用途
Canopy Blocks 让开发者把整个页面区块构建为可复用的模板。开发者定义区块可以呈现的样子,内容编辑者则把区块添加到页面、填写其设置,并在 Canopy 编辑器中排列它们。这样可以在代码与内容之间保持清晰的分离。
Canopy Blocks 取代了已废弃的 cms_* Canopy 元素(cms_text、cms_heading、cms_image 等)。新工作应始终使用区块模板。
主要能力
- 区块模板:每个 .canvas 文件定义一个区块模板,放在 views/canopy/ 目录下。文件名会成为模板名称,除非配置中另行指定。
- 配置:使用 {% canopy config %} 定义标题与设置,配置必须是严格合法的 JSON(双引号、无尾随逗号、无注释)。
- 设置类型:支持 heading、textarea 等类型,可为每个设置提供合理默认值,使区块在编辑器添加时即呈现完整外观。
- 渲染:在布局中通过区块区域渲染,需配合 canopy.head、canopy.blocks、canopy.scripts 使用相同句柄。
- 嵌套区块:支持父区块包含子区块(画廊、滑块、手风琴等)。
- 区域控制:allow、limit、locked 仅用于 canopy.blocks() 区域声明,用于限定可接受的模板、限制区块数量、固定结构。
使用方式
最小区块示例:
{% canopy config %} { "title": "Hero", "settings": [ { "name": "heading", "type": "heading", "default": { "value": "Welcome", "element": "h1" } }, { "name": "description", "type": "textarea" } ] } {% endcanopy %}
{% canopy template %} <section> <{{ settings.heading.element }}>{{ settings.heading.value }}</{{ settings.heading.element }}> <p>{{ settings.description }}</p> </section> {% endcanopy %}
在布局中通过区块区域渲染:
<head>{{ canopy.head('main') }}</head> <body> {{ canopy.blocks('main') }} {{ canopy.scripts('main') }} </body>
按任务加载对应规则文件:
- 创建/编辑区块模板、配置或区块;隐藏区块:rules/block-templates.md
- 定义设置(类型、默认值、标签页/分组):rules/settings.md
- 在布局中渲染区块(区域、head/scripts、shared、allow/limit/locked):rules/rendering.md
- 含子区块的父区块(画廊、滑块、手风琴):rules/nested-blocks.md
- 设计区块、构建工作流、常见模式:rules/patterns.md
- 维护或迁移已废弃的 cms_* 元素:rules/legacy-elements.md
该技能是 Canopy Blocks 的权威来源。规则索引覆盖的内容不要调用 Blutui 文档 MCP 或抓取 docs.blutui.com,而应加载匹配的规则文件;规则文件完整且最新,包含公开文档可能滞后的功能。仅当主题确实超出本技能范围(Collections 及其字段定义、通用 Canvas 语言语法、仪表盘表单构建)或规则文件明确指向文档时才查阅文档。
核心规则(始终适用)
- 每个 .canvas 文件在 views/canopy/ 中定义一个区块模板,绝不在其他地方定义区块。
- 配置必须是严格合法的 JSON。缺少 name、缺少 type 或未知类型的设置会被静默忽略,因此拼写错误不会报错。
- 为每个设置提供合理默认值。
- 在渲染依赖标记前,用 {% if %} / {% for %} 保护对象和数组设置值(url、file、list、media-sources)。
- 始终保护 collection 和 entry 设置值——被删除的内容会解析为 null(单条目、集合)或 [](多条目选择),未保护的模板会出错。
- 用 raw 过滤器输出 richtext 值——它们以 HTML 存储。
- 每个区块区域都要与 canopy.head 和 canopy.scripts 使用相同句柄配对,否则区块的 CSS 和 JS 永远不会加载。
- allow、limit、locked 只能放在 canopy.blocks() 区域声明上,绝不能放在区块模板配置或设置上。allow 列出区域接受的模板(也是显示 "hidden": true 模板的唯一方式),limit 限制区块数量,locked 固定结构(字段仍可编辑;添加/删除/重排不可)。区块配置中唯一的选取器控件是 hidden。
- 嵌套区块:每个父模板需要恰好一个普通的 {{ canopy.children() }} 调用(带过滤/索引/childList 的渲染仅用于显示——没有普通调用,编辑者无法添加或管理子区块),每个子模板的配置需要显式 "name",以便在过滤器和默认列表期望的键下注册。
- 选择正确的工具:区块用于编辑者组合的区块;{ shared: true } 区域用于全局区块(页脚);Collections 用于结构化、可查询的数据(博客文章、产品)——通过 collection 和 entry 设置类型在区块中呈现;表单通过 form 设置类型加 {% form %} 标签。
- 新工作中绝不使用已废弃的 cms_* 元素函数——改为构建区块模板。
适用场景
适用于使用 Blutui Canopy 构建页面区块模板、定义设置、在布局中渲染区块、处理父子嵌套区块,以及维护或迁移已废弃 cms_* 元素的开发工作。
限制
资料未提供关于收费、价格、平台支持范围或具体效果的信息。