如何在AnQiCMS模板中通过`if`、`for`等逻辑标签灵活控制内容的条件显示和循环输出?

在AnQiCMS中,模板是构建网站外观和展示内容的核心。要让网站的内容呈现更加灵活和智能,熟练运用模板中的逻辑标签至关重要。这其中,if 条件判断和 for 循环输出标签是实现内容动态展示的两大利器。它们允许您根据特定条件显示或隐藏内容,以及高效地遍历并输出一系列数据,从而打造出高度定制化且响应用户需求的前端页面。

AnQiCMS的模板语法设计上借鉴了Django模板引擎,因此对于熟悉此类语法的用户来说会非常容易上手。它的基本规则是:变量使用双花括号 {{ 变量名 }} 来输出,而像条件判断和循环控制这类逻辑标签则使用单花括号和百分号 {% 标签名 %} 包裹,并且这些逻辑标签通常都需要一个对应的结束标签来闭合。

条件显示:ifelifelse 的妙用

想象一下这样的场景:您希望只在某个特定条件下才显示一段文字、一张图片或一个功能按钮,或者根据不同的情况显示不同的内容。这时,if 逻辑标签就能派上大用场了。它允许您在模板中设定条件,只有当条件为真时,被包裹的内容才会呈现在用户面前。

if 标签的基本用法非常直观:

{% if 条件 %}
    <!-- 当条件为真时显示的内容 -->
{% endif %}

在实际应用中,您可能会遇到需要处理多种条件分支的情况。AnQiCMS模板提供了 elif(else if 的缩写)和 else 标签,让您能够构建更复杂的条件逻辑:

{% if 第一个条件 %}
    <!-- 当第一个条件为真时显示的内容 -->
{% elif 第二个条件 %}
    <!-- 当第一个条件为假,且第二个条件为真时显示的内容 -->
{% else %}
    <!-- 当所有条件都为假时显示的内容 -->
{% endif %}

常用的判断场景包括:

  • 判断变量是否存在或有值: 比如,您只有在文章有缩略图时才显示图片。

    
    {% if archive.Thumb %}
        <img src="{{ archive.Thumb }}" alt="{{ archive.Title }}" />
    {% else %}
        <img src="/static/images/default-thumb.png" alt="默认图片" />
    {% endif %}
    

  • 比较变量的值: 例如,根据文档的ID显示特定信息,或者判断某个状态值。

    {% if archive.Id == 10 %}
        <p>这是ID为10的特别推荐文章!</p>
    {% endif %}
    
    
    {% if category.ParentId == 0 %}
        <p>这是一个顶级分类。</p>
    {% endif %}
    
  • 布尔值判断: 某些变量本身就是布尔类型(True/False),可以直接用于判断。

    {% if item.IsCurrent %}
        <span class="active">当前选中</span>
    {% endif %}
    
  • 使用 innot 运算符: 检查某个值是否包含在一个集合(如数组、列表)中,或者判断某个条件是否不成立。

    {# 假设 archive.Flag 包含多个推荐属性标志,如 "h,c,f" #}
    {% if "h" in archive.Flag %}
        <span class="hot-badge">热门</span>
    {% endif %}
    
    
    {% if not archive.Thumb %}
        <p>此文章暂无缩略图。</p>
    {% endif %}
    

通过这些灵活的 if 逻辑组合,您可以精确控制页面上每一个元素的显示与否,极大地增强了模板的智能性和交互性。

循环输出:for 遍历的强大功能

当您需要展示一系列相似的内容,例如文章列表、产品列表、导航菜单项或图片轮播时,手动逐一编写HTML代码将是非常低效和难以维护的。这时,for 循环标签就成为了您的得力助手。它允许您遍历一个数据集合(如由 archiveListcategoryListnavList 等标签获取的数据),并对集合中的每一个元素应用相同的模板结构,从而动态生成大量内容。

for 标签的基本用法是:

{% for item in 集合变量 %}
    <!-- 对每一个 item 执行的操作,item 代表集合中的当前元素 -->
{% endfor %}

遍历常见数据类型:

AnQiCMS的许多标签都会返回一个数据集合,例如:

  • archiveList 返回文档列表。
  • categoryList 返回分类列表。
  • navList 返回导航菜单列表。
  • pageList 返回单页面列表。
  • tagDataList 返回某个标签下的文档列表。

您可以使用这些标签获取数据后,再通过 for 循环来展示它们。例如,显示最新的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 %}

forloop 变量:增强循环控制

for 循环内部,AnQiCMS提供了一些特殊的 forloop 变量,让您能够更好地控制循环的样式或行为:

  • forloop.Counter: 当前循环的迭代次数(从 1 开始)。
  • forloop.Revcounter: 当前循环的剩余迭代次数(从总数递减)。

这些变量在需要为列表项添加奇偶样式、显示序号或判断是否是第一个/最后一个元素时特别有用:

<ul>
    {% for item in archives %}
        <li class="{% if forloop.Counter is odd %}odd{% else %}even{% endif %}">
            {{ forloop.Counter }}. <a href="{{ item.Link }}">{{ item.Title }}</a>
            {% if forloop.Counter == 1 %} (最新) {% endif %}
        </li>
    {% endfor %}
</ul>

特殊情况处理:empty 标签

当您遍历的集合可能为空时,为了避免页面空白,可以使用 empty 标签来提供一个备选内容:

{% for item in archives %}
    <li><a href="{{ item.Link }}">{{ item.Title }}</a></li>
{% empty %}
    <li>目前还没有任何文章发布。</li>
{% endfor %}

循环控制:reversedsorted

AnQiCMS的 for 标签还支持 reversedsorted 关键字,用于改变遍历的顺序:

  • {% for item in archives reversed %}: 反向遍历集合。
  • {% for item in archives sorted %}: 对集合进行排序后遍历(适用于数字或可比较的字符串)。

cycle 标签:轮流显示样式或内容

cycle 标签允许您在每次循环迭代时,按顺序输出预定义的多个值。这在需要为列表项应用交替的CSS类,或者轮流显示不同的图标时非常方便:

<ul>
    {% for item in archives %}
        <li class="{% cycle 'row-a' 'row-b' %}">
            <a href="{{ item.Link }}">{{ item.Title }}</a>
        </li>
    {% endfor %}
</ul>

这里,列表项的 class 会在 row-arow-b 之间交替。

进阶技巧与注意事项

结合使用 iffor 掌握了 if