在安企CMS的模板开发中,我们经常会遇到需要在页面上展示一些列表数据,比如导航菜单、分类标签、或是一些固定选项。当这些数据不适合从后台数据库动态获取,或者我们仅仅需要一个简单、固定的字符串集合时,直接在模板中定义一个字符串数组就显得非常便捷和高效。安企CMS基于Django模板引擎语法,为我们提供了灵活的方式来处理这类需求。

核心方法:使用 list 过滤器定义字符串数组

要在安企CMS模板中直接定义一个字符串数组,我们可以巧妙地利用模板引擎提供的set标签配合list过滤器。list过滤器专门用于将一个符合特定JSON格式的字符串转换为一个可迭代的数组对象。

其基本语法结构如下:

{% set 变量名 = '["元素1", "元素2", "元素3", ...]'|list %}

这里,{% set ... %} 标签用于在模板中声明并赋值一个变量。'["元素1", "元素2", "元素3", ...]' 是一个标准的JSON格式字符串,它代表了一个字符串数组。接着,通过管道符|将这个字符串传递给list过滤器,list过滤器会将其解析并转换为一个可以在模板中直接循环遍历的Go语言字符串切片([]string{})。

需要注意的是,JSON格式的字符串中,每个元素都应该用双引号包裹,即使是数字,在经过list过滤器处理后,也会作为字符串存储在数组中。

实践示例:定义并遍历数组

假设我们想在页脚展示几个友情链接的名称,这些链接名称是固定的,不需要从后台动态管理。我们可以在模板中这样定义和使用这个字符串数组:

{% set friend_links = '["安企CMS官网", "AnQiCMS博客", "Go语言教程"]'|list %}

<div class="footer-links">
    <h3>友情链接</h3>
    <ul>
        {% for link_name in friend_links %}
        <li><a href="#">{{ link_name }}</a></li>
        {% empty %}
        <li>暂无友情链接</li>
        {% endfor %}
    </ul>
</div>

在这个例子中,friend_links 变量被赋值为一个包含三个字符串的数组。随后,我们使用for循环遍历这个数组,并为每个元素(即每个链接名称)创建一个列表项。{% empty %}标签则是在数组为空时提供一个备用内容,这使得模板更具健壮性。

实际应用场景

  1. 动态生成导航菜单或分类选项: 当某些导航项或筛选选项是固定不变且数量有限时,可以直接在模板中定义数组来快速构建。例如,顶部菜单中的“首页”、“关于我们”、“联系我们”等。
    
    {% set main_nav = '["首页", "产品中心", "解决方案", "关于我们", "联系我们"]'|list %}
    <nav>
        <ul>
            {% for item in main_nav %}
            <li><a href="/{{ item|lower }}">{{ item }}</a></li>
            {% endfor %}
        </ul>
    </nav>
    
  2. 页面关键词的辅助管理: 虽然安企CMS提供了强大的关键词库功能,但对于某些特定页面或模块,我们可能需要额外增加一些辅助性的关键词提示,这些关键词可能不希望被全局管理,此时数组就能派上用场。
    
    {% set seo_tips = '["高效", "定制", "易扩展"]'|list %}
    <p>我们提供{% for tip in seo_tips %}{{ tip }} {% if not forloop.Last %}/{% endif %}{% endfor %}的内容管理服务。</p>
    
  3. 条件判断与内容切换: 我们可以定义一个包含特定状态或权限的字符串数组,然后在if语句中判断某个变量是否包含在其中,以实现内容的动态显示。
    
    {% set vip_levels = '["VIP1", "VIP2", "VIP3"]'|list %}
    {% if user.Group in vip_levels %}
    <p>尊贵的VIP用户,您好!</p>
    {% else %}
    <p>欢迎普通用户,升级VIP享受更多权益!</p>
    {% endif %}
    
    (注意:user.Group 需要是后端传递的字符串类型,并且 filter-contain.md 中有提及 in 操作符。)

注意事项与**实践

直接在模板中定义字符串数组,最适合处理那些内容相对固定、变化频率低且数量不多的数据。对于需要频繁更新、数量庞大或与后台业务逻辑紧密相关的数据,我们仍然建议使用安企CMS提供的各类标签(如categoryListarchiveListtagList等)从数据库动态获取,这样更能发挥CMS的优势,保持内容的可维护性和可扩展性。

通过set标签和list过滤器的结合,我们可以在安企CMS模板中轻松定义和操作字符串数组,为前端展示带来更多灵活性和便利。


常见问题 (FAQ)

Q1: 为什么不能直接使用 {% set my_array = ["item1", "item2"] %} 这样的语法来定义数组? A1: 安企CMS的模板引擎(基于Go语言的Django-like模板)在处理模板变量赋值时,需要对值进行明确的类型转换。直接使用 [...] 语法在模板中会被解析为普通字符串,而不是数组。因此,我们需要通过|list过滤器来显式地告诉模板引擎,将括号内的JSON格式字符串解析为一个字符串数组(切片)。

Q2: 我可以在这个字符串数组中包含数字或者其他类型的数据吗?例如 {% set mixed_data = '["文本", 123, true]'|list %} A2: 可以,但需要注意的是,list过滤器会将JSON格式字符串中的所有元素都解析并作为字符串存储在最终的[]string{}数组中。即使你在JSON字符串中写的是数字或布尔值,如123true,它们在数组中也会被视为字符串"123""true"。如果你需要对这些“数字”元素进行算术运算,可能需要在取用时进行额外的类型转换(如果模板引擎支持)。

Q3: 我可以将安企CMS后台获取的数据(如分类列表)直接赋值到一个自定义的字符串数组中吗? A3: categoryListarchiveList等标签返回的是包含复杂对象的列表(例如,每个元素都是一个分类对象,包含ID、标题、链接等多个属性),而不是简单的字符串。如果你想从这些复杂对象中提取特定属性(比如所有分类的标题)组成一个字符串数组,你需要通过for循环遍历这些对象,并手动构建一个新的字符串数组。通常,直接使用后台数据提供的对象列表进行遍历和渲染会更加方便,而不是将其转换为一个纯字符串数组。直接在模板中定义字符串数组适用于固定且不依赖后台数据更新的小型列表。