Een kerncomponent uitbreiden extend-component
- de Universele Redacteur voor visueel het uitgeven van hoofdloze inhoud.
- de Redacteur van het Fragment van de Inhoud voor op vorm-gebaseerde het uitgeven van hoofdloze inhoud.
Leer hoe te om een bestaande Component van de Kern uit te breiden die met de Redacteur van AEM SPA moet worden gebruikt. Begrijpen hoe te om een bestaande component uit te breiden is een krachtige techniek om de mogelijkheden van een implementatie van de Redacteur van AEM aan te passen en uit te breiden SPA.
Doelstelling
- Breid een bestaande Component van de Kern met extra eigenschappen en inhoud uit.
- Begrijp de basis van Componentovererving met het gebruik van
sling:resourceSuperType. - Leer hoe te om het Patroon van de Delegatie voor het Verdelen Modellen te gebruiken om bestaande logica en functionaliteit opnieuw te gebruiken.
Wat u gaat maken
In dit hoofdstuk wordt een nieuwe component Card gemaakt. De Card component breidt de Component van de Kern van het Beeld uit toevoegend extra inhoudsgebieden zoals een Titel en een knoop van Call to action om de rol van een meetapparaat voor andere inhoud binnen het KUUROORD uit te voeren.
Card component afhankelijk van projectvereisten te maken. Het wordt altijd geadviseerd om Componenten van de Kern direct te gebruiken wanneer mogelijk.Vereisten
Herzie het vereiste tooling en de instructies voor vestiging a lokale ontwikkelomgeving .
De code ophalen
-
Download het beginpunt voor deze zelfstudie via Git:
code language-shell $ git clone git@github.com:adobe/aem-guides-wknd-spa.git $ cd aem-guides-wknd-spa $ git checkout Angular/extend-component-start -
Implementeer de codebasis naar een lokale AEM-instantie met Maven:
code language-shell $ mvn clean install -PautoInstallSinglePackageAls het gebruiken van AEM 6.x voeg het
classicprofiel toe:code language-shell $ mvn clean install -PautoInstallSinglePackage -Pclassic -
Installeer het gebeëindigde pakket voor de traditionele WKND verwijzingsplaats . De beelden die door worden verstrekt WKND verwijzingsplaats wordt opnieuw gebruikt op WKND SPA. Het pakket kan worden geïnstalleerd gebruikend de Manager van het Pakket van AEM .
U kunt de gebeëindigde code op GitHub altijd bekijken of de code plaatselijk controleren door aan de tak Angular/extend-component-solution te schakelen.
Eerste kaartimplementatie controleren
De begincode van het hoofdstuk bevat een eerste kaartcomponent. Inspecteer het beginpunt voor de implementatie van de Kaart.
-
Open de module
ui.appsin de IDE van uw keuze. -
Navigeer naar
ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/components/carden bekijk het.content.xml-bestand.
code language-xml <?xml version="1.0" encoding="UTF-8"?> <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" jcr:primaryType="cq:Component" jcr:title="Card" sling:resourceSuperType="wknd-spa-angular/components/image" componentGroup="WKND SPA Angular - Content"/>De eigenschap
sling:resourceSuperTypeverwijst naarwknd-spa-angular/components/imagedie aangeeft dat de componentCardde functionaliteit overerft van de component WKND SPA Image. -
Controleer het bestand
ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/components/image/.content.xml:code language-xml <?xml version="1.0" encoding="UTF-8"?> <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" jcr:primaryType="cq:Component" jcr:title="Image" sling:resourceSuperType="core/wcm/components/image/v2/image" componentGroup="WKND SPA Angular - Content"/>De
sling:resourceSuperTypeverwijst naarcore/wcm/components/image/v2/image. Dit wijst erop dat de component van het Beeld WKND SPA de functionaliteit van het Beeld van de Component van de Kern erft.Ook gekend als het patroon van de Volmacht Verschuivende middelovererving is een krachtig ontwerppatroon voor het toestaan van kindcomponenten om functionaliteit te erven en gedrag uit te breiden/met voeten te treden wanneer gewenst. De overerving van de verkoop steunt veelvoudige niveaus van overerving, zodat erft de nieuwe
Cardcomponent uiteindelijk functionaliteit van het Beeld van de Component van de Kern.Veel ontwikkelingsteams streven ernaar om D.R.Y. te zijn (herhaal jezelf niet). Dit is mogelijk met AEM als gevolg van het verkopen van erfenis.
-
Open het bestand
_cq_dialog/.content.xmlonder de mapcard.Dit bestand is de definitie in het dialoogvenster Component voor de component
Card. Als het gebruiken van het Verdelen overerving, is het mogelijk om eigenschappen van de Verschuivende Fusie van het Middel te gebruiken om gedeelten van de dialoog met voeten te treden of uit te breiden. In dit voorbeeld is een nieuw tabblad toegevoegd aan het dialoogvenster om aanvullende gegevens van een auteur vast te leggen om de kaartcomponent te vullen.Met eigenschappen als
sling:orderBeforekan een ontwikkelaar kiezen waar nieuwe tabbladen of formuliervelden moeten worden ingevoegd. In dit geval wordt de tabTextingevoegd vóór de tabasset. Om volledig gebruik van de Verschuivende Fusie van het Middel te maken, is het belangrijk om de originele structuur van de dialoogknoop voor de de componentendialoog van het Beeld te kennen. -
Open het bestand
_cq_editConfig.xmlonder de mapcard. Dit bestand schrijft het gedrag voor slepen en neerzetten voor in de AEM-ontwerpinterface. Wanneer het uitbreiden van de component van het Beeld, is het belangrijk dat het middeltype de component zelf aanpast. Controleer het knooppunt<parameters>:code language-xml <parameters jcr:primaryType="nt:unstructured" sling:resourceType="wknd-spa-angular/components/card" imageCrop="" imageMap="" imageRotate=""/>De meeste componenten vereisen geen
cq:editConfig, de Afbeelding en onderliggende afstammelingen van de component Image zijn uitzonderingen. -
In de schakelaar IDE aan de
ui.frontendmodule, navigerend aanui.frontend/src/app/components/card:
-
Controleer het bestand
card.component.ts.De component is al uitgestald om met behulp van de standaardfunctie
MapTotoe te wijzen aan de AEMCard-component.code language-js MapTo('wknd-spa-angular/components/card')(CardComponent, CardEditConfig);Controleer de drie parameters
@Inputin de klasse voorsrc,altentitle. Deze worden JSON-waarden van de AEM-component verwacht die worden toegewezen aan de Angular-component. -
Open het bestand
card.component.html:code language-html <div class="card" *ngIf="hasContent"> <app-image class="card__image" [src]="src" [alt]="alt" [title]="title"></app-image> </div>In dit voorbeeld hebben we ervoor gekozen de bestaande Angular Image-component
app-imageopnieuw te gebruiken door de@Input-parameters vanuitcard.component.tsdoor te geven. Verderop in de zelfstudie worden extra eigenschappen toegevoegd en weergegeven.
Sjabloonbeleid bijwerken
Met deze eerste Card -implementatie controleert u de functionaliteit in de AEM SPA Editor. Als u de eerste Card -component wilt zien, moet het sjabloonbeleid worden bijgewerkt.
-
Implementeer de startcode naar een lokale instantie van AEM, als u dat nog niet hebt gedaan:
code language-shell $ cd aem-guides-wknd-spa $ mvn clean install -PautoInstallSinglePackage -
Navigeer aan het Malplaatje van de Pagina van het KUUROORD in http://localhost:4502/editor.html/conf/wknd-spa-angular/settings/wcm/templates/spa-page-template/structure.html .
-
Werk het beleid van de container voor lay-out bij om de nieuwe component
Cardtoe te voegen als een toegestane component:
Sla de wijzigingen in het beleid op en bekijk de component
Cardals een toegestane component:
Aanvankelijke kaartcomponent van auteur
Vervolgens ontwerpt u de component Card met gebruik van de AEM SPA Editor.
-
Navigeer aan http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html .
-
Voeg in de modus
Editde componentCardtoe aan de componentLayout Container: in
-
Sleep een afbeelding van de zoekfunctie voor middelen naar de component
Card: toe
-
Open de
Cardcomponentendialoog en merk de toevoeging van a Tekst Lusje op. -
Ga de volgende waarden op het Tekst lusje in:
Weg van de Kaart - kies een pagina onder de homepage van het KUUROORD.
Tekst van CTA - "Lees meer"
Titel van de Kaart - verlaten leeg
krijgt titel van verbonden pagina - controleer checkbox om waar te wijzen.
-
Werk het lusje van Metagegevens van Activa bij om waarden voor Alternatieve Tekst en Titel toe te voegen.
Er worden momenteel geen aanvullende wijzigingen weergegeven na het bijwerken van het dialoogvenster. Als u de nieuwe velden toegankelijk wilt maken voor de Angular-component, moet het Sling-model voor de
Card-component worden bijgewerkt. -
Open een nieuw lusje en navigeer aan CRXDE-Lite . Controleer de inhoudsknooppunten onder
/content/wknd-spa-angular/us/en/home/jcr:content/root/responsivegridom de inhoud van de componentCardte zoeken.
De eigenschappen
cardPath,ctaText,titleFromPageblijven in het dialoogvenster behouden.
Model voor kaartverkoop bijwerken
Als u uiteindelijk de waarden uit het dialoogvenster met componenten toegankelijk wilt maken voor de Angular-component, moet u het Sling-model bijwerken dat de JSON voor de Card -component vult. Wij hebben ook de kans om twee stukken bedrijfslogica uit te voeren:
- Als
titleFromPageaan waar, de titel van de pagina terugkeert die doorcardPathanders wordt gespecificeerd de waarde vancardTitletextfield terugkeren. - Retourneer de laatste gewijzigde datum van de pagina die is opgegeven door
cardPath.
Ga terug naar de IDE van uw keuze en open de module core .
-
Open het bestand
Card.javaomcore/src/main/java/com/adobe/aem/guides/wknd/spa/angular/core/models/Card.java.Merk op dat de interface
Cardmomenteelcom.adobe.cq.wcm.core.components.models.Imageuitbreidt en daarom de methoden van de interfaceImageovererft. De interfaceImagebreidt reeds deComponentExporterinterface uit die het het Verdelen Model om als JSON toelaat worden uitgevoerd en door de redacteur van het KUUROORD in kaart gebracht. Daarom te hoeven wij niet uitdrukkelijk omComponentExporterinterface uit te breiden zoals wij in het hoofdstuk van de Component van de Douane deden. -
Voeg de volgende methodes aan de interface toe:
code language-java @ProviderType public interface Card extends Image { /*** * The URL to populate the CTA button as part of the card. * The link should be based on the cardPath property that points to a page. * @return String URL */ public String getCtaLinkURL(); /*** * The text to display on the CTA button of the card. * @return String CTA text */ public String getCtaText(); /*** * The date to be displayed as part of the card. * This is based on the last modified date of the page specified by the cardPath * @return */ public Calendar getCardLastModified(); /** * Return the title of the page specified by cardPath if `titleFromPage` is set to true. * Otherwise return the value of `cardTitle` * @return */ public String getCardTitle(); }Deze methoden worden beschikbaar gesteld via de JSON-model-API en doorgegeven aan de Angular-component.
-
Openen
CardImpl.java. Dit is de implementatie vanCard.javainterface. Deze implementatie is gedeeltelijk stopgezet om de zelfstudie te versnellen. Let op het gebruik van de@Model- en@Exporter-aantekeningen om ervoor te zorgen dat het Sling-model via de Sling Model Exporter met serienummering kan worden gecodeerd als JSON.CardImpl.javagebruikt ook het patroon van de Delegatie voor het Verdelen Modellen om het herschrijven van de logica van de Component van de Kern van het Beeld te vermijden. -
Neem de volgende regels in acht:
code language-java @Self @Via(type = ResourceSuperType.class) private Image image;De bovenstaande aantekening instantieert een afbeeldingsobject met de naam
imageop basis van desling:resourceSuperTypeovererving van de componentCard.code language-java @Override public String getSrc() { return null != image ? image.getSrc() : null; }Het is dan mogelijk om het
image-object eenvoudig te gebruiken voor het implementeren van methoden die zijn gedefinieerd door deImage-interface, zonder dat u zelf de logica hoeft te schrijven. Deze techniek wordt gebruikt voorgetSrc(),getAlt()engetTitle(). -
Implementeer vervolgens de methode
initModel()om een variabele van het type private te initiërencardPageop basis van de waarde vancardPathcode language-java @PostConstruct public void initModel() { if(StringUtils.isNotBlank(cardPath) && pageManager != null) { cardPage = pageManager.getPage(this.cardPath); } }@PostConstruct initModel()wordt geroepen wanneer het het Verdelen Model wordt geïnitialiseerd, daarom is het een goede gelegenheid om voorwerpen te initialiseren die door andere methodes in het model kunnen worden gebruikt.pageManageris één van verscheidene Java™ gesteunde globale voorwerpen ter beschikking gesteld aan het Schuiven Modellen via de@ScriptVariableaantekening. De getPage methode neemt in een weg en keert een voorwerp van de Pagina van AEM 🔗 terug of ongeldig als de weg niet aan een geldige pagina richt.Hierdoor wordt de variabele
cardPagegeïnitialiseerd, die door de andere nieuwe methoden wordt gebruikt om gegevens over de onderliggende gekoppelde pagina te retourneren. -
Bekijk de algemene variabelen die al zijn toegewezen aan de JCR-eigenschappen die in het dialoogvenster met auteurs zijn opgeslagen. De annotatie
@ValueMapValuewordt gebruikt om de toewijzing automatisch uit te voeren.code language-java @ValueMapValue private String cardPath; @ValueMapValue private String ctaText; @ValueMapValue private boolean titleFromPage; @ValueMapValue private String cardTitle;Deze variabelen worden gebruikt om de extra methodes voor de
Card.javainterface uit te voeren. -
Voer de extra methodes uit die in de
Card.javainterface worden bepaald:code language-java @Override public String getCtaLinkURL() { if(cardPage != null) { return cardPage.getPath() + ".html"; } return null; } @Override public String getCtaText() { return ctaText; } @Override public Calendar getCardLastModified() { if(cardPage != null) { return cardPage.getLastModified(); } return null; } @Override public String getCardTitle() { if(titleFromPage) { return cardPage != null ? cardPage.getTitle() : null; } return cardTitle; }note note NOTE U kunt gebeëindigde CardImpl.java hier bekijken . -
Open een terminalvenster en implementeer alleen de updates voor de module
coremet behulp van het profiel MavenautoInstallBundleuit de mapcore.code language-shell $ cd core/ $ mvn clean install -PautoInstallBundleAls het gebruiken van AEM 6.x het
classicprofiel toevoegt. -
Bekijk de JSON modelreactie bij: http://localhost:4502/content/wknd-spa-angular/us/en.model.json en onderzoek naar
wknd-spa-angular/components/card:code language-json "card": { "ctaText": "Read More", "cardTitle": "Page 1", "title": "Woman chillaxing with river views in Australian bushland", "src": "/content/wknd-spa-angular/us/en/home/_jcr_content/root/responsivegrid/card.coreimg.jpeg/1595190732886/adobestock-216674449.jpeg", "alt": "Female sitting on a large rock relaxing in afternoon dappled light the Australian bushland with views over the river", "cardLastModified": 1591360492414, "ctaLinkURL": "/content/wknd-spa-angular/us/en/home/page-1.html", ":type": "wknd-spa-angular/components/card" }U ziet dat het JSON-model wordt bijgewerkt met extra sleutel-/waardeparen nadat de methoden in het
CardImplSling-model zijn bijgewerkt.
Angular-component bijwerken
Nu het JSON-model is gevuld met nieuwe eigenschappen voor ctaLinkURL , ctaText , cardTitle en cardLastModified , kunnen we de Angular-component bijwerken en deze weergeven.
-
Keer terug naar winde en open de
ui.frontendmodule. Start eventueel de webpack-ontwikkelserver vanuit een nieuw terminalvenster om de wijzigingen in real-time te zien:code language-shell $ cd ui.frontend $ npm install $ npm start -
Open
card.component.tsomui.frontend/src/app/components/card/card.component.ts. Voeg de aanvullende@Input-annotaties toe om het nieuwe model vast te leggen:code language-diff export class CardComponent implements OnInit { @Input() src: string; @Input() alt: string; @Input() title: string; + @Input() cardTitle: string; + @Input() cardLastModified: number; + @Input() ctaLinkURL: string; + @Input() ctaText: string; -
Voeg methoden toe om te controleren of de Call to action gereed is en om een datum-/tijdtekenreeks te retourneren op basis van de invoer
cardLastModified:code language-js export class CardComponent implements OnInit { ... get hasCTA(): boolean { return this.ctaLinkURL && this.ctaLinkURL.trim().length > 0 && this.ctaText && this.ctaText.trim().length > 0; } get lastModifiedDate(): string { const lastModifiedDate = this.cardLastModified ? new Date(this.cardLastModified) : null; if (lastModifiedDate) { return lastModifiedDate.toLocaleDateString(); } return null; } ... } -
Open
card.component.htmlen voeg de volgende markering toe om de titel, call to action en de datum van laatste wijziging weer te geven:code language-html <div class="card" *ngIf="hasContent"> <app-image class="card__image" [src]="src" [alt]="alt" [title]="title"></app-image> <div class="card__content"> <h2 class="card__title"> {{cardTitle}} <span class="card__lastmod" *ngIf="lastModifiedDate">{{lastModifiedDate}}</span> </h2> <div class="card__action-container" *ngIf="hasCTA"> <a [routerLink]="ctaLinkURL" class="card__action-link" [title]="ctaText"> {{ctaText}} </a> </div> </div> </div>Er zijn al sorteerregels toegevoegd bij
card.component.scssom de titel, call to action en de datum van laatste wijziging op te maken.note note NOTE U kunt de gebeëindigde code van de kaartcomponent van Angular hier bekijken . -
Implementeer de volledige wijzigingen in AEM vanaf de basis van het project met Maven:
code language-shell $ cd aem-guides-wknd-spa $ mvn clean install -PautoInstallSinglePackage -
Navigeer aan http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html om de bijgewerkte component te zien:
-
U moet de bestaande inhoud opnieuw kunnen ontwerpen om een pagina te maken die lijkt op het volgende:
Gefeliciteerd! congratulations
Gefeliciteerd, u leerde hoe te om een component van AEM uit te breiden en hoe het Verdelen Modellen en dialogen met het model JSON werken.
U kunt de gebeëindigde code op GitHub altijd bekijken of de code plaatselijk controleren door aan de tak Angular/extend-component-solution te schakelen.