计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
ue-component-model【效率与协作】Use this when the user mentions component models, component definitions, component filters, block configuration for the Universal Editor, UE block setup, adding a new block to UE, configuring block properties or block authoring fields, or wants to create an EDS/Franklin block with Universal Editor support, modify block fields, or add a block to the s…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
This skill helps you create or edit the three JSON configuration files that control how AEM Edge Delivery Services (EDS) blocks appear and behave in the Universal Editor (UE):
Before generating any configuration, read and analyze:
The block's JS file (blocks/<name>/<name>.js) — understand what content the decorate(block) function expects:
block.querySelector('a') (links/URLs), block.querySelector('picture') (images), etc.?The block's CSS file (blocks/<name>/<name>.css) — look for variant-specific styles.
Existing config — check if entries already exist:
component-definition.json for the block IDcomponent-models.json for the model IDcomponent-filters.json for the block in the section components listblocks/<name>/_<name>.json distributed config fileBased on the JS analysis:
Simple block: One component with its own fields. Most blocks are this type.
Container block: Has repeatable child items (cards, slides, tabs).
block.children or creates items from rowsKey-value block: Configuration-style block (2-column key-value pairs).
"key-value": true in templateMap the block's content expectations to component model fields. Read references/field-types.md for the full field type reference.
Common field mappings:
| Block expects... | Use component type | Notes |
|---|---|---|
| An image | reference (name: image) | Pair with text field named imageAlt |
| A URL/link | aem-content (name: link or url) | For page links and external URLs |
| Rich text content | richtext | For formatted text with headings, lists, links |
| Plain text (single line) | text | For titles, labels, short strings |
| Plain text (multi-line) | textarea | For descriptions, notes, long text without formatting |
| Heading level choice | select with h1-h6 options | Name it titleType to auto-collapse with title |
| Style variants | multiselect (name: classes) | Values become CSS classes on block div |
| Multiple toggles | checkbox-group | For multiple independent boolean options |
| Boolean toggle | boolean | For show/hide options |
| Number value | number | For counts, limits |
| Content Fragment | aem-content-fragment | For CF-driven blocks |
| Experience Fragment | aem-experience-fragment | For reusable content+layout fragments |
| Content tags | aem-tag | For categorization via AEM tag picker |
Field naming rules (semantic collapsing):
image + imageAlt → collapsed into <picture><img alt="...">link + linkText + linkTitle + linkType → collapsed into <a href="..." title="...">text</a> with optional classtitle + titleType → collapsed into <h2>title</h2> (level from titleType)group_ (underscore separator) are grouped into a single cellGenerate entries for all three files. The approach depends on whether the project uses centralized or distributed config.
Check for distributed config pattern: If the block directory contains _<blockname>.json files (e.g., blocks/hero/_hero.json), create a distributed config file instead of editing the central files.
component-definition.json — Add to the "Blocks" group's components array:
{
"title": "<Block Display Name>",
"id": "<block-id>",
"plugins": {
"xwalk": {
"page": {
"resourceType": "core/franklin/components/block/v1/block",
"template": {
"name": "<Block Name>",
"model": "<model-id>"
}
}
}
}
}
For container blocks, add both the container AND item definitions. The container gets "filter" instead of "model", and the item uses "core/franklin/components/block/v1/block/item" as resourceType.
For key-value blocks, add "key-value": true to the template.
Template can include default values for any model field (e.g., "titleType": "h3", "classes": ["light"]).
component-models.json — Add a new model entry:
{
"id": "<model-id>",
"fields": [
{
"component": "<field-type>",
"name": "<property-name>",
"label": "<Display Label>",
"valueType": "string"
}
]
}
component-filters.json — Add the block ID to the section filter's components array. For container blocks, also add a new filter entry defining allowed children.
blocks/<name>/_<name>.json):Create a single file with all three configs:
{
"definitions": [ ... ],
"models": [ ... ],
"filters": [ ... ]
}
Still add the block to the section filter in the central component-filters.json.
After generating the config, verify:
id in the definition matches what's used in component-filters.json. The template.model value matches the id in component-models.json.section filter's components array (otherwise authors can't add it to pages).name properties in the model fields should produce HTML that the block's decorate() function can consume.image/imageAlt, not image/altText unless intentional).For detailed information, read these reference files as needed:
text, textarea, richtext, reference, aem-content, aem-content-fragment, aem-experience-fragment, aem-tag, select, multiselect, checkbox-group, radio-group, boolean, number, date-time, container, tab), valueType constraints, required properties, field properties, validation types, conditional fields, and option formatssection filter's components list.core/franklin/components/block/v1/block. Don't invent custom resource types.template.model must exactly match the model id, and template.filter must exactly match the filter id.text for single-line strings, textarea for multi-line plain text, and richtext for formatted content. For URLs and page links, use aem-content so authors get the content picker.valueType (e.g., boolean must use "boolean", number must use "number", checkbox-group must use "string[]"). Always include valueType and check the field-types reference for the enforced value.filter (not a model) in their template, and a corresponding filter entry in component-filters.json.