如何在AnQiCMS模板中正确引用和显示变量,并进行条件判断来控制内容呈现?

在 AnQiCMS 的模板中,灵活地引用变量并运用条件判断来控制内容的呈现,是构建动态且功能丰富的网站的关键。AnQiCMS 采用了类似 Django 的模板引擎语法,这使得模板开发既直观又强大。本文将深入探讨如何在 AnQiCMS 模板中有效地管理变量和逻辑,帮助你更好地驾驭内容呈现。


一、AnQiCMS 模板基础:变量的引用与显示

在 AnQiCMS 模板中,数据的流动通过变量来承载。理解如何正确地引用和显示这些变量是模板开发的第一步。

1. 模板引擎语法速览

AnQiCMS 模板遵循特定的语法规则:

  • 变量引用:使用双花括号 {{ 变量名 }} 来输出变量的值。
  • 逻辑控制:使用单花括号和百分号 {% 标签名 %} 来处理条件判断、循环、函数调用等逻辑操作。这些逻辑标签通常需要成对出现,例如 {% if 条件 %}...{% endif %}

2. 变量命名与访问

AnQiCMS 中的变量通常采用驼峰命名法(CamelCase),即每个单词的首字母大写。当你需要访问一个对象的属性时,使用点号 . 进行连接。

  • 引用简单变量: 如果你在后台“全局功能设置”中配置了网站名称,并将其命名为 SiteName,在模板中你可以这样引用它:

    <h1>欢迎来到 {{ SiteName }}!</h1>
    

    或者使用系统标签显式调用并赋值给一个自定义变量名:

    {% system siteNameVar with name="SiteName" %}
    <h1>欢迎来到 {{ siteNameVar }}!</h1>
    
  • 引用对象属性: 在遍历文档列表时,每个文档都是一个对象,你可以通过 item.Titleitem.Link 等方式访问其属性。例如,在一个文章列表中显示文章标题和链接:

    {% archiveList archives with type="list" limit="5" %}
        {% for item in archives %}
            <p><a href="{{ item.Link }}">{{ item.Title }}</a></p>
        {% endfor %}
    {% endarchiveList %}
    
  • 使用过滤器处理变量: AnQiCMS 提供了丰富的过滤器来对变量进行格式化或转换。过滤器通过竖线 | 连接在变量名之后,可以串联使用。 例如,如果你的文章内容 item.Content 包含 HTML 标签,为了安全地显示这些内容而不被浏览器直接解析为恶意脚本,可以使用 safe 过滤器:

    <div>{{ item.Content|safe }}</div>
    

    再比如,格式化时间戳 item.CreatedTime 为可读日期:

    <p>发布日期:{{ stampToDate(item.CreatedTime, "2006-01-02") }}</p>
    

    对于字符串截断,你可以使用 truncatechars

    <p>简介:{{ item.Description|truncatechars:50 }}</p>
    

3. 自定义变量

有时你需要在模板中临时创建或赋值一个变量,AnQiCMS 提供了 withset 标签来实现这一点。

  • {% with %} 标签:用于在某个作用域内定义一个或多个变量,通常与 include 标签配合使用,将变量传递给被包含的模板片段。
    
    {% with greeting="你好" name="世界" %}
        <p>{{ greeting }}, {{ name }}!</p>
    {% endwith %}
    
  • {% set %} 标签:用于在当前模板作用域内声明一个变量,它的作用范围直到模板结束或被新的 set 标签覆盖。
    
    {% set articleCount = 0 %}
    {% archiveList archives with type="list" limit="10" %}
        {% for item in archives %}
            {% set articleCount = forloop.Counter %}
            <p>{{ articleCount }}. {{ item.Title }}</p>
        {% endfor %}
    {% endarchiveList %}
    <p>共有 {{ articleCount }} 篇文章。</p>
    

二、灵活控制内容呈现:条件判断(If 语句)

条件判断是模板逻辑的核心,它允许你根据不同的条件显示或隐藏特定的内容块。AnQiCMS 的 if 语句语法直观且功能完善。

1. {% if %} / {% elif %} / {% else %} 结构

最常见的条件判断结构包括 if (如果), elif (否则如果), else (否则) 和 endif (结束如果)。

{% if 用户已登录 %}
    <p>欢迎回来,{{ 用户名 }}!</p>
{% elif 用户正在注册 %}
    <p>欢迎注册新账号!</p>
{% else %}
    <p>请登录或注册。</p>
{% endif %}

2. 常用条件判断

  • 相等与不相等:使用 == (等于) 和 != (不等于)。
    
    {% if category.Id == 1 %}
        <p>这是新闻分类的特别内容。</p>
    {% endif %}
    
  • 大小比较:使用 >, <, >=, <=
    
    {% if archive.Views > 1000 %}
        <span class="hot-badge">热门</span>
    {% endif %}
    
  • 逻辑运算:使用 and (且), or (或), not (非)。
    
    {% if user.IsVIP and user.ExpireTime > currentTime %}
        <p>您是尊贵的 VIP 会员。</p>
    {% elif not user.IsVIP %}
        <p>成为 VIP 享受更多特权。</p>
    {% endif %}
    
  • 判断变量存在或非空:直接使用变量名作为条件,当变量为 nil、空字符串、零值等时会被判断为 false
    
    {% if archive.Thumb %}
        <img src="{{ archive.Thumb }}" alt="{{ archive.Title }}">
    {% else %}
        <img src="/static/images/default_thumb.jpg" alt="默认缩略图">
    {% endif %}
    

3. 实际场景应用

条件判断广泛应用于各种场景,例如:

  • 根据用户角色显示不同导航菜单。
  • 根据文章是否有缩略图显示图片或占位符。
  • 在列表页根据文章的 Flag 属性(如“推荐”、“头条”)添加特殊样式或标签。
  • 在多站点管理中,根据 siteId 加载不同的内容或布局。

三、遍历数据集合:循环(For 语句)

循环是处理数据列表的强大工具,无论是文章列表、分类列表还是导航菜单,for 语句都能帮助你高效地渲染。

1. {% for %} / {% endfor %} 结构

for 循环用于遍历数组、切片(slice)或其他可迭代对象中的每个元素。

{% categoryList categories with moduleId="1" parentId="0" %}
    <ul>
        {% for category in categories %}
            <li><a href="{{ category.Link }}">{{ category.Title }}</a></li>
        {% endfor %}
    </ul>
{% endcategoryList %}

2. forloop 对象与辅助功能

for 循环内部,你可以访问一个特殊的 forloop 对象,它提供了当前循环状态的信息。

  • forloop.Counter:当前循环的迭代次数(从 1 开始)。
  • forloop.Revcounter:当前循环剩余的迭代次数(倒序计数)。
    
    {% archiveList archives with type="list" limit="3" %}
        {% for item in archives %}
            <p>{{ forloop.Counter }}. {{ item.Title }} (还剩 {{ forloop.Revcounter }} 篇)</p>
        {% endfor %}
    {% endarchiveList %}
    

3