在网站运营和内容管理中,我们经常会遇到这样的场景:后台某个字段存储了多个相关信息,比如一篇文章的多个关键词、一个产品的多种功能标签,或者某个作者的多个别名。这些信息通常以逗号、分号或其他特定符号连接成一个字符串。当需要在网站前端模板中将这些信息逐一展示或进行样式处理时,就需要将这个字符串拆分成独立的项,然后逐个遍历显示。
AnQiCMS 提供了强大且灵活的模板引擎,其语法风格类似于 Django,允许我们使用过滤器(Filters)对数据进行处理,并通过循环标签(for 循环)来遍历和显示这些处理后的数据。
AnQiCMS 模板语言基础
AnQiCMS 的模板系统旨在简化内容展示的开发过程。它通过以下几个核心概念,让数据处理变得直观:
- 变量输出: 使用双花括号
{{ 变量名 }}来显示后台传递到模板的数据。 - 标签(Tags): 使用单花括号和百分号
{% 标签名 %}来执行逻辑控制,例如条件判断(if)、循环(for)等。 - 过滤器(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 %}
代码解释:
{% if archive.Keywords %}:首先判断archive.Keywords字段是否有值,避免在没有关键词时显示空区域。{% set keyword_array = archive.Keywords|split:"," %}:使用set标签将archive.Keywords字符串通过,拆分后赋值给一个名为keyword_array的新变量。这是**实践,因为它将数据处理和循环逻辑分开,使代码更清晰。{% for keyword in keyword_array %}:遍历keyword_array数组,每次循环将当前元素赋值给keyword变量。<a href="/tags/{{ keyword|urlencode }}" class="tag-item">{{ keyword|trim }}</a>:keyword|urlencode:将关键词进行 URL 编码,以防关键词中含有特殊字符导致链接失效。keyword|trim:移除关键词前后可能存在的空格,确保显示整洁。class="tag-item":可以为每个关键词应用自定义的 CSS 样式。
{% empty %}<span>暂无关键词</span>{% endfor %}:如果keyword_array数组为空(即archive.Keywords为空字符串或经过拆分后仍为空),则显示 “暂无关键词”。
通过这样的组合使用,我们就能轻松地将后台存储的结构化字符串数据,以美观且功能性的方式呈现在网站前端。
总结
AnQiCMS 的模板引擎提供了灵活的过滤器和循环