Personalization syntax personalization-syntax

På den här sidan: Lär dig mer om hanterarfält och PQL personaliseringssyntax i Adobe Journey Optimizer, inklusive allmänna regler, reserverade nyckelord, typtvång, tillgängliga namnutrymmen och bästa praxis.

Personalization i Journey Optimizer använder två kompletterande syntaxer som fungerar tillsammans i samma uttryck:

  • Handlebars ({{...}}) - används för att återge profilattribut, göra en slinga över arrayer och anropa blockhjälpredor. En fullständig referens finns i HandlebarsJS-dokumentationen.
  • Profile Query Language (PQL) ({%= ... %}) - används för att anropa inbyggda funktioner (t.ex. upperCase(), formatDate(), dateDiff()) och utvärderar villkorsuttryck.

Att förstå vilket sammanhang du befinner dig i är avgörande för att undvika körningsfel. Ett PQL-funktionsanrop som placerats i {{...}} kommer till exempel att misslyckas eftersom Handlebars försöker att lösa det som en hjälp i stället för att utvärdera det som ett PQL-uttryck.

Exempel:

Använd skiftläge
Syntax
Återge ett profilattribut
{{profile.person.name.firstName}}
Ring en PQL-funktion
{%= upperCase(profile.person.name.firstName) %}
Villkorligt block
{%#if profile.loyalty.tier = "gold"%}...{%/if%}
Slinga över en array
{{#each profile.orders}}...{{/each}}

Attributstrukturen definieras i ett Adobe Experience Platform XDM-schema. Läs mer.

TIP
För färdiga uttryck som tillämpar dessa syntaxer på verkliga scenarier - datumformatering, räkningar, villkorliga reservationer med mera - se sidan Personalization recept.

Allmänna syntaxregler general-rules

  • Identifierare kan vara vilket Unicode-tecken som helst förutom följande specialtecken, som är reserverade för Handlebars-syntaxen:

    code language-none
    Whitespace ! " # % & ' ( ) * + , . / ; < = > @ [ \ ] ^ ` { | } ~
    
  • Syntaxen är skiftlägeskänslig.

  • Orden true, false, null och undefined tillåts bara i den första delen av ett sökvägsuttryck.

  • I Handlebars är värdena som returneras av {{expression}} HTML-escape. Om uttrycket innehåller & genereras returnerade HTML-escape-utdata som &amp;. Om du inte vill att Handlebars ska hoppa över ett värde använder du “trippelstreck”.

    Anta att värdet för fältet profile.person.name är “Mark & Mary”. Syntaxen {{profile.person.name}} visar Mark &amp; Mary medan {{{profile.person.name}}} visar Mark & Mary.

  • När det gäller argument för literala funktioner saknar den mallande språkparsern stöd för ett omvänt snedstreck (\) av typen unescape. Det här tecknet måste föregås av ett ytterligare omvänt snedstreck (\). Exempel:

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

  • Om du vill inkludera ett literalt dubbelcitattecken i ett strängvärde (t.ex. när JSON-utdata genereras) kan du undvika det med ett omvänt snedstreck (\"):

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

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

    Du kan också använda trippelstrecket {{{ }}} för att skriva ut unescape-konverterade HTML när själva värdet innehåller specialtecken som du inte vill ha HTML-kodade.

Reserverade nyckelord reserved-keywords

Vissa nyckelord är reserverade i Profile Query Language (PQL) och kan inte användas direkt som fält- eller variabelnamn i personaliseringsuttryck. Om XDM-schemat innehåller fält med namn som matchar reserverade nyckelord måste du undvika dem med hjälp av bakterier (`) för att referera till dem i dina uttryck.

Reserverade nyckelord är:

  • next
  • last
  • this

Exempel:

Om ditt profilschema har ett fält med namnet next måste du omsluta det med bakgrunder:

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

Utan de här blocken misslyckas personaliseringsredigeraren med valideringen och ett fel inträffar.

NOTE
Backtick-escape för reserverade nyckelord gäller för både {{...}}-handtagssökvägar och {%= ... %} PQL-uttryck, eftersom dessa nyckelord är reserverade på sökvägsupplösningsnivån. Detta skiljer sig från avstavade fältnamn, där backtick escape-funktioner endast stöds i PQL-uttryck. Se Avstavade attributnycklar.

PQL syntaxregler för specialattributnycklar pql-special-keys

Förutom reserverade nyckelord krävs ytterligare två fall för att undvika backtick i PQL-uttryck.

Avstavade attributnycklar hyphenated-keys

Om ditt XDM-schema innehåller fältnamn med bindestreck (t.ex. my-field, event-type) eller namn som börjar med eller innehåller siffror, radbryt nyckeln i bakslag i PQL-uttryck:

{%= profile.events.`order-total` > 100 %}
NOTE
Backtick-escape stöds endast i PQL-uttryck ({%= ... %}). Det stöds inte i Handlebars-interpolation ({{...}}). Avstavade fältnamn kan dock refereras direkt i {{...}} block (t.ex. {{profile.my-custom-field}}); endast backtick-syntax misslyckas där.

Om det inte finns några bakgrunder i ett PQL-uttryck tolkas bindestrecket som en subtraktionsoperator och orsakar ett syntaxfel i PQL.

Numeriska händelse-ID:n i kontextattribut numeric-event-ids

När kontexthändelseattribut refereras till där händelse-ID är ett tal (t.ex. 1697323153), radbryt den i backticks. Detta gäller även inuti funktioner som formatDate():

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

Typtvång type-coercion

PQL är starkt typat. När värden jämförs eller skickas måste båda sidorna vara av samma typ. Vanliga fall:

Scenario
Lösning
Numeriskt värde sparat som en sträng
Använd stringToNumber() före aritmetik eller jämförelse: {%= stringToNumber(profile.loyalty.pointsBalance) > 500 %}
Heltal sparat som sträng
Använd string_to_integer() eller stringToNumber() före aritmetisk
Boolean lagrad som sträng
Använd toBool() för att konvertera: {%= toBool(profile.consents.email.val) = true %}

Tillgängliga namnutrymmen namespaces

  • Profil

    Med det här namnutrymmet kan du referera till alla attribut som definieras i profilschemat som beskrivs i dokumentationen för Adobe Experience Platform datamodell (XDM).

    Attributen måste definieras i schemat innan de refereras i ett Journey Optimizer-anpassningsblock.

    Mer information om hur du återanvänder profilattribut i villkor finns i det här avsnittet.

    accordion
    Exempelreferenser
    • {{profile.person.name.fullName}}
    • {{profile.person.name.firstName}}
    • {{profile.person.gender}}
    • {{profile.personalEmail.address}}
    • {{profile.mobilePhone.number}}
    • {{profile.homeAddress.city}}
    • {{profile.faxPhone.number}}
  • Målgrupp

    Mer information om segmenteringstjänsten finns i den här dokumentationen.

  • Erbjudanden

    Med det här namnutrymmet kan du referera till befintliga offertbeslut.

    Om du vill hänvisa till ett erbjudande måste du deklarera en sökväg med den information som definierar ett erbjudande. Den här sökvägen har följande struktur:

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

    där:

    • offers identifierar sökvägsuttrycket som tillhör namnutrymmet offer
    • Type bestämmer typen av erbjudanderepresentation. Möjliga värden är: image, html och text
    • Placement Id och Activity Id är placerings- och aktivitetsidentifierare
    • Attributes erbjuder specifika attribut som är beroende av erbjudandetypen. Exempel: deliveryUrl för bilder

    Mer information om beslut-API och om offertrepresentationer finns på den här sidan

    Alla referenser valideras mot offertschema med en valideringsmekanism som beskrivs på den här sidan

    accordion
    Exempelreferenser
    • Plats där bilden finns:

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

    • Mål-URL när du klickar på bilden:

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

    • Innehåll i det erbjudande som kommer från beslutsmotorn:

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

    • HTML innehåll i erbjudandet som kommer från beslutsmotorn:

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

Hjälpmedel helpers-all

Handtag-hjälpen är en enkel identifierare som kan följas av parametrar. Varje parameter är ett Handlebars-uttryck. Hjälpprogrammen kan nås från alla sammanhang i en mall.

Dessa blockhjälpare identifieras av en # före hjälpnamnet och kräver en matchande avslutande / med samma namn.

Blocken är uttryck som har ett blocköppning ({{# }}) och stängning ({{/}}).

Mer information om hjälpfunktioner finns i det här avsnittet.

Literala typer literal-types

Adobe Journey Optimizer stöder följande literaltyper:

Literal
Definition
Sträng
En datatyp som består av tecken omgivna av dubbla citattecken.
Exempel: "prospect", "jobs", "articles"
Boolean
En datatyp som är antingen true eller false.
Heltal
En datatyp som representerar ett heltal. Den kan vara positiv, negativ eller noll.
Exempel: -201, 0, 412
Array
En datatyp som består av en grupp med andra literala värden. Här används hakparenteser för att gruppera och kommatecken för att avgränsa mellan olika värden.
Obs! Du kan inte komma åt egenskaper direkt för objekt i en array.
Exempel: [1, 4, 7], ["US", "FR"]
CAUTION
Det går inte att använda variabeln xEvent i personaliseringsuttryck. Alla referenser till xEvent resulterar i valideringsfel.

God praxis best-practices

Granska dessa syntaxregler innan du skapar personaliseringsuttryck. De flesta runtime-fel uppstår när du blandar handtag och PQL-kontexter.

Använd rätt villkorsstyrd blocksyntax

Använd alltid {%#if%} / {%else if%} / {%else%} / {%/if%}. Syntaxen {% if %} / {% elseif %} / {% endif %} stöds inte.

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

Anropa inte PQL-funktioner i {{...}} Handlebars blocks

{{...}} löser endast hanterarfältsvariabler och hjälpprogram - det utvärderas inte av PQL. Om en PQL-funktion som upperCase() i {{...}} kapslas in uppstår felet"det gick inte att hitta hjälpen". Använd {%= ... %} i stället:

Felaktig
Korrigera
{{upperCase(cleanName)}}
{%= upperCase(cleanName) %}

Använd ett namngivet loopalias när {{#each}} kombineras med{%#if%}

this.field löses av Handlebars-renderaren men inte av PQL-utvärderaren i ett {%#if%} -villkor. Definiera ett namngivet alias med as |item| så att båda kontexterna kan matcha fältet:

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

Tilldela PQL-funktionsresultat till en variabel innan slingor

PQL UDF som topN kan inte anropas direkt i {{#each}}. Utvärdera dem först med {% let %} och iterera sedan över resultatet:

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

Använd {% let %} för att undvika upprepade funktionsanrop

När ett beräknat värde behövs mer än en gång, sparar du det i en variabel. Detta förbättrar läsbarheten och förhindrar överflödiga utvärderingar:

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

Använd rätt argumentordning fördateDiff

dateDiff(start, end) tar det tidigare datumet först. Om du vill beräkna återstående dagar till ett framtida datum skickar du aktuellt datum som det första argumentet:

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

Använd = för likhetsjämförelser i PQL, inte==

PQL använder en enskild =-operator för likhet. Om du använder == uppstår ett syntaxfel.

Använd bakterier för avstavade fältnamn - endast i PQL-uttryck

Om ett XDM-schemafältnamn innehåller ett bindestreck (t.ex. order-total), radbryt det i bakslag för att förhindra att bindestrecket tolkas som en subtraktionsoperator. Detta stöds endast i {%= ... %} PQL-uttryck, inte i {{...}} Handlebars-block:

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

Mer information om färdiga uttryck som du kan kopiera direkt till ditt innehåll finns i Personalization recept.

recommendation-more-help
journey-optimizer-help