`if` 标签在 AnQiCMS 模板中如何判断变量是否为空、是否存在或为特定值?

在 AnQiCMS 模板开发中,if 标签是构建动态页面内容的核心工具。它允许我们根据不同的条件,灵活地控制内容的显示,从而为用户提供更智能、更个性化的浏览体验。无论您是想判断某个数据是否存在、是否为空,还是希望根据特定值来调整布局,if 标签都能帮您轻松实现。

AnQiCMS 的模板引擎语法与 Django 模板引擎非常相似,因此,熟悉这类语法的开发者会感到非常亲切。if 标签的基本结构直观易懂,包括 {% if 条件 %}{% elif 其他条件 %}(可选)、{% else %}(可选)和 {% endif %}。通过这套结构,我们可以清晰地定义内容的逻辑流程。

判断变量是否存在或非空

在实际应用中,我们最常见的需求之一就是判断某个变量是否有值,或者它是否为空。AnQiCMS 的 if 标签在判断变量时,遵循一种“真值”的概念。简单来说,对于大多数变量,如果它们是:

  • 非空的字符串(如 "Hello World"
  • 非零的数字(如 103.14
  • 非空的列表、数组或映射
  • nil 的对象

它们都会被 if 标签视为“真”(True)。反之,空字符串 ""、数字 0、空列表/数组/映射以及 nil 值,则会被视为“假”(False)。

因此,要判断一个变量 archive.Title 是否存在且有内容,最简洁的方式就是直接使用:

{% if archive.Title %}
    <h1>{{ archive.Title }}</h1>
{% else %}
    <h1>暂无标题</h1>
{% endif %}

如果我们需要明确地判断一个变量是否 为空字符串,也可以使用相等运算符:

{% if archive.Description == "" %}
    <p>该文章暂无简介。</p>
{% else %}
    <p>{{ archive.Description }}</p>
{% endif %}

对于列表或数组类型的变量,例如 archive.Images(可能包含多张图片),判断它是否包含图片,通常会结合 length 过滤器来获取其长度:

{% if archive.Images|length > 0 %}
    <div class="gallery">
        {% for img in archive.Images %}
            <img src="{{ img }}" alt="图片">
        {% endfor %}
    </div>
{% else %}
    <p>暂无相关图片。</p>
{% endif %}

当然,您也可以使用 not 关键字来反向判断,例如 {% if not archive.Thumb %} 用于判断缩略图字段是否为空或不存在。

判断变量是否为特定值

除了判断存在性或非空,if 标签更强大的地方在于能够根据变量的特定值来驱动内容显示。这包括数值比较、字符串匹配以及布尔值判断。

数值判断: 我们可以使用常见的比较运算符:==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。

例如,根据文章的浏览量 archive.Views 来显示不同的推荐等级:

{% if archive.Views > 1000 %}
    <span class="hot-badge">热门文章</span>
{% elif archive.Views > 500 %}
    <span class="popular-badge">受欢迎</span>
{% else %}
    <span class="new-badge">普通阅读</span>
{% endif %}

字符串判断: 当变量是字符串类型时,可以直接与特定字符串进行比较。比如,AnQiCMS 模板可以通过 system 标签获取网站的当前语言设置 system.Language,我们可以据此显示不同的提示信息:

{% if system.Language == "zh-cn" %}
    <p>欢迎访问我们的中文网站!</p>
{% elif system.Language == "en-us" %}
    <p>Welcome to our English website!</p>
{% else %}
    <p>Hello World!</p>
{% endif %}

布尔值判断: 如果变量本身就是一个布尔值(truefalse),判断会更加直接。例如,某个文章的 Flag 属性可能包含布尔判断(尽管文档中 Flag 属性是字符串或字符,这里我们假设自定义字段 IsFeatured 是布尔值):

{% if archive.IsFeatured %}
    <div class="featured-banner">特别推荐</div>
{% endif %}

在集合中判断元素是否存在 (in 操作符)

AnQiCMS 模板也提供了 in 操作符,方便我们检查一个值是否存在于某个集合(如列表、数组或映射的键)中。这在处理标签、权限或分类等场景时非常实用。

例如,如果一个文档可能有多个 Tag,假设我们想判断文档是否包含某个特定标签名称:

{# 假设我们有一个名为 'tags' 的列表,其中包含当前文章的所有标签名 #}
{% set tags = archive.Tags|split:"," %} {# 假设 Tags 字段是逗号分隔的字符串,先用 split 过滤器转换成列表 #}
{% if "AnQiCMS" in tags %}
    <span class="tag-highlight">AnQiCMS 相关</span>
{% endif %}

或者,如果某个元素的属性值是一个列表,要判断某个标识是否在列表中:

{% if 'h' in archive.Flag %} {# 假设 archive.Flag 是一个包含多个字母的字符串,可以视为集合判断 #}
    <span class="flag-h">头条</span>
{% endif %}

结合实际场景运用

掌握了这些基本的判断方法,我们就可以在 AnQiCMS 模板中实现各种复杂的逻辑。

例如,在文章详情页,我们通常会显示“上一篇”和“下一篇”的链接。但如果当前文章已经是第一篇或最后一篇,对应的链接就不应该显示。这时,if 标签就能派上用场:

<nav class="pagination-nav">
    {% prevArchive prev %}
        {% if prev %}
            <a href="{{ prev.Link }}">上一篇:{{ prev.Title }}</a>
        {% else %}
            <span>没有上一篇了</span>
        {% endif %}
    {% endprevArchive %}

    {% nextArchive next %}
        {% if next %}
            <a href="{{ next.Link }}">下一篇:{{ next.Title }}</a>
        {% else %}
            <span>没有下一篇了</span>
        {% endif %}
    {% endnextArchive %}
</nav>

另一个常见的例子是在首页显示不同的内容区块,比如只在某个分类有内容时才展示该分类下的文章列表:

”`twig {% categoryList categories with moduleId=“1” parentId=“0” limit=“4” %}

{% for category in categories %}
    {% if category.ArchiveCount > 0 %} {# 判断分类下是否有文章 #}
        <section class="category-section">
            <h2><a href="{{ category.Link }}">{{ category.Title }}</a></h2>
            <ul class="article-list">
                {%