Utöka en AEM Screens-komponent
I följande självstudiekurs går du igenom de olika stegen och de bästa sätten att utöka AEM Screens-komponenterna direkt. Bildkomponenten utökas för att lägga till en redigerbar textövertäckning.
Ökning overview
Den här självstudiekursen är avsedd för utvecklare som inte har använt AEM Screens tidigare. I den här självstudiekursen utökas Screens Image-komponenten för att skapa en Poster-komponent. En titel, beskrivning och logotyp läggs ovanpå en bild för att skapa en övertygande upplevelse i en sekvenskanal.
En Custom Poster-komponent skapas genom att bildkomponenten utökas.
Förutsättningar prerequisites
Du behöver följande för att kunna slutföra den här självstudiekursen:
- AEM 6.5 + Senaste Screens Feature Pack
- AEM Screens Player
- Lokal utvecklingsmiljö
Självstudiestegen och skärmbilderna utförs med CRXDE-Lite. Eclipse eller IntelliJ IDE:er kan också användas för att slutföra självstudiekursen. Mer information om hur du använder en IDE för att utveckla med AEM finns här.
Projektinställningar project-setup
Ett Screens-projekts källkod hanteras vanligtvis som ett Maven-projekt med flera moduler. För att underlätta självstudiekursen har ett projekt förskapats med AEM Project Archetype 13. Mer information om att skapa ett projekt med Maven AEM Project Archetype finns här.
- Hämta och installera följande paket med CRX package manage
http://localhost:4502/crx/packmgr/index.jsp)r:
Hämta fil
Om du vill kan du hämta källpaketet nedan om du arbetar med Eclipse eller någon annan IDE. Distribuera projektet till en lokal AEM-instans med kommandot Maven:
mvn -PautoInstallPackage clean install
SRC Starta Screens We.Retail Kör projekt
-
I CRX Package Manager
http://localhost:4502/crx/packmgr/index.jspär följande två paket installerade:screens-weretail-run.ui.content-0.0.1-SNAPSHOT.zipscreens-weretail-run.ui.apps-0.0.1-SNAPSHOT.zip
AEM Screens
We.Retail Run Ui.Apps- ochUi.Content-paket som installeras med CRX Package Manager
Skapa komponenten Poster poster-cmp
Komponenten Poster utökar den färdiga AEM Screens Image-komponenten. En mekanism med Sling, sling:resourceSuperType, används för att ärva huvudfunktionerna i Image-komponenten utan att behöva kopiera och klistra in. Mer information om grunderna i Bearbetning av delningsbegäran finns här.
Komponenten Poster återges i helskärmsläge i förhandsgransknings-/produktionsläge. I redigeringsläge är det viktigt att återge komponenten på ett annat sätt för att underlätta redigering av sekvenskanalen.
-
I CRXDE-Lite
http://localhost:4502/crx/de/index.jsp(eller valfri IDE) under/apps/weretail-run/components/contentskapar du encq:Componentmed namnetposter.Lägg till följande egenskaper i komponenten
poster:code language-xml <?xml version="1.0" encoding="UTF-8"?> <jcr:root xmlns:sling="https://sling.apache.org/jcr/sling/1.0" xmlns:cq="https://www.day.com/jcr/cq/1.0" xmlns:jcr="https://www.jcp.org/jcr/1.0" jcr:primaryType="cq:Component" jcr:title="Poster" sling:resourceSuperType="screens/core/components/content/image" componentGroup="We.Retail Run - Content"/>
Egenskaper för /apps/weretail-run/components/content/affisch
Genom att ställa in egenskapen
sling:resourceSuperTypepåscreens/core/components/content/imageärver Poster-komponenten alla funktioner i Image-komponenten. Likvärdiga noder och filer som hittas underscreens/core/components/content/imagekan läggas till under komponentenposterför att åsidosätta och utöka funktionen. -
Kopiera noden
cq:editConfigunder/libs/screens/core/components/content/image. Klistra incq:editConfigunder komponenten/apps/weretail-run/components/content/poster.Uppdatera egenskapen
sling:resourceTypetill lika medweretail-run/components/content/posterpå nodencq:editConfig/cq:dropTargets/image/parameters.
XML-representation av
cq:editConfigsom visas nedan:code language-xml <?xml version="1.0" encoding="UTF-8"?> <jcr:root xmlns:sling="https://sling.apache.org/jcr/sling/1.0" xmlns:cq="https://www.day.com/jcr/cq/1.0" xmlns:jcr="https://www.jcp.org/jcr/1.0" xmlns:nt="https://www.jcp.org/jcr/nt/1.0" jcr:primaryType="cq:EditConfig"> <cq:dropTargets jcr:primaryType="nt:unstructured"> <image jcr:primaryType="cq:DropTargetConfig" accept="[image/.*]" groups="[media]" propertyName="./fileReference"> <parameters jcr:primaryType="nt:unstructured" sling:resourceType="weretail-run/components/content/poster" imageCrop="" imageMap="" imageRotate=""/> </image> </cq:dropTargets> </jcr:root> -
Kopiera dialogrutan
imageför WCM Foundation som ska användas för komponentenposter.Det är enklast att börja från en befintlig dialogruta och sedan göra ändringar.
- Kopiera dialogrutan från:
/libs/wcm/foundation/components/image/cq:dialog - Klistra in dialogrutan under
/apps/weretail-run/components/content/poster
Dialogrutan har kopierats från
/libs/wcm/foundation/components/image/cq:dialogtill/apps/weretail-run/components/content/posterAEM Screens
image-komponenten är supertypad till WCM Foundationimage-komponenten. Därför ärver komponentenposterfunktioner från båda. Dialogrutan för förhandsgranskningskomponenten består av en kombination av dialogrutorna Screens och Foundation. Funktionerna iSling Resource Mergeranvänds för att dölja irrelevanta dialogrutefält och flikar som ärvs från de överordnade typkomponenterna. - Kopiera dialogrutan från:
-
Uppdatera
cq:dialogunder/apps/weretail-run/components/content/postermed följande ändringar representerade i XML:code language-xml <?xml version="1.0" encoding="UTF-8"?> <jcr:root xmlns:sling="https://sling.apache.org/jcr/sling/1.0" xmlns:cq="https://www.day.com/jcr/cq/1.0" xmlns:jcr="https://www.jcp.org/jcr/1.0" xmlns:nt="https://www.jcp.org/jcr/nt/1.0" jcr:primaryType="nt:unstructured" jcr:title="Poster" sling:resourceType="cq/gui/components/authoring/dialog"> <content jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/container"> <layout jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/layouts/tabs" type="nav"/> <items jcr:primaryType="nt:unstructured"> <image jcr:primaryType="nt:unstructured" jcr:title="Elements" sling:resourceType="granite/ui/components/foundation/section"> <layout jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/layouts/fixedcolumns" margin="{Boolean}false"/> <items jcr:primaryType="nt:unstructured"> <column jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/container"> <items jcr:primaryType="nt:unstructured" sling:hideChildren="[linkURL,size]"> <file jcr:primaryType="nt:unstructured" sling:resourceType="cq/gui/components/authoring/dialog/fileupload" autoStart="{Boolean}false" class="cq-droptarget" fieldLabel="Image asset" fileNameParameter="./fileName" fileReferenceParameter="./fileReference" mimeTypes="[image]" multiple="{Boolean}false" name="./file" title="Upload Image Asset" uploadUrl="${suffix.path}" useHTML5="{Boolean}true"/> <title jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/form/textfield" fieldLabel="Title" name="./jcr:title"/> <description jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/form/textarea" fieldLabel="Description" name="./jcr:description"/> <position jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/click" fieldLabel="Text Position" name="./textPosition"> <items jcr:primaryType="nt:unstructured"> <left jcr:primaryType="nt:unstructured" text="Left" value="left"/> <center jcr:primaryType="nt:unstructured" text="Center" value="center"/> <right jcr:primaryType="nt:unstructured" text="Right" value="right"/> </items> </position> <color jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/click" fieldLabel="Text Color" name="./textColor"> <items jcr:primaryType="nt:unstructured"> <light jcr:primaryType="nt:unstructured" text="Light" value="light"/> <dark jcr:primaryType="nt:unstructured" text="Dark" value="dark"/> </items> </color> </items> </column> </items> </image> <accessibility jcr:primaryType="nt:unstructured" sling:hideResource="{Boolean}true"/> </items> </content> </jcr:root>Egenskapen
sling:hideChildren="[linkURL,size]används på nodenitemsför att säkerställa att fälten linkURL och size döljs i dialogrutan. Det räcker inte att ta bort de här noderna från förhandsgranskningsdialogrutan. Egenskapensling:hideResource="{Boolean}true"på fliken Tillgänglighet används för att dölja hela fliken.Dubbelklicksfält läggs till i dialogrutan, Textplacering och Textfärg, så att författaren kan styra textens position och färgen för titeln och beskrivningen.
Affisch - Slutlig dialogstruktur
Nu kan en instans av komponenten
posterläggas till på sidan Inaktiv kanal iWe.RetailKör projekt:http://localhost:4502/editor.html/content/screens/we-retail-run/channels/idle-channel.edit.html.
Dialogrutefält för förhandsgranskning
-
Skapa en fil under
/apps/weretail-run/components/content/postermed namnetproduction.html.Fyll filen med följande:
code language-xml <!--/* /apps/weretail-run/components/content/poster/production.html */--> <div data-sly-use.image="image.js" data-duration="${properties.duration}" class="cmp-poster" style="background-image: url(${request.contextPath @ context='uri'}${image.src @ context='uri'});"> <div class="cmp-poster__text cmp-poster__text--${properties.textPosition @ context='attribute'} cmp-poster__text--${properties.textColor @ context='attribute'}"> <h1 class="cmp-poster__title">${properties.jcr:title}</h1> <h2 class="cmp-poster__description">${properties.jcr:description}</h2> </div> <img class="cmp-poster__logo" src="/content/dam/we-retail-run/logos/we-retail-run_dark.png" alt="we-retail-logo" /> </div>Produktionsmärkningen för komponenten Poster visas direkt ovanför. HTL-skriptet åsidosätter
screens/core/components/content/image/production.html.image.jsär ett serverskript som skapar ett POJO-liknande bildobjekt. Bildobjektet kan sedan anropas för att återgesrcsom en bakgrundsbild i textformat.The h1och h2-taggar läggs till visar titel och beskrivning baserat på komponentegenskaperna:${properties.jcr:title}och${properties.jcr:description}.Omgivande
h1- ochh2-taggar är en div-wrapper med tre CSS-klasser med variationer avcmp-poster__text. Värdet för egenskapernatextPositionochtextColoranvänds för att ändra CSS-klassen som återges baserat på författarens dialogrutemarkering. I nästa avsnitt skrivs CSS från klientbibliotek för att aktivera dessa ändringar i visningen.En logotyp ingår också som ett överlägg i komponenten. I det här exemplet är sökvägen till logotypen
We.Retailhårdkodad i DAM. Beroende på användningsfallet kan det vara mer praktiskt att skapa ett dialogfält för att göra logotypsökvägen till ett dynamiskt ifyllt värde.Observera också att BEM-notation (Block Element Modifier) används med komponenten. BEM är en CSS-kodkonvention som gör det enklare att skapa återanvändbara komponenter. BEM är den notation som används av AEM Core Components.
-
Skapa en fil under
/apps/weretail-run/components/content/postermed namnetedit.html.Fyll filen med följande:
code language-xml <!--/* /apps/weretail-run/components/content/poster/edit.html */--> <div class="aem-Screens-editWrapper ${image.cssClass} cmp-poster" data-sly-use.image="image.js" data-emptytext="${'Poster' @ i18n, locale=request.locale}"> <img class="cmp-poster__image" src="${request.contextPath}${image.src @ context='uri'}" width="100%" /> <div class="cmp-poster__text cmp-poster__text--${properties.textPosition @ context='attribute'} cmp-poster__text--${properties.textColor @ context='attribute'}"> <p class="cmp-poster__title">${properties.jcr:title}</p> <p class="cmp-poster__description">${properties.jcr:description}</p> </div> </div>Markeringen redigerad för komponenten Poster visas direkt ovanför. HTL-skriptet åsidosätter
/libs/screens/core/components/content/image/edit.html. Markeringen liknar markeringenproduction.htmloch visar titeln och beskrivningen ovanpå bilden.aem-Screens-editWrapperläggs till så att komponenten inte återges i helskärmsläge i redigeraren. Attributetdata-emptytextser till att en platshållare visas när ingen bild eller inget innehåll har fyllts i.
Skapa bibliotek på klientsidan clientlibs
Med bibliotek på klientsidan kan du ordna och hantera CSS- och JavaScript-filer som behövs för en AEM-implementering. Mer information om hur du använder klientbibliotek finns här.
AEM Screens-komponenter återges annorlunda i redigeringsläget jämfört med i förhandsgransknings-/produktionsläget. Två uppsättningar klientbibliotek skapas, en för redigeringsläget och en andra för Förhandsvisa/Produktion.
-
Skapa en mapp för klientbibliotek för komponenten Poster.
Skapa en mapp med namnet
clientlibsunder/apps/weretail-run/components/content/poster.
-
Skapa en nod med namnet
sharedav typencq:ClientLibraryFolder.under mappenclientlibs
-
Lägg till följande egenskaper i det delade klientbiblioteket:
allowProxy| Boolean |truecategories| Sträng [] |cq.screens.components
Egenskaper för /apps/weretail-run/components/content/affisch/clientlibs/shared
Egenskapen
categoriesär en sträng som identifierar klientbiblioteket. Kategorincq.screens.componentsanvänds i både redigeringsläge och förhandsgransknings-/produktionsläge. Alla CSS/JS som definierats i klientlibsharedläses därför in i alla lägen.Det är en god praxis att aldrig visa några sökvägar direkt till
/appsi en produktionsmiljö. EgenskapenallowProxyser till att klientbibliotekets CSS och JS refereras via prefixet/etc.clientlibs. Mer information om egenskapen allowProxy finns här. -
Skapa filen
css.txtunder den delade mappen.Fyll filen med följande:
code language-none #base=css styles.less -
Skapa en mapp med namnet
cssunder mappenshared. Lägg till filenstyle.lessunder mappencss. Klientbibliotekens struktur bör nu se ut så här:
I stället för att skriva CSS direkt använder den här självstudien LESS. LESS är en populär CSS-förkompilator som stöder CSS-variabler, mixins och funktioner. AEM klientbibliotek stöder LESS-kompilering. Du kan använda Sass eller andra förkompilerare, men du måste kompilera dem utanför AEM.
-
Fyll i
/apps/weretail-run/components/content/poster/clientlibs/shared/css/styles.lessmed följande:code language-css /* /apps/weretail-run/components/content/poster/clientlibs/shared/css/styles.less Poster component - Shared Style */ @import url('https://fonts.googleapis.com/css?family=Fjalla+One|Open+Sans:400i'); @text-light-color: #fff; @text-dark-color: #000; @title-font-family: 'Fjalla One', sans-serif; @description-font-family: 'Open Sans', sans-serif; .cmp-poster { &__text { position: absolute; color: @text-light-color; top: 0; text-align:center; width: 100%; &--left { text-align: left; margin-left: 1em; } &--right { text-align: right; margin-right: 1em; } &--dark { color: @text-dark-color; } } &__title { font-weight: bold; font-family: @title-font-family; font-size: 1.2em; } &__description { font-style: italic; font-family: @description-font-family; } }note note NOTE Google Web Fonts används för teckensnittsfamiljer. Web Fonts kräver internetanslutning och inte alla AEM Screens-implementeringar har en tillförlitlig anslutning. Planering för offlineläge är en viktig faktor för AEM Screens-distributioner. -
Kopiera klientbiblioteksmappen
shared. Klistra in det som ett jämlikhetsobjekt och byt namn på det tillproduction.
-
Uppdatera egenskapen
categoriesför produktionsklientbiblioteket tillcq.screens.components.production.Kategorin
cq.screens.components.productionser till att formaten bara läses in i förhandsgransknings-/produktionsläge.
Egenskaper för /apps/weretail-run/components/content/affisch/clientlibs/production
-
Fyll i
/apps/weretail-run/components/content/poster/clientlibs/production/css/styles.lessmed följande:code language-css /* /apps/weretail-run/components/content/poster/clientlibs/production/css/styles.less Poster component - Production Style */ .cmp-poster { background-size: cover; height: 100%; width: 100%; position:absolute; &__text { top: 2em; &--left { width: 40%; top: 5em; } &--right { width: 40%; right: 1em; } } &__title { font-size: 5rem; font-weight: 900; margin: 0.1rem; } &__description { font-size: 2rem; margin: 0.1rem; font-weight: 400; } &__logo { position: absolute; max-width: 200px; top: 1em; left: 0; } }Ovanstående format visar rubriken och beskrivningen på en absolut plats på skärmen. Titeln visas större än beskrivningen. Komponentens BEM-notation gör det enkelt att noggrant omforma formningarna i klassen cmp-affisch.
En tredje klientbibliotekskategori: cq.screens.components.edit kan användas för att lägga till Redigera endast specifika format i komponenten.
cq.screens.componentscq.screens.components.editcq.screens.components.productionLägg till filmminiatyrkomponent i en sekvenskanal add-sequence-channel
Poster-komponenten används på en sekvenskanal. Startpaketet för den här självstudiekursen innehöll en inaktivitetskanal. Inaktivitetskanalen är förkonfigurerad för att tillåta komponenter i gruppen We.Retail Run - Content. Poster-komponentens grupp är inställd på We.Retail Run - Content och är tillgänglig för att läggas till i kanalen.
-
Öppna inaktivitetskanalen från projektet
We.RetailKör:http://localhost:4502/editor.html/content/screens/we-retail-run/channels/idle-channel.edit.html -
Dra och släpp en ny instans av komponenten Poster från sidofältet till sidan.
-
Redigera dialogrutan för förhandsgranskningskomponenten så att du kan lägga till en bild, titel, beskrivning. Använd alternativen Textplacering och Textfärg för att säkerställa att titeln/beskrivningen kan läsas över bilden.
-
Om du vill lägga till några Poster-komponenter upprepar du stegen ovan. Lägg till övergångar mellan komponenterna.
Sammanställ allt putting-it-all-together
I videon nedan visas den färdiga komponenten och hur den kan läggas till i en sekvenskanal. Kanalen läggs sedan till i en platsvisning och tilldelas till en Screens-spelare.
Kod klar finished-code
Nedan visas den färdiga koden från självstudiekursen. screens-weretail-run.ui.apps-0.0.1-SNAPSHOT.zip och screens-weretail-run.ui.content-0.0.1-SNAPSHOT.zip är kompilerade AEM-paket. SRC-screens-weretail-run-0.0.1.zip är den okompilerade källkoden som kan distribueras med Maven.
SRC Final AEM Screens We.Retail Run Project