Iterera över kontextuella data personalization-contexts
Lär dig hur du använder itereringssyntax för Handlebars för att visa dynamiska listor med data från olika källor i dina meddelanden, inklusive händelser, anpassade åtgärdssvar och andra sammanhangsbaserade data.
Översikt overview
Journey Optimizer ger åtkomst till kontextuella data från flera källor under meddelandepersonalisering. Du kan iterera över arrayer från dessa källor med hjälp av Handlebars-syntax i inbyggda kanaler (email, push, SMS) för att visa dynamiskt innehåll som produktlistor, rekommendationer eller andra upprepade element.
Tillgängliga sammanhangskällor:
- Händelser: Data från resehändelser (affärshändelser, enhetshändelser)
- Anpassade åtgärdssvar: Data som returnerats från externa API-anrop via anpassade åtgärder
- Datauppsättningssökning: Förbättrade data har hämtats från Adobe Experience Platform datauppsättningar
- Tekniska egenskaper: Resemetadata som resa-ID och extra identifierare
- Resekontext: Andra reserelaterade data som är tillgängliga under körningen
Den här guiden visar hur du itererar över arrayer från var och en av dessa källor i dina meddelanden och hur du arbetar med arrayer när du konfigurerar reseaktiviteter. Börja med Hantera fält-itereringssyntax om du vill förstå grunderna för meddelandeanpassning, eller gå till Arbeta med arrayer i Journey-uttryck om du vill lära dig hur du skickar arraydata till anpassade åtgärder och datasetsökningar.
Syntax för iterering av Handlebars syntax
Hanteringsfält ger {{#each}} hjälpen som kan itereras över arrayer. Grundsyntaxen är:
Nyckelpunkter:
- Ersätt
arrayPathmed sökvägen till matrisdata - Ersätt
itemmed valfritt variabelnamn (t.ex.product,response,element) - Åtkomst till egenskaper för varje objekt med
{{item.propertyName}} - Du kan kapsla in flera
{{#each}}-block för flernivåarrayer
Iterera över händelsedata event-data
Händelsedata är tillgängliga när din resa aktiveras av en händelse. Detta är användbart för att visa data som hämtades när resan påbörjades, till exempel kundvagnsinnehåll, orderartiklar eller formulärinskickningar.
Kontextsökväg för händelser
<event_ID>: Det unika ID:t för din händelse som konfigurerats under resan<fieldPath>: Sökvägen till fältet eller arrayen i ditt händelseschema
Exempel: Skapa kundvagnsobjekt från en händelse
Om ditt händelseschema innehåller en productListItems-matris (standardformat XDM) kan du visa kundvagnens innehåll enligt exemplet nedan.
| code language-handlebars |
|---|
|
Exempel: Kapslade arrayer i händelser
Använd kapslade {{#each}}-block för kapslade strukturer.
| code language-handlebars |
|---|
|
Läs mer om kapsling i Bästa tillvägagångssätt.
Iterera över anpassade åtgärdssvar custom-action-responses
Anpassade åtgärder-svar innehåller data som returnerats från externa API-anrop. Detta är användbart när du vill visa realtidsinformation från dina system, t.ex. förmånspoäng, produktrekommendationer, lagerstatus eller personaliserade erbjudanden.
Kontextsökväg för anpassade åtgärder
<actionName>: Namnet på din anpassade åtgärd som konfigurerats under resan<fieldPath>: Sökvägen till fältet eller arrayen i svarsnyttolasten
Exempel: Produktrekommendationer från ett API
Om du vill iterera över en array med produktrekommendationer som returneras från en anpassad åtgärd och visa dem som enskilda kort i ditt meddelande, se exemplet nedan.
API-svar:
| code language-json |
|---|
|
Meddelandepersonalisering:
| code language-handlebars |
|---|
|
Exempel: Kapslade arrayer från anpassade åtgärder
Om du vill iterera över ett anpassat åtgärdssvar som innehåller kapslade arrayer (en array med objekt där varje objekt innehåller en annan array), se exemplet nedan. Detta visar hur kapslade {{#each}}-slingor används för att få åtkomst till flera datanivåer.
API-svar:
| code language-json |
|---|
|
Meddelandepersonalisering:
| code language-handlebars |
|---|
|
Mer komplexa kapslingsmönster finns i Bästa tillvägagångssätt.
Exempel: Förmåner i bonusskiktet
Om du vill visa dynamiska fördelar baserat på lojalitetsstatus, se exemplet nedan.
API-svar:
| code language-json |
|---|
|
Meddelandepersonalisering:
| code language-handlebars |
|---|
|
Iterera sökresultat för datauppsättningar dataset-lookup
Uppslagsaktiviteten för datauppsättningar gör att du kan hämta data från Adobe Experience Platform-datauppsättningar under körning. De inkapslade data lagras som en array och kan itereras över i dina meddelanden.
Läs mer om hur du konfigurerar uppslagsaktiviteten för datauppsättningar i det här avsnittet. Datauppsättningssökningen är särskilt kraftfull när den kombineras med händelsedata - se Exempel: Händelsedata som har berikats med datauppsättningssökning för ett praktiskt användningsexempel.
Kontextsökväg för datasökningar
<activityID>: Det unika ID:t för datauppsättningsaktivitetenentities: Arrayen med anrikade data som hämtats från datauppsättningen
Exempel: Produktinformation från en datauppsättning
Om du använder en datauppslagsaktivitet för att hämta produktinformation baserat på SKU:er, se exemplet nedan.
Uppslagskonfiguration för datauppsättning:
- Uppslagstangenter:
list(@event{purchase_event.products.sku}) - Fält som ska returneras:
["SKU", "category", "price", "name"]
Meddelandepersonalisering:
| code language-handlebars |
|---|
|
Exempel: Filtrerad iteration med datauppsättningsdata
Om du vill filtrera sökresultat för datauppsättningar under upprepning och bara visa objekt som matchar specifika villkor (t.ex. produkter från en viss kategori) använder du villkorliga {{#if}}-satser i {{#each}} -slingan. Se exemplet nedan.
| code language-handlebars |
|---|
|
Läs mer om villkorsstyrd filtrering i Bästa praxis.
Exempel: Beräkna summor från datauppsättningssökning
Om du vill beräkna och visa summor medan du itererar över datasetsökningsresultat, se exemplet nedan.
| code language-handlebars |
|---|
|
Använd resans tekniska egenskaper technical-properties
Resetekniska egenskaper ger åtkomst till metadata om körningen av resan, som rese-ID och kompletterande identifierare. Dessa kan vara användbara när de kombineras med iterationsmönster, särskilt för att filtrera arrayer baserat på specifika resinstanser.
Tillgängliga tekniska egenskaper
Exempel: Filtrera arrayobjekt med hjälp av tilläggsidentifierare
När du använder tilläggsidentifierare i händelseutlösta resor med matriser kan du filtrera så att bara den relevanta artikeln för den aktuella resinstansen visas. Läs mer om ytterligare identifierare i den här handboken.
Scenario: En resa aktiveras med flera bokningar, men du vill bara visa information för den specifika bokningen (identifieras med ett extra ID) som utlöste den här reseinstansen.
| code language-handlebars |
|---|
|
Exempel: Inkludera rese-ID för spårning
Se exemplet nedan om du vill inkludera rese-ID:t i ditt meddelande för spårningsändamål.
| code language-handlebars |
|---|
|
Kombinera flera sammanhangskällor combine-sources
Ni kan kombinera data från olika källor i samma budskap för att skapa innehållsrika, personaliserade upplevelser. I det här avsnittet visas praktiska exempel på hur du använder flera sammanhangskällor tillsammans.
Kontextkällor som du kan kombinera:
Exempel: Kundvagnsartiklar med realtidslager
Se exemplet nedan om du vill kombinera händelsedata (kundvagnens innehåll) med anpassade åtgärdsdata (lagerstatus).
| code language-handlebars |
|---|
|
Exempel: Händelsedata som har berikats med datasökning
Visa exemplet nedan om du vill kombinera händelse-SKU:er med detaljerad produktinformation från en dataset-sökning.
| code language-handlebars |
|---|
|
Exempel: Kombinera flera källor med tekniska egenskaper
Se exemplet nedan om du vill kombinera flera sammanhangskällor (profildata, händelsedata, anpassade åtgärder och tekniska egenskaper) i ett enda meddelande.
| code language-handlebars |
|---|
|
Andra sammanhangstyper other-contexts
Den här guiden fokuserar på upprepning över arrayer, men det finns andra sammanhangstyper tillgängliga för personalisering som vanligtvis inte kräver upprepning. De här nås direkt i stället för att upprepas:
- Profilattribut (
profile.*): Individuella profilfält från Adobe Experience Platform - Publiker (
inAudience()): Kontroller av målgruppsmedlemskap - Erbjud beslut: Beslutshantering erbjuder
- Målattribut (endast orkestrerade kampanjer): Attribut som beräknas på kampanjarbetsytan
- Token (
context.token): Sessions- eller autentiseringstoken
Fullständig personaliseringssyntax och exempel på hur du använder dessa källor finns i:
Arbeta med arrayer i Journey-uttryck arrays-in-journeys
I de föregående avsnitten fokuseras på att iterera över arrayer i meddelandepersonalisering med hjälp av Handlebars, men du arbetar också med arrayer när du konfigurerar reseaktiviteter. I det här avsnittet beskrivs hur du använder arraydata från händelser i Journey-uttryck, särskilt när du skickar data till anpassade åtgärder eller använder arrayer med datasetuppslag.
first, all och serializeList. I meddelandeinnehåll använder du Handlebars syntax med {{#each}} -slingor.Skicka arrayvärden till anpassade åtgärdsparametrar arrays-to-custom-actions
När du konfigurerar anpassade åtgärder måste du ofta extrahera värden från händelsearrayer och skicka dem som parametrar. I det här avsnittet beskrivs vanliga mönster.
Läs mer om hur du skickar samlingar i Överför samlingar till anpassade åtgärdsparametrar.
Extrahera ett enskilt värde från en array
Använd fall: Hämta ett specifikt fält från en händelsearray som ska skickas som en frågeparameter i en GET-begäran.
Exempelscenario: Extrahera den första SKU:n med ett pris som är större än 0 från en produktlista.
Exempel på händelseschema:
| code language-json |
|---|
|
Anpassad åtgärdskonfiguration:
- Konfigurera en frågeparameter (t.ex.
sku) med typenstringi den anpassade åtgärden - Markera det som
Variableom du vill tillåta dynamiska värden
Reseuttryck i åtgärdsparameter:
| code language-javascript |
|---|
|
Förklaring:
@event{YourEventName}: Refererar till din resehändelse.first(currentEventField.condition): Returnerar det första arrayobjektet som matchar villkoretcurrentEventField: Representerar varje objekt i händelsearrayen när du gör en slinga genom den.SKU: Extraherar SKU-fältet från det matchade objektet- Resultat:
"SKU-1"(en sträng som är lämplig för åtgärdsparametern)
Läs mer om funktionen first i Samlingshanteringsfunktioner.
Skapa en lista med värden från en array
Använd skiftläge: Skapa en kommaavgränsad lista med ID:n som ska skickas som en frågeparameter (t.ex. /products?ids=sku1,sku2,sku3).
Anpassad åtgärdskonfiguration:
- Konfigurera en frågeparameter (till exempel
ids) med typenstring - Markera den som
Variable
Reseuttryck:
| code language-javascript |
|---|
|
Förklaring:
-
.all(currentEventField.condition): Returnerar alla matrisobjekt som matchar villkoret (returnerar en lista) -
currentEventField: Representerar varje objekt i händelsearrayen när du gör en slinga genom den -
.SKU: Projicerar listan så att den bara innehåller SKU-värden -
serializeList(list, delimiter, addQuotes): Kopplar listan till en sträng",": Använd komma som avgränsaretrue: Lägg till citattecken runt varje strängelement
-
Resultat:
"SKU-1,SKU-3"(lämpligt för en frågeparameter)
Läs mer om:
Samlingshantering för anpassade åtgärder beskrivs i Överför samlingar till anpassade åtgärdsparametrar.
Överföra en array med objekt till en anpassad åtgärd
Använd skiftläge: Skicka en fullständig array med objekt i en begärandebrödtext (för POST eller GET med brödtext).
Exempel på begärandetext:
| code language-json |
|---|
|
Anpassad åtgärdskonfiguration:
- Definiera
productssom typlistObjecti begärandetexten - Markera den som
Variable - Definiera objektfälten:
id,name,price,color(varje blir mappningsbart)
Resans arbetsytekonfiguration:
-
I avancerat läge anger du mängduttrycket:
code language-javascript @event{YourEventName.commerce.productListItems.all(currentEventField.priceTotal > 0)} -
I samlingsmappningens användargränssnitt:
- Karta
id→productListItems.SKU - Karta
name→productListItems.name - Karta
price→productListItems.priceTotal - Karta
color→productListItems.color
- Karta
Journey Optimizer konstruerar en array med objekt som matchar din åtgärdsnyttolaststruktur.
| note note |
|---|
| NOTE |
När du arbetar med händelsearrayer använder du currentEventField för att referera till varje objekt. Använd currentDataPackField för datakällsamlingar (Adobe Experience Platform). Använd currentActionField för anpassade åtgärdssvarssamlingar. |
Läs mer i Överför samlingar till anpassade åtgärdsparametrar.
Använda arrayer med datasetsökningar arrays-with-dataset-lookup
När du använder uppslagsaktiviteten för datauppsättningar kan du skicka en array med värden som uppslagsnycklar för att hämta inkapslade data.
Exempel: Sök efter produktinformation för alla SKU:er i en händelsearray.
Uppslagskonfiguration för datauppsättning:
Använd list() i fältet för söknycklar för att konvertera en arraysökväg till en lista:
| code language-javascript |
|---|
|
Då skapas en lista med alla SKU-värden som ska slås upp i datauppsättningen. Resultaten är tillgängliga som en array på context.journey.datasetLookup.<activityID>.entities som du kan iterera igenom i meddelandet (se Upprepa sökresultat för datauppsättningar).
Begränsningar och mönster array-limitations
Tänk på dessa begränsningar när du arbetar med matriser under resor:
Ingen dynamisk slinga över matriser i reseflödet
Det går inte att skapa dynamiska slingor där en åtgärdsnod körs flera gånger för varje objekt i en array. Detta är avsiktligt för att förhindra prestandaproblem vid körning.
Vad du inte kan göra:
- Kör en anpassad åtgärd dynamiskt en gång per arrayobjekt
- Skapa flera resegrenar baserat på matrislängd
Rekommenderade mönster i stället:
-
Skicka alla objekt samtidigt: Skicka hela arrayen eller en serialiserad lista till en anpassad åtgärd som bearbetar alla objekt. Se Skapa en lista med värden från en array.
-
Använd extern aggregering: Låt ditt externa API acceptera flera ID:n och returnera kombinerade resultat i ett enda anrop.
-
Förberäkning i AEP: Använd beräknade attribut för att förberäkna värden från arrayer på profilnivå.
-
Extrahering av enstaka värden: Om du bara behöver ett värde extraherar du det med
firstellerhead. Se Extrahera ett enskilt värde från en array.
Läs mer i Guardrutor och begränsningar.
Överväganden om matrisstorlek
Stora disksystem kan påverka resprestanda:
- Händelsematriser: Behåll händelsens nyttolaster under 50 kB totalt
- Anpassade åtgärdssvar: Svarsnyttolasterna ska vara under 100 kB
- Uppslagsresultat för datauppsättning: Begränsa antalet uppslagsnycklar och returnerade entiteter
Fullständigt exempel: händelsematris till anpassad åtgärd complete-example
Här är ett komplett arbetsflöde som visar hur du använder en händelsearray med en anpassad åtgärd.
Scenario: När en användare överger sin kundvagn skickar du kundvagnsdata till ett externt rekommendations-API för att få anpassade förslag och visar dem sedan i ett e-postmeddelande.
Steg 1: Konfigurera den anpassade åtgärden
Skapa en anpassad åtgärd "GetCartRecommendations":
- Metod: POST
- URL:
https://api.example.com/recommendations - Begärandetext:
| code language-json |
|---|
|
- Markera
cartItemssom typlistObjectochVariable - Definiera fält:
sku(sträng),price(tal),quantity(heltal)
Läs mer i Konfigurera en anpassad åtgärd.
Steg 2: Konfigurera svarsnyttolast
Konfigurera svaret i den anpassade åtgärden:
| code language-json |
|---|
|
Läs mer i Använd API-anropssvar.
Steg 3: Vidga åtgärden i resan
-
Lägg till den anpassade åtgärden efter kundvagnsöverhoppningen
-
I avancerat läge för samlingen
cartItems:code language-javascript @event{cartAbandonment.commerce.productListItems.all(currentEventField.quantity > 0)} -
Mappa samlingsfälten:
sku→productListItems.SKUprice→productListItems.priceTotalquantity→productListItems.quantity
Steg 4: Använd svaret i ditt e-postmeddelande
Upprepa rekommendationerna i ditt e-postinnehåll:
| code language-handlebars |
|---|
|
Steg 5: Testa konfigurationen
Innan du kör en direktresa testar du den anpassade åtgärden med funktionen"Skicka testbegäran" i åtgärdskonfigurationen för att verifiera den inbyggda begäran och värdena.
- Använd provningsläget för resan
- Utlös med exempelhändelsedata som innehåller en
productListItems-array - Verifiera att den anpassade åtgärden tar emot rätt matrisstruktur
- Kontrollera åtgärdstestloggarna
- Förhandsgranska e-postmeddelandet för att bekräfta att båda arrayerna visas korrekt
Läs mer i Felsöka anpassade åtgärder.
Bästa praxis best-practices
Följ dessa metodtips när du itererar över kontextuella data för att skapa underhållande, högpresterande personalisering.
Använd beskrivande variabelnamn
Välj variabelnamn som tydligt anger vad du itererar över. Detta gör koden mer läsbar och enklare att underhålla. Läs mer om personaliseringssyntax:
| code language-handlebars |
|---|
|
Uttrycksfragment i slingor
När du använder uttrycksfragment i {{#each}} -slingor bör du vara medveten om att du inte kan skicka loopomfattade variabler som fragmentparametrar. Fragment kan dock komma åt globala variabler som är definierade i meddelandeinnehållet utanför fragmentet.
Mönster som stöds - Använd globala variabler:
| code language-handlebars |
|---|
|
Fragmentet kan referera till globalDiscount eftersom det har definierats globalt i meddelandet.
Stöds inte - skicka loopvariabler:
| code language-handlebars |
|---|
|
Tillfällig lösning: Inkludera personaliseringslogiken direkt i slingan i stället för att använda ett fragment, eller anropa fragmentet utanför slingan.
Läs mer om att använda uttrycksfragment i slingor, inklusive detaljerade exempel och ytterligare tillfälliga lösningar.
Hantera tomma arrayer
Använd {{else}}-satsen för att tillhandahålla reservinnehåll när en matris är tom. Läs mer om hjälpfunktioner:
| code language-handlebars |
|---|
|
Kombinera med villkorliga hjälpmedel
Använd {{#if}} i slingor för villkorligt innehåll. Läs mer om villkorliga regler och se exempel i avsnitten Anpassade åtgärder och Datauppsättningssökning.
| code language-handlebars |
|---|
|
Begränsa iteration för prestanda
För stora arrayer bör du överväga att begränsa antalet iterationer:
| code language-handlebars |
|---|
|
Åtkomst till arraymetadata
Handlebars innehåller speciella variabler i slingor som hjälper till med avancerade iterationsmönster:
@index: Aktuellt upprepningsindex (0-baserat)@first: Sant för den första iterationen@last: Sant för den senaste upprepningen
| code language-handlebars |
|---|
|
@index, @first, @last) är bara tillgängliga i {{#each}} -slingor i meddelandepersonalisering. Om du arbetar med arrayer i Journey-uttryck (till exempel hämtar det första objektet från en array innan det skickas till en anpassad åtgärd) använder du arrayfunktioner som head, first eller all. Mer information finns i Arbeta med arrayer i Journey-uttryck.Felsökning troubleshooting
Har du problem med upprepningen? I det här avsnittet beskrivs vanliga problem och lösningar.
Matrisen visas inte
Problem: Din arrayiteration visar inget innehåll.
Möjliga orsaker och lösningar:
-
Felaktig sökväg: Verifiera den exakta sökvägen till arrayen baserat på kontextkällan:
- För händelser:
context.journey.events.<event_ID>.<fieldPath> - För anpassade åtgärder:
context.journey.actions.<actionName>.<fieldPath> - För datasökningar:
context.journey.datasetLookup.<activityID>.entities
- För händelser:
-
Arrayen är tom: Lägg till en
{{else}}-sats för att kontrollera om arrayen saknar data. Exempel finns i Bästa tillvägagångssätt. -
Data är inte tillgängliga än: Kontrollera att aktiviteten för anpassad åtgärd, händelse eller sökning efter datauppsättningar har körts innan meddelandeaktiviteten i ditt kundflöde.
Syntaxfel
Problem: Uttrycksvalideringen misslyckas eller meddelandet återges inte.
Vanliga misstag:
- Avslutande taggar saknas: Varje
{{#each}}måste ha en{{/each}}. Granska Interaktionssyntaxen för att se om strukturen är korrekt. - Felaktigt variabelnamn: Kontrollera att variabelnamnet används konsekvent genom hela blocket. Mer information om namnkonventioner finns i Bästa tillvägagångssätt.
- Felaktiga sökvägsavgränsare: Använd punkter (
.), inte snedstreck eller andra tecken
Uttrycksfragment fungerar inte i slingor
Problem: Ett uttrycksfragment visar inte förväntat innehåll när det används i en {{#each}}-slinga eller visar tomma/oväntade utdata.
Möjliga orsaker och lösningar:
-
Försöker skicka loopvariabler som parametrar: Uttrycksfragment kan inte ta emot loopomfångsvariabler (som det aktuella upprepningsobjektet) som parametrar. Detta är en känd begränsning.
Lösning: Använd något av följande tillfälliga lösningar:
- Definiera globala variabler i meddelandet som fragmentet kan komma åt
- Inkludera personaliseringslogiken direkt i slingan i stället för att använda ett fragment
- Anropa fragmentet utanför slingan om det inte behöver loopspecifika data
-
Fragment förväntar sig en parameter som inte är tillgänglig: Om fragmentet har utformats för att ta emot specifika indataparametrar fungerar det inte korrekt när dessa parametrar inte kan skickas från en slinga.
Lösning: Strukturera om ditt tillvägagångssätt så att du kan använda globala variabler som fragmentet har åtkomst till. Se God praxis - Uttrycksfragment i slingor för exempel.
-
Felaktigt variabelomfång: Fragmentet kanske försöker referera till en variabel som bara finns inom slingomfånget.
Lösning: Definiera alla variabler som fragmentet behöver på meddelandenivå (utanför slingan) så att de är globalt tillgängliga.
Läs mer om att använda uttrycksfragment i slingor, inklusive detaljerade förklaringar, exempel och rekommenderade mönster.
Testa dina iterationer
Använd testläget för resan för att verifiera dina iterationer. Detta är särskilt viktigt när du använder anpassade åtgärder eller datauppsättningssökningar:
- Starta din resa i testläge
- Utlös händelsen eller den anpassade åtgärden med exempeldata
- Kontrollera förhandsgranskningen av meddelandet för att verifiera att iterationen visas korrekt
- Granska testlägesloggar för eventuella fel (se Loggar för testläge för anpassade åtgärder)
Relaterade ämnen related-topics
Grundläggande om Personalization: Kom igång med personalisering | Lägg till personalisering | Personalization-syntax | Hjälpfunktioner | Skapa villkorliga regler
Resekonfiguration: Om händelser | Konfigurera anpassade åtgärder | Skicka samlingar till anpassade åtgärdsparametrar | Använd API-anropssvar i anpassade åtgärder | Felsöka anpassade åtgärder | Använd Adobe Experience Platform-data på resor | Använd extra identifierare på resor | Skyddsritningar och begränsningar | Testa din resa
Reseuttrycksfunktioner: Avancerad uttrycksredigerare | Funktioner för samlingshantering (först, alla, sist) | Listfunktioner (serializeList, filter, sort) | Arrayfunktioner (head, tail)
Användningsexempel för Personalization: E-post om att kunden har lämnat en kundvagn | Meddelande om orderstatus
Meddelandedesign: Kom igång med e-postdesign | Skapa push-meddelanden | Skapa SMS-meddelanden | Förhandsgranska och testa ditt innehåll