Creare un nuovo blocco
In questo capitolo viene descritto come creare un nuovo blocco teaser modificabile per un sito web Edge Delivery Services tramite l’editor universale.
Il blocco, denominato teaser, presenta i seguenti elementi:
-
Immagine: immagine visivamente coinvolgente.
-
Contenuto testo:
- Titolo: titolo efficace per richiamare l’attenzione.
- Corpo del testo: contenuto descrittivo che fornisce contesto o dettagli, ed eventuali termini e condizioni.
- Pulsante Call-to-Action (CTA): collegamento progettato per invitare l’utente a interagire e guidarlo verso un ulteriore coinvolgimento.
Il contenuto del blocco teaser può essere modificato nell’editor universale per garantirne la facilità d’uso e di riutilizzo in tutto il sito web.
Come puoi osservare, il blocco teaser è simile al blocco standard hero; pertanto il blocco teaser è inteso solo come semplice esempio per illustrare i concetti di sviluppo.
Creare un nuovo ramo Git
Per mantenere un flusso di lavoro pulito e organizzato, crea un nuovo ramo per ogni attività di sviluppo specifica. Questo ti aiuterà a evitare problemi di implementazione in produzione di codice incompleto o non testato.
- Inizia dal ramo principale: utilizza il codice di produzione più aggiornato, per contare su una solida base.
- Recupera modifiche remote: recupera gli aggiornamenti più recenti da GitHub per assicurarti di disporre del codice più recente prima di iniziare lo sviluppo.
- Esempio: dopo aver unito le modifiche dal ramo
wknd-stylesinmain, recupera gli aggiornamenti più recenti.
- Esempio: dopo aver unito le modifiche dal ramo
- Crea un nuovo ramo:
# ~/Code/aem-wknd-eds-ue
$ git fetch origin
$ git checkout -b teaser origin/main
Una volta creato il ramo teaser, puoi iniziare a sviluppare il blocco Teaser.
Cartella del blocco
Crea una nuova cartella denominata teaser nella directory blocks del progetto. Questa cartella contiene i file JSON, CSS e JavaScript del blocco, organizzando tutti i file del blocco in un’unica posizione:
# ~/Code/aem-wknd-eds-ue
/blocks/teaser
Il nome della cartella del blocco funge da ID del blocco e viene utilizzato per farvi riferimento durante lo sviluppo.
File JSON del blocco
Il file JSON del blocco ne definisce tre aspetti chiave:
- Definizione: registra il blocco come componente modificabile nell’editor universale, collegandolo a un modello di blocco e facoltativamente a un filtro.
- Modello: specifica i campi di authoring del blocco e il modo in cui vengono visualizzati come HTML semantico di Edge Delivery Services.
- Filtro: configura le regole di filtro per limitare i contenitori a cui è possibile aggiungere il blocco tramite l’editor universale. La maggior parte dei blocchi non sono contenitori, ma i loro ID vengono aggiunti ai filtri di altri blocchi contenitore.
Crea un nuovo file in /blocks/teaser/_teaser.json con la seguente struttura iniziale, nell’ordine esatto riportato di seguito. Se le chiavi non sono nell’ordine corretto, potrebbero non essere create correttamente.
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Nome file dell’esempio di codice riportato di seguito."}
{
"definitions": [],
"models": [],
"filters": []
}
Modello di blocco
Il modello di blocco è una parte critica della configurazione del blocco, in quanto definisce:
-
l’esperienza di authoring definendo i campi disponibili per la modifica;
i
;
-
come vengono riprodotti i valori dei campi nell’HTML di Edge Delivery Services.
Ai modelli viene assegnato un id che corrisponde alla definizione del blocco e include un array fields per specificare i campi modificabili.
Ogni campo nell’array fields ha un oggetto JSON che include le seguenti proprietà obbligatorie:
componentnamelabelPer un elenco completo delle proprietà, incluse quelle facoltative, consulta la documentazione dei campi dell’editor universale.
Progettazione del blocco
Il blocco teaser include i seguenti elementi modificabili:
-
Immagine: rappresenta il contenuto visivo del teaser.
-
Contenuto testo: include il titolo, il corpo del testo e il pulsante di invito all’azione, e si trova in un rettangolo bianco.
- Il titolo e il corpo del testo possono essere creati tramite lo stesso editor Rich Text.
- L’invito all’azione (CTA) può essere creato con un campo
textper l’etichetta e un campoaem-contentper il collegamento associato al testo dell’etichetta.
La progettazione del blocco teaser è suddivisa in questi due componenti logici (contenuto immagine e testo), garantendo un’esperienza di authoring strutturata e intuitiva per gli utenti.
Campi del blocco
Definisci i campi necessari per il blocco: immagine, testo alternativo per l’immagine, testo, etichetta CTA e collegamento CTA.
Questa scheda illustra come modellare correttamente il blocco teaser.
Il teaser è costituito da due aree logiche: immagine e testo. Per semplificare il codice necessario affinché l’HTML di Edge Delivery Services riproduca correttamente l’esperienza web desiderata, struttura il modello del blocco come segue.
- Raggruppa l’immagine e il testo alternativo per l’immagine utilizzando la compressione dei campi.
- Raggruppa i campi di contenuto di testo utilizzando il raggruppamento di elementi e la compressione dei campi per l’elemento CTA.
La compressione dei campi, il raggruppamento di elementi e l’inferenza del tipo sono concetti essenziali per creare un modello di blocco ben strutturato; se non hai familiarità con questi concetti, consulta la documentazione mediante il relativo collegamento.
Nell’esempio seguente:
- L’inferenza del tipo viene utilizzata per creare automaticamente un elemento HTML
<img>dal campoimage. La compressione dei campi viene utilizzata per i campiimageeimageAlt, in modo da creare un elemento HTML<img>. L’attributosrcè impostato con il valore del campoimage, mentre l’attributoaltè impostato con il valore del campoimageAlt. textContentè un nome di gruppo utilizzato per categorizzare i campi. Deve essere semantico, ma può essere qualsiasi cosa specifica di questo blocco. Segnala all’editor universale di riprodurre, nell’output HTML finale, tutti i campi con questo prefisso all’interno dello stesso elemento<div>.- La compressione del campo viene applicata anche nel gruppo
textContentper l’elemento di invito all’azione (CTA). Il CTA viene creato come<a>tramite l’inferenza del tipo. Il campoctaviene utilizzato per impostare l’attributohrefdell’elemento<a>e il campoctaTextfornisce il contenuto di testo per il collegamento all’interno dei tag<a ...>.
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Nome file dell’esempio di codice riportato di seguito."}
| code language-json |
|---|
|
Questo modello definisce, per il blocco, quali saranno gli input di authoring nell’editor universale.
Nell’HTML di Edge Delivery Services risultante per questo blocco, l’immagine inserita nel primo div e i campi del gruppo di elementi textContent nel secondo div.
| code language-html |
|---|
|
Come illustrato nel prossimo capitolo, con questa struttura HTML sarà più semplice assegnare uno stile al blocco considerandolo una singola unità coesiva.
La scheda Cosa non fare illustra cosa accade se non si comprimono i campi e non si raggruppano gli elementi.
Questa scheda descrive un modo non ottimale per modellare il blocco teaser, in giustapposizione al modo corretto descritto nella scheda adiacente.
Si può essere tentati di definire ogni campo come elemento autonomo nel modello del blocco, senza ricorrere alla compressione dei campi e al raggruppamento di elementi. Tuttavia, questo complicherebbe l’assegnazione di uno stile al blocco considerandolo come una singola unità coesiva.
Ad esempio, il modello teaser potrebbe essere definito senza compressione dei campi o raggruppamento di elementi, come segue:
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Nome file dell’esempio di codice riportato di seguito."}
| code language-json |
|---|
|
Nell’HTML di Edge Delivery Services per il blocco, il valore di ogni campo viene inserito in un elemento div separato e risulterà quindi più complicato comprendere il contenuto, applicarvi uno stile e regolare la struttura HTML per ottenere l’aspetto desiderato.
| code language-html |
|---|
|
Ogni campo è isolato nel proprio div, e questo rende difficile formattare l’immagine e il contenuto di testo come unità coesive. Sarà comunque possibile ottenere l’aspetto finale desiderato, ma richiederà più impegno e creatività. Se invece si ricorre al raggruppamento di elementi per raggruppare i campi di contenuto di testo e alla compressione dei campi per aggiungere valori di authoring come attributi di elementi, risulterà tutto più facile, più semplice e semanticamente corretto.
Consulta la scheda Cosa fare qui sopra per informazioni su come modellare al meglio il blocco teaser.
Definizione del blocco
La definizione del blocco registra il blocco nell’editor universale. Di seguito trovi le proprietà JSON utilizzate nella definizione del blocco:
definition.titledefinition.idfilters.definition.plugins.xwalk.page.resourceTypecore/franklin/components/block/v#/block.definition.plugins.xwalk.page.template.namedefinition.plugins.xwalk.page.template.modelmodel, che controlla i campi di authoring che vengono visualizzati nell’editor universale per il blocco in questione. Il valore qui deve corrispondere a un valore model.id.definition.plugins.xwalk.page.template.classesclass dell’elemento HTML del blocco. Questo consente varianti dello stesso blocco. Il valore classes può essere reso modificabile aggiungendo un campo di classi al modello del blocco.Di seguito è riportato un esempio di codice JSON per la definizione del blocco:
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Nome file dell’esempio di codice riportato di seguito."}
{
"definitions": [{
"title": "Teaser",
"id": "teaser",
"plugins": {
"xwalk": {
"page": {
"resourceType": "core/franklin/components/block/v1/block",
"template": {
"name": "Teaser",
"model": "teaser",
"textContent_text": "<h2>Enter a title</h2><p>...and body text here!</p>",
"textContent_cta": "/",
"textContent_ctaText": "Click me!"
}
}
}
}
}],
"models": [... from previous section ...],
"filters": []
}
In questo esempio:
- Il blocco è denominato “Teaser” e utilizza il modello
teaserche determina i campi che potranno essere modificati nell’editor universale. - Il blocco include il contenuto predefinito del campo
textContent_text(un’area Rich Text per il titolo e il corpo del testo), nonchétextContent_ctaetextContent_ctaTextper il collegamento e l’etichetta dell’elemento CTA (invito all’azione). I nomi dei campi del modello contenenti il contenuto iniziale corrispondono ai nomi dei campi definiti nell’array dei campi del modello di contenuto;
Con questa struttura, nell’editor universale il blocco sarà configurato con i campi, il modello di contenuto e il tipo di risorsa giusti per consentirne la corretta riproduzione.
Filtri del blocco
L’array filters del blocco definisce, per i blocchi contenitore, quali altri blocchi possono essere aggiunti al contenitore. I filtri definiscono un elenco di ID di blocco (model.id) che possono essere aggiunti al contenitore.
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Nome file dell’esempio di codice riportato di seguito."}
{
"definitions": [... populated from previous section ...],
"models": [... populated from previous section ...],
"filters": []
}
Il componente teaser non è un blocco contenitore, pertanto non è possibile aggiungervi altri blocchi. Di conseguenza, l’array filters è lasciato vuoto. Piuttosto, aggiungi invece l’ID del teaser all’elenco dei filtri di un blocco sezione, in modo che possa essere aggiunto a una sezione.
I filtri dei blocchi forniti da Adobe, ad esempio il blocco sezione, sono memorizzati nella cartella models del progetto. Per modificarli, individua il file JSON del blocco fornito da Adobe (ad esempio, /models/_section.json) e aggiungi l’ID del teaser (teaser) all’elenco dei filtri. Questa configurazione segnala all’editor universale che il componente teaser può essere aggiunto al blocco contenitore “section”.
[/models/_section.json]{class="badge neutral" title="Nome file dell’esempio di codice riportato di seguito."}
{
"definitions": [],
"models": [],
"filters": [
{
"id": "section",
"components": [
"text",
"image",
"button",
"title",
"hero",
"cards",
"columns",
"fragment",
"teaser"
]
}
]
}
L’ID di definizione del blocco teaser teaser è stato aggiunto all’array components.
Eseguire il linting dei file JSON
Assicurati di eseguire frequentemente il linting per le modifiche apportate, per assicurarti che il codice pulito e coerente. Eseguendo frequentemente il linting si possono individuare per tempo eventuali problemi, velocizzando così i tempi di sviluppo. Il comando npm run lint:js eseue il linting anche sui file JSON e rileva eventuali errori di sintassi.
# ~/Code/aem-wknd-eds-ue
$ npm run lint:js
Creare il progetto JSON
Dopo aver configurato i file JSON del blocco (ad esempio, blocks/teaser/_teaser.json e models/_section.json), questi vengono compilati automaticamente nei file component-models.json, component-definitions.json e component-filters.json del progetto. La compilazione viene gestita automaticamente da un hook pre-commit Husky incluso nel modello del progetto AEM Boilerplate XWalk.
Le build possono anche essere attivate manualmente o a livello di programmazione tramite gli script NPM con codice “build” di JSON del progetto.
Implementare il blocco JSON
Per rendere il blocco disponibile nell’editor universale, è necessario eseguire il commit del progetto e inviarlo al ramo di un archivio GitHub, in questo caso il ramo teaser.
Il nome esatto del ramo utilizzato dall’editor universale può essere regolato, per utente, tramite il suo URL.
# ~/Code/aem-wknd-eds-ue
$ git add .
$ git commit -m "Add teaser block JSON files so it is available in Universal Editor"
# JSON files are compiled automatically and added to the commit via a husky precommit hook
$ git push origin teaser
Quando si apre l’editor universale con il parametro di query ?ref=teaser, il nuovo blocco teaser viene visualizzato nella palette dei blocchi. Il blocco non ha uno stile; i campi del blocco vengono riprodotti come HTML semantico, e formattati solo tramite il CSS globale.