AnQiCMS模板中如何使用`if`标签进行条件判断来控制内容显示?

AnQiCMS 模板中如何使用 if 标签进行条件判断来控制内容显示?

在构建网站模板时,我们经常需要根据不同的条件来显示或隐藏特定的内容区块。例如,只有当文章有缩略图时才显示图片,或者只有当用户登录后才显示欢迎信息。在 AnQiCMS 的模板系统中,if 标签正是实现这种条件判断的强大工具。它采用类似于 Django 模板引擎的语法,简洁而富有表现力,让内容显示逻辑变得清晰易懂。

核心概念:什么是 if 标签?

if 标签是 AnQiCMS 模板中用于进行逻辑判断的控制结构。它的主要作用是根据某个条件表达式的真假来决定是否渲染其内部的内容。当条件为真时,标签内的内容会被输出到最终的 HTML 页面;当条件为假时,这部分内容则会被忽略。这使得模板能够根据数据或上下文的变化,灵活地调整页面的显示。

一个最基本的 if 标签结构如下: {% if 条件表达式 %} <!-- 当条件为真时显示的内容 --> {% endif %}

if 标签是成对出现的,必须以 {% endif %} 结束。

基础用法:单条件判断

最常见的用法是检查某个变量是否存在或其值为“真”:

{# 假设有一个名为 `archive` 的文档对象 #}
{% if archive %}
    <p>当前页面存在文档内容。</p>
{% endif %}

{# 检查 `archive.Thumb` 是否存在,存在则显示缩略图 #}
{% if archive.Thumb %}
    <img src="{{ archive.Thumb }}" alt="{{ archive.Title }}">
{% endif %}

在 AnQiCMS 模板中,以下值会被视为“假”:falsenil、空字符串 ""、数字 0 以及空的列表或字典。任何其他值通常被视为“真”。

进阶用法:多条件判断与分支

当需要处理更复杂的逻辑时,if 标签可以配合 elif(else if 的缩写)和 else 标签使用,以构建多分支的条件判断结构。

{% if archive.Views > 1000 %}
    <p>这篇文章非常受欢迎,阅读量超过1000!</p>
{% elif archive.Views > 500 %}
    <p>这篇文章有一定热度,阅读量超过500。</p>
{% else %}
    <p>这篇文章的阅读量尚不明显。</p>
{% endif %}

在这个例子中,系统会首先检查 archive.Views 是否大于 1000。如果为真,则显示第一段文字;否则,继续检查 archive.Views 是否大于 500。如果为真,则显示第二段文字;如果以上条件都不满足,则最终显示 else 标签中的内容。

常见的判断条件类型

if 标签的条件表达式可以非常灵活,支持多种数据类型和操作符:

  1. 变量是否存在或非空: 这是最常见的判断,直接写变量名即可。如果变量 nil、空字符串、0false 或空集合,则被视为假。

    {% if system.SiteIcp %} {# 检查网站备案号是否存在 #}
        <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">{{ system.SiteIcp }}</a>
    {% endif %}
    
    
    {% if contact.Cellphone %} {# 检查联系电话是否存在 #}
        电话: {{ contact.Cellphone }}
    {% endif %}
    
  2. 数值比较: 使用 == (等于), != (不等于), > (大于), < (小于), >= (大于等于), <= (小于等于) 等操作符。

    {% if archive.Id == 10 %} {# 检查文档ID是否为10 #}
        <p>这是ID为10的特殊文档。</p>
    {% endif %}
    
    
    {% if item.Price < 100 %} {# 检查商品价格是否低于100 #}
        <span class="sale-price">{{ item.Price }}</span>
    {% endif %}
    
  3. 布尔值判断: 直接判断布尔变量或表达式的真假,可以使用 not 关键字进行取反。

    {% if item.IsCurrent %} {# 检查当前导航项是否是当前页面 #}
        <li class="active">{{ item.Title }}</li>
    {% else %}
        <li><a href="{{ item.Link }}">{{ item.Title }}</a></li>
    {% endif %}
    
    
    {% if not pages.PrevPage %} {# 如果没有上一页 #}
        <span class="disabled">上一页</span>
    {% endif %}
    
  4. 字符串/集合包含: 使用 in 操作符可以检查一个值是否存在于字符串、数组(slice)或字典(map)中。

    {% set tags = "AnQiCMS, Go, Web" %}
    {% if "Go" in tags %} {# 检查标签字符串是否包含 "Go" #}
        <p>这是一个关于 Go 语言的文档。</p>
    {% endif %}
    
    
    {% set categories = ["新闻", "博客", "产品"] %}
    {% if "产品" in categories %} {# 检查数组是否包含 "产品" #}
        <p>分类列表中有产品分类。</p>
    {% endif %}
    
  5. 逻辑组合: 使用 and (且), or (或) 操作符组合多个条件。

    {% if archive.Views > 100 and archive.CommentCount > 10 %} {# 同时满足两个条件 #}
        <p>热门且讨论度高的文章。</p>
    {% endif %}
    
    
    {% if user.IsAdmin or user.IsVip %} {# 满足任一条件 #}
        <p>欢迎尊贵的会员/管理员!</p>
    {% endif %}
    

实际应用场景举例

1. 显示/隐藏文档缩略图

在文章列表或详情页,如果文章有缩略图才显示,否则不显示。

{% archiveList archives with type="list" limit="5" %}
    {% for item in archives %}
        <div class="article-item">
            <h3><a href="{{ item.Link }}">{{ item.Title }}</a></h3>
            {% if item.Thumb %} {# 如果存在缩略图 #}
                <a href="{{ item.Link }}">
                    <img src="{{ item.Thumb }}" alt="{{ item.Title }}">
                </a>
            {% endif %}
            <p>{{ item.Description }}</p>
        </div>
    {% endfor %}
{% endarchiveList %}

2. 导航菜单当前项高亮

根据 item.IsCurrent 属性来给当前页面对应的导航项添加 active 类。

{% navList navs %}
    <ul>
        {% for item in navs %}
            <li {% if item.IsCurrent %}class="active"{% endif %}>
                <a href="{{ item.Link }}">{{ item.Title }}</a>
            </li>
        {% endfor %}
    </ul>
{% endnavList %}

3. 控制分页按钮的显示状态

在分页组件中,根据是否有上一页或下一页来禁用或隐藏相应的按钮。

”`twig {% pagination pages with show=“5” %}

<div class="pagination-controls">
    {% if pages.FirstPage.IsCurrent %}
        <span class="disabled">首页</span>
    {% else %}
        <a href="{{ pages.FirstPage.Link }}">首页</a>
    {% endif %}

    {% if pages.PrevPage %}
        <a href="{{ pages.PrevPage.Link }}">上一页</a>
    {% else %}
        <span class="disabled">上一页</span>
    {% endif %}

    {# 中间页码循环 #}
    {% for pageItem in pages.Pages %}
        {% if pageItem.IsCurrent %}
            <span class="current">{{ pageItem.Name }}</span>
        {% else %}
            <a href="{{ pageItem.Link }}">{{ pageItem.Name }}</a>
        {% endif %}
    {% endfor %}

    {% if pages.NextPage %}
        <