如何在 AnQiCMS 模板中利用 `not` 操作符来反转条件判断?

AnQiCMS 的模板系统以其灵活和高效著称,它借鉴了 Django 模板引擎的语法风格,让内容呈现和逻辑控制变得直观。在模板开发中,我们经常需要根据不同的条件来显示或隐藏内容,这时,掌握条件判断的各种用法就显得尤为重要。今天,我们就来聊聊如何在 AnQiCMS 模板中巧妙运用 not 操作符来反转条件判断,让你的页面逻辑更加清晰和灵活。

什么是 not 操作符?

在任何编程语言中,not 操作符都扮演着“非”的角色,它的作用非常简单:将一个布尔表达式(真或假)的结果进行反转。如果一个条件原本为真(True),经过 not 处理后就会变成假(False);反之,如果条件为假,就会变成真。

在 AnQiCMS 模板中,not 主要用于 {% if %} 标签内部,帮助我们构建反向的逻辑判断。这在很多场景下能让代码意图更明确,或者解决一些直接判断较复杂的逻辑问题。

基本用法

not 操作符的基本语法非常直观:

{% if not 你的条件 %}
    <!-- 当“你的条件”为假时,这里的内容会显示 -->
{% endif %}

或者,如果你想在条件为真时执行另一段代码,可以结合 else

{% if not 你的条件 %}
    <!-- 当“你的条件”为假时,这里的内容会显示 -->
{% else %}
    <!-- 当“你的条件”为真时,这里的内容会显示 -->
{% endif %}

接下来,我们通过几个 AnQiCMS 模板中的实际场景来具体看看 not 能带来哪些便利。

实用场景与示例

1. 显示备用内容或占位符

设想一下,你的文章可能并非都有缩略图。当 archive.Thumb (文档缩略图)不存在或为空时,你希望显示一张默认图片作为占位符,而不是让页面留白。

<a href="{{ archive.Link }}">
    {% if not archive.Thumb %}
        <img src="/public/static/images/default-thumbnail.webp" alt="默认缩略图">
    {% else %}
        <img src="{{ archive.Thumb }}" alt="{{ archive.Title }}">
    {% endif %}
    <h3>{{ archive.Title }}</h3>
</a>

在这里,{% if not archive.Thumb %} 会检查 archive.Thumb 是否有值。如果没有(即为空或不存在),条件为真,就会显示默认缩略图。如果有,条件为假,则显示文章本身的缩略图。

2. 处理非活动状态或排除特定项

在导航菜单或列表展示中,你可能希望对“非当前”的页面或某些特定项进行不同的处理。

例如,在一个分类列表循环中,你希望突出显示所有 是当前选中分类的链接:

{% categoryList categories with moduleId="1" parentId="0" %}
    <ul>
        {% for item in categories %}
            <li {% if not item.IsCurrent %}class="inactive-category"{% endif %}>
                <a href="{{ item.Link }}">{{ item.Title }}</a>
            </li>
        {% endfor %}
    </ul>
{% endcategoryList %}

这里,item.IsCurrent 是一个布尔值,表示当前循环的分类是否是用户正在浏览的分类。{% if not item.IsCurrent %} 就判断了“如果这不是当前分类”,然后给它添加一个 inactive-category 的 CSS 类。

再比如,你有一个文档列表,但想排除掉 ID 为 10 的那篇特殊文档:

{% archiveList archives with type="list" limit="10" %}
    <ul>
        {% for item in archives %}
            {% if not item.Id == 10 %}
                <li><a href="{{ item.Link }}">{{ item.Title }}</a></li>
            {% endif %}
        {% endfor %}
    </ul>
{% endarchiveList %}

通过 {% if not item.Id == 10 %},我们只渲染那些 ID 不等于 10 的文章项。

3. 网站状态的精细控制

AnQiCMS 支持网站闭站功能,当网站处于闭站状态时,通常会显示一个闭站提示。你可以利用 not 来控制何时显示正常内容:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>{% tdk with name="Title" siteName=true %}</title>
</head>
<body>
    {% if system.SiteCloseTips %}
        <!-- 如果网站处于闭站状态,显示闭站提示 -->
        <div class="site-closed-banner">
            <p>{{ system.SiteCloseTips }}</p>
        </div>
    {% else %}
        <!-- 如果网站未闭站,则显示正常网站内容 -->
        <header>...</header>
        <main>
            <h1>欢迎访问我们的网站!</h1>
            <!-- 其他正常页面内容 -->
        </main>
        <footer>...</footer>
    {% endif %}
</body>
</html>

虽然这里我们使用了 {% if system.SiteCloseTips %} 来直接判断闭站提示是否存在,但另一种思路是,如果 system.SiteCloseTips 变量不存在(即网站未闭站),就显示正常内容,这也可以通过 not 来实现:

{% if not system.SiteCloseTips %}
    <!-- 网站未闭站,显示正常内容 -->
    <header>...</header>
    <main>...</main>
    <footer>...</footer>
{% else %}
    <!-- 网站已闭站,显示闭站提示 -->
    <div class="site-closed-banner">
        <p>{{ system.SiteCloseTips }}</p>
    </div>
{% endif %}

这种写法也同样有效,可以根据个人偏好或团队规范选择。

结合 and, or 运算符

not 操作符也可以与其他逻辑运算符 andor 结合使用,构建更复杂的条件判断。例如:

{% if not (item.IsFeatured and item.Category == "News") %}
    <!-- 如果文章不是“特色”且“新闻”类别,则显示此内容 -->
{% endif %}

这里 not (item.IsFeatured and item.Category == "News") 意味着:如果文章 是特色文章 属于新闻类别,条件就会成立。

小贴士:减少模板空行

在 AnQiCMS 模板中,像 {% if %} 这样的逻辑标签有时会在渲染时产生多余的空行,影响 HTML 结构的美观性。为了避免这种情况,你可以在标签的开始和/或结束处使用 - 符号,如下所示:

{%- if not archive.Thumb %}
    <img src="/public/static/images/default-thumbnail.webp" alt="默认缩略图">
{%- else %}
    <img src="{{ archive.Thumb }}" alt="{{ archive.Title }}">
{%- endif %}

{%- if{%- else 之后以及 {%- endif %} 之前添加 -,可以有效地移除这些标签所在的行及其旁边的空白字符,让最终输出的 HTML 更加紧凑。

总结

not 操作符是 AnQiCMS 模板中一个简单却强大的工具,它能帮助我们以反向思维处理条件判断,使得模板逻辑更加灵活和易读。无论是显示备用内容、排除特定项,还是控制页面元素的可见性,not 都能发挥其独特的作用。掌握好它的运用,将