Sintassi di personalizzazione personalization-syntax

In questa pagina: Scopri la sintassi di personalizzazione Handlebars e PQL in Adobe Journey Optimizer, incluse le regole generali, le parole chiave riservate, la coercizione del tipo, gli spazi dei nomi disponibili e le best practice.

Personalization in Journey Optimizer utilizza due sintassi complementari che funzionano insieme nella stessa espressione:

  • Handlebars ({{...}}): utilizzato per eseguire il rendering degli attributi di profilo, eseguire il loop su array e chiamare gli helper di blocco. Consulta la documentazione HandlebarsJS per un riferimento completo.
  • Profile Query Language (PQL) ({%= ... %}): utilizzato per chiamare funzioni incorporate (ad esempio upperCase(), formatDate(), dateDiff()) e valutare espressioni condizionali.

Per evitare errori di runtime, è fondamentale capire in quale contesto ci si trova. Ad esempio, una chiamata di funzione PQL inserita all’interno di {{...}} avrà esito negativo perché Handlebars tenta di risolverla come helper anziché valutarla come espressione di PQL.

Esempi:

Caso d’uso
Sintassi
Eseguire il rendering di un attributo di profilo
{{profile.person.name.firstName}}
Chiamare una funzione PQL
{%= upperCase(profile.person.name.firstName) %}
Blocco condizionale
{%#if profile.loyalty.tier = "gold"%}...{%/if%}
Eseguire il ciclo su un array
{{#each profile.orders}}...{{/each}}

La struttura degli attributi è definita in uno schema XDM di Adobe Experience Platform. Ulteriori informazioni.

TIP
Per le espressioni pronte all'uso che applicano queste sintassi a scenari reali, ad esempio formattazione delle date, conteggi, fallback condizionali e altro ancora, vedere la pagina Composizioni di Personalization.

Regole generali di sintassi general-rules

  • Gli identificatori possono essere qualsiasi carattere Unicode ad eccezione dei seguenti caratteri speciali, che sono riservati per la sintassi Handlebars:

    code language-none
    Whitespace ! " # % & ' ( ) * + , . / ; < = > @ [ \ ] ^ ` { | } ~
    
  • La sintassi fa distinzione tra maiuscole e minuscole.

  • Le parole true, false, null e undefined sono consentite solo nella prima parte di un’espressione di percorso.

  • In Handlebars, i valori restituiti da {{expression}} sono con escape HTML. Se l’espressione contiene &, l’output con escape HTML restituito verrà generato come &amp;. Se non vuoi che Handlebars sfugga a un valore, utilizza il “triplo-stash”.

    Si supponga che il valore del campo profile.person.name sia “Mark & Mary”. La sintassi {{profile.person.name}} visualizzerà Mark &amp; Mary, mentre {{{profile.person.name}}} visualizzerà Mark & Mary.

  • Per quanto riguarda gli argomenti delle funzioni letterali, il parser del linguaggio del modello non supporta una singola barra rovesciata senza escape (\). Questo carattere deve essere preceduto da una barra rovesciata (\). Esempio:

    {%= regexGroup("abc@xyz.com","@(\\w+)", 1)%}

  • Per includere virgolette doppie letterali in un valore stringa (ad esempio, durante la generazione dell’output JSON), esegui l’escape con una barra rovesciata (\"):

    code language-handlebars
    { "message": "Hello \"{{profile.person.name.firstName}}\"" }
    

    Output: { "message": "Hello \"John\"" }

    In alternativa, utilizza il triplo-stash {{{ }}} per generare HTML senza escape quando il valore stesso contiene caratteri speciali che non desideri siano codificati in HTML.

Parole chiave riservate reserved-keywords

Alcune parole chiave sono riservate in Profile Query Language (PQL) e non possono essere utilizzate direttamente come nomi di campi o variabili nelle espressioni di personalizzazione. Se lo schema XDM contiene campi con nomi che corrispondono a parole chiave riservate, è necessario eseguirne l’escape utilizzando apici inversi (`) per farvi riferimento nelle espressioni.

Le parole chiave riservate includono:

  • next
  • last
  • this

Esempio:

Se lo schema del profilo dispone di un campo denominato next, è necessario racchiuderlo in apici:

{{profile.person.`next`.name}}

Se non vengono utilizzati i backtick, l’editor di personalizzazione non riuscirà a eseguire la convalida e restituirà un errore.

NOTE
L'escape backtick per le parole chiave riservate si applica sia ai percorsi Handlebars {{...}} che alle espressioni PQL {%= ... %}, poiché queste parole chiave sono riservate al livello di risoluzione del percorso. Questa funzione è diversa dai nomi di campo sillabati, in cui l’escape con apice inverso è supportato solo all’interno di espressioni PQL. Vedi Chiavi attributo con sillabazione.

Regole di sintassi PQL per chiavi di attributi speciali pql-special-keys

Oltre alle parole chiave riservate, due casi aggiuntivi richiedono l’escape backtick nelle espressioni PQL.

Chiavi attributo sillabate hyphenated-keys

Se lo schema XDM contiene nomi di campo con trattini (ad esempio my-field, event-type) o nomi che iniziano con o contengono numeri, racchiudi la chiave tra i segni di sospensione all’interno delle espressioni PQL:

{%= profile.events.`order-total` > 100 %}
NOTE
L'escape di tipo Backtick è supportato solo all'interno di espressioni PQL ({%= ... %}). Non è supportato nell'interpolazione Handlebars ({{...}}). Tuttavia, è possibile fare riferimento direttamente ai nomi dei campi sillabati nei blocchi {{...}} (ad esempio {{profile.my-custom-field}}); solo la sintassi backtick non riesce.

Senza apici retroversi in un’espressione PQL, il trattino viene interpretato come un operatore di sottrazione e causa un errore di sintassi PQL.

ID evento numerici negli attributi di contesto numeric-event-ids

Quando si fa riferimento agli attributi dell’evento di contesto in cui l’ID evento è un numero (ad esempio 1697323153), racchiuderlo in apici. Questo vale anche all’interno di funzioni come formatDate():

{% let ts = formatDate(toDateTime(context.journey.events.`1697323153`.timestamp), "dd/MM/yyyy") %}
{{ts}}

Tipo coercizione type-coercion

PQL è fortemente tipizzato. Quando si confrontano o si trasmettono valori, entrambi i lati devono essere dello stesso tipo. Casi comuni:

Scenario
Soluzione
Valore numerico memorizzato come stringa
Usa stringToNumber() prima di aritmetica o confronto: {%= stringToNumber(profile.loyalty.pointsBalance) > 500 %}
Intero memorizzato come stringa
Usa string_to_integer() o stringToNumber() prima dell’aritmetica
Booleano memorizzato come stringa
Usa toBool() per convertire: {%= toBool(profile.consents.email.val) = true %}

Spazi dei nomi disponibili namespaces

  • Profilo

    Questo spazio dei nomi consente di fare riferimento a tutti gli attributi definiti nello schema del profilo descritto nella documentazione di Adobe Experience Platform Data Model (XDM).

    Gli attributi devono essere definiti nello schema prima di essere referenziati in un blocco di personalizzazione Journey Optimizer.

    Per ulteriori informazioni su come sfruttare gli attributi del profilo nelle condizioni, consulta questa sezione.

    accordion
    Riferimenti di esempio
    • {{profile.person.name.fullName}}
    • {{profile.person.name.firstName}}
    • {{profile.person.gender}}
    • {{profile.personalEmail.address}}
    • {{profile.mobilePhone.number}}
    • {{profile.homeAddress.city}}
    • {{profile.faxPhone.number}}
  • Pubblico

    Per ulteriori informazioni sul servizio di segmentazione, consulta questa documentazione.

  • Offerte

    Questo spazio dei nomi consente di fare riferimento alle decisioni sulle offerte esistenti.

    Per fare riferimento a un’offerta è necessario dichiarare un percorso con le diverse informazioni che definiscono un’offerta. Questo percorso ha la seguente struttura:

    offers.Type.[Placement Id].[Activity Id].Attribute

    dove:

    • offers identifica l’espressione di percorso appartenente allo spazio dei nomi dell’offerta
    • Type determina il tipo di rappresentazione dell’offerta. I valori possibili sono: image, html e text
    • Placement Id e Activity Id sono identificatori di posizionamento e attività
    • Attributes sono attributi specifici dell’offerta che dipendono dal tipo di offerta. Esempio: deliveryUrl per le immagini

    Per ulteriori informazioni sull’API Decisions e sulle rappresentazioni di offerte, consulta questa pagina

    Tutti i riferimenti vengono convalidati in base allo schema delle offerte con un meccanismo di convalida descritto in questa pagina

    accordion
    Riferimenti di esempio
    • Posizione in cui è ospitata l’immagine:

      offers.image.[offers:xcore:offer-placement:126f767d74b0da80].[xcore:offer-activity:125e2c6889798fd9].deliveryUrl

    • URL di destinazione quando fai clic sull’immagine:

      offers.image.[offers:xcore:offer-placement:126f767d74b0da80].[xcore:offer-activity:125e2c6889798fd9].linkUrl

    • Contenuto del testo dell’offerta proveniente dal motore decisionale:

      offers.text.[offers:xcore:offer-placement:126f767d74b0da80].[xcore:offer-activity:125e2c6889798fd9].content

    • Contenuto HTML dell’offerta proveniente dal motore decisionale:

      offers.html.[offers:xcore:offer-placement:126f767d74b0da80].[xcore:offer-activity:125e2c6889798fd9].content

Helper helpers-all

Un helper Handlebars è un semplice identificatore che può essere seguito da parametri. Ogni parametro è un’espressione Handlebars. È possibile accedere a questi helper da qualsiasi contesto in un modello.

Questi helper di blocco sono identificati da un # che precede il nome dell’helper e richiedono un / di chiusura corrispondente, con lo stesso nome.

I blocchi sono espressioni con un blocco di apertura ({{# }}) e chiusura ({{/}}).

Per ulteriori informazioni sulle funzioni di supporto, consultare questa sezione.

Tipi letterali literal-types

Adobe Journey Optimizer supporta i seguenti tipi letterali:

Letterale
Definizione
Stringa
Tipo di dati costituito da caratteri racchiusi tra virgolette doppie.
Esempi: "prospect", "jobs", "articles"
Booleano
Tipo di dati true o false.
Intero
Tipo di dati che rappresenta un numero intero. Può essere positivo, negativo o zero.
Esempi: -201, 0, 412
Array
Tipo di dati composto da un gruppo di altri valori letterali. Utilizza parentesi quadre per raggruppare e virgole per delimitare tra valori diversi.
Nota: non è possibile accedere direttamente alle proprietà degli elementi all’interno di un array.
Esempi: [1, 4, 7], ["US", "FR"]
CAUTION
L'utilizzo della variabile xEvent non è disponibile nelle espressioni di personalizzazione. Qualsiasi riferimento a xEvent provocherà errori di convalida.

Best practice best-practices

Rivedi queste regole di sintassi prima di creare espressioni di personalizzazione. La maggior parte degli errori di runtime deriva dalla combinazione di Handlebars e contesti di PQL.

Utilizzare la sintassi del blocco condizionale corretta

Usa sempre {%#if%} / {%else if%} / {%else%} / {%/if%}. Sintassi {% if %} / {% elseif %} / {% endif %} non supportata.

{%#if profile.loyalty.tier = "gold"%}
Gold member content
{%else if profile.loyalty.tier = "silver"%}
Silver member content
{%else%}
Default content
{%/if%}

Non chiamare funzioni PQL all’interno di {{...}} blocchi Handlebars

{{...}} risolve solo le variabili Handlebars e gli helper, ma non valuta PQL. Il wrapping di una funzione PQL come upperCase() in {{...}} causa un errore di tipo “Impossibile trovare l’helper”. Utilizza invece {%= ... %}:

Non corretto
Corretto
{{upperCase(cleanName)}}
{%= upperCase(cleanName) %}

Utilizzare un alias loop denominato quando si combina {{#each}} con{%#if%}

this.field è risolto dal renderer Handlebars ma non dal valutatore PQL all’interno di una condizione {%#if%}. Definire un alias denominato con as |item| in modo che entrambi i contesti possano risolvere il campo:

{{#each profile.orders as |order|}}
  {%#if order.status = "pending"%}
  Order {{order.id}} is pending.
  {%/if%}
{{/each}}

Assegnare i risultati della funzione PQL a una variabile prima di eseguire un ciclo

Impossibile chiamare le FDU di PQL come topN direttamente in {{#each}}. Valutali prima con {% let %}, quindi esegui un’iterazione sul risultato:

{% let topOrders = topN(profile.orders, price, 3) %}
{{#each topOrders}}
  {{this.name}} — {{this.price}}&euro;
{{/each}}

Utilizza {% let %} per evitare di ripetere le chiamate di funzione

Se un valore calcolato è necessario più di una volta, memorizzalo in una variabile. Ciò migliora la leggibilità e impedisce le valutazioni ridondanti:

{% let cleanName = replaceAll(profile.person.name.firstName, "[^a-zA-Z]", "") %}
Hi {{cleanName}}, your code is: WELCOME-{%= upperCase(cleanName) %}

Utilizza l’ordine corretto degli argomenti perdateDiff

dateDiff(start, end) prende prima la data precedente. Per calcolare i giorni rimanenti fino a una data futura, passare la data corrente come primo argomento:

{% let daysLeft = dateDiff(getCurrentZonedDateTime(), stringToDate(profile.loyalty.expiryDate)) %}

Utilizzare = per i confronti di uguaglianza in PQL, non==

PQL utilizza un singolo operatore = per l’uguaglianza. L’utilizzo di == genera un errore di sintassi.

Usa i contrassegni per i nomi dei campi sillabati, solo nelle espressioni PQL

Se il nome di un campo dello schema XDM contiene un trattino (ad esempio order-total), racchiudilo tra apici per evitare che il trattino venga analizzato come operatore di sottrazione. Questo è supportato solo all’interno di {%= ... %} espressioni PQL, non nei blocchi Handlebars {{...}}:

{%= profile.events.`order-total` > 100 %}

Per le espressioni pronte all’uso che puoi copiare direttamente nel contenuto, consulta Composizioni di Personalization.

recommendation-more-help
journey-optimizer-help