I componenti sono al centro della creazione di un’esperienza nell’AEM. Il Componenti core e Archetipo progetto AEM semplificate l'utilizzo di un set di strumenti con componenti robusti e pronti. Il Esercitazione WKND spiega allo sviluppatore come utilizzare questi strumenti e come creare componenti personalizzati per creare un nuovo sito AEM.
Prima di fare riferimento a questo documento, assicurati di aver completato Esercitazione WKND e hanno quindi familiarità con Componenti core e Archetipo progetto AEM.
Poiché l’esercitazione WKND copre la maggior parte dei casi d’uso, questo documento è inteso solo come supplemento a tali risorse. Fornisce informazioni tecniche approfondite sulla struttura e la configurazione dei componenti in AEM e non intende essere una guida introduttiva.
Questa sezione descrive concetti e problemi chiave come introduzione ai dettagli necessari per lo sviluppo di componenti personalizzati.
Prima di iniziare a configurare o codificare il componente, è necessario chiedere:
Prima di dedicare tempo alla creazione di un componente completamente nuovo, è consigliabile personalizzare o estendere i componenti esistenti. Componenti core offre una suite di componenti flessibili, robusti e testati pronti per la produzione.
I Componenti core offrono anche cancella modelli di personalizzazione che puoi utilizzare per adattarle alle esigenze del tuo progetto.
I componenti possono essere ridefiniti anche con sovrapposizione in base alla logica del percorso di ricerca. Tuttavia, in tal caso, Sling Resource Merger non verrà attivato e /apps
deve definire l’intera sovrapposizione.
È inoltre possibile modificare la finestra di dialogo di un componente utilizzando Sling Resource Merger e definendo la proprietà sling:resourceSuperType
.
Ciò significa che è sufficiente ridefinire le differenze richieste, anziché ridefinire l’intera finestra di dialogo.
Il rendering del componente verrà eseguito con HTML. Il componente deve definire le HTML necessarie per acquisire il contenuto richiesto e quindi eseguirne il rendering come richiesto, sia nell’ambiente di authoring che in quello di pubblicazione.
Si consiglia di mantenere il codice responsabile del markup e del rendering separato dal codice che controlla la logica utilizzata per selezionare il contenuto del componente.
Questa filosofia è supportata da HTL: linguaggio per modelli appositamente limitato per garantire che venga utilizzato un linguaggio di programmazione reale per definire la logica di business sottostante. Questo meccanismo evidenzia il codice chiamato per una determinata vista e, se necessario, consente una logica specifica per diverse viste dello stesso componente.
Questa logica (facoltativa) può essere implementata in diversi modi e viene richiamata da HTL con comandi specifici:
La struttura di una componente AEM è potente e flessibile. Le parti principali sono:
Un elemento chiave della struttura è il tipo di risorsa.
Si tratta di un’astrazione che aiuta a garantire che, anche quando l’aspetto cambia nel tempo, l’intenzione rimanga nel tempo.
La definizione di un componente può essere suddivisa come segue:
/libs/core/wcm/components
./apps/<myApp>/components
.cq:Component
e avere gli elementi chiave:
cq:Component
definizione.<mycomponent> (cq:Component)
- Nodo gerarchico del componente.jcr:title
- Titolo del componente; ad esempio, utilizzato come etichetta quando il componente è elencato in Browser Componenti e Console Componentijcr:description
- Descrizione del componente; utilizzata come suggerimento del mouse nella console Browser componenti e Componenticq:editConfig (cq:EditConfig)
- Definisce le proprietà di modifica del componente e ne attiva la visualizzazione nel browser Componenti
cq:childEditConfig (cq:EditConfig)
- Controlla gli aspetti dell’interfaccia utente di authoring per i componenti secondari che non definiscono i propri cq:editConfig
.cq:dialog (nt:unstructured)
- Finestra di dialogo per questo componente. Definisce l’interfaccia che consente all’utente di configurare il componente e/o modificare il contenuto.cq:design_dialog (nt:unstructured)
- Modifica del design di questo componenteL’icona o l’abbreviazione del componente viene definita tramite le proprietà JCR del componente quando questo viene creato dallo sviluppatore. Queste proprietà vengono valutate nell'ordine seguente e viene utilizzata la prima proprietà valida trovata.
cq:icon
: proprietà stringa che punta a un'icona standard nella Libreria interfaccia utente Coral da visualizzare nel browser componenti
abbreviation
- Proprietà stringa per personalizzare l'abbreviazione del nome del componente nel browser componenti
jcr:title
proprietà.
abbreviation_commentI18n
, che viene quindi utilizzata come suggerimento di traduzione.cq:icon.png
o cq:icon.svg
: icona per questo componente, che viene visualizzata nel browser Componenti
.png
e .svg
sono supportati._cq_icon.png
o _cq_icon.svg
ad esempio..png
ha precedenza su .svg
se sono presenti entrambi.Se nessuna delle proprietà precedenti (cq:icon
, abbreviation
, cq:icon.png
o cq:icon.svg
) si trovano nel componente:
sling:resourceSuperType
proprietà.jcr:title
del componente corrente.Per annullare l’ereditarietà delle icone dai super componenti, imposta un valore vuoto abbreviation
sul componente verrà ripristinato il comportamento predefinito.
Il Console Componenti mostra come viene definita l’icona di un particolare componente.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "https://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink" x="0px" y="0px"
width="20px" height="20px" viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve">
<ellipse cx="5" cy="5" rx="3" ry="3" fill="#707070"/>
<ellipse cx="15" cy="5" rx="4" ry="4" fill="#707070"/>
<ellipse cx="5" cy="15" rx="5" ry="5" fill="#707070"/>
<ellipse cx="15" cy="15" rx="4" ry="4" fill="#707070"/>
</svg>
Molti nodi/proprietà necessari per definire un componente sono comuni a entrambe le interfacce, con differenze che rimangono indipendenti in modo che il componente possa funzionare in entrambi gli ambienti.
Un componente è un nodo di tipo cq:Component
e ha le seguenti proprietà e nodi secondari:
Nome | Tipo | Descrizione |
---|---|---|
. |
cq:Component |
Rappresenta il componente corrente. Un componente è di tipo nodo cq:Component . |
componentGroup |
String |
Rappresenta il gruppo in cui il componente può essere selezionato nella Browser Componenti. Un valore che inizia con . viene utilizzato per i componenti che non sono disponibili per la selezione dall’interfaccia utente, ad esempio i componenti di base da cui ereditano altri componenti. |
cq:isContainer |
Boolean |
Indica se il componente è un componente contenitore e può quindi contenere altri componenti, ad esempio un sistema paragrafo. |
cq:dialog |
nt:unstructured |
Questa è la definizione della finestra di dialogo per modifica del componente. |
cq:design_dialog |
nt:unstructured |
Questa è la definizione della finestra di dialogo per progettazione del componente. |
cq:editConfig |
cq:EditConfig |
Questo definisce il modifica la configurazione del componente. |
cq:htmlTag |
nt:unstructured |
In questo modo vengono restituiti attributi di tag aggiuntivi che vengono aggiunti al tag HTML circostante. Abilita l’aggiunta di attributi ai div generati automaticamente. |
cq:noDecoration |
Boolean |
Se true, il componente non viene renderizzato con le classi div e css generate automaticamente. |
cq:template |
nt:unstructured |
Se individuato, questo nodo verrà utilizzato come modello di contenuto quando il componente viene aggiunto dal browser Componenti. |
jcr:created |
Date |
Data di creazione del componente. |
jcr:description |
String |
Descrizione del componente. |
jcr:title |
String |
Titolo del componente. |
sling:resourceSuperType |
String |
Con questa impostazione, il componente eredita da questo componente. |
component.html |
nt:file |
Questo è il file di script HTL del componente. |
cq:icon |
String |
Questo valore punta al icona del componente e viene visualizzato nel browser Componenti. |
Se consideriamo il Testo componente, possiamo vedere una serie di questi elementi:
Le proprietà di particolare interesse comprendono:
jcr:title
: titolo del componente utilizzato per identificare il componente nel browser Componenti.jcr:description
- Questa è la descrizione del componente.sling:resourceSuperType
- Indica il percorso di ereditarietà quando si estende un componente (sovrascrivendo una definizione).I nodi figlio di particolare interesse includono:
cq:editConfig
- Questa opzione controlla gli aspetti visivi del componente durante la modifica.cq:dialog
: definisce la finestra di dialogo per la modifica del contenuto di questo componente.cq:design_dialog
- Specifica le opzioni di modifica della progettazione per questo componente.Le finestre di dialogo sono un elemento chiave del componente in quanto forniscono un’interfaccia che consente agli autori di configurare il componente in una pagina di contenuto e fornire input per tale componente. Consulta la documentazione di authoring per informazioni dettagliate su come gli autori di contenuti interagiscono con i componenti.
A seconda della complessità del componente, la finestra di dialogo potrebbe richiedere una o più schede.
Finestre di dialogo per le componenti AEM:
cq:dialog
nodi di tipo nt:unstructured
.cq:Component
e accanto alle relative definizioni dei componenti.sling:resourceType
proprietà.nt:unstructured
con il necessario sling:resourceType
proprietà.Nella finestra di dialogo sono definiti i singoli campi:
Le finestre di dialogo per progettazione sono simili alle finestre di dialogo utilizzate per modificare e configurare il contenuto, ma forniscono agli autori di modelli l’interfaccia per la pro-configurazione e i dettagli di progettazione per tale componente su un modello di pagina. I modelli di pagina vengono quindi utilizzati dagli autori dei contenuti per creare pagine di contenuto. Consulta la documentazione del modello per informazioni dettagliate sulla creazione dei modelli.
Le finestre di dialogo per progettazione vengono utilizzate quando si modifica un modello di pagina, anche se non sono necessari per tutti i componenti. Ad esempio, Titolo e Componenti immagine entrambi dispongono di finestre di dialogo di progettazione, mentre Componente condivisione social media non lo fa.
L’interfaccia utente Coral e Granite definiscono l’aspetto dell’AEM.
L’interfaccia utente Granite offre una vasta gamma di widget di base necessari per creare la finestra di dialogo nell’ambiente di authoring. Se necessario, puoi estendere questa selezione e creare un widget personalizzato.
Per ulteriori informazioni, consulta le seguenti risorse:
Per creare un nuovo widget da utilizzare nella finestra di dialogo di un componente è necessario creare un nuovo componente campo dell’interfaccia utente Granite.
Se consideri la finestra di dialogo come un semplice contenitore per un elemento del modulo, puoi anche visualizzare il contenuto principale della finestra di dialogo come campi del modulo. La creazione di un nuovo campo modulo richiede la creazione di un tipo di risorsa, il che equivale alla creazione di un nuovo componente. Per facilitare questa attività, l’interfaccia utente Granite offre un componente campo generico da cui ereditare (utilizzando sling:resourceSuperType
):
/libs/granite/ui/components/coral/foundation/form/field
Più precisamente, l’interfaccia utente Granite offre una serie di componenti di campo adatti all’utilizzo nelle finestre di dialogo o, più in generale, in moduli.
Dopo aver creato il tipo di risorsa, puoi creare un’istanza del campo aggiungendo un nuovo nodo nella finestra di dialogo, con la proprietà sling:resourceType
facendo riferimento al tipo di risorsa appena introdotto.
È inoltre possibile utilizzare le condizioni di rendering (rendercondition
) per controllare chi ha accesso a schede/campi specifici nella finestra di dialogo; ad esempio:
+ mybutton
- sling:resourceType = granite/ui/components/coral/foundation/button
+ rendercondition
- sling:resourceType = myapp/components/renderconditions/group
- groups = ["administrators"]
Dopo aver creato un componente, devi abilitarlo per poterlo utilizzare. Il suo utilizzo mostra come la struttura del componente è correlata alla struttura del contenuto risultante nell’archivio.
Una volta definito un componente, questo deve essere reso disponibile per l’uso. Per rendere un componente disponibile per l’utilizzo in un modello, devi abilitarlo nel criterio del Contenitore di layout del modello.
Consulta la documentazione del modello per informazioni dettagliate sulla creazione dei modelli.
Se creiamo e configuriamo un’istanza di Titolo componente nella pagina: /content/wknd/language-masters/en/adventures/extreme-ironing.html
Quindi possiamo vedere la struttura del contenuto creato all’interno dell’archivio:
In particolare, se si considera il testo effettivo di un Componente Titolo:
jcr:title
proprietà contenente il testo effettivo del titolo immesso dall’autore.sling:resourceType
riferimento alla definizione del componente.Le proprietà definite dipendono dalle singole definizioni. Anche se possono essere più complesse di quanto sopra, seguono comunque gli stessi principi di base.
I componenti dell’AEM sono soggetti agli Gerarchia dei tipi di risorsa. Viene utilizzato per estendere i componenti utilizzando la proprietà sling:resourceSuperType
. Questo consente al componente di ereditare da un altro componente.
Consulta la sezione Riutilizzo dei componenti per ulteriori informazioni.
Questa sezione spiega come configurare il comportamento di modifica di un componente. Ciò include attributi quali le azioni disponibili per il componente, le caratteristiche dell’editor in.place e i listener relativi agli eventi sul componente.
Il comportamento di modifica di un componente viene configurato aggiungendo un cq:editConfig
nodo di tipo cq:EditConfig
sotto il nodo del componente (di tipo cq:Component
) e aggiungendo proprietà e nodi secondari specifici. Sono disponibili le seguenti proprietà e nodi figlio:
cq:editConfig
proprietà nodocq:editConfig
nodi secondari:
cq:dropTargets
(tipo di nodo nt:unstructured
): definisce un elenco di destinazioni di rilascio che possono accettare un rilascio da una risorsa di content finder (è consentita una singola destinazione di rilascio)cq:inplaceEditing
(tipo di nodo cq:InplaceEditingConfig
): definisce una configurazione per la modifica diretta del componentecq:listeners
(tipo di nodo cq:EditListenersConfig
): definisce cosa accade prima o dopo che si verifica un’azione sul componenteCi sono molte configurazioni esistenti nell'AEM. Puoi cercare facilmente proprietà specifiche o nodi secondari utilizzando lo strumento Query in CRXDE Lite.
I componenti devono sempre eseguire il rendering di alcuni HTML visibili all’autore, anche quando il componente non ha contenuto. In caso contrario, potrebbe scomparire visivamente dall’interfaccia dell’editor, rendendolo tecnicamente presente ma invisibile nella pagina e nell’editor. In questo caso, gli autori non potranno selezionare e interagire con il componente vuoto.
Per questo motivo, i componenti devono eseguire il rendering di un segnaposto, a condizione che non eseguano il rendering di alcun output visibile quando la pagina viene riprodotta nell’editor di pagine (quando la modalità WCM è edit
o preview
).
Il markup HTML tipico per un segnaposto è il seguente:
<div class="cq-placeholder" data-emptytext="Component Name"></div>
HTML Il tipico script HTL che esegue il rendering del segnaposto sopra riportato è il seguente:
<div class="cq-placeholder" data-emptytext="${component.properties.jcr:title}"
data-sly-test="${(wcmmode.edit || wcmmode.preview) && isEmpty}"></div>
Nell’esempio precedente, isEmpty
è una variabile che è true solo quando il componente non ha contenuto ed è invisibile all’autore.
Per evitare ripetizioni, l’Adobe consiglia agli implementatori di componenti di utilizzare un modello HTL per questi segnaposto, come quello fornito dai Componenti core.
L’utilizzo del modello nel collegamento precedente viene quindi eseguito con la seguente riga di HTL:
<sly data-sly-use.template="core/wcm/components/commons/v1/templates.html"
data-sly-call="${template.placeholder @ isEmpty=!model.text}"></sly>
Nell’esempio precedente, model.text
è la variabile che è true solo quando il contenuto ha contenuto ed è visibile.
Un esempio di utilizzo di questo modello è disponibile nei Componenti core, come nel componente Titolo.
Il cq:dropTargets
nodo (tipo di nodo) nt:unstructured
) definisce la destinazione di rilascio in grado di accettare un rilascio da una risorsa trascinata da content finder. È un nodo di tipo cq:DropTargetConfig
.
Nodo figlio di tipo cq:DropTargetConfig
definisce una destinazione di rilascio nel componente.
Un editor locale consente all’utente di modificare il contenuto direttamente nel flusso di contenuto, senza dover aprire una finestra di dialogo. Ad esempio, lo standard Testo e Titolo entrambi i componenti dispongono di un editor locale.
Non è necessario/significativo un editor locale per ogni tipo di componente.
Il cq:inplaceEditing
nodo (tipo di nodo) cq:InplaceEditingConfig
) definisce una configurazione di modifica diretta per il componente. Può avere le seguenti proprietà:
Nome proprietà | Tipo di proprietà | Valore proprietà |
---|---|---|
active |
Boolean |
true per abilitare la modifica diretta del componente. |
configPath |
String |
Percorso della configurazione dell’editor, che può essere specificata da un nodo di configurazione |
editorType |
String |
I tipi disponibili sono: plaintext per contenuti non HTML, title converte i titoli grafici in testo normale prima di iniziare la modifica e text utilizza l’Editor Rich Text |
La seguente configurazione abilita la modifica diretta del componente e definisce plaintext
come tipo di editor:
<cq:inplaceEditing
jcr:primaryType="cq:InplaceEditingConfig"
active="{Boolean}true"
editorType="plaintext"/>
Il metodo di gestione degli eventi sui campi della finestra di dialogo viene eseguito con i listener in un libreria client.
Per inserire la logica nel campo, è necessario:
A questo scopo, è necessario conoscere la libreria di widget sottostante con cui desideri interagire. Consulta la documentazione sull’interfaccia utente Coral per identificare a quale evento desideri reagire.
Il cq:listeners
nodo (tipo di nodo) cq:EditListenersConfig
) definisce cosa accade prima o dopo un’azione sul componente. La tabella seguente definisce le proprietà possibili.
Nome proprietà | Valore proprietà |
---|---|
beforedelete |
Il gestore viene attivato prima della rimozione del componente. |
beforeedit |
L’handler viene attivato prima che il componente venga modificato. |
beforecopy |
L’handler viene attivato prima che il componente venga copiato. |
beforeremove |
L’handler viene attivato prima che il componente venga spostato. |
beforeinsert |
Il gestore viene attivato prima dell’inserimento del componente. |
beforechildinsert |
L’handler viene attivato prima che il componente venga inserito all’interno di un altro componente (solo contenitori). |
afterdelete |
Il gestore viene attivato dopo la rimozione del componente. |
afteredit |
Il gestore viene attivato dopo la modifica del componente. |
aftercopy |
Il gestore viene attivato dopo la copia del componente. |
afterinsert |
Il gestore viene attivato dopo l’inserimento del componente. |
aftermove |
Il gestore viene attivato dopo lo spostamento del componente. |
afterchildinsert |
L’handler viene attivato dopo che il componente è stato inserito all’interno di un altro componente (solo contenitori). |
Nel caso di componenti nidificati, esistono alcune restrizioni alle azioni definite come proprietà sul cq:listeners
nodo. Per i componenti nidificati, i valori delle seguenti proprietà deve essere REFRESH_PAGE
:
aftermove
aftercopy
Il gestore eventi può essere implementato con un’implementazione personalizzata. Ad esempio (dove project.customerAction
è un metodo statico):
afteredit = "project.customerAction"
L’esempio seguente è equivalente al REFRESH_INSERTED
configurazione:
afterinsert="function(path, definition) { this.refreshCreated(path, definition); }"
Con la seguente configurazione la pagina viene aggiornata dopo che il componente è stato eliminato, modificato, inserito o spostato:
<cq:listeners
jcr:primaryType="cq:EditListenersConfig"
afterdelete="REFRESH_PAGE"
afteredit="REFRESH_PAGE"
afterinsert="REFRESH_PAGE"
afterMove="REFRESH_PAGE"/>
La convalida dei campi nell’interfaccia utente Granite e nei widget dell’interfaccia utente Granite viene eseguita utilizzando foundation-validation
API. Consulta la foundation-valdiation
Documentazione di Granite per i dettagli.
Se disponi di un JavaScript personalizzato che deve essere eseguito solo quando la finestra di dialogo è disponibile e pronta, è necessario ascoltare dialog-ready
evento.
Questo evento viene attivato ogni volta che la finestra di dialogo viene caricata (o ricaricata) ed è pronta per l’uso, ovvero ogni volta che si verifica una modifica (creazione/aggiornamento) nel DOM della finestra di dialogo.
dialog-ready
può essere utilizzato per hook nel codice personalizzato JavaScript che esegue personalizzazioni sui campi all’interno di una finestra di dialogo o attività simili.
Il Modalità WCM Il cookie viene impostato quando si passa alla modalità Anteprima anche quando la pagina non viene aggiornata.
Per i componenti con un rendering sensibili alla modalità WCM, è necessario definirli per aggiornarsi in modo specifico e quindi basarsi sul valore del cookie.
In qualità di sviluppatore, desideri poter accedere facilmente alla documentazione dei componenti per comprendere rapidamente i relativi:
Per questo motivo, è molto semplice creare qualsiasi markdown della documentazione esistente disponibile all’interno del componente stesso.
È sufficiente inserire un README.md
nella struttura dei componenti.
Questo markdown verrà quindi visualizzato nel Console Componenti.
Il markdown supportato è lo stesso di Frammenti di contenuto.