Sviluppo di componenti AEM developing-aem-components
I componenti AEM vengono utilizzati per conservare, formattare ed eseguire il rendering del contenuto reso disponibile sulle pagine web.
-
Quando creazione di pagine, i componenti consentono agli autori di modificare e configurare il contenuto.
-
Durante la costruzione di un Commerce i componenti possono, ad esempio, raccogliere ed eseguire il rendering delle informazioni dal catalogo.
Vedi Sviluppo di eCommerce per ulteriori informazioni.
-
Durante la costruzione di un Community i componenti possono fornire informazioni ai visitatori e raccogliere informazioni da essi.
Vedi Sviluppo di Communities per ulteriori informazioni.
-
-
Nell’istanza di pubblicazione i componenti eseguono il rendering del contenuto, presentandolo come necessario ai visitatori del sito web.
/libs/cq/gui/components/authoring/dialog
devono essere utilizzati solo nell’editor (finestre di dialogo dei componenti nell’authoring). Se vengono utilizzati altrove (ad esempio in una finestra di dialogo della procedura guidata), potrebbero non comportarsi come previsto.Esempi di codice code-samples
Questa pagina fornisce la documentazione di riferimento (o collegamenti alla documentazione di riferimento) necessaria per sviluppare nuovi componenti per AEM. Vedi Sviluppo di componenti AEM - Esempi di codice per alcuni esempi pratici.
Struttura structure
La struttura di base di un componente viene illustrata nella pagina Componenti AEM - Nozioni di base. Questo documento tratta sia le interfacce touch che quelle classiche. Anche se non è necessario utilizzare le impostazioni classiche nel nuovo componente, può essere utile tenerne conto quando si ereditano da componenti esistenti.
Estensione dei componenti e delle finestre di dialogo esistenti extending-existing-components-and-dialogs
A seconda del componente che desideri implementare, potrebbe essere possibile estendere o personalizzare un’istanza esistente, anziché definire e sviluppare l’intero struttura da zero.
Quando estendete o personalizzate un componente o una finestra di dialogo esistente, potete copiare o replicare l’intera struttura o la struttura necessaria per la finestra di dialogo prima di apportare le modifiche.
Estensione di un componente esistente extending-an-existing-component
L’estensione di un componente esistente può essere ottenuta con Gerarchia dei tipi di risorsa e i relativi meccanismi di ereditarietà.
/apps
deve definire l'intera sovrapposizione.Personalizzazione di una finestra di dialogo del componente esistente customizing-a-existing-component-dialog
È inoltre possibile ignorare un finestra di dialogo dei componenti utilizzando Sling Resource Merger e definizione della proprietà sling:resourceSuperType
.
Questo significa che devi solo ridefinire le differenze richieste, invece di ridefinire l’intera finestra di dialogo (utilizzando sling:resourceSuperType
). Metodo consigliato per l’estensione di una finestra di dialogo di un componente
Consulta la sezione Sling Resource Merger per ulteriori dettagli.
Definizione del markup defining-the-markup
Verrà eseguito il rendering del componente con HTML. Il componente deve definire il HTML necessario per prendere il contenuto richiesto e quindi eseguirne il rendering come necessario, sia negli ambienti di authoring che di pubblicazione.
Utilizzo di HTML Template Language using-the-html-template-language
La Lingua dei modelli HTML (HTL), introdotto con AEM 6.0, sostituisce JSP (JavaServer Pages) come sistema di modelli lato server preferito e consigliato per HTML. Per gli sviluppatori web che hanno bisogno di creare siti web aziendali affidabili, HTL consente di ottenere maggiore sicurezza ed efficienza di sviluppo.
Sviluppo della logica dei contenuti developing-the-content-logic
Questa logica facoltativa seleziona e/o calcola il contenuto di cui eseguire il rendering. Viene richiamato dalle espressioni HTL con il pattern Use-API appropriato.
Il meccanismo per separare la logica dall'aspetto aiuta a chiarire ciò che viene richiesto per una determinata vista. Permette anche di usare logiche diverse per diverse viste della stessa risorsa.
Utilizzo di Java using-java
L’API di utilizzo Java HTL abilita un file HTL per accedere a metodi helper in una classe Java personalizzata. Questo consente di utilizzare il codice Java per implementare la logica necessaria per selezionare e configurare il contenuto del componente.
Utilizzo di JavaScript using-javascript
L’API di utilizzo JavaScript HTL abilita un file HTL per accedere al codice helper scritto in JavaScript. Questo consente di utilizzare il codice JavaScript per implementare la logica necessaria per selezionare e configurare il contenuto del componente.
Utilizzo delle librerie HTML lato client using-client-side-html-libraries
I siti web moderni si basano fortemente sull’elaborazione lato client basata su codice JavaScript e CSS complessi. Organizzare e ottimizzare il servizio di questo codice può essere un problema complicato.
Per risolvere questo problema, AEM fornisce Cartelle libreria lato client, che ti consente di memorizzare il codice lato client nell’archivio, organizzarlo in categorie e definire quando e come ogni categoria di codice deve essere trasmessa al client. Il sistema di libreria lato client si occupa quindi di produrre i collegamenti corretti nella pagina web finale per caricare il codice corretto.
Leggi Utilizzo delle librerie HTML lato client per ulteriori informazioni.
Configurazione del comportamento di modifica configuring-the-edit-behavior
Puoi configurare il comportamento di modifica di un componente, compresi attributi come le azioni disponibili per il componente, le caratteristiche dell’editor locale e i listener relativi agli eventi sul componente. La configurazione è comune sia all’interfaccia touch che all’interfaccia classica, anche se con alcune specifiche differenze.
La è configurato il comportamento di modifica di un componente aggiungendo un cq:editConfig
nodo di tipo cq:EditConfig
sotto il nodo del componente (di tipo cq:Component
) e aggiungendo proprietà specifiche e nodi secondari.
Configurazione del comportamento di anteprima configuring-the-preview-behavior
La Modalità WCM cookie impostato quando si passa a Anteprima anche quando la pagina non viene aggiornata.
Per i componenti con un rendering sensibile alla modalità WCM, è necessario definirli per aggiornarsi in modo specifico, quindi basarsi sul valore del cookie.
Creazione e configurazione di una finestra di dialogo creating-and-configuring-a-dialog
Le finestre di dialogo consentono all’autore di interagire con il componente. Mediante una finestra di dialogo gli autori e/o gli amministratori possono modificare il contenuto, configurare il componente o definire parametri di progettazione (utilizzando un’ Finestra di dialogo Progettazione)
Interfaccia Coral e interfaccia Granite coral-ui-and-granite-ui
Interfaccia Coral e Interfaccia Granite definisci l'aspetto e la sensazione moderni di AEM.
L’interfaccia utente Granite offre una vasta gamma di componenti di base (widget) necessaria per creare una finestra di dialogo sull’ambiente di authoring. Se necessario, puoi estendere questa selezione e creare un widget personalizzato.
Per maggiori dettagli consultare:
-
Interfaccia Coral
- Fornisce un'interfaccia utente coerente in tutte le soluzioni cloud
- Concetti dell’interfaccia AEM touch - Interfaccia Coral
- Guida all’interfaccia utente Coral
-
Interfaccia Granite
- Fornisce il markup dell’interfaccia utente Coral nei componenti Sling per la creazione di console e finestre di dialogo dell’interfaccia utente
- Concetti dell’interfaccia AEM touch - Interfaccia Granite
- Documentazione dell’interfaccia utente Granite
Creazione di una nuova finestra di dialogo creating-a-new-dialog
Finestre di dialogo per l’interfaccia touch:
-
sono denominati
cq:dialog
. -
sono definite come
nt:unstructured
con il nodosling:resourceType
impostata. -
sono situati sotto le loro
cq:Component
e accanto alla relativa definizione del componente. -
vengono sottoposti a rendering sul lato server (come componenti Sling), in base alla loro struttura del contenuto e alla
sling:resourceType
proprietà. -
utilizza il framework dell'interfaccia utente Granite.
-
contiene una struttura di nodo che descrive i campi all’interno della finestra di dialogo.
- questi nodi sono
nt:unstructured
con ilsling:resourceType
proprietà.
- questi nodi sono
Un esempio di struttura del nodo potrebbe essere:
newComponent (cq:Component)
cq:dialog (nt:unstructured)
content
layout
items
column
items
file
description
La personalizzazione di una finestra di dialogo è simile allo sviluppo di un componente, in quanto la finestra di dialogo stessa è un componente (ad esempio, il markup rappresentato da uno script di un componente insieme al comportamento/stile fornito da una libreria client).
Per esempi, consulta:
/libs/foundation/components/text/cq:dialog
/libs/foundation/components/download/cq:dialog
Personalizzazione dei campi della finestra di dialogo customizing-dialog-fields
- la sessione AEM Gems su Personalizzazione dei campi della finestra di dialogo.
- il relativo codice di esempio di cui Esempio di codice - Come personalizzare i campi della finestra di dialogo.
Creazione di un nuovo campo creating-a-new-field
I widget per l’interfaccia touch sono implementati come componenti dell’interfaccia utente Granite.
Per creare un nuovo widget da utilizzare in una finestra di dialogo dei componenti per l’interfaccia touch, è necessario creare un nuovo componente campo dell’interfaccia utente Granite.
Se si considera la finestra di dialogo come un contenitore semplice per un elemento modulo, è anche possibile visualizzare il contenuto principale del contenuto della finestra di dialogo come campi modulo. La creazione di un nuovo campo modulo richiede la creazione di un tipo di risorsa; equivale a creare un nuovo componente. Per facilitare l’esecuzione di tale attività, l’interfaccia utente Granite offre un componente campo generico da cui ereditare (utilizzando sling:resourceSuperType
):
/libs/granite/ui/components/coral/foundation/form/field
In particolare, l’interfaccia utente Granite offre una serie di componenti per campo adatti all’uso nelle finestre di dialogo (o, più in generale, in forms).
cq:Widgets
nodi, ciascuno con un particolare xtype
stabilire la relazione con il widget ExtJS corrispondente. Dal punto di vista dell'implementazione, questi widget sono stati resi sul lato client dal framework ExtJS.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
riferimento al tipo di risorsa appena introdotto.
Creazione di una libreria client per stile e comportamento creating-a-client-library-for-style-and-behavior
Per definire stile e comportamento del componente, puoi creare un libreria client che definisce i CSS/LESS e JS personalizzati.
Per fare in modo che la libreria client venga caricata solo per la finestra di dialogo del componente (ovvero non verrà caricata per un altro componente), è necessario impostare la proprietà extraClientlibs
della finestra di dialogo con il nome della categoria della libreria client appena creata. Questo è consigliabile se la libreria client è abbastanza grande e/o se il campo è specifico per tale finestra di dialogo e non sarà necessario in altre finestre di dialogo.
Per caricare la libreria client per tutte le finestre di dialogo, imposta la proprietà category della libreria client su cq.authoring.dialog
. Questo è il nome della categoria della libreria client inclusa per impostazione predefinita durante il rendering di tutte le finestre di dialogo. Si desidera eseguire questa operazione se la libreria client è piccola e/o il campo è generico e può essere riutilizzato in altre finestre di dialogo.
Ad esempio, consulta:
-
cqgems/customizingfield/components/colorpicker/clientlibs
- di cui Esempio di codice
Estensione (ereditarietà da) un campo extending-inheriting-from-a-field
A seconda delle tue esigenze, puoi:
- Estende un dato campo dell’interfaccia Granite in base all’ereditarietà di un componente (
sling:resourceSuperType
) - Estendi un determinato widget dalla libreria di widget sottostante (nel caso dell'interfaccia utente Granite, questa è l'interfaccia utente Coral), seguendo l'API della libreria di widget (ereditarietà JS/CSS)
Accesso ai campi della finestra di dialogo access-to-dialog-fields
Puoi anche 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"]
Gestione degli eventi dei campi handling-field-events
Il metodo di gestione degli eventi nei campi di dialogo è ora eseguito con listener in una libreria client personalizzata. Questo è un cambiamento rispetto al vecchio metodo di avere ascoltatori nella struttura del contenuto.
Listener in una libreria client personalizzata listeners-in-a-custom-client-library
Per inserire una logica nel campo, devi:
- Fai in modo che il tuo campo sia contrassegnato con una determinata classe CSS (l' gancio).
- Definisci, nella libreria client, un listener JS collegato al nome della classe CSS (in questo modo la logica personalizzata viene delimitata solo nel campo e non influisce su altri campi dello stesso tipo).
Per ottenere questo risultato è necessario conoscere la libreria di widget sottostante con cui si desidera interagire. Consulta la sezione Documentazione dell’interfaccia utente Coral per identificare l'evento a cui si desidera reagire. È molto simile al processo che si era dovuto eseguire con ExtJS in passato: trova la pagina della documentazione di un determinato widget, quindi controlla i dettagli della sua API evento.
Ad esempio, consulta:
-
cqgems/customizingfield/components/clientlibs/customizingfield
- di cui Esempio di codice
Ascoltatori nella struttura del contenuto listeners-in-the-content-structure
Nell’interfaccia classica con ExtJS, nella struttura dei contenuti era solito avere ascoltatori per un determinato widget. Il raggiungimento dello stesso risultato nell’interfaccia touch è diverso perché il codice del listener JS (o qualsiasi altro codice) non è più definito nel contenuto.
la struttura del contenuto descrive la struttura semantica; non deve implicare la natura del widget sottostante. Non disponendo di codice JS nella struttura del contenuto, puoi modificare i dettagli di implementazione senza dover modificare la struttura del contenuto. In altre parole, puoi modificare la libreria dei widget senza dover toccare la struttura del contenuto.
Rilevamento della disponibilità della finestra di dialogo dialog-ready
Se disponi di un JavaScript personalizzato che deve essere eseguito solo quando la finestra di dialogo è disponibile e pronta, è necessario prestare attenzione alle dialog-ready
evento.
Questo evento viene attivato ogni volta che la finestra di dialogo viene caricata (o ricaricata) ed è pronta per l’uso, il che significa che ogni volta che si verifica una modifica (creazione/aggiornamento) nel DOM della finestra di dialogo.
dialog-ready
può essere utilizzato per agganciare nel codice personalizzato JavaScript che esegue personalizzazioni sui campi all’interno di una finestra di dialogo o attività simili.
Convalida campo field-validation
Campo obbligatorio mandatory-field
Per contrassegnare un dato campo come obbligatorio, imposta la seguente proprietà sul nodo del contenuto del campo:
- Nome:
required
- Tipo:
Boolean
Ad esempio, consulta:
/libs/foundation/components/page/cq:dialog/content/items/tabs/items/basic/items/column/items/title/items/title
Convalida del campo (interfaccia utente Granite) field-validation-granite-ui
La convalida dei campi nell’interfaccia utente Granite e nei componenti dell’interfaccia Granite (equivalenti ai widget) viene eseguita utilizzando foundation-validation
API. Consulta la sezione foundation-valdiation
Documentazione Granite per i dettagli.
Per esempi, consulta:
-
cqgems/customizingfield/components/clientlibs/customizingfield/js/validations.js
- di cui Esempio di codice
-
/libs/cq/gui/components/authoring/dialog/clientlibs/dialog/js/validations.js
Creazione e configurazione di una finestra di dialogo di progettazione creating-and-configuring-a-design-dialog
La finestra di dialogo Progettazione viene visualizzata quando un componente presenta dettagli di progettazione che possono essere modificati in Modalità Progettazione.
La definizione è molto simile a quella di un finestra di dialogo utilizzata per modificare il contenuto, con la differenza che viene definita come nodo:
- Nome nodo:
cq:design_dialog
- Tipo:
nt:unstructured
Creazione e configurazione di un editor interno creating-and-configuring-an-inplace-editor
Un editor interno consente all’utente di modificare il contenuto direttamente nel flusso di paragrafi, senza la necessità di aprire una finestra di dialogo. Ad esempio, i componenti Testo e Titolo standard dispongono entrambi di un editor interno.
Un editor interno non è necessario/significativo per ogni tipo di componente.
Vedi Estensione dell’authoring delle pagine - Aggiungi nuovo editor interno per ulteriori informazioni.
Personalizzazione della barra degli strumenti del componente customizing-the-component-toolbar
La Barra degli strumenti del componente consente all’utente di accedere a una serie di azioni per il componente, quali modifica, configurazione, copia ed eliminazione.
Vedi Estensione dell’authoring delle pagine - Aggiungere una nuova azione a una barra degli strumenti di un componente per ulteriori informazioni.
Configurazione di un componente per la barra laterale Riferimenti (prestato/prestato) configuring-a-component-for-the-references-rail-borrowed-lent
Se il nuovo componente fa riferimento a contenuti provenienti da altre pagine, puoi considerare se desideri che influisca sul Contenuto preso in prestito e Contenuto prestato sezioni Riferimenti Ferrovia.
Il componente Riferimento AEM viene selezionato solo come componente predefinito. Per aggiungere il componente è necessario configurare il bundle OSGi Configurazione di riferimento per contenuti di authoring WCM.
Crea una nuova voce nella definizione, specificando il componente e la proprietà da controllare. Ad esempio:
/apps/<your-Project>/components/reference@parentPath
Abilitazione e aggiunta del componente al sistema paragrafo enabling-and-adding-your-component-to-the-paragraph-system
Una volta sviluppato, il componente deve essere abilitato per l’uso in un sistema paragrafo appropriato, in modo che possa essere utilizzato nelle pagine richieste.
Questo può essere fatto da:
- utilizzo Modalità Progettazione durante la modifica di una pagina specifica.
- definizione dei componenti nel sistema paragrafo di un modello.
La configurazione di un sistema di paragrafi in modo che il trascinamento di una risorsa crei un’istanza di componente configuring-a-paragraph-system-so-that-dragging-an-asset-creates-a-component-instance
AEM offre la possibilità di configurare un sistema paragrafo sulla pagina in modo che un’istanza del nuovo componente viene creata automaticamente quando un utente trascina una risorsa (appropriata) in un’istanza della pagina invece di dover sempre trascinare un componente vuoto sulla pagina.
Questo comportamento e la relazione risorsa-componente richiesta possono essere configurati:
-
Sotto la definizione di paragrafo della progettazione della pagina. Ad esempio:
/etc/designs/<myApp>/page/par
Crea un nuovo nodo:
- Nome:
cq:authoring
- Tipo:
nt:unstructured
-
In questo crea un nuovo nodo per contenere tutte le mappature asset-to-component:
- Nome:
assetToComponentMapping
- Tipo:
nt:unstructured
- Nome:
-
Per ogni mappatura asset-to-component crea un nodo:
- Nome: testo; si raccomanda che il nome indichi l’attività e il tipo di componente correlato; ad esempio, image
- Tipo:
nt:unstructured
Ognuna con le seguenti proprietà:
-
assetGroup
:- Tipo:
String
- Valore: il gruppo al quale appartiene l'attività connessa; ad esempio,
media
- Tipo:
-
assetMimetype
:- Tipo:
String
- Valore: il tipo MIME dell’attività correlata; per esempio
image/*
- Tipo:
-
droptarget
:- Tipo:
String
- Valore: l'obiettivo di caduta; ad esempio,
image
- Tipo:
-
resourceType
:- Tipo:
String
- Valore: la relativa risorsa componente; ad esempio,
foundation/components/image
- Tipo:
-
type
:- Tipo:
String
- Valore: il tipo, ad esempio,
Images
- Tipo:
Per esempi consulta:
/etc/designs/geometrixx/jcr:content/page/par/cq:authoring
/etc/designs/geometrixx-outdoors/jcr:content/page/par/cq:authoring
/etc/designs/geometrixx-media/jcr:content/article/article-content-par/cq:authoring
CODICE SU GITHUB
Puoi trovare il codice di questa pagina su GitHub
- Apri progetto aem-project-archetype su GitHub
- Scarica il progetto come un file ZIP
Utilizzo dell’estensione AEM Brackets using-the-aem-brackets-extension
La Estensione Bracket AEM fornisce un flusso di lavoro fluido per modificare i componenti AEM e le librerie client. Si basa sul Parentesi editor di codice.
Estensione:
- Semplifica la sincronizzazione (senza Maven o File Vault necessari) per aumentare l'efficienza degli sviluppatori e aiuta gli sviluppatori front-end con limitata conoscenza AEM a partecipare ai progetti.
- Fornisce alcuni HTL supporto, il linguaggio dei modelli progettato per semplificare lo sviluppo dei componenti e aumentare la sicurezza.
Migrazione da un componente Classic migrating-from-a-classic-component
Durante la migrazione di un componente progettato per l’uso con l’interfaccia classica a un componente che può essere utilizzato con l’interfaccia touch (solo o congiuntamente), è necessario tenere in considerazione i seguenti problemi:
-
HTL
- Utilizzo di HTL non è obbligatorio, ma se il componente deve essere aggiornato, è il momento ideale per considerare migrazione da JSP a HTL.
-
Componenti
- Migrare
cq:listener
codice che utilizza funzioni specifiche dell’interfaccia classica - plugin RTE, per ulteriori informazioni vedi Configurazione dell’editor Rich Text.
- Migrare
cq:listener
codice che utilizza funzioni specifiche dell’interfaccia classica
- Migrare
-
Finestre di dialogo
- Sarà necessario creare una nuova finestra di dialogo da utilizzare nell’interfaccia touch. Tuttavia, a fini di compatibilità, l’interfaccia touch può utilizzare la definizione di una finestra di dialogo dell’interfaccia classica, se non è stata definita alcuna finestra di dialogo per l’interfaccia touch.
- La Strumenti di modernizzazione AEM viene fornito per facilitare l’estensione dei componenti esistenti.
- Mappatura di ExtJS sui componenti dell’interfaccia Granite fornisce una comoda panoramica degli xtype e dei tipi di nodo ExtJS con i tipi di risorse equivalenti dell’interfaccia Granite.
- Personalizzazione dei campi, per ulteriori informazioni consulta la sessione AEM Gems su Personalizzazione dei campi della finestra di dialogo.
- Migrare da tipi a Convalida dell’interfaccia utente Granite
- Utilizzando gli ascoltatori JS, per ulteriori informazioni vedi Gestione degli eventi dei campi e la sessione AEM Gems su Personalizzazione dei campi della finestra di dialogo.
Migrazione del codice cq:listener migrating-cq-listener-code
Se stai eseguendo la migrazione di un progetto progettato per l’interfaccia classica, l’ cq:listener
Il codice (e le clientlib relative ai componenti) può utilizzare funzioni specifiche dell’interfaccia classica (ad esempio CQ.wcm.*
). Per la migrazione è necessario aggiornare tale codice utilizzando gli oggetti/le funzioni equivalenti nell’interfaccia touch.
Se il progetto viene migrato completamente nell’interfaccia touch, è necessario sostituire tale codice per utilizzare gli oggetti e le funzioni pertinenti all’interfaccia touch.
Tuttavia, se durante il periodo di migrazione il progetto deve essere compatibile sia con l’interfaccia classica che con quella touch (lo scenario più consueto), è necessario implementare uno switch per differenziare il codice separato che fa riferimento agli oggetti appropriati.
Questo meccanismo di commutazione può essere implementato come segue:
if (Granite.author) {
// touch UI
} else {
// classic UI
}
Documentazione del componente documenting-your-component
In qualità di sviluppatore, desideri accedere facilmente alla documentazione del componente per comprendere rapidamente:
- Descrizione
- Uso previsto
- Struttura e proprietà del contenuto
- API e punti di estensione esposti
- Ecc.
Per questo motivo, è abbastanza semplice rendere disponibile qualsiasi markdown della documentazione esistente all’interno del componente stesso.
Tutto quello che devi fare è mettere un README.md
nella struttura del componente. Questa Markdown verrà quindi visualizzata nella console dei componenti.
Il markdown supportato è lo stesso di quello di frammenti di contenuto.