Skapa ett nytt block
I det här kapitlet beskrivs hur du skapar ett nytt, redigerbart teaserblock för en Edge Delivery Services-webbplats med den universella redigeraren.
Blocket teaser visar följande element:
-
Bild: En visuellt engagerande bild.
-
Textinnehåll:
- Titel: En intressant rubrik som drar fokus.
- Brödtext: Beskrivande innehåll som ger kontext eller information, inklusive valfria villkor.
- Knappen Call-to-action (CTA): En länk som utformats för att uppmuntra användarinteraktion och vägleda dem till ytterligare engagemang.
teaser-blockets innehåll kan redigeras i Universell redigerare vilket gör det enkelt att använda och återanvända på hela webbplatsen.
Observera att teaser-blocket liknar mallens hero-block. teaser-blocket är därför endast avsett att fungera som ett enkelt exempel för att illustrera utvecklingskoncept.
Skapa en ny Git-gren
Om du vill ha ett rent och organiserat arbetsflöde skapar du en ny gren för varje specifik utvecklingsuppgift. På så sätt undviker du problem med att distribuera ofullständig eller otestad kod till produktionen.
- Börja från huvudgrenen: En stabil grund garanteras om du arbetar från den senaste produktionskoden.
- Hämta fjärrändringar: Genom att hämta de senaste uppdateringarna från GitHub ser du till att den senaste koden är tillgänglig innan du påbörjar utvecklingen.
- Exempel: Hämta de senaste uppdateringarna när du har sammanfogat ändringar från grenen
wknd-stylestillmain.
- Exempel: Hämta de senaste uppdateringarna när du har sammanfogat ändringar från grenen
- Skapa en ny gren:
# ~/Code/aem-wknd-eds-ue
$ git fetch origin
$ git checkout -b teaser origin/main
När grenen teaser har skapats kan du börja utveckla teaserblocket.
Blockera mapp
Skapa en ny mapp med namnet teaser i projektkatalogen blocks. Den här mappen innehåller blockets JSON-, CSS- och JavaScript-filer och ordnar blockets filer på en plats:
# ~/Code/aem-wknd-eds-ue
/blocks/teaser
Blockmappens namn fungerar som blockets ID och används för att referera till blocket under hela dess utveckling.
Blockera JSON
Blocket JSON definierar tre huvudaspekter av blocket:
- Definition: Registrerar blocket som en redigerbar komponent i Universal Editor, som länkar det till en blockmodell och eventuellt ett filter.
- Modell: Anger blockets redigeringsfält och hur dessa fält återges som semantiska Edge Delivery Services HTML.
- Filter: Konfigurerar filtreringsregler för att begränsa vilka behållare som blocket kan läggas till i via den universella redigeraren. De flesta block är inte behållare, utan deras ID:n läggs till i andra behållarblocks filter.
Skapa en ny fil på /blocks/teaser/_teaser.json med följande inledande struktur, i exakt ordning. Om nycklarna inte är i ordning kanske de inte byggs som de ska.
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Filnamn på kodexemplet nedan."}
{
"definitions": [],
"models": [],
"filters": []
}
Blockmodell
Blockmodellen är en viktig del av blockets konfiguration, eftersom den definierar:
-
Redigeringsupplevelsen genom att definiera de fält som är tillgängliga för redigering.
-
Hur fältets värden återges i Edge Delivery Services HTML.
Modeller tilldelas en id som motsvarar blockets definition och innehåller en fields-array som anger de redigerbara fälten.
Varje fält i arrayen fields har ett JSON-objekt som innehåller följande obligatoriska egenskaper:
componentnamelabelEn omfattande lista med egenskaper, inklusive valfria, finns i dokumentationen för fält i den universella redigeraren.
Blockdesign
Teaser-blocket innehåller följande redigerbara element:
-
Bild: Representerar suddgummits visuella innehåll.
-
Textinnehåll: Innehåller titeln, brödtexten och knappen för att ringa in-åtgärd, och placeras i en vit rektangel.
- title och body text kan redigeras med samma RTF-redigerare.
- CTA kan redigeras via ett
text-fält för label ochaem-content-fältet för link.
Teaser-blockets design är uppdelad i två logiska komponenter (bild- och textinnehåll), vilket ger en strukturerad och intuitiv redigeringsupplevelse för användarna.
Blockera fält
Definiera de fält som krävs för blocket: bild, bildalternativ text, text, CTA-etikett och CTA-länk.
Den här fliken visar det rätta sättet att modellera teaserblocket.
Teaser består av två logiska områden: bild och text. För att förenkla koden som behövs för att visa Edge Delivery Services HTML som önskad webbupplevelse bör blockmodellen återspegla den här strukturen.
- Gruppera bilden och bilden alt text med fältkomprimering.
- Gruppera textinnehållsfälten med elementgruppering och fältkomprimering för CTA.
Om du inte är bekant med fältkomprimering, elementgruppering eller typhärledning granskar du den länkade dokumentationen innan du fortsätter, eftersom de är nödvändiga för att skapa en välstrukturerad blockmodell.
I exemplet nedan:
- Typhärledning används för att automatiskt skapa ett
<img>HTML-element från fältetimage. Fältkomprimering används med fältenimageochimageAltför att skapa ett<img>HTML-element. Attributetsrcär inställt på värdet för fältetimage, medan attributetaltär inställt på värdet för fältetimageAlt. textContentär ett gruppnamn som används för att kategorisera fält. Den ska vara semantisk, men kan vara allt som är unikt för det här blocket. Detta informerar den universella redigeraren om att återge alla fält med det här prefixet i samma<div>-element i den slutliga HTML-utdatafilen.- Komprimering av fält används också i gruppen
textContentför anropet till åtgärd (CTA). CTA skapas som en<a>via typhärledning. Fältetctaanvänds för att ange attributethrefför elementet<a>och fältetctaTextinnehåller textinnehållet för länken inuti<a ...>-taggarna.
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Filnamn på kodexemplet nedan."}
| code language-json |
|---|
|
Den här modellen definierar redigeringsindata i Universell redigerare för blocket.
Den resulterande Edge Delivery Services HTML för det här blocket placerar bilden i den första div-taggen och elementgruppsfälten textContent i den andra div-taggen.
| code language-html |
|---|
|
Som du kan se i nästa kapitel förenklar den här HTML-strukturen formateringen av blocket som en kohesiv enhet.
Om du vill förstå konsekvenserna av att inte använda fältkomprimering och elementgruppering läser du fliken Fel sätt ovan.
På den här fliken visas ett suboptimalt sätt att modellera teaserblocket, och det är bara ett juxposition åt höger.
Det kan verka frestande att definiera varje fält som ett fristående fält i blockmodellen utan att använda fältkomprimering och elementgruppering. Denna tillsyn komplicerar dock att formatera blocket som en sammanhängande enhet.
Teaser-modellen kan till exempel definieras som utan-fältkomprimering eller elementgruppering enligt följande:
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Filnamn på kodexemplet nedan."}
| code language-json |
|---|
|
Edge Delivery Services HTML för blocket återger varje fälts värde i en separat div vilket komplicerar innehållskompetens, formatprogram och HTML strukturjusteringar för att uppnå önskad design.
| code language-html |
|---|
|
Varje fält isoleras i sin egen div, vilket gör det svårt att formatera bilden och textinnehållet som sammanhängande enheter. Det går att uppnå önskad design med ansträngning och kreativitet, men det är enklare, enklare och semantiskt att använda elementgruppering för att gruppera textinnehållsfält och fältkomprimering för att lägga till redigerade värden som elementattribut.
Se Skrivvägs-fliken ovan för mer information om hur du modellerar teaserblocket bättre.
Blockdefinition
Blockdefinitionen registrerar blocket i Universell redigerare. Här är en beskrivning av JSON-egenskaperna som används i blockdefinitionen:
definition.titledefinition.idfilters.definition.plugins.xwalk.page.resourceTypecore/franklin/components/block/v#/block.definition.plugins.xwalk.page.template.namedefinition.plugins.xwalk.page.template.modelmodel-definition, som styr de redigeringsfält som visas för blocket i den universella redigeraren. Värdet här måste matcha ett model.id-värde.definition.plugins.xwalk.page.template.classesclass-attribut. Detta tillåter varianter av samma block. Värdet classes kan göras redigerbart genom att lägga till ett klassfält i blockets modell.Här är ett exempel på JSON för blockdefinitionen:
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Filnamn på kodexemplet nedan."}
{
"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": []
}
I detta exempel:
- Blocket heter"Teaser" och använder modellen
teasersom avgör vilka fält som är tillgängliga för redigering i Universell redigerare. - Blocket innehåller standardinnehåll för fältet
textContent_text, som är ett RTF-område för titel- och brödtexten, samttextContent_ctaochtextContent_ctaTextför CTA-länken och etiketten (call-to-action). Mallens fältnamn som innehåller ursprungligt innehåll matchar fältnamnen som definierats i innehållsmodellens fältarray;
Den här strukturen ser till att blocket är konfigurerat i den universella redigeraren med rätt fält, innehållsmodell och resurstyp för återgivning.
Blockfilter
Blockets filters-array definierar, för behållarblock, vilka andra block som kan läggas till i behållaren. Filter definierar en lista med block-ID (model.id) som kan läggas till i behållaren.
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Filnamn på kodexemplet nedan."}
{
"definitions": [... populated from previous section ...],
"models": [... populated from previous section ...],
"filters": []
}
Teaser-komponenten är inte ett behållarblock, vilket innebär att du inte kan lägga till andra block i den. Därför är filters-arrayen tom. Lägg i stället till teaser-ID:t i avsnittsblockets filterlista så att teaser kan läggas till i ett avsnitt.
Adobe-fördefinierade block, som avsnittsblocket, lagrar filter i projektets models-mapp. Om du vill justera söker du efter JSON-filen för det Adobe-tillhandahållna blocket (till exempel /models/_section.json) och lägger till teaser-ID (teaser) i filterlistan. Konfigurationen signalerar till Universal Editor att teaser-komponenten kan läggas till i avsnittets behållarblock.
[/models/_section.json]{class="badge neutral" title="Filnamn på kodexemplet nedan."}
{
"definitions": [],
"models": [],
"filters": [
{
"id": "section",
"components": [
"text",
"image",
"button",
"title",
"hero",
"cards",
"columns",
"fragment",
"teaser"
]
}
]
}
Teaser block definition ID för teaser läggs till i components-arrayen.
Laga dina JSON-filer
Se till att du ofta lintar dina ändringar så att de blir rena och konsekventa. Linting hjälper dig att fånga upp problem tidigt och minskar den totala utvecklingstiden. Kommandot npm run lint:js begränsar också JSON-filer och fångar upp eventuella syntaxfel.
# ~/Code/aem-wknd-eds-ue
$ npm run lint:js
Bygg projekt-JSON
När blockets JSON-filer (t.ex. blocks/teaser/_teaser.json, models/_section.json) har konfigurerats kompileras de automatiskt till projektets component-models.json -, component-definitions.json - och component-filters.json -filer. Den här kompileringen hanteras automatiskt av en Husky-exekveringskrok som ingår i projektmallen AEM Boilerplate XWalk .
Bygger kan också aktiveras manuellt eller programmatiskt med projektets build JSON NPM-skript.
Distribuera blockets JSON
Om du vill göra blocket tillgängligt i Universal Editor måste projektet implementeras och skickas till en GitHub-databasgren, i det här fallet grenen teaser.
Det exakta förgreningsnamnet Universal Editor använder kan justeras per användare via Universal Editors 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
När den universella redigeraren öppnas med frågeparametern ?ref=teaser visas det nya teaser-blocket på blockpaletten. Observera att blocket inte har någon formatering. Det återger blockets fält som semantiska HTML, formaterade endast via global CSS.