Show Menu
ARGOMENTI×

Personalizzazione ed estensione dei frammenti di contenuto

Alcune funzionalità per i frammenti di contenuto richiedono l’applicazione di AEM 6.4 Service Pack 2 (6.4.2.0) .
Un frammento di contenuto estende una risorsa standard; vedere:

Architettura

Le parti costitutive di base di un frammento di contenuto sono:
  • Un Frammento Di Contenuto,
  • costituito da uno o più elementi di contenuto,
  • e che possono avere una o più varianti di contenuto.
A seconda del tipo di frammento, vengono utilizzati anche modelli o modelli:
I modelli di frammento di contenuto vengono utilizzati per tutti gli esempi in We.Retail.
  • Modelli per frammenti di contenuto:
    • Utilizzato per definire frammenti di contenuto contenenti contenuto strutturato.
    • I modelli di frammento di contenuto definiscono la struttura di un frammento di contenuto al momento della creazione.
    • Un frammento fa riferimento al modello; le modifiche apportate al modello possono quindi avere o avranno effetto su eventuali frammenti dipendenti.
    • I modelli sono composti di tipi di dati.
    • Le funzioni per aggiungere nuove varianti, ecc., devono aggiornare di conseguenza il frammento.
    Qualsiasi modifica apportata a un modello di frammento di contenuto esistente può avere un impatto sui frammenti dipendenti; in questo modo è possibile creare proprietà orfane nei frammenti.
  • Modelli di frammento di contenuto:
    • Utilizzato per definire frammenti di contenuto semplici.
    • I modelli definiscono la struttura (di base, solo testo) di un frammento di contenuto al momento della creazione.
    • Il modello viene copiato nel frammento al momento della creazione; pertanto, ulteriori modifiche al modello non si rifletteranno sui frammenti esistenti.
    • Le funzioni per aggiungere nuove varianti, ecc., devono aggiornare di conseguenza il frammento.
    • I modelli di frammento di contenuto funzionano in modo diverso rispetto ad altri meccanismi di modellazione all’interno dell’ecosistema AEM (ad esempio, modelli di pagina, ecc.). Devono pertanto essere considerati separatamente.
    • Se basato su un modello, il tipo MIME del contenuto è gestito sul contenuto effettivo; ciò significa che ogni elemento e ogni variante possono avere un tipo MIME diverso.

Integrazione con le risorse

Content Fragment Management (CFM) fa parte di AEM Assets come segue:
  • I frammenti di contenuto sono risorse.
  • Utilizzano la funzionalità Risorse esistente.
  • Sono completamente integrati con le risorse (console di amministrazione, ecc.).

Mapping di frammenti di contenuto strutturati a risorse

I frammenti di contenuto con contenuto strutturato (ovvero basato su un modello di frammento di contenuto) vengono mappati su una singola risorsa:
  • Tutto il contenuto è memorizzato nel jcr:content/data nodo della risorsa:
    • I dati dell'elemento vengono memorizzati sotto il nodo secondario principale:
      jcr:content/data/master
    • Le varianti sono memorizzate in un nodo secondario che contiene il nome della variante:
      ad esempio jcr:content/data/myvariation
    • I dati di ciascun elemento vengono memorizzati nel rispettivo nodo secondario come proprietà con il nome dell'elemento:
      Ad esempio, il contenuto dell'elemento text viene memorizzato come proprietà text in jcr:content/data/master
  • I metadati e il contenuto associato sono memorizzati sotto jcr:content/metadata
    Ad eccezione del titolo e della descrizione, che non sono considerati metadati tradizionali e memorizzati in jcr:content

Mappatura di frammenti di contenuto semplici a risorse

I frammenti di contenuto semplici (basati su un modello) sono mappati su un composito costituito da una risorsa principale e (facoltativamente) da risorse secondarie:
  • Tutte le informazioni non di contenuto di un frammento (ad esempio titolo, descrizione, metadati, struttura) vengono gestite esclusivamente sulla risorsa principale.
  • Il contenuto del primo elemento di un frammento viene mappato sulla rappresentazione originale della risorsa principale.
    • Le varianti (se ce ne sono) del primo elemento sono mappate ad altre rappresentazioni della risorsa principale.
  • Eventuali elementi aggiuntivi (se esistenti) sono mappati alle risorse secondarie della risorsa principale.
    • Il contenuto principale di questi elementi aggiuntivi viene associato alla rappresentazione originale della rispettiva sottorisorsa.
    • Altre variazioni (se applicabili) di eventuali elementi aggiuntivi sono associate ad altre rappresentazioni della rispettiva sub-attività.

Posizione risorsa

Come per le risorse standard, un frammento di contenuto è memorizzato in:
  • /content/dam

Autorizzazioni risorsa

Per ulteriori dettagli, vedere Frammento di contenuto - Considerazioni sull'eliminazione.

Integrazione delle funzionalità

  • La funzione Content Fragment Management (CFM) si basa sul core Assets, ma deve essere il più indipendente possibile.
  • CFM fornisce le proprie implementazioni per gli elementi nelle viste scheda/colonna/elenco; questi plug-in nelle implementazioni di rendering dei contenuti di Assets.
  • Diversi componenti Risorse sono stati estesi per gestire i frammenti di contenuto.

Utilizzo di frammenti di contenuto nelle pagine

È ora consigliabile utilizzare il componente di base del frammento di contenuto. Per ulteriori informazioni, consulta Sviluppo di componenti di base.
È possibile fare riferimento ai frammenti di contenuto dalle pagine AEM, come qualsiasi altro tipo di risorsa. AEM fornisce il componente di base di contenuto, un componente che consente di includere frammenti di contenuto nelle pagine . È inoltre possibile estendere questo componente di base​ Frammento ​di contenuto.
  • Il componente utilizza la fragmentPath proprietà per fare riferimento al frammento di contenuto effettivo. La fragmentPath proprietà viene gestita allo stesso modo delle proprietà simili di altri tipi di risorse; ad esempio, quando il frammento di contenuto viene spostato in un'altra posizione.
  • Il componente consente di selezionare la variante da visualizzare.
  • È inoltre possibile selezionare una serie di paragrafi per limitare l'output; ad esempio, può essere utilizzato per l'output a più colonne.
  • Il componente permette di inserire contenuti intermedi:
    • Qui il componente permette di inserire altre risorse (immagini, ecc.) tra i paragrafi del frammento a cui viene fatto riferimento.
      • Per il contenuto intermedio è necessario:
        • essere consapevole della possibilità di riferimenti instabili; il contenuto intermedio (aggiunto durante l’authoring di una pagina) non ha alcuna relazione fissa con il paragrafo a cui è posizionato accanto, inserendo un nuovo paragrafo (nell’editor dei frammenti di contenuto) prima che la posizione del contenuto intermedio possa perdere la posizione relativa
          • prendete in considerazione i parametri aggiuntivi (come i filtri di variazione e paragrafo) per evitare falsi positivi nei risultati di ricerca
Modello per frammenti di contenuto:
Quando si utilizza un frammento di contenuto basato su un modello di frammento di contenuto in una pagina, viene fatto riferimento al modello. Questo significa che se il modello non è stato pubblicato al momento della pubblicazione della pagina, verrà contrassegnato e il modello verrà aggiunto alle risorse da pubblicare insieme alla pagina.
Modello frammento di contenuto:
Quando si utilizza un frammento di contenuto basato su un modello di frammento di contenuto in una pagina, non è presente alcun riferimento in quanto il modello è stato copiato al momento della creazione del frammento.

Configurazione mediante la console OSGi

L’implementazione di back-end dei frammenti di contenuto, ad esempio, consente di rendere ricercabili le istanze di un frammento utilizzate in una pagina o di gestire contenuti multimediali diversi. Questa implementazione deve sapere quali componenti vengono utilizzati per il rendering dei frammenti e come viene parametrizzato il rendering.
I parametri per questo possono essere configurati nella console Configurazione OSGi con la console Web Web, per la configurazione dei frammenti di contenuto del bundle OSGi DAM.
  • Tipi di risorse
    È sling:resourceTypes possibile fornire un elenco di componenti utilizzati per il rendering dei frammenti di contenuto e a cui applicare l'elaborazione in background.
  • Proprietà di riferimento
    È possibile configurare un elenco di proprietà per specificare la posizione in cui viene memorizzato il riferimento al frammento per il rispettivo componente.
Nessuna mappatura diretta tra proprietà e tipo di componente.
AEM acquisisce semplicemente la prima proprietà che si trova su un paragrafo. Quindi dovreste scegliere le proprietà con attenzione.
Esistono ancora alcune linee guida da seguire per garantire che il componente sia compatibile con l’elaborazione in background del frammento di contenuto:
  • Il nome della proprietà in cui è definito l'elemento o gli elementi da sottoporre a rendering deve essere element o elementNames .
  • Il nome della proprietà in cui è definita la variante da sottoporre a rendering deve essere variation o variationName .
  • Se l'output di più elementi è supportato (utilizzando elementNames per specificare più elementi), la modalità di visualizzazione effettiva è definita dalla proprietà displayMode :
    • Se il valore è singleText (e c'è un solo elemento configurato), l'elemento viene rappresentato come un testo con contenuto intermedio, supporto di layout e così via. Questa è l'impostazione predefinita per i frammenti in cui viene eseguito il rendering di un solo elemento.
    • In caso contrario, viene utilizzato un approccio molto più semplice (potrebbe essere denominato "visualizzazione modulo"), in cui non è supportato alcun contenuto intermedio e il contenuto del frammento viene rappresentato "così com'è".
  • Se viene eseguito il rendering del frammento per displayMode == singleText (implicitamente o esplicitamente), vengono visualizzate le seguenti proprietà aggiuntive:
    • paragraphScope Definisce se deve essere eseguito il rendering di tutti i paragrafi o solo di un intervallo di paragrafi (valori: all rispetto a range )
    • if paragraphScope == range la proprietà paragraphRange definisce l'intervallo di paragrafi da sottoporre a rendering

Integrazione con altri framework

I frammenti di contenuto possono essere integrati con:
  • Traduzioni
    I frammenti di contenuto sono completamente integrati nel flusso di lavoro di traduzione di AEM. A livello architettonico, ciò significa:
    • Le singole traduzioni di un frammento di contenuto sono in realtà frammenti separati; ad esempio:
      • si trovano in diverse radici linguistiche:
        /content/dam/<path>/en/<to>/<fragment>
        vs
        /content/dam/<path>/de/<to>/<fragment>
      • ma condividono esattamente lo stesso percorso relativo sotto la radice della lingua:
        /content/dam/<path>/en/<to>/<fragment>
        vs
        /content/dam/<path>/de/<to>/<fragment>
    • Oltre ai percorsi basati su regole, non esiste un'ulteriore connessione tra le diverse versioni linguistiche di un frammento di contenuto; sono gestiti come due frammenti separati, anche se l'interfaccia utente fornisce i mezzi per spostarsi tra le varianti di lingua.
    Il flusso di lavoro di traduzione di AEM funziona con /content :
    • Poiché i modelli di frammento di contenuto risiedono in /conf , questi non sono inclusi in tali traduzioni. Potete internazionalizzare le stringhe dell’interfaccia utente.
    • I modelli vengono copiati per creare il frammento in modo che sia implicito.
  • Schemi metadati
    • I frammenti di contenuto (re)utilizzano gli schemi di metadati, che possono essere definiti con risorse standard.
  • CFM fornisce uno schema specifico proprio:
    /libs/dam/content/schemaeditors/forms/contentfragment
    può essere esteso se necessario.
  • Il modulo schema corrispondente è integrato con l'editor frammento.

API di gestione dei frammenti di contenuto - Lato server

È possibile utilizzare l'API lato server per accedere ai frammenti di contenuto; vedere:
com.adobe.cq.dam.cfm

È vivamente consigliato utilizzare l'API lato server invece di accedere direttamente alla struttura del contenuto.

Interfacce chiave

Le tre interfacce seguenti possono fungere da punti di ingresso:
  • Modello frammento
    FragmentTemplate
    
    
    Utilizzare FragmentTemplate.createFragment() per creare un nuovo frammento.
    Resource templateOrModelRsc = resourceResolver.getResource("...");
    FragmentTemplate tpl = templateOrModelRsc.adaptTo(FragmentTemplate.class);
    ContentFragment newFragment = tpl.createFragment(parentRsc, "A fragment name", "A fragment description.");
    
    
    Questa interfaccia rappresenta:
    • modello di frammento di contenuto o modello di frammento di contenuto da cui creare un frammento di contenuto,
    • e (dopo la creazione) le informazioni strutturali di tale frammento
    Queste informazioni possono includere:
    • Accesso ai dati di base (titolo, descrizione)
    • Accesso a modelli/modelli per gli elementi del frammento:
      • Modelli degli elementi elenco
      • Ottenere informazioni strutturali per un dato elemento
      • Accesso al modello di elemento (vedere ElementTemplate )
    • Modelli di accesso per le varianti del frammento:
      • Elenca modelli di variante
      • Ottenere informazioni strutturali per una determinata variazione
      • Accedere al modello di variazione (vedere VariationTemplate )
    • Ottenere il contenuto associato iniziale
    Interfacce che rappresentano informazioni importanti:
    • ElementTemplate
      • Ottenere i dati di base (nome, titolo)
      • Ottenere il contenuto iniziale dell'elemento
    • VariationTemplate
      • Ottenere i dati di base (nome, titolo, descrizione)
  • Frammento di contenuto
    ContentFragment
    
    
    Questa interfaccia consente di utilizzare un frammento di contenuto in modo astratto.
    È vivamente consigliato accedere a un frammento tramite questa interfaccia. È necessario evitare di modificare direttamente la struttura del contenuto.
    L'interfaccia fornisce i mezzi per:
    • Gestire i dati di base (ad es. get name; get/set title/description)
    • Accesso ai metadati
    • Elementi di accesso:
      • Elementi elenco
      • Ottieni elementi per nome
      • Creare nuovi elementi (vedere Caveats )
      • Dati degli elementi di accesso (vedere ContentElement )
    • Elenca le varianti definite per il frammento
    • Creare nuove varianti a livello globale
    • Gestisci contenuto associato:
      • Elenca raccolte
      • Aggiungere raccolte
      • Rimuovere le raccolte
    • Accesso al modello o al modello del frammento
    Le interfacce che rappresentano gli elementi primari di un frammento sono:
    • Elemento contenuto
      ContentElement
      
      
      • Ottenere i dati di base (nome, titolo, descrizione)
      • Ottenere/impostare il contenuto
      • Accesso alle varianti di un elemento:
        • Varianti elenco
        • Ottieni varianti per nome
        • Creare nuove varianti (vedere Caveats )
        • Rimuovere le varianti (vedere Caveats )
        • Accedere ai dati delle varianti (vedere ContentVariation )
      • Tasti di scelta rapida per la risoluzione delle varianti (applicazione di una logica di fallback specifica per l'implementazione, se la variante specificata non è disponibile per un elemento)
    • Variazione contenuto
      ContentVariation
      
      
      • Ottenere i dati di base (nome, titolo, descrizione)
      • Ottenere/impostare il contenuto
      • Sincronizzazione semplice, in base alle ultime informazioni modificate
    Tutte e tre le interfacce ( ContentFragment , ContentElement , ContentVariation ) estendono l' Versionable interfaccia, che aggiunge funzionalità di controllo delle versioni, necessarie per i frammenti di contenuto:
    • Creare una nuova versione dell'elemento
    • Elenca versioni dell'elemento
    • Ottenete il contenuto di una versione specifica dell’elemento con versione

Adattamento - Utilizzo di adaptTo()

È possibile modificare:
  • ContentFragment può essere adattato a:
    • Resource - la risorsa Sling sottostante; tenere presente che l'aggiornamento Resource diretto del sottostante richiede la ricostruzione dell' ContentFragment oggetto.
    • Asset - l' Asset astrazione DAM che rappresenta il frammento di contenuto; l'aggiornamento Asset diretto dell'oggetto richiede la ricostruzione dell' ContentFragment oggetto.
  • ContentElement può essere adattato a:
    • ElementTemplate - per accedere alle informazioni strutturali dell'elemento.
  • FragmentTemplate può essere adattato a:
    • Resource - la Resource determinazione del modello di riferimento o del modello originale copiato;
      • le modifiche apportate attraverso il pannello non Resource vengono applicate automaticamente al FragmentTemplate .
  • Resource può essere adattato a:
    • ContentFragment
    • FragmentTemplate

Caveats

Va osservato che:
  • L'API è implementata per fornire funzionalità supportate dall'interfaccia utente.
  • L'intera API è progettata per non mantenere le modifiche automaticamente (se non diversamente specificato nel JavaDoc API). Sarà quindi sempre necessario impegnare il risolutore delle risorse della rispettiva richiesta (o il risolutore che si sta utilizzando).
  • Attività che potrebbero richiedere ulteriore sforzo:
    • La creazione e la rimozione di nuovi elementi non comporta l'aggiornamento della struttura dati di frammenti semplici (basati su un modello di frammento).
    • La creazione di nuove varianti da non ContentElement aggiornerà la struttura dei dati (ma le creerà globalmente dalla ContentFragment volontà).
    • La rimozione delle varianti esistenti non aggiornerà la struttura dei dati.

API di gestione dei frammenti di contenuto - Lato client

Per AEM 6.4 l’API lato client è interna.

Informazioni aggiuntive

Consulta:
  • filter.xml
    La filter.xml gestione dei frammenti di contenuto è configurata in modo da non sovrapporsi al pacchetto di contenuto di base di Risorse.

Modifica sessioni

Una sessione di modifica viene avviata quando l'utente apre un frammento di contenuto in una delle pagine dell'editor. La sessione di modifica viene terminata quando l’utente esce dall’editor selezionando Salva o Annulla .

Requisiti

Requisiti per il controllo di una sessione di modifica:
  • La modifica di un frammento di contenuto, che può estendersi su più viste (= pagine HTML), deve essere atomica.
  • L'editing dovrebbe essere anche transazionale ; alla fine della sessione di modifica, le modifiche devono essere salvate (salvate) o ripristinate (annullate).
  • I casi Edge devono essere gestiti correttamente; tali situazioni includono situazioni come quelle in cui l’utente esce dalla pagina immettendo manualmente un URL o utilizzando la navigazione globale.
  • Per evitare la perdita di dati, deve essere disponibile un salvataggio automatico periodico (ogni x minuti).
  • Se un frammento di contenuto viene modificato da due utenti contemporaneamente, non devono sovrascrivere le modifiche l'uno rispetto all'altro.

Processi

I processi coinvolti sono:
  • Avvio di una sessione
    • Viene creata una nuova versione del frammento di contenuto.
    • Salvataggio automatico avviato.
    • I cookie sono impostati; tali opzioni definiscono il frammento attualmente modificato e indicano che è aperta una sessione di modifica.
  • Completamento di una sessione
    • Salvataggio automatico interrotto.
    • Al momento del commit:
      • Le ultime informazioni modificate vengono aggiornate.
      • I cookie vengono rimossi.
    • Al ripristino:
      • Viene ripristinata la versione del frammento di contenuto creata all’avvio della sessione di modifica.
      • I cookie vengono rimossi.
  • Modifica
    • Tutte le modifiche (salvataggio automatico incluso) vengono effettuate sul frammento di contenuto attivo, non in un'area separata e protetta.
    • Di conseguenza, tali modifiche si riflettono immediatamente sulle pagine AEM che fanno riferimento al rispettivo frammento di contenuto

Azioni

Le azioni possibili sono:
  • Inserimento di una pagina
    • Verificate la presenza di una sessione di modifica; controllando il rispettivo cookie.
      • Se esistente, verificate che la sessione di modifica sia stata avviata per il frammento di contenuto in corso di modifica
        • Se il frammento corrente, ristabilire la sessione.
        • In caso contrario, provate ad annullare la modifica per il frammento di contenuto precedentemente modificato e a rimuovere i cookie (in seguito non sarà presente alcuna sessione di modifica).
      • Se non esiste alcuna sessione di modifica, attendete la prima modifica apportata dall’utente (vedete di seguito).
    • Verificate che in una pagina sia già presente un riferimento al frammento di contenuto e visualizzate le informazioni appropriate in tal caso.
  • Modifica del contenuto
    • Ogni volta che l’utente cambia contenuto e non è presente alcuna sessione di modifica, viene creata una nuova sessione di modifica (consultate Avvio di una sessione ).
  • Uscire da una pagina
    • Se è presente una sessione di modifica e le modifiche non sono state mantenute, viene visualizzata una finestra di dialogo di conferma modale per informare l’utente del contenuto potenzialmente perso e consentire loro di restare sulla pagina.

Esempi

Esempio: Accesso a un frammento di contenuto esistente

A tal fine, potete adattare la risorsa che rappresenta l'API a:
com.adobe.cq.dam.cfm.ContentFragment
Ad esempio:
// first, get the resource
Resource fragmentResource = resourceResolver.getResource("/content/dam/fragments/my-fragment");
// then adapt it
if (fragmentResource != null) {
    ContentFragment fragment = fragmentResource.adaptTo(ContentFragment.class);
    // the resource is now accessible through the API
} 

Esempio: Creazione di un nuovo frammento di contenuto

Per creare un nuovo frammento di contenuto a livello di programmazione, è necessario utilizzare:
com.adobe.cq.dam.cfm.ContentFragmentManager#create
Ad esempio:
Resource templateOrModelRsc = resourceResolver.getResource("...");
FragmentTemplate tpl = templateOrModelRsc.adaptTo(FragmentTemplate.class);
ContentFragment newFragment = tpl.createFragment(parentRsc, "A fragment name", "A fragment description.");

Esempio: Specifica dell'intervallo di salvataggio automatico

L'intervallo di salvataggio automatico (in secondi) può essere definito utilizzando il gestore di configurazione (ConfMgr):
  • Nodo: <conf-root>/settings/dam/cfm/jcr:content
  • Nome proprietà: autoSaveInterval
  • Tipo: Long
  • Predefinito: 600 (10 minuti); è definito in /libs/settings/dam/cfm/jcr:content
Per impostare un intervallo di salvataggio automatico di 5 minuti è necessario definire la proprietà sul nodo; ad esempio:
  • Nodo: /conf/global/settings/dam/cfm/jcr:content
  • Nome proprietà: autoSaveInterval
  • Tipo: Long
  • Valore: 300 (5 minuti equivale a 300 secondi)

Modelli di frammento di contenuto

Per ulteriori informazioni, consulta Modelli di frammenti di contenuto.

Componenti per l’authoring delle pagine

Per ulteriori informazioni, consulta