静态 Block
Static theme blocks 使主题开发者能够对其块和区块的布局拥有更多控制权。它们被称为静态主题块,因为它们在 Liquid 中是静态渲染的,而不是动态渲染的。静态主题块可以在各种场景中使用:
- 在主题设计需要商户无法移动或删除主题块的情况下,为主题提供结构。
- 条件渲染主题块。
在所有情况下,静态块都保留了自定义设置的灵活性。
静态渲染 vs 动态渲染的主题块
你可以通过以下方式在区块或另一个主题块中渲染主题块:
- 使用
{% content_for 'blocks' %}
在 Liquid 中动态渲染。 - 在 Liquid 中静态渲染,通过显式设置
type
使用{% content_for “block”, type: “<type>”, id: “<id>” %}
。
静态块 | 动态渲染的块 |
---|---|
可以隐藏和自定义 | 可以隐藏和自定义 |
不能重新排序(拖放) | 可以重新排序(拖放) |
不能删除或复制 | 可以删除或复制 |
可以在条件语句或 for 循环中渲染 | 不能在条件语句或 for 循环中渲染 |
如果未作为块预设的一部分添加,仍会被解析 | 必须包含在块预设中才能作为预设的一部分添加 |
不计入 max_blocks 限制 |
计入 max_blocks 限制 |
渲染静态块
要在区块或块文件中静态渲染主题块,必须使用以下 Liquid 标签:
{% content_for "block", type: "type", id: "id" %}
参数 | 定义 |
---|---|
type |
主题 /blocks 文件夹中现有主题块的类型(名称)。 |
id |
必填。在包含静态块的区块或块中,唯一标识符及其关联的字符串字面量。ID 可以是任何描述性标识符,用于在预设和模板中引用静态主题块。由于同一类型可能存在多个静态块,因此需要 ID。Shopify 不会为静态块生成 ID,因此主题开发者必须在 Liquid 中手动设置静态 ID。 |
注意
与这一功能一同更新的是块的唯一 ID 约束。块 ID 不再需要对根区块唯一,只需对其直接父级唯一。这意味着主题开发者无需担心静态块在区块中的使用位置或次数。
向静态块传递数据
与主题块一样,静态块也可以访问来自区块和块的动态源数据。通过静态块,你还可以传递任意数据。例如,幻灯片区块可以将颜色传递给幻灯片块:
{% content_for "block", id: "slide-1", type: "slide", color: "#111" %}
从幻灯片块中,可以通过引用相同的关键词访问数据:
<h2 style="color: {{ color | default: "green" }}">
Shopify
</h2>
条件渲染
当静态块在 Liquid 的条件语句中渲染时,它被视为条件渲染。Shopify 会检测到静态块的条件渲染,并在主题编辑器侧边栏中显示视觉提示(虚线眼睛图标),以提升用户体验。
<div id="slideshow-{{ section.id }}">
<div class="slideshow__slides">
{% content_for "blocks" %}
</div>
{% if section.blocks.size > 1 %}
{% content_for "block", type: "_slideshow-controls", id: "static-slideshow-controls" %}
{% endif %}
</div>
{% schema %}
{
"name": "Slideshow",
"class": "section--group",
"blocks": [{ "type": "_slide" }, { "type": "_slideshow-controls" }]
}
{% endschema %}
预设中的静态主题块
你可以选择在主题块预设中包含静态块以覆盖设置值。静态块预设需要两个额外的键:
id
: 来自 Liquid 的静态块 IDstatic: true
: 表示该块是静态的
注意
如果区块或块包含静态块但未在预设中明确包含它们,静态块将始终与容器区块或块预设一起添加,并使用默认设置值。
以下示例通过静态块渲染可折叠行的摘要和图标。摘要和图标是静态块,因为它们与行有固定关系。每一行应始终在顶层包含图标和摘要,因此商户不应能够删除它们或重新排序。
在此示例中,静态块是在块预设中编写的:
{% content_for "block", type: "collapsible-row-summary", id: "collapsible-row" %}
<div>
{% content_for "blocks" %}
</div>
{% schema %}
{
"name": "Collapsible row",
"tag": "details",
"class": "details",
"blocks": [{ "type": "@theme" }, { "type": "@app" }],
"settings": [],
"presets": [
{
"name": "Collapsible row",
"blocks": [
{
"type": "collapsible-row-summary",
"static": true,
"id": "collapsible-row",
"blocks": [
{
"type": "icon",
"id": "collapsible-row-icon",
"static": true,
"settings": {
"icon": "check_mark",
"size": {
"width": "22px"
}
}
}
]
},
{
"type": "group",
"blocks": [
{
"type": "heading"
},
{
"type": "text"
}
]
}
]
}
]
}
{% endschema %}
上述代码将在编辑器中渲染一个可折叠行,包含静态渲染的图标和摘要:
数据中的静态主题块
静态主题块会持久化在 JSON 数据中。关于 JSON 数据中的静态块,需要注意两个关键点:
static: true
标志表明哪些块是静态渲染的。- 静态块 ID 不会包含在
block_order
数组中,因为商户无法重新排序静态块。Shopify 会根据静态块在 Liquid 代码中的排列顺序(相对于动态块)确定其顺序,并在主题编辑器侧边栏和渲染页面中相应显示。
以下代码片段来自一个模板 JSON 文件。collapsible-row-summary
和 collapsible-row-icon
块具有 static: true
标志。它们未包含在 block_order
数组中。
{
"sections": {
"custom_section": {
"type": "custom-section",
"blocks": {
"collapsible_row": {
"type": "collapsible-row",
"settings": {},
"blocks": {
"collapsible-row-summary": {
"type": "collapsible-row-summary",
"static": true,
"settings": {
"summary": "Collapsible row"
},
"blocks": {
"collapsible-row-icon": {
"type": "icon",
"static": true,
"settings": {
"icon": "check_mark",
"size": {
"width": "22px"
}
}
}
},
"block_order": []
}
},
"block_order": []
}
},
"block_order": ["collapsible_row"],
"settings": {
"direction": "column",
"justify_content": "flex-start",
"full_width": false
}
}
},
"order": ["custom_section"]
}