Variabili di Automazione e Modelli in GLPI 11

Guida tecnica alle variabili di notifica di GLPI 11: i tag ##...## che funzionano davvero, il blocco FOREACH che quasi nessuno conosce, i tag ##lang.*## per email multilingue, perché il richiedente esce vuoto e la query di coda che NexTool esegue quando una notifica non arriva.

In questo articolo7 sezioni

Una variabile di automazione è ciò che separa un generico "Il tuo ticket è stato aggiornato" da un "Ticket 12345 - Stampante senza toner passato a In lavorazione, gestito dalla tecnica Ana Paula". In GLPI queste variabili sono i tag di notifica: marcatori ##...## che il motore sostituisce con il dato reale al momento dell'invio. Sembrano banali finché arriva il giorno in cui il nome del richiedente esce vuoto nell'email e nessuno sa perché. Questa guida è la mappa che usiamo nella manutenzione di parchi GLPI dei clienti per azzeccare il modello al primo colpo.

Dove vivono le variabili: un modello non è una notifica

Prima di scegliere i tag, comprenda la catena che GLPI costruisce, perché la maggior parte dei "la variabile non funziona" sono in realtà errori di configurazione, non di sintassi. Un messaggio parte solo quando quattro pezzi sono allineati:

  • Notifica (Configura > Notifiche): collega l'evento - nuovo ticket, aggiornamento, soluzione, sondaggio di soddisfazione.
  • Modello (Modelli di notifica): il corpo testo e il corpo HTML, dove scrive i tag ##...##.
  • Destinatari: chi lo riceve - richiedente, tecnico assegnato, gruppo, osservatore.
  • Coda e invio: GLPI non spedisce l'email all'istante; la accoda e l'azione automatica queuednotification la smista.

Mettere il tag giusto in un modello non collegato ad alcuna notifica attiva non produce alcuna email - e non è colpa del tag.

I tag che usa davvero

I tag sono contestuali: l'insieme disponibile cambia in base all'oggetto (Ticket, Change, Problem). Per i ticket, questi coprono la maggior parte dei modelli - tutti verificati direttamente nel motore di notifica di GLPI 11:

TagCosa restituisce
##ticket.id##Numero del ticket
##ticket.title##Titolo
##ticket.description##Descrizione (contenuto di apertura)
##ticket.url##Link diretto al ticket (richiede login)
##ticket.status##Stato attuale
##ticket.priority##Priorità
##ticket.category##Categoria
##ticket.creationdate##Data di apertura
##ticket.solvedate##Data di soluzione
##ticket.duedate##Scadenza di risoluzione (SLA)
##ticket.authors##Richiedente/i - elenco separato da virgole
##ticket.assigntousers##Tecnico/i assegnato/i - elenco per virgole
##ticket.assigntogroups##Gruppo/i assegnato/i
##ticket.solution##Testo della soluzione
##followup.author## / ##followup.description##Dentro ##FOREACHfollowups##
##task.author## / ##task.description##Dentro ##FOREACHtasks##
##author.name## / ##author.email##Dentro ##FOREACHauthors##

Noti che ##ticket.assigntousers## restituisce un elenco già pronto, separato da virgole - GLPI fa l'implode internamente. Non è un ciclo, è testo semplice: risolve "ho due tecnici e li voglio entrambi nell'email" senza alcun trucco.

L'errore sul campo più comune: il richiedente non è ##user.name##

Questo è, di gran lunga, il problema che riapriamo di più negli audit di modello: il nome del richiedente arriva vuoto. La causa è quasi sempre la stessa - qualcuno ha copiato ##user.name## da un tutorial di recupero password dentro una notifica di ticket. In una notifica di Ticket, ##user.name## semplicemente non esiste: appartiene alle notifiche dell'oggetto Utente (reset password, creazione account). GLPI non segnala alcun errore - sostituisce solo con una stringa vuota, e il tecnico passa il pomeriggio a inseguire un bug che è in realtà un problema di origine del dato. Il richiedente di un ticket è ##ticket.authors## (elenco pronto) oppure, se vuole nome ed email di ciascuno separatamente, il blocco FOREACH qui sotto.

FOREACH: la parte che quasi nessuno conosce

Un ticket ha N aggiornamenti, N attività, N richiedenti. Non esiste un tag magico che riversi tutto formattato: GLPI espone le collezioni tramite un blocco di ripetizione. Apra il ciclo, scriva il cuore una volta con i tag dell'elemento e lo chiuda - e può anche limitare quanti elementi con FIRST o LAST:

Ciao ##ticket.authors##,

Il tuo ticket ##ticket.id## - ##ticket.title##
e passato a: ##ticket.status##
Tecnico/i: ##ticket.assigntousers##

Ultimo aggiornamento:
##FOREACH LAST 1 followups##
[##followup.date##] ##followup.author##:
##followup.description##
##ENDFOREACHfollowups##

Accedi: ##ticket.url##

Il LAST 1 (accetta anche FIRST e numeri più grandi) è ciò che evita l'email chilometrica che ripete tutta la cronologia a ogni nuovo aggiornamento - una richiesta ricorrente del cliente che la maggior parte "risolve" tagliando il contenuto a forza, quando bastava il modificatore. Le collezioni che accettano FOREACH includono followups, tasks, authors, actors, costs e le collegate (linkedtickets, linkedchanges, linkedproblems).

Notifica multilingue gratis: i tag ##lang.*##

Dettaglio che compare solo quando apre l'elenco completo dei tag: ogni tag di valore ha una compagna di etichetta. Per ##ticket.status## (il valore) esiste ##lang.ticket.status##, che stampa l'etichetta "Stato" tradotta nella lingua del destinatario. Costruendo il modello con coppie etichetta + valore, lo stesso messaggio esce in portoghese per un utente e in spagnolo per un altro, senza duplicare il modello:

##lang.ticket.title##: ##ticket.title##
##lang.ticket.status##: ##ticket.status##
##lang.ticket.priority##: ##ticket.priority##

In un cliente con entità in più di un paese, questo riduce la manutenzione di "un modello per lingua" a uno solo. Il valore non lo traduce - il dato è il dato; ciò che cambia è solo l'etichetta, e ##lang.*## ci pensa da solo.

Diagnosi: la variabile è giusta, ma l'email non parte

Quando il modello è impeccabile e l'email sparisce comunque, il problema non è il tag - è la coda. GLPI scrive ogni messaggio in glpi_queuednotifications e l'azione automatica queuednotification esegue l'invio vero e proprio. Se l'azione non gira (cron fermo) o l'SMTP rifiuta, il messaggio si accumula con sent_time nullo. È la prima cosa che eseguiamo su un ticket "le notifiche non arrivano":

-- Notifiche in coda che avrebbero gia dovuto partire:
-- sent_time NULL = non ancora inviata; send_time nel passato = in ritardo.
SELECT id, name AS oggetto, recipient, send_time, sent_try
FROM glpi_queuednotifications
WHERE sent_time IS NULL
  AND send_time <= NOW()
ORDER BY send_time ASC
LIMIT 30;

Righe che si accumulano con sent_try che sale significano SMTP che rifiuta; coda che cresce con sent_try a zero significa cron fermo. In entrambi i casi il modello è giusto - e ha appena risparmiato il pomeriggio che avrebbe speso a riscrivere tag inutilmente.

Dove funziona ogni variabile (matrice di decisione)

La confusione che ereditiamo da quasi ogni nuovo parco è credere che "modello di ticket" e "modello di notifica" siano la stessa cosa. Non lo sono - e solo uno dei due fa la sostituzione di ##tag##:

DoveSostituisce ##tag##?A cosa serve
Modello di notifica (corpo e oggetto)Sì - tag, FOREACH e ##lang.*##Corpo email dinamico
Modello di ticket (TicketTemplate)NoPredefinire, nascondere o rendere obbligatori campi all'apertura
Modello di attività / aggiornamentoNoTesto base riutilizzabile, senza sostituzione dinamica
Oggetto della notificaSìGli stessi tag del corpo, su una sola riga

Consiglio finale che vale tutto il resto: quando modifica un modello di notifica, GLPI mostra la scheda dei tag disponibili per quell'elemento specifico. È la fonte della verità - contestuale e sempre allineata alla versione installata. Prima di copiare un tag da un blog (questo compreso), verifichi che compaia lì.

Le servono notifiche che informino davvero - multilingue, con il richiedente giusto e senza email bloccate in coda? Scopra il servizio di manutenzione GLPI di NexTool.


Revisionato dal team NexTool Solutions.

Domande Frequenti

Quasi sempre perché il modello usa ##user.name##, che non esiste nelle notifiche di Ticket (appartiene alle notifiche dell'oggetto Utente, come il reset password). GLPI non segnala alcun errore, sostituisce solo con una stringa vuota. Usi ##ticket.authors## per l'elenco dei richiedenti, o il blocco ##FOREACHauthors## con ##author.name## e ##author.email## per trattare ciascuno.

Usi il modificatore del FOREACH: ##FOREACH LAST 1 followups## ... ##ENDFOREACHfollowups##. LAST 1 prende solo l'aggiornamento più recente; FIRST e numeri più grandi sono anch'essi accettati. Senza il modificatore, il ciclo stampa tutti gli aggiornamenti a ogni invio, generando la classica email chilometrica.

Sì. Ogni tag di valore ha una compagna di etichetta ##lang.*##: per ##ticket.status## esiste ##lang.ticket.status##, che stampa l'etichetta tradotta nella lingua del destinatario. Costruendo il corpo con coppie ##lang.ticket.campo##: ##ticket.campo##, un solo modello serve più lingue.

La coda, non il modello. GLPI accoda ogni messaggio in glpi_queuednotifications e l'azione automatica queuednotification esegue l'invio. Controlli le righe con sent_time NULL e send_time nel passato: un sent_try che sale indica SMTP che rifiuta; sent_try a zero indica cron fermo.

No. Il modello di ticket (TicketTemplate) serve a predefinire, nascondere o rendere obbligatori campi all'apertura - non fa sostituzione di ##tag##. Le variabili di automazione ##...## vivono nei modelli di notifica (corpo e oggetto). Confondere i due è all'origine di molti 'la variabile non funziona'.

Hai bisogno di aiuto?