AnQiCMS 模板中如何使用`if`和`for`标签进行逻辑判断和循环遍历?

作为一名资深的网站运营专家,我深知一套灵活且强大的模板系统对于内容管理的重要性。AnQiCMS 凭借其基于 Go 语言的高性能架构,以及对 Django 模板引擎语法的支持,为我们提供了极大的便利。它不仅仅是发布内容的工具,更是我们实现内容个性化展示和提升用户体验的利器。

在 AnQiCMS 的模板世界里,iffor 标签无疑是构建动态内容的基石。它们赋予了模板逻辑判断和循环遍历的能力,让我们的网站内容能够根据不同条件智能呈现,或者将一系列相关数据以整齐有序的方式展示出来。今天,我们就来深入探讨如何在 AnQiCMS 模板中巧妙运用这两个标签,为您的网站注入更多活力。


一、逻辑的艺术:if 标签的灵活运用

在网站运营中,我们常常需要根据不同的业务场景或数据状态来展示不同的内容。比如,当用户登录时显示欢迎信息,未登录时显示注册/登录入口;或者根据文章的“推荐”属性来添加特殊的样式标记。这时,if 标签就成了我们进行条件判断的核心工具。

AnQiCMS 的 if 标签语法简洁明了,与许多现代模板引擎类似,它支持单条件判断、带 else 的二选一判断,以及带 elif(else if)的多条件判断。所有 if 语句都必须以 {% endif %} 结束。

1. 基本的条件判断:{% if 条件 %}

这是最简单的形式,当 if 后面的条件为真(true)时,标签内部的内容就会被渲染。

{# 假设我们想判断网站名称是否存在,存在则显示 #}
{% if system.SiteName %}
    <h1>欢迎来到 {{ system.SiteName }}!</h1>
{% endif %}

您可以使用各种比较运算符(== 等于, != 不等于, > 大于, < 小于, >= 大于等于, <= 小于等于),以及逻辑运算符(and 且, or 或, not 非)来构建复杂的条件。例如,判断文档 ID 是否为 10:

{% if archive.Id == 10 %}
    <p>这是文档ID为10的特别内容。</p>
{% endif %}

2. 二选一的判断:{% if 条件 %} ... {% else %} ... {% endif %}

当条件为真时执行一部分代码,否则执行另一部分。这在处理有明确“是”与“否”两种结果的场景时非常实用。

{# 判断文章是否有缩略图,有则显示,无则显示占位图 #}
{% if archive.Thumb %}
    <img src="{{ archive.Thumb }}" alt="{{ archive.Title }}">
{% else %}
    <img src="/public/static/images/placeholder.webp" alt="无图片">
{% endif %}

3. 多重条件判断:{% if 条件 %} ... {% elif 其他条件 %} ... {% else %} ... {% endif %}

当您需要处理两种以上、互斥的条件时,elif 标签就能派上用场。它允许您链式地添加多个判断分支。

{# 根据文档的 Flag 属性显示不同的标签 #}
{% if archive.Flag contains "h" %}
    <span class="badge badge-hot">头条</span>
{% elif archive.Flag contains "c" %}
    <span class="badge badge-recommend">推荐</span>
{% else %}
    <span class="badge badge-normal">普通</span>
{% endif %}

在这个例子中,archive.Flag contains "h" 会判断 Flag 字符串中是否包含 “h” 字符,如果包含则执行第一段代码,否则继续判断 elif 中的条件。

4. 检查变量是否存在或为空:

if 标签可以自然地用于检查变量是否存在或其值是否为空(例如 nil、空字符串、空数组等)。

{# 检查联系电话是否存在 #}
{% if contact.Cellphone %}
    <p>联系电话:{{ contact.Cellphone }}</p>
{% else %}
    <p>暂无联系电话</p>
{% endif %}

二、迭代的力量:for 标签的遍历魔法

动态网站的一个核心特征就是能够展示一系列重复但内容不同的数据,例如文章列表、产品列表、导航菜单项、评论列表等等。for 标签正是 AnQiCMS 模板引擎中实现这种“循环遍历”功能的关键。它让我们可以轻松地访问数组、切片(slice)或其他可迭代对象中的每一个元素,并针对每个元素进行渲染。

1. 基本的循环遍历:{% for item in collection %}

这是 for 标签最常见的用法,它会遍历 in 后面的集合(collection),将每个元素依次赋值给 item 变量,并在 {% endfor %} 之前的代码块中进行渲染。

{# 遍历并显示最新的10篇文章标题和链接 #}
{% archiveList archives with type="list" limit="10" %}
    <ul>
        {% for article in archives %}
            <li>
                <a href="{{ article.Link }}">{{ article.Title }}</a>
            </li>
        {% endfor %}
    </ul>
{% endarchiveList %}

这里,archiveList 标签获取了一个文档列表,并将其赋值给 archives 变量。随后,for 循环遍历 archives 中的每一个 article 对象,并渲染出文章的标题和链接。

2. 处理空集合:{% for item in collection %} ... {% empty %} ... {% endfor %}

在实际运营中,我们经常会遇到某个列表可能为空的情况。如果直接循环一个空列表,页面上就什么都不会显示,这可能会让用户感到困惑。AnQiCMS 的 for 标签提供了一个非常优雅的 empty 子标签来处理这种情况。当 collection 为空或不存在时,{% empty %}{% endfor %} 之间的内容就会被渲染。

{# 遍历并显示 Tag 文档列表,如果为空则显示提示信息 #}
{% tagDataList archives with type="page" limit="10" %}
    {% for item in archives %}
        <div class="tag-article">
            <h3><a href="{{ item.Link }}">{{ item.Title }}</a></h3>
            <p>{{ item.Description|truncatechars:100 }}</p>
        </div>
    {% empty %}
        <p class="no-content">当前标签下暂无相关文章。</p>
    {% endfor %}
{% endtagDataList %}

使用 empty 比先用 if 判断列表长度再决定是否循环要简洁得多,也更符合代码的逻辑流。

3. 循环上下文变量:赋予迭代更多控制

for 循环内部,AnQiCMS 提供了一系列内置的 forloop 变量,帮助我们更好地控制循环的渲染行为:

  • forloop.Counter: 当前循环的迭代次数(从 1 开始)。
  • forloop.Revcounter: 当前循环的剩余迭代次数(从总数倒数计数)。
  • forloop.First: 如果是循环中的第一个元素,为 true
  • forloop.Last: 如果是循环中的最后一个元素,为 true
  • forloop.Odd: 如果 Counter 为奇数,为 true
  • forloop.Even: 如果 Counter 为偶数,为 true

这些变量在为列表项添加特殊样式(如第一个突出显示、隔行变色),或在特定位置插入额外内容时非常有用。

”`twig {# 利用 forloop 变量,为列表项添加不同样式或内容 #} {% categoryList categories with moduleId=“1” parentId=“0” limit=“5” %}

<ul class="category-nav">
    {% for category in categories %}
        <li class="{% if forloop.First %}first-item{% endif %} {% if forloop.Last %}last-item{% endif %} {% if forloop.Odd %}odd-row{% else %}even-row{% endif %}">
            第 {{ forloop.Counter }} 项:<a href="{{ category.Link }}">{{ category.Title }}</a>
            {% if forloop.Last %}
                <span class="tip">(这是最后一项)</span>
            {% endif %}
        </li>
    {% endfor %}
</ul>

{% end