在AnQiCMS的模板中,如何有效地展示变量数据,是每一位网站运营者和模板制作者都需要掌握的核心技能。AnQiCMS采用了一套类似于Django模板引擎的语法,使得数据的调用和展示既直观又灵活。本文将深入探讨在AnQiCMS模板中显示变量的各种方式,帮助您将后台配置的数据、文章内容等动态信息精准地呈现在网站前端。

核心概念:双花括号 {{ }} 与变量基础

在AnQiCMS的模板里,显示任何动态数据最基本的方式就是使用双花括号 {{ 变量名 }}。这是一种直观的语法,模板引擎在渲染页面时,会自动将双花括号内的变量替换为实际的数据。

例如,如果你想在模板中显示网站的名称,它可能被定义为一个变量 SiteName,你就可以这样调用: <h1>{{ SiteName }}</h1>

如果变量是一个包含多个属性的对象(如一篇文章、一个分类),你可以使用点 . 来访问其内部属性。例如,一篇文档对象通常会有标题 Title 和内容 Content 等属性: <h2>{{ archive.Title }}</h2> <div>{{ archive.Content }}</div>

需要注意的是,AnQiCMS中的变量命名通常遵循驼峰命名法则,即每个单词的首字母大写(例如 SiteName, CreatedTime)。

动态获取数据:标签 (Tags) 的力量

除了直接访问一些全局变量外,AnQiCMS提供了丰富的“标签” ({% tag %}) 来动态地从数据库中获取数据。这些标签执行特定的逻辑,并将查询到的数据赋值给模板中的变量,供您进一步展示。

1. 获取全局或站点级信息: AnQiCMS提供了一些标签用于获取整个网站或当前站点的配置信息,如 systemcontacttdk(TDK指Title、Description、Keywords)。这些标签通常通过 name 参数指定要获取的字段:

  • 网站系统设置: {% system with name="SiteName" %} 会显示您在后台“全局设置”中配置的网站名称。同样,{% system with name="SiteLogo" %} 会返回网站Logo的图片地址。
  • 联系方式: {% contact with name="Cellphone" %} 将显示您在后台“联系方式设置”中填写的联系电话。
  • 页面TDK: {% tdk with name="Title" %} 将获取当前页面的标题。当您需要将网站标题与网站名称结合时,可以使用 {% tdk with name="Title" siteName=true %}

2. 获取内容详情: 当您处于文章详情页、分类详情页或单页面时,可以直接使用对应的详情标签来获取当前内容的详细信息。这些标签会自动识别当前页面的上下文。

  • 文档详情: {% archiveDetail with name="Title" %} 会显示当前文章的标题。同样,{% archiveDetail with name="Content" %} 会显示文章内容。您也可以通过 idtoken 参数获取指定文档的信息。
  • 分类详情: {% categoryDetail with name="Title" %} 显示当前分类的名称,{% categoryDetail with name="Description" %} 显示分类的描述。
  • 单页详情: {% pageDetail with name="Content" %} 用于显示“关于我们”这类单页面的内容。

3. 获取内容列表: 对于需要展示多条数据(如文章列表、产品列表、分类导航)的场景,您需要使用列表标签,并结合 {% for %} 循环标签来遍历并显示每一项的数据。

  • 文档列表: {% archiveList archives with type="list" categoryId="1" limit="10" %} 会获取指定分类下的10篇文章。在循环中,您可以通过 {{ item.Title }} 访问每篇文章的标题。
  • 分类列表: {% categoryList categories with moduleId="1" parentId="0" %} 会获取文章模型下所有的顶级分类。您可以在循环中使用 {{ item.Title }}{{ item.Link }} 来构建导航。

当您使用列表标签获取数据时,通常会像这样组织代码:

{% archiveList articles with type="list" limit="5" %}
    {% for article in articles %}
        <h3><a href="{{ article.Link }}">{{ article.Title }}</a></h3>
        <p>{{ article.Description }}</p>
        <span>发布时间:{{ stampToDate(article.CreatedTime, "2006-01-02") }}</span>
    {% empty %}
        <p>暂时没有文章。</p>
    {% endfor %}
{% endarchiveList %}

这里的 articles 是您通过 archiveList 标签获取到的文章集合,article 是循环中每一篇文章的变量。

精细控制:使用过滤器 (Filters) 优化变量显示

仅仅获取原始数据往往不够,我们还需要对数据进行格式化、截取或者转换。AnQiCMS提供了“过滤器”机制,通过在变量名后添加竖线 | 和过滤器名称,您可以对变量的显示进行精细控制。

1. 处理HTML内容:|safe 当您在后台编辑器中输入了富文本(如文章内容),其中包含HTML标签时,如果直接输出 {{ archive.Content }},为了安全,模板引擎可能会将其中的HTML标签进行转义,显示为 <p>内容</p> 而不是渲染后的样式。这时,您需要使用 |safe 过滤器,告诉模板引擎这段内容是安全的,可以直接作为HTML输出: <div>{{ archive.Content|safe }}</div>

2. 格式化日期和时间:stampToDate AnQiCMS中存储的时间戳通常是10位数字。为了将其显示为人类可读的日期格式,您可以使用 stampToDate 函数: <span>发布日期:{{ stampToDate(article.CreatedTime, "2006-01-02") }}</span> <span>更新时间:{{ stampToDate(article.UpdatedTime, "2006-01-02 15:04:05") }}</span> 请注意,日期格式字符串 2006-01-02 15:04:05 是Golang特有的参考时间格式,用来表示年、月、日、时、分、秒。

3. 截取文本:|truncatechars|truncatewords 当您需要显示文章摘要或简短描述时,可以使用截取过滤器来限制字符数或单词数,并自动在末尾添加省略号: {{ item.Description|truncatechars:100 }} (截取前100个字符) {{ item.Description|truncatewords:20 }} (截取前20个单词)

4. 其他常用过滤器:

  • |lower / |upper:将字符串转换为小写/大写。
  • |add:数字:将变量与指定数字相加。
  • |replace:"旧词,新词":替换字符串中的特定内容。
  • |length:获取字符串、数组或对象集合的长度。
  • |join:", ":将数组元素用逗号和空格连接成一个字符串。

灵活的变量定义:withset 标签

有时,您可能需要在模板内部定义一些临时变量,以便代码更清晰或避免重复计算。AnQiCMS提供了 withset 标签来实现这一目的。

  • {% with ... %} 用于在模板块中定义临时的、块级作用域的变量,常与 include 标签结合使用,向被引入的模板传递参数。
    
    {% with pageTitle="我的自定义页面标题", pageKeywords="关键字1,关键字2" %}
        {% include "partial/header.html" with title=pageTitle keywords=pageKeywords only %}
    {% endwith %}
    
  • {% set ... %} 用于在当前模板中定义