AEM 6.4 ha raggiunto la fine del supporto esteso e questa documentazione non viene più aggiornata. Per maggiori dettagli, consulta la nostra periodi di assistenza tecnica. Trova le versioni supportate qui.
L’interfaccia classica utilizza ExtJS per creare widget che forniscono l’aspetto dei componenti. A causa della natura di questi widget, vi sono alcune differenze tra il modo in cui i componenti interagiscono con l’interfaccia classica e il interfaccia touch.
Molti aspetti dello sviluppo dei componenti sono comuni sia all’interfaccia classica che a quella touch, quindi devi leggere Componenti AEM - Nozioni di base prima utilizzo di questa pagina, che tratta le specifiche dell’interfaccia classica.
Sebbene sia HTML Template Language (HTL) che JSP possano essere utilizzati per lo sviluppo di componenti per l’interfaccia classica, questa pagina illustra lo sviluppo con JSP. Ciò è dovuto esclusivamente alla cronologia dell’utilizzo di JSP nell’interfaccia classica.
HTL è ora il linguaggio di script consigliato per AEM. Vedi HTL e Sviluppo di componenti AEM per confrontare i metodi.
La struttura di base di un componente viene illustrata nella pagina Componenti AEM - Nozioni di base, che applica sia le interfacce touch che classica. Anche se non è necessario utilizzare le impostazioni per l’interfaccia touch nel nuovo componente, può essere utile conoscerle quando si eredita da componenti esistenti.
Gli script o i servlet JSP possono essere utilizzati per il rendering dei componenti. Secondo le regole di elaborazione della richiesta di Sling il nome per lo script predefinito è:
<*componentname*>.jsp
Il file di script JSP global.jsp
viene utilizzato per fornire un accesso rapido a oggetti specifici (ad esempio per accedere al contenuto) a qualsiasi file di script JSP utilizzato per il rendering di un componente.
Pertanto global.jsp
deve essere incluso in ogni script JSP di rendering del componente in cui uno o più oggetti forniti in global.jsp
sono utilizzati.
Posizione dell'impostazione predefinita global.jsp
è:
/libs/foundation/global.jsp
Il percorso /libs/wcm/global.jsp
, utilizzato dalle versioni CQ 5.3 e precedenti, ora è obsoleto.
Di seguito sono elencati gli oggetti più importanti forniti dall’impostazione predefinita global.jsp
:
Riepilogo:
<cq:defineObjects />
slingRequest
- L'oggetto di richiesta con wrapping ( SlingHttpServletRequest
).slingResponse
- L'oggetto di risposta racchiuso ( SlingHttpServletResponse
).resource
- L'Oggetto Risorsa Sling ( slingRequest.getResource();
).resourceResolver
- L'Oggetto Sling Resource Resolver ( slingRequest.getResoucreResolver();
).currentNode
- Il nodo JCR risolto per la richiesta.log
- Il logger predefinito ().sling
- L'helper dello script Sling.properties
- Le proprietà della risorsa gestita ( resource.adaptTo(ValueMap.class);
).pageProperties
- Le proprietà della pagina della risorsa gestita.pageManager
- Gestione delle pagine per l'accesso AEM pagine di contenuto ( resourceResolver.adaptTo(PageManager.class);
).component
- L'oggetto componente del componente AEM corrente.designer
- L'oggetto designer per il recupero delle informazioni di progettazione ( resourceResolver.adaptTo(Designer.class);
).currentDesign
- Progettazione della risorsa gestita.currentStyle
- Stile della risorsa gestita.Sono disponibili tre metodi per accedere al contenuto in AEM WCM:
Tramite l'oggetto properties introdotto in global.jsp
:
L'oggetto properties è un'istanza di ValueMap (vedi API Sling) e contiene tutte le proprietà della risorsa corrente.
Esempio: String pageTitle = properties.get("jcr:title", "no title");
utilizzato nello script di rendering di un componente pagina.
Esempio: String paragraphTitle = properties.get("jcr:title", "no title");
utilizzato nello script di rendering di un componente paragrafo standard.
Tramite il currentPage
oggetto introdotto in global.jsp
:
La currentPage
l'oggetto è un'istanza di una pagina (vedi API AEM). La classe page fornisce alcuni metodi per accedere al contenuto.
Esempio: String pageTitle = currentPage.getTitle();
Via currentNode
oggetto introdotto in global.jsp
:
La currentNode
l'oggetto è un'istanza di un nodo (vedi API JCR). Le proprietà di un nodo sono accessibili dal getProperty()
metodo .
Esempio: String pageTitle = currentNode.getProperty("jcr:title");
Le librerie di tag CQ e Sling consentono di accedere a funzioni specifiche da utilizzare nello script JSP dei modelli e dei componenti.
Per ulteriori informazioni, consulta il documento Librerie di tag.
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.
Vedere il documento Utilizzo delle librerie HTML lato client per ulteriori informazioni.
Per aggiungere e configurare il contenuto, è necessaria una finestra di dialogo per gli autori.
Vedi Componenti AEM - Nozioni di base per ulteriori dettagli.
Puoi configurare il comportamento di modifica di un componente. Ciò include 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 alle interfacce touch che alle interfacce 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.
Vedi Utilizzo ed estensione dei widget ExtJS per ulteriori dettagli.
Vedi Utilizzo di xtypes per ulteriori dettagli.
Questa sezione descrive come creare i propri componenti e aggiungerli al sistema paragrafo.
Un modo rapido per iniziare consiste nel copiare un componente esistente e quindi apportare le modifiche desiderate.
Un esempio di come sviluppare un componente è descritto in dettaglio in Estensione del componente Testo e immagine - Un esempio.
Per sviluppare nuovi componenti per AEM basati sul componente esistente è possibile copiare il componente, creare un file javascript per il nuovo componente e archiviarlo in una posizione accessibile a AEM (vedi anche Personalizzazione di componenti e altri elementi):
Utilizzando CRXDE Lite, crea una nuova cartella di componenti in:
/ apps/<myProject>/components/<myComponent>
Ricrea la struttura del nodo come in libs, quindi copia la definizione di un componente esistente, ad esempio il componente Testo . Ad esempio, per personalizzare la copia del componente Testo :
/libs/foundation/components/text
/apps/myProject/components/text
Modifica la jcr:title
per riflettere il nuovo nome.
Apri la nuova cartella dei componenti e apporta le modifiche necessarie. Inoltre, elimina eventuali informazioni estranee presenti nella cartella.
Puoi apportare modifiche quali:
aggiunta di un nuovo campo nella finestra di dialogo
cq:dialog
- Finestra di dialogo per l’interfaccia touchdialog
- Finestra di dialogo per l’interfaccia classicasostituzione del .jsp
file (denominalo dopo il nuovo componente)
o rielaborazione completa dell’intero componente, se lo si desidera
Ad esempio, se scegli una copia del componente Testo standard, puoi aggiungere un campo aggiuntivo alla finestra di dialogo e quindi aggiornare il .jsp
per elaborare l'input effettuato in quel punto.
Un componente per:
Una finestra di dialogo definita per l’interfaccia classica funziona all’interno dell’interfaccia touch.
Una finestra di dialogo definita per l’interfaccia touch non funziona nell’interfaccia classica.
A seconda dell’ambiente di istanza e authoring, è possibile definire entrambi i tipi di finestra di dialogo per il componente.
Uno dei seguenti nodi deve essere presente e inizializzato correttamente affinché venga visualizzato il nuovo componente:
cq:dialog
- Finestra di dialogo per l’interfaccia touchdialog
- Finestra di dialogo per l’interfaccia classicacq:editConfig
- comportamento dei componenti nell’ambiente di modifica (ad esempio, trascinamento)design_dialog
- finestra di dialogo per la modalità di progettazione (solo interfaccia classica)Attiva il nuovo componente nel sistema paragrafo:
<path-to-component>
(ad esempio, /apps/geometrixx/components/myComponent
) ai componenti di proprietà del nodo /etc/designs/geometrixx/jcr:content/contentpage/par
In AEM WCM, apri una pagina del sito Web e inserisci un nuovo paragrafo del tipo appena creato per verificare che il componente funzioni correttamente.
Per visualizzare le statistiche di temporizzazione per il caricamento della pagina, puoi utilizzare Ctrl-Maiusc-U con ?debugClientLibs=true
nell’URL.
Una volta sviluppato il componente, lo aggiungi al sistema di paragrafi, consentendo agli autori di selezionare e utilizzare il componente durante la modifica di una pagina.
Accedere a una pagina dell’ambiente di authoring che utilizza il sistema paragrafo, ad esempio <contentPath>/Test.html
.
Passa alla modalità Progettazione effettuando una delle seguenti operazioni:
aggiunta ?wcmmode=design
alla fine dell’URL e accedi di nuovo, ad esempio:
<contextPath>/ Test.html?wcmmode=design
clic su Progettazione nella barra laterale
Ora sei in modalità progettazione e puoi modificare il sistema paragrafo.
Fai clic su Modifica.
Viene visualizzato un elenco dei componenti appartenenti al sistema paragrafo. È elencato anche il nuovo componente.
I componenti possono essere attivati (o disattivati) per determinare quali vengono offerti all’autore durante la modifica di una pagina.
Attiva il componente, quindi torna alla modalità di modifica normale per verificare che sia disponibile per l’uso.
Questa sezione fornisce un esempio su come estendere il componente di testo e immagine standard, ampiamente utilizzato, con una funzione di posizionamento dell’immagine configurabile.
L’estensione al componente testo e immagine consente agli editor di utilizzare tutte le funzionalità esistenti del componente, oltre a un’opzione aggiuntiva per specificare il posizionamento dell’immagine:
Dopo aver esteso questo componente, puoi configurare il posizionamento dell’immagine tramite la finestra di dialogo del componente.
In questo esercizio sono descritte le seguenti tecniche:
Questo esempio è destinato all’interfaccia classica.
Questo esempio si basa sul contenuto di esempio di Geometrixx, che non viene più fornito con AEM, essendo stato sostituito da We.Retail. Vedere il documento Implementazione di riferimento di We.Retail per informazioni su come scaricare e installare Geometrixx.
Per creare il nuovo componente, utilizziamo il componente di testo standard come base e lo modifichiamo. Il nuovo componente viene memorizzato nell’applicazione di esempio Geometrixx AEM WCM.
Copia il componente di testo standard da /libs/foundation/components/textimage
nella cartella del componente Geometrixx, /apps/geometrixx/components
, utilizzando il textimage come nome del nodo di destinazione. Copia il componente accedendo al componente, facendo clic con il pulsante destro del mouse e selezionando Copia e navigando nella directory di destinazione.
Per semplificare questo esempio, passa al componente copiato ed elimina tutti i sottonodi del nuovo nodo di textimage, tranne i seguenti:
textimage/dialog
textimage/textimage.jsp
textimage/cq:editConfig
La definizione della finestra di dialogo dipende dall’interfaccia utente:
textimage/cq:dialog
textimage/dialog
Modifica i metadati del componente:
Nome componente
jcr:description
a Text Image Component (Extended)
jcr:title
a Text Image (Extended)
Gruppo, in cui il componente è elencato nella barra laterale (lascia così com’è)
componentGroup
impostato su General
Componente principale per il nuovo componente (il componente di testo standard)
sling:resourceSuperType
a foundation/components/textimage
Dopo questo passaggio, il nodo del componente si presenta così:
Modificare la sling:resourceType
proprietà del nodo di configurazione modifica dell'immagine (proprietà: textimage/cq:editConfig/cq:dropTargets/image/parameters/sling:resourceType
) a geometrixx/components/textimage.
In questo modo, quando un’immagine viene rilasciata al componente sulla pagina, la sling:resourceType
la proprietà del componente testo esteso è impostata su: geometrixx/components/textimage.
Modificare la finestra di dialogo del componente in modo da includere la nuova opzione. Il nuovo componente eredita le parti della finestra di dialogo uguali a quelle dell’originale. L'unica aggiunta che facciamo è quella di estendere Avanzate scheda , aggiunta di un Posizione immagine elenco a discesa, con opzioni Sinistra e Destra:
textimage/dialog
proprietà invariate.Nota come textimage/dialog/items
presenta quattro sottonodi, da tab1 a tab4, che rappresentano le quattro schede della finestra di dialogo della textimage.
Per le prime due schede (tab1 e tab2):
/libs/foundation/components/textimage/dialog/items/tab1.infinity.json
e /libs/foundation/components/textimage/dialog/items/tab2.infinity.json
, rispettivamente.Per la scheda 3:
Lascia le proprietà e i sottonodi senza modifiche
Aggiungi una nuova definizione di campo a tab3/items
, posizione del nodo del tipo cq:Widget
Imposta le seguenti proprietà (di tipo String) per il nuovo tab3/items/position
nodo:
name
: ./imagePosition
xtype
: selection
fieldLabel
: Image Position
type
: select
Aggiungi nodo secondario position/options
di tipo cq:WidgetCollection
per rappresentare le due scelte per il posizionamento dell'immagine, e sotto di esso creare due nodi, o1 e o2 di tipo nt:unstructured
.
Per nodo position/options/o1
imposta le proprietà: text
a Left
e value
a left.
Per nodo position/options/o2
imposta le proprietà: text
a Right
e value
a right
.
Elimina scheda4.
La posizione dell'immagine viene mantenuta nel contenuto come imagePosition
proprietà del nodo che rappresenta textimage
paragrafo. Dopo questi passaggi, la finestra di dialogo del componente si presenta così:
Estende lo script del componente, textimage.jsp
, con ulteriore gestione del nuovo parametro:
Image image = new Image(resource, "image");
if (image.hasContent() || WCMMode.fromRequest(request) == WCMMode.EDIT) {
image.loadStyleData(currentStyle);
Sostituiremo il frammento di codice sottolineato %><div class="image"><% con nuovo codice che genera uno stile personalizzato per questo tag.
// todo: add new CSS class for the 'right image' instead of using
// the style attribute
String style="";
if (properties.get("imagePosition", "left").equals("right")) {
style = "style=\"float:right\"";
}
%><div <%= style %> class="image"><%
Salva il componente nella directory archivio. Il componente è pronto per il test.
Una volta sviluppato il componente, è possibile aggiungerlo al sistema di paragrafi, consentendo agli autori di selezionare e utilizzare il componente durante la modifica di una pagina. Questi passaggi consentono di testare il componente.
Il componente memorizza il suo contenuto in un paragrafo della pagina Società.
Per disabilitare questa funzionalità, utilizziamo il componente immagine standard come base e lo modifichiamo. Il nuovo componente viene memorizzato nell’applicazione di Geometrixx.
Copia il componente immagine standard da /libs/foundation/components/image
nella cartella del componente Geometrixx, /apps/geometrixx/components
, utilizzando l’immagine come nome del nodo di destinazione.
Modifica i metadati del componente:
Image (Extended)
Accedi a /apps/geometrixx/components/image/dialog/items/image
.
Aggiungi una nuova proprietà:
allowUpload
String
false
Fai clic su Salva tutto. Il componente è pronto per il test.
Apri una pagina in Geometrixx, ad esempio Inglese / Azienda.
Passa alla modalità di progettazione e attiva l'immagine (Extended).
Torna alla modalità di modifica e aggiungilo al sistema paragrafo. Nelle immagini successive, è possibile vedere le differenze tra il componente immagine originale e quello appena creato.
Componente immagine originale:
Il nuovo componente immagine:
Il componente è ora pronto per l’uso.