跳到正文
Sline

Sline 模板语言入门

从对象、标签、过滤器、作用域和安全输出开始,建立开发 SHOPLINE Online Store 3.0 主题所需的 Sline 基础。

学习路径 1 / 6适合初级主题开发者最后核验:2026-07-28
本页目录

Sline 解决什么问题

Sline 是 SHOPLINE 的模板语言。主题文件先写好静态结构,再通过对象和属性插入当前商品、集合、顾客或页面数据。它还提供标签处理条件与循环,并通过过滤器改变输出格式。

一个商品标题的最小输出是:

<h1>{{ product.title }}</h1>

这里的 product 是对象,title 是属性。实际渲染时,SHOPLINE 会把当前商品的数据填入模板。

先建立边界: Sline 服务于 SHOPLINE 主题渲染。SHOPLINE 明确说明开发者不能自行定义新的 Sline 标签和过滤器,应从官方参考中选择平台提供的能力。

输出与 HTML 安全

默认转义

双花括号会输出数据并转义其中的 HTML 特殊字符:

<div class="product-description">
  {{ product.description }}
</div>

这是处理标题、文本设置或顾客输入时更安全的默认方式。

明确输出 HTML

三花括号会把内容作为未转义 HTML 输出:

<div class="product-description">
  {{{ product.description }}}
</div>

只有在字段本身由 SHOPLINE 以富文本或可信 HTML 形式提供,并且官方对象说明允许这样使用时,才应选择三花括号。不要为了“让标签生效”就把普通输入改成未转义输出。

对象、属性与作用域

Sline 对象分为两类:

  • 全局对象可在多种主题模板中访问,例如页面标题一类的全局数据。
  • 局部对象只在创建它的标签或当前模板范围内有效,例如循环中的 forloop。

访问属性通常使用点号:

{{ product.title }}
{{ product.featured_image }}

当 key 来自变量,或者名称不适合点号访问时,可以使用方括号:

{{ products[index].title }}
{{ linklists["footer"].links }}

资源 handle 是 SHOPLINE 中商品、集合、博客等资源的稳定标识。不要把显示标题当成 handle;如果 handle 改变,依赖旧 handle 的主题引用也需要一起检查。

标签:让模板产生结构

标签负责条件、循环、变量或平台提供的专用输出。普通标签有开始与结束,自闭合标签以 /}} 结束。

条件

{{#if customer != nil}}
  <p>欢迎回来,{{ customer.name }}</p>
{{#else/}}
  <a href="/account/login">登录</a>
{{/if}}

Sline 支持 ==、!=、>、<、>=、<=,以及 &&、||。复杂条件可以使用括号明确优先级。

循环

<ul>
  {{#for product in collection.products}}
    <li>{{ product.title }}</li>
  {{/for}}
</ul>

循环内部优先使用当前项目对象,不要假设可以像 Handlebars 一样通过 ../ 回到父级作用域。跨层数据访问是后续迁移时最容易遗漏的差异之一。

过滤器:改变输出

过滤器写在管道符 | 后,并从左到右依次执行:

<span class="price">
  {{ product.price | money() }}
</span>

多个过滤器可以串联:

{{ product.title | truncate(40) | escape() }}

过滤器应该用于轻量的数据格式化。商品选择、权限判断或复杂业务规则仍应由平台数据或应用层处理,而不是塞进主题模板。

数据类型与真假值

Sline 支持字符串、数字、布尔值、nil 和数组等类型。初学时需要特别注意两点:

  1. 空字符串和空数组在 Sline 中可能仍被视为真。
  2. 不能直接初始化数组,但可以使用 split() 把分隔字符串转换为数组。

因此,检查数组是否有内容时应判断长度:

{{#if collection.products | size() > 0}}
  <p>找到商品</p>
{{#else/}}
  <p>当前集合没有商品</p>
{{/if}}

一个完整的商品摘要

下面的示例把对象、条件、过滤器和默认转义放在一起:

<article class="product-card">
  {{#if product.featured_image}}
    {{#image_tag product.featured_image | image_url(width=720) /}}
  {{/if}}

  <h2>{{ product.title }}</h2>

  <p class="product-card__price">
    {{ product.price | money() }}
  </p>

  {{#if product.available}}
    <a href="{{ product.url }}">查看商品</a>
  {{#else/}}
    <span>暂时售罄</span>
  {{/if}}
</article>

真实项目中,应再次对照当前对象、过滤器和标签参考,确认属性名与参数适用于目标页面。

练习这些表达式时,可把片段粘贴到 Sline AST Explorer 查看语法树;工具只检查语法结构,实际数据输出仍需在主题预览中验证。

开始编码前的检查清单

  • 确认当前文件能访问哪些全局和局部对象。
  • 普通文本使用双花括号,只有可信 HTML 才使用三花括号。
  • 数组是否为空用 size() 判断。
  • 过滤器按从左到右的顺序阅读与调试。
  • 不依赖自定义标签或过滤器。
  • 资源引用使用正确 handle,不使用可能变化的显示名称。
  • 每次新增模板逻辑后,同时检查有数据、无数据和未登录状态。
下一阶段Sline、Handlebars 与 Liquid 语法对照

把已经掌握的 Sline 基础放进三种模板语言中比较。

从语法认识到主题交付

完整路线

  1. 01认识 Sline

    理解对象、标签、过滤器与作用域。

  2. 02语法对照

    比较 Sline、Handlebars 与 Liquid。

  3. 03迁移实战

    将常见模板写法迁移到 Sline。

  4. 04主题架构

    对照 Dawn 与 Bottle 的组织方式。

  5. 05升级 OS 3.0

    规划主题、应用和内容迁移。

  6. 06CLI 工作流

    完成本地开发、检查与交付。