在网站运营和内容管理中,我们经常会遇到这样的场景:后台某个字段存储了多个相关信息,比如一篇文章的多个关键词、一个产品的多种功能标签,或者某个作者的多个别名。这些信息通常以逗号、分号或其他特定符号连接成一个字符串。当需要在网站前端模板中将这些信息逐一展示或进行样式处理时,就需要将这个字符串拆分成独立的项,然后逐个遍历显示。

AnQiCMS 提供了强大且灵活的模板引擎,其语法风格类似于 Django,允许我们使用过滤器(Filters)对数据进行处理,并通过循环标签(for 循环)来遍历和显示这些处理后的数据。

AnQiCMS 模板语言基础

AnQiCMS 的模板系统旨在简化内容展示的开发过程。它通过以下几个核心概念,让数据处理变得直观:

  1. 变量输出: 使用双花括号 {{ 变量名 }} 来显示后台传递到模板的数据。
  2. 标签(Tags): 使用单花括号和百分号 {% 标签名 %} 来执行逻辑控制,例如条件判断(if)、循环(for)等。
  3. 过滤器(Filters): 使用竖线 | 符号,将变量的值传递给一个函数进行处理。过滤器可以改变数据的格式、内容或结构。这是我们实现字符串拆分的关键。

核心功能:字符串拆分成数组

AnQiCMS 提供了几个实用的过滤器,可以将字符串按不同规则拆分成数组(Go 语言中的 slice),以便于在模板中进一步处理。

1. split 过滤器:按指定分隔符拆分

这是最常用的方法,可以根据你自定义的任何分隔符将字符串拆分成数组。

  • 用法: {{ 字符串变量 | split:"分隔符" }}
  • 示例: 假设你的 archive.Keywords 字段存储了 “SEO优化,内容营销,网站运营” 这样一个字符串,你想用逗号 , 将它拆开。
    
    {% set keyword_string = archive.Keywords %}
    {% set keyword_array = keyword_string|split:"," %}
    {# 此时 keyword_array 就是一个包含 ["SEO优化", "内容营销", "网站运营"] 的数组 #}
    
    如果字符串中不包含指定的分隔符,split 过滤器会返回一个只包含原始字符串的单元素数组。例如,如果 keyword_string 是 “SEO优化”,那么 keyword_string|split:"," 将返回 ["SEO优化"]。 如果分隔符是一个空字符串 ""split 过滤器会将原字符串的每个字符都拆分成数组的一个元素。

2. make_list 过滤器:按字符拆分

当你需要将一个字符串中的每个字符(包括中文、英文、数字等)都拆分成数组中的一个独立元素时,make_list 过滤器会非常方便。

  • 用法: {{ 字符串变量 | make_list }}
  • 示例: 如果你需要处理 “你好世界” 这样的字符串,并希望每个汉字都是一个独立的元素。
    
    {% set greeting_string = "你好世界" %}
    {% set char_array = greeting_string|make_list %}
    {# 此时 char_array 就是一个包含 ["你", "好", "世", "界"] 的数组 #}
    

3. fields 过滤器:按空格拆分

这个过滤器专门用于将字符串按照空格(包括连续空格)拆分成数组。

  • 用法: {{ 字符串变量 | fields }}
  • 示例: 如果你的字符串是 “AnQiCMS is a GoLang CMS”,你想按空格拆分。
    
    {% set phrase_string = "AnQiCMS is a GoLang CMS" %}
    {% set word_array = phrase_string|fields %}
    {# 此时 word_array 就是一个包含 ["AnQiCMS", "is", "a", "GoLang", "CMS"] 的数组 #}
    

在模板中遍历并显示数组

一旦我们将字符串拆分成了数组,就可以使用 AnQiCMS 模板引擎中的 for 循环标签来遍历并显示数组中的每一个元素。

  • 用法:
    
    {% for item in 数组变量 %}
        {# 在这里处理每个 item #}
    {% empty %}
        {# 如果数组为空,则显示这里的内容 #}
    {% endfor %}
    
  • 循环变量:for 循环内部,你可以通过 item 变量(或其他你自定义的变量名)访问当前遍历到的数组元素。此外,模板引擎还提供了一些特殊的循环状态变量,例如:
    • forloop.Counter: 当前循环的次数(从 1 开始)。
    • forloop.Revcounter: 剩余循环的次数。

综合示例:显示文章关键词列表

我们来看一个实际的例子,假设文章详情页的 archive.Keywords 字段存储了以逗号分隔的关键词。我们希望在页面底部以标签形式显示这些关键词,并且每个关键词都是一个可点击的链接。

{# 假设 archive.Keywords 的值是 "SEO优化,内容营销,网站运营" #}
{% if archive.Keywords %}
    <div class="article-keywords">
        <strong>关键词:</strong>
        {% set keyword_array = archive.Keywords|split:"," %}
        {% for keyword in keyword_array %}
            <a href="/tags/{{ keyword|urlencode }}" class="tag-item">{{ keyword|trim }}</a>
        {% empty %}
            <span>暂无关键词</span>
        {% endfor %}
    </div>
{% endif %}

代码解释:

  1. {% if archive.Keywords %}:首先判断 archive.Keywords 字段是否有值,避免在没有关键词时显示空区域。
  2. {% set keyword_array = archive.Keywords|split:"," %}:使用 set 标签将 archive.Keywords 字符串通过 , 拆分后赋值给一个名为 keyword_array 的新变量。这是**实践,因为它将数据处理和循环逻辑分开,使代码更清晰。
  3. {% for keyword in keyword_array %}:遍历 keyword_array 数组,每次循环将当前元素赋值给 keyword 变量。
  4. <a href="/tags/{{ keyword|urlencode }}" class="tag-item">{{ keyword|trim }}</a>
    • keyword|urlencode:将关键词进行 URL 编码,以防关键词中含有特殊字符导致链接失效。
    • keyword|trim:移除关键词前后可能存在的空格,确保显示整洁。
    • class="tag-item":可以为每个关键词应用自定义的 CSS 样式。
  5. {% empty %}<span>暂无关键词</span>{% endfor %}:如果 keyword_array 数组为空(即 archive.Keywords 为空字符串或经过拆分后仍为空),则显示 “暂无关键词”。

通过这样的组合使用,我们就能轻松地将后台存储的结构化字符串数据,以美观且功能性的方式呈现在网站前端。

总结

AnQiCMS 的模板引擎提供了灵活的过滤器和循环