在开发 AnQiCMS 网站模板时,我们经常需要根据某些条件动态地显示或隐藏内容。一个常见的需求是判断某个元素是否存在于一个数据集合中,例如检查用户是否拥有特定的角色,或者当前文章是否带有某个标签。AnQiCMS 的模板引擎提供了一个简洁而强大的 in 操作符,能够轻松解决这类问题。

核心功能解析:in 操作符是什么?

AnQiCMS 模板引擎的设计灵感来源于 Django 模板,它提供了强大而直观的语法来处理各种数据逻辑。其中,in 操作符就是这样一种非常实用的工具。它主要用于判断一个特定的元素是否存在于一个集合(如数组、切片、映射 map)中,或者判断一个子字符串是否存在于另一个字符串中。

如果判断结果为存在,条件判断就为真(true);否则为假(false)。这使得在 if 语句中进行条件性内容渲染变得非常高效和直观。

使用场景与示例:动手实践 in

in 操作符的基本语法非常简单明了:{% if 元素 in 集合 %}。接下来,我们将通过几个具体的例子,看看它在不同类型的数据集合中是如何工作的。

场景一:判断元素是否存在于数组或切片中

假设您有一个包含用户角色的数组 activeUserRoles,您需要根据用户是否是“管理员”来显示不同的内容。

{% set activeUserRoles = ["admin", "editor", "viewer"] %}

{% if "admin" in activeUserRoles %}
    <p>您好,管理员!欢迎来到管理面板。</p>
{% endif %}

{% if "moderator" in activeUserRoles %}
    <p>您拥有版主权限。</p>
{% else %}
    <p>您不具备版主权限。</p>
{% endif %}

在实际的 AnQiCMS 应用中,您可能从 tagListarchiveList 等标签获取到一个列表。例如,文档的 Flag 属性可能是一个包含多个推荐属性的字符串,如 "h,c,f"(分别代表头条、推荐、幻灯)。您可以利用 in 操作符判断文档是否包含某个特定的 Flag

{# 假设 archive.Flag 的值为 "h,c,f" #}
{% if "h" in archive.Flag %}
    <span class="badge badge-primary">头条</span>
{% endif %}
{% if "c" in archive.Flag %}
    <span class="badge badge-success">推荐</span>
{% endif %}
{% if "j" in archive.Flag %}
    <span class="badge badge-info">跳转</span>
{% endif %}

这里 archive.Flag 虽然是字符串,但 in 操作符可以有效地判断其中是否包含特定的字符或子字符串,非常灵活。

场景二:判断键是否存在于 Map (字典/集合) 中

在 AnQiCMS 中,您可能定义了一些自定义字段,或者从后台获取到一些以键值对形式存储的配置。如果您需要判断某个特定的键(key)是否存在于一个 map 中,in 操作符同样适用。

例如,假设 userPermissions 是一个包含用户具体权限的 map

{% set userPermissions = {"create_article": true, "delete_comment": false, "view_dashboard": true} %}

{% if "create_article" in userPermissions %}
    <button class="btn btn-primary">发表新文章</button>
{% endif %}

{% if "edit_settings" in userPermissions %}
    <p>您可以编辑网站设置。</p>
{% else %}
    <p>您没有编辑网站设置的权限。</p>
{% endif %}

需要注意的是,in 操作符在 map 中主要用于判断 是否存在,而不是值。

场景三:判断子字符串是否存在于另一个字符串中

除了数组和 mapin 操作符也可以直接用于字符串之间的包含判断。这在处理文本内容、关键词或者 URL 时特别有用。

{% set documentContent = "AnQiCMS 是一个基于 Go 语言开发的企业级内容管理系统,致力于提供高效、可定制、易扩展的内容管理解决方案。" %}

{% if "Go 语言" in documentContent %}
    <p>本文内容包含了关于 Go 语言的讨论。</p>
{% endif %}

{% if "数据库优化" in documentContent %}
    <p>本文涉及数据库优化相关话题。</p>
{% else %}
    <p>本文未提及数据库优化。</p>
{% endif %}

结合 not 操作符:反向判断

有时候,我们需要判断一个元素是否“不”存在于某个集合中。这时,可以结合 not 操作符来实现反向判断。

{% set blacklistedIPs = ["192.168.1.1", "10.0.0.5", "172.16.0.1"] %}
{% set currentUserIP = "203.0.113.42" %}

{% if currentUserIP not in blacklistedIPs %}
    <p>您的IP地址未被列入黑名单,可以正常访问本站。</p>
{% endif %}

另一种等效的写法是 {% if not (currentUserIP in blacklistedIPs) %},但通常 not in 这种形式更具可读性