在安企CMS的模板世界里,我们常常需要根据不同的条件展示内容,或者重复显示一系列数据,这时候,iffor 这两个逻辑标签就显得尤为重要。它们是模板中构建动态内容、实现灵活布局的基石,能够帮助我们精准控制网页上每一块信息的呈现。

AnQiCMS 模板中的条件逻辑:if 标签

if 标签在模板中的作用就像一个智能的开关,它允许我们根据特定条件来决定是否显示某部分内容。这在很多场景下都非常实用,比如显示不同的用户欢迎语、根据文章是否有缩略图来决定是否加载图片,或者根据产品状态显示“有货”或“缺货”。

它的基本用法非常直观:以 {% if 条件 %} 开始,以 {% endif %} 结束。如果条件判断为真(True),标签内部的内容就会被渲染并显示出来;如果条件为假(False),这部分内容就会被忽略。

当然,现实中的需求往往不止“是”或“否”那么简单。if 标签也支持 elif(else if 的缩写)和 else 子句,让我们能够处理多个条件分支。

例如,我们可能需要根据用户权限等级显示不同的导航链接:

{% if user.IsAdmin %}
    <a href="/admin/dashboard">管理后台</a>
{% elif user.IsVip %}
    <a href="/user/vip-content">VIP专属内容</a>
{% else %}
    <a href="/user/login">登录/注册</a>
{% endif %}

在判断条件时,我们可以使用多种表达式:

  • 变量是否存在或非空: {% if variable %} 会判断 variable 是否为 nil、空字符串、零值或 false
  • 比较运算: {% if item.Views > 100 %}(大于)、{% if archive.Id == 1 %}(等于)、{% if price <= 50 %}(小于等于)等等。
  • 逻辑运算: 使用 andornot 来组合或否定条件,例如 {% if category.HasChildren and category.IsActive %}
  • 成员检查: {% if "关键词" in archive.Tags %} 可以检查某个值是否包含在一个字符串或集合中。

通过这些灵活的条件判断,我们可以让模板根据数据的实时状态,呈现出千变万化的内容组合,极大地提升了网站的交互性和个性化。

灵活的数据遍历:for 循环标签

for 标签则是处理数据集的利器,它允许我们逐一遍历列表、数组或其他可迭代对象,并为每个元素生成重复的内容结构。这在显示文章列表、产品分类、导航菜单或评论列表时都是必不可少的。

for 循环的基本结构是 {% for item in collection %},并以 {% endfor %} 结束。在循环体内部,item 变量代表了当前正在处理的集合元素。

比如,要展示一个文章列表:

{% archiveList archives with type="list" limit="5" %}
    {% for article in archives %}
        <div class="article-item">
            <h2><a href="{{ article.Link }}">{{ article.Title }}</a></h2>
            <p>{{ article.Description }}</p>
            <span>发布日期:{{ stampToDate(article.CreatedTime, "2006-01-02") }}</span>
        </div>
    {% endfor %}
{% endarchiveList %}

for 循环中,有一些内置的特殊变量和功能可以帮助我们更好地控制循环:

  • forloop.Counterforloop.Revcounter forloop.Counter 返回当前循环的从1开始的索引(如1, 2, 3…),而 forloop.Revcounter 则返回从总数倒数的索引(如总数是5,则返回5, 4, 3…)。这对于为列表项添加奇偶样式或特殊标记(如“热门推荐”仅显示给前几项)非常有用。

  • empty 子句:for 循环遍历的集合为空时,{% empty %} 块内的内容就会被执行。这比先用 if 判断集合是否为空再写循环更简洁:

    {% archiveList articles with type="list" categoryId="999" %} {# 假设这个分类没有文章 #}
        {% for article in articles %}
            <div class="article-item">...</div>
        {% empty %}
            <p>抱歉,该分类下暂时没有文章。</p>
        {% endfor %}
    {% endarchiveList %}
    
  • 修饰符: for 标签还可以配合 reversedsorted 修饰符,来控制遍历的顺序。reversed 让集合倒序遍历,sorted 则尝试对集合进行排序后再遍历。

    {% for item in categories reversed %}
        {# 倒序显示分类 #}
    {% endfor %}
    {% for number in numberList sorted %}
        {# 对数字列表排序后显示 #}
    {% endfor %}
    
  • cycle 标签: cycle 标签可以在每次循环中按顺序输出预设的几个值,常用于为交替的列表项应用不同的CSS类,实现斑马线效果。

    {% for product in products %}
        <div class="product-item {% cycle 'odd' 'even' %}">
            ...
        </div>
    {% endfor %}
    

结合实际场景,提升模板表现力

iffor 标签的真正威力在于它们与其他 AnQiCMS 标签的结合使用。例如,我们可以先用 archiveList 获取文章数据,再用 for 循环遍历这些文章,并在循环内部使用 if 标签判断每篇文章的特定属性,如是否有缩略图 ({% if item.Thumb %})、是否是置顶文章 ({% if "h" in item.Flag %}),从而决定如何展示内容。

在分页场景中,archiveList 配合 type="page" 返回分页数据,然后 for 循环用于遍历当前页的数据项,而 pagination 标签则负责渲染分页导航,其中也可能会用到 if 来判断当前页和总页数。

此外,当我们在模板中使用 iffor 标签时,可能会注意到生成的 HTML 中多了不少空行。AnQiCMS 提供了一个巧妙的解决方案:在逻辑标签的开始或结束符中添加破折号 -,例如 {%- if 条件 %}{% endfor -%}。这能够移除标签本身及其两侧可能产生的空白字符(包括换行符),让生成的 HTML 更加紧凑和干净。

通过熟练掌握 iffor 标签及其各种高级用法,我们就能在 AnQiCMS 中构建出高度动态、响应灵活且内容丰富的网站页面,满足各种复杂的内容运营需求。


常见问题 (FAQ)

  1. 如何在 iffor 标签中使用过滤器(Filter)来处理数据? 您可以在 if 语句的条件部分或 for 循环内部的变量输出时使用过滤器。例如,{% if article.Title|length > 10 %} 判断文章标题长度是否大于10,或者 {{ article.Description|truncatechars:50 }}for 循环中截断文章描述。过滤器(Filter)的语法通常是 {{ 变量|过滤器名:参数 }}

  2. 为什么我的模板在使用了 iffor 标签后,HTML 输出会有很多空行? 这是因为逻辑标签本身(如 {% if %}{% endfor %})会占用模板文件中的一行,并在渲染时产生换行。为了生成更紧凑的 HTML 输出,您可以在逻辑标签的开始或结束符内部添加一个破折号 -。例如,将 {% if condition %} 改为 {%- if condition %},或者将 {% endfor %} 改为 {% endfor -%}。这会移除标签本身及其两侧的空白字符,包括换行符。

  3. 我如何判断一个变量是空值或者不存在? 在 `