Anpassa Adobe-klientdatalagret med AEM customize-data-layer
Lär dig hur du anpassar datalagret för klienten i Adobe med innehåll från anpassade AEM. Lär dig hur du använder API:er från AEM Core Components för att utöka och anpassa datalagret.
Vad du ska bygga
I den här självstudiekursen ska vi utforska olika alternativ för att utöka datalagret för Adobe-klienten genom att uppdatera WKND-komponenten Byline. Komponenten Byline är en anpassad komponent och lektioner som du lär dig i den här självstudiekursen kan användas i andra anpassade komponenter.
Mål objective
- Mata in komponentdata i datalagret genom att utöka en Sling-modell och komponent-HTML
- Använd Core Component Data Layer-verktyg för att minska arbetsinsatsen
- Använd Core Component-dataattribut för att knyta till befintliga datalagerhändelser
Förutsättningar prerequisites
En lokal utvecklingsmiljö krävs för att slutföra den här självstudien. Skärmbilder och video spelas in med AEM as a Cloud Service SDK som körs på en macOS. Kommandon och kod är oberoende av det lokala operativsystemet om inget annat anges.
Ny på AEM as a Cloud Service? Titta i följande guide för att konfigurera en lokal utvecklingsmiljö med AEM as a Cloud Service SDK.
Har du inte använt AEM 6.5 tidigare? Titta i följande guide för att konfigurera en lokal utvecklingsmiljö.
Hämta och distribuera WKND Reference-webbplatsen set-up-wknd-site
Den här självstudien utökar Byline-komponenten på WKND-referensplatsen. Klona och installera WKND-kodbasen i din lokala miljö.
-
Starta en lokal QuickStart author-instans av AEM som körs på http://localhost:4502.
-
Öppna ett terminalfönster och klona WKND-kodbasen med Git:
code language-shell $ git clone git@github.com:adobe/aem-guides-wknd.git
-
Distribuera WKND-kodbasen till en lokal instans av AEM:
code language-shell $ cd aem-guides-wknd $ mvn clean install -PautoInstallSinglePackage
note note NOTE För AEM 6.5 och senaste Service Pack lägger du till profilen classic
i kommandot Maven:mvn clean install -PautoInstallSinglePackage -Pclassic
-
Öppna ett nytt webbläsarfönster och logga in på AEM. Öppna en tidskriftssida som: http://localhost:4502/content/wknd/us/en/magazine/guide-la-skateparks.html.
Du bör se ett exempel på den Byline-komponent som har lagts till på sidan som en del av ett Experience Fragment. Du kan visa Experience Fragment på http://localhost:4502/editor.html/content/experience-fragments/wknd/language-masters/en/contributors/stacey-roswells/byline.html
-
Öppna dina utvecklarverktyg och ange följande kommando i konsolen:
code language-js window.adobeDataLayer.getState();
Om du vill se det aktuella läget för datalagret på en AEM plats kontrollerar du svaret. Du bör se information om sidan och enskilda komponenter.
Observera att komponenten Byline inte finns med i datalagret.
Uppdatera modellen Byline Sling sling-model
Om du vill mata in data om komponenten i datalagret uppdaterar vi först komponentens Sling Model. Uppdatera sedan Bylines Java™-gränssnitt och Sling Model-implementering så att den nya metoden getData()
finns. Den här metoden innehåller de egenskaper som ska injiceras i datalagret.
-
Öppna projektet
aem-guides-wknd
i den utvecklingsmiljö du vill använda. Navigera till modulencore
. -
Öppna filen
Byline.java
vidcore/src/main/java/com/adobe/aem/guides/wknd/core/models/Byline.java
. -
Lägg till nedanstående metod i gränssnittet:
code language-java public interface Byline { ... /*** * Return data about the Byline Component to populate the data layer * @return String */ String getData(); }
-
Öppna filen
BylineImpl.java
vidcore/src/main/java/com/adobe/aem/guides/wknd/core/models/impl/BylineImpl.java
. Det är implementeringen av gränssnittetByline
och implementeras som en Sling-modell. -
Lägg till följande importsatser i början av filen:
code language-java import java.util.HashMap; import java.util.Map; import org.apache.sling.api.resource.Resource; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.adobe.cq.wcm.core.components.util.ComponentUtils;
fasterxml.jackson
API:er används för att serialisera data som ska visas som JSON.ComponentUtils
AEM kärnkomponenter används för att kontrollera om datalagret är aktiverat. -
Lägg till den oimplementerade metoden
getData()
iBylineImple.java
:code language-java public class BylineImpl implements Byline { ... @Override public String getData() { Resource bylineResource = this.request.getResource(); // Use ComponentUtils to verify if the DataLayer is enabled if (ComponentUtils.isDataLayerEnabled(bylineResource)) { //Create a map of properties we want to expose Map<String, Object> bylineProperties = new HashMap<String,Object>(); bylineProperties.put("@type", bylineResource.getResourceType()); bylineProperties.put("name", this.getName()); bylineProperties.put("occupation", this.getOccupations()); bylineProperties.put("fileReference", image.getFileReference()); //Use AEM Core Component utils to get a unique identifier for the Byline component (in case multiple are on the page) String bylineComponentID = ComponentUtils.getId(bylineResource, this.currentPage, this.componentContext); // Return the bylineProperties as a JSON String with a key of the bylineResource's ID try { return String.format("{\"%s\":%s}", bylineComponentID, // Use the ObjectMapper to serialize the bylineProperties to a JSON string new ObjectMapper().writeValueAsString(bylineProperties)); } catch (JsonProcessingException e) { LOGGER.error("Unable to generate dataLayer JSON string", e); } } // return null if the Data Layer is not enabled return null; } }
I ovanstående metod används en ny
HashMap
för att hämta de egenskaper som ska visas som JSON. Observera att befintliga metoder somgetName()
ochgetOccupations()
används.@type
representerar komponentens unika resurstyp, vilket gör att en klient enkelt kan identifiera händelser och/eller utlösare baserat på komponenttypen.ObjectMapper
används för att serialisera egenskaperna och returnera en JSON-sträng. Denna JSON-sträng kan sedan infogas i datalagret. -
Öppna ett terminalfönster. Skapa och distribuera bara modulen
core
med dina Maven-kunskaper:code language-shell $ cd aem-guides-wknd/core $ mvn clean install -PautoInstallBundle
Uppdatera Byline-HTML htl
Uppdatera sedan Byline
HTML. HTML (HTML Template Language) är den mall som används för att återge komponentens HTML.
Ett särskilt dataattribut data-cmp-data-layer
för varje AEM används för att visa dess datalager. JavaScript som tillhandahålls av AEM Core Components letar efter det här dataattributet. Värdet för det här dataattributet fylls i med JSON-strängen som returneras av Byline Sling-modellens getData()
-metod och matas in i Adobe-klientdatalagret.
-
Öppna projektet
aem-guides-wknd
i IDE. Navigera till modulenui.apps
. -
Öppna filen
byline.html
vidui.apps/src/main/content/jcr_root/apps/wknd/components/byline/byline.html
. -
Uppdatera
byline.html
om du vill inkludera attributetdata-cmp-data-layer
:code language-diff <div data-sly-use.byline="com.adobe.aem.guides.wknd.core.models.Byline" data-sly-use.placeholderTemplate="core/wcm/components/commons/v1/templates.html" data-sly-test.hasContent="${!byline.empty}" + data-cmp-data-layer="${byline.data}" class="cmp-byline"> ...
Värdet för
data-cmp-data-layer
har angetts till"${byline.data}"
därbyline
är den tidigare uppdaterade delningsmodellen..data
är standardnotation för anrop av Java™ Getter-metoden i HTML-koden förgetData()
som implementerades i föregående övning. -
Öppna ett terminalfönster. Skapa och distribuera bara modulen
ui.apps
med dina Maven-kunskaper:code language-shell $ cd aem-guides-wknd/ui.apps $ mvn clean install -PautoInstallPackage
-
Gå tillbaka till webbläsaren och öppna sidan igen med en Byline-komponent: http://localhost:4502/content/wknd/us/en/magazine/guide-la-skateparks.html.
-
Öppna utvecklingsverktygen och kontrollera HTML-källan för sidan för att se om det finns en Byline-komponent:
Du bör se att
data-cmp-data-layer
har fyllts i med JSON-strängen från Sling-modellen. -
Öppna webbläsarens utvecklarverktyg och ange följande kommando i konsolen:
code language-js window.adobeDataLayer.getState();
-
Navigera under svaret under
component
för att hitta instansen av komponentenbyline
som har lagts till i datalagret:med penna
Du bör se ett inlägg som följande:
code language-json byline-136073cfcb: @type: "wknd/components/byline" fileReference: "/content/dam/wknd/en/contributors/stacey-roswells.jpg" name: "Stacey Roswells" occupation: (3) ["Artist", "Photographer", "Traveler"] parentId: "page-30d989b3f8"
Observera att de egenskaper som visas är samma som läggs till i
HashMap
i segmentmodellen.
Lägg till en klickningshändelse click-event
Adobe-klientdatalagret är händelsestyrt och en av de vanligaste händelserna som utlöser en åtgärd är cmp:click
-händelsen. AEM Core-komponenterna gör det här enkelt att registrera komponenten med hjälp av dataelementet: data-cmp-clickable
.
Klickbara element är vanligtvis en CTA-knapp eller en navigeringslänk. Tyvärr har inte komponenten Byline någon av dessa men vi måste registrera den ändå eftersom det kan vara vanligt för andra anpassade komponenter.
-
Öppna modulen
ui.apps
i din IDE -
Öppna filen
byline.html
vidui.apps/src/main/content/jcr_root/apps/wknd/components/byline/byline.html
. -
Uppdatera
byline.html
så att attributetdata-cmp-clickable
inkluderas i Bylines name-element:code language-diff <h2 class="cmp-byline__name" + data-cmp-clickable="${byline.data ? true : false}"> ${byline.name} </h2>
-
Öppna en ny terminal. Skapa och distribuera bara modulen
ui.apps
med dina Maven-kunskaper:code language-shell $ cd aem-guides-wknd/ui.apps $ mvn clean install -PautoInstallPackage
-
Gå tillbaka till webbläsaren och öppna sidan igen med komponenten Byline tillagd: http://localhost:4502/content/wknd/us/en/magazine/guide-la-skateparks.html.
För att testa vår aktivitet lägger vi till JavaScript manuellt med hjälp av utvecklarkonsolen. Se Använda Adobe-klientdatalagret med AEM kärnkomponenter för en video om hur du gör detta.
-
Öppna webbläsarens utvecklarverktyg och ange följande metod i konsolen:
code language-javascript function bylineClickHandler(event) { var dataObject = window.adobeDataLayer.getState(event.eventInfo.path); if (dataObject != null && dataObject['@type'] === 'wknd/components/byline') { console.log("Byline Clicked!"); console.log("Byline name: " + dataObject['name']); } }
Den här enkla metoden bör hantera klickningen på namnet på komponenten Byline.
-
Ange följande metod i konsolen:
code language-javascript window.adobeDataLayer.push(function (dl) { dl.addEventListener("cmp:click", bylineClickHandler); });
Ovanstående metod överför en händelseavlyssnare till datalagret för att avlyssna händelsen
cmp:click
och anroparbylineClickHandler
.note caution CAUTION Det är viktigt inte att uppdatera webbläsaren under övningen, annars försvinner konsolen JavaScript. -
I webbläsaren klickar du på författarens namn i Byline-komponenten när konsolen är öppen:
Du bör se konsolmeddelandet
Byline Clicked!
och namnet på byteboken.Händelsen
cmp:click
är enklast att koppla in sig i. För mer komplexa komponenter och för att spåra andra beteenden är det möjligt att lägga till anpassade JavaScript för att lägga till och registrera nya händelser. Ett bra exempel är Carousel-komponenten, som utlöser encmp:show
-händelse när en bild växlas. Mer information finns i källkoden.
Använda verktyget DataLayerBuilder data-layer-builder
När Sling Model uppdaterades tidigare i kapitlet valde vi att skapa JSON-strängen med en HashMap
och ange var och en av egenskaperna manuellt. Den här metoden fungerar bra för små engångskomponenter, men för komponenter som utökar AEM Core Components kan det resultera i mycket extra kod.
Det finns en verktygsklass, DataLayerBuilder
, som kan utföra de flesta grova lyftningarna. Detta gör att implementeringar kan utöka bara de egenskaper de vill ha. Vi uppdaterar Sling-modellen så att DataLayerBuilder
används.
-
Återgå till IDE och navigera till modulen
core
. -
Öppna filen
Byline.java
vidcore/src/main/java/com/adobe/aem/guides/wknd/core/models/Byline.java
. -
Ändra metoden
getData()
för att returnera typenComponentData
code language-java import com.adobe.cq.wcm.core.components.models.datalayer.ComponentData; ... public interface Byline { ... /*** * Return data about the Byline Component to populate the data layer * @return ComponentData */ ComponentData getData(); }
ComponentData
är ett objekt som tillhandahålls av AEM kärnkomponenter. Det resulterar i en JSON-sträng, precis som i det föregående exemplet, men utför även en hel del extraarbete. -
Öppna filen
BylineImpl.java
vidcore/src/main/java/com/adobe/aem/guides/wknd/core/models/impl/BylineImpl.java
. -
Lägg till följande importsatser:
code language-java import com.adobe.cq.wcm.core.components.models.datalayer.ComponentData; import com.adobe.cq.wcm.core.components.models.datalayer.builder.DataLayerBuilder;
-
Ersätt metoden
getData()
med följande:code language-java @Override public ComponentData getData() { Resource bylineResource = this.request.getResource(); // Use ComponentUtils to verify if the DataLayer is enabled if (ComponentUtils.isDataLayerEnabled(bylineResource)) { return DataLayerBuilder.extending(getImage().getData()).asImageComponent() .withTitle(this::getName) .build(); } // return null if the Data Layer is not enabled return null; }
Komponenten Byline återanvänder delar av Image Core Component för att visa en bild som representerar författaren. I ovanstående kodutdrag används DataLayerBuilder för att utöka datalagret för komponenten
Image
. JSON-objektet fylls i automatiskt med alla data om bilden som används. Den utför även några av rutinfunktionerna som att ställa in@type
och komponentens unika identifierare. Observera att metoden är liten!Den enda egenskapen utökade
withTitle
som ersätts med värdetgetName()
. -
Öppna ett terminalfönster. Skapa och distribuera bara modulen
core
med dina Maven-kunskaper:code language-shell $ cd aem-guides-wknd/core $ mvn clean install -PautoInstallBundle
-
Återgå till IDE och öppna filen
byline.html
underui.apps
-
Uppdatera HTML så att
byline.data.json
används för att fylla i attributetdata-cmp-data-layer
:code language-diff <div data-sly-use.byline="com.adobe.aem.guides.wknd.core.models.Byline" data-sly-use.placeholderTemplate="core/wcm/components/commons/v1/templates.html" data-sly-test.hasContent="${!byline.empty}" - data-cmp-data-layer="${byline.data}" + data-cmp-data-layer="${byline.data.json}"
Kom ihåg att vi nu returnerar ett objekt av typen
ComponentData
. Det här objektet innehåller en get-metodgetJson()
och det används för att fylla i attributetdata-cmp-data-layer
. -
Öppna ett terminalfönster. Skapa och distribuera bara modulen
ui.apps
med dina Maven-kunskaper:code language-shell $ cd aem-guides-wknd/ui.apps $ mvn clean install -PautoInstallPackage
-
Gå tillbaka till webbläsaren och öppna sidan igen med komponenten Byline tillagd: http://localhost:4502/content/wknd/us/en/magazine/guide-la-skateparks.html.
-
Öppna webbläsarens utvecklarverktyg och ange följande kommando i konsolen:
code language-js window.adobeDataLayer.getState();
-
Navigera under svaret under
component
för att hitta instansen av komponentenbyline
:Du bör se ett inlägg som följande:
code language-json byline-136073cfcb: @type: "wknd/components/byline" dc:title: "Stacey Roswells" image: @type: "image/jpeg" repo:id: "142658f8-4029-4299-9cd6-51afd52345c0" repo:modifyDate: "2019-10-25T23:49:51Z" repo:path: "/content/dam/wknd/en/contributors/stacey-roswells.jpg" xdm:tags: [] parentId: "page-30d989b3f8" repo:modifyDate: "2019-10-18T20:17:24Z"
Observera att det nu finns ett
image
-objekt ibyline
-komponentposten. Här finns mycket mer information om resursen i DAM. Observera också att@type
och det unika ID:t (i det här falletbyline-136073cfcb
) har fyllts i automatiskt och attrepo:modifyDate
anger när komponenten ändrades.
Ytterligare exempel additional-examples
-
Ett annat exempel på hur du utökar datalagret kan visas genom att undersöka komponenten
ImageList
i WKND-kodbasen:ImageList.java
- Java-gränssnittet i modulencore
.ImageListImpl.java
- Sling Model i modulencore
.image-list.html
- HTML-mall i modulenui.apps
.
note note NOTE Det är lite svårare att inkludera anpassade egenskaper som occupation
när DataLayerBuilder används. Men om du utökar en Core-komponent som innehåller en bild eller sida sparar verktyget mycket tid.note note NOTE Om du skapar ett avancerat datalager för objekt som återanvänds under en implementering bör du extrahera datalagrets element till deras egna datalagerspecifika Java™-objekt. Commerce Core Components har till exempel lagt till gränssnitt för ProductData
ochCategoryData
eftersom dessa kan användas på många komponenter i en Commerce-implementering. Granska koden i rapporten om aem-cif-core-components om du vill ha mer information.
Grattis! congratulations
Du har utforskat några sätt att utöka och anpassa datalagret för klienten i Adobe med AEM komponenter!