在安企CMS的模板开发中,我们经常需要根据内容的特定属性或关键词来动态调整页面的显示。例如,判断一篇文章的标题是否包含某个词语,一个产品分类是否在某个列表中,或者某个配置项是否存在。安企CMS强大的模板引擎提供了多种过滤器和操作符,可以帮助我们轻松实现这些判断,并获得清晰的布尔(True/False)结果。
让我们深入了解如何在安企CMS中实现这些灵活的判断。
核心功能:contain 过滤器
当您需要判断一段文字字符串、一个数组(或Go语言中的slice)的元素,或者一个映射(map)/结构体(struct)的键名是否包含某个特定的关键词时,contain 过滤器是您的首选工具。它会返回一个布尔值,直接告诉您结果是 True(包含)还是 False(不包含)。
基本用法
contain 过滤器的使用方式非常直观:
{{ obj|contain:"关键词" }}
其中 obj 是您要检查的变量,而 "关键词" 则是您希望查找的特定内容。
在条件判断中的应用
通常,我们会将 contain 过滤器的结果用于 if 逻辑判断标签中,从而控制模板的显示逻辑。
{% if "欢迎使用安企CMS(AnQiCMS)"|contain:"CMS" %}
<p>这段文字中包含了"CMS"!</p>
{% else %}
<p>这段文字中没有找到"CMS"。</p>
{% endif %}
您也可以先将 contain 过滤器的结果存储到一个变量中,再进行后续的判断,这有助于提升代码的可读性和复用性:
{% set sourceText = "安企CMS,高效内容管理" %}
{% set isFound = sourceText|contain:"内容管理" %}
{% if isFound %}
<p>内容中提到了“内容管理”这个关键词。</p>
{% else %}
<p>内容中未提及“内容管理”。</p>
{% endif %}
针对不同数据类型的判断
contain 过滤器在处理不同数据类型时展现了其灵活性:
字符串中的关键词查找: 当
obj是一个字符串时,contain会检查该字符串是否包含指定的关键词作为其子串。{% set articleTitle = "安企CMS:打造企业级内容管理平台" %} {% if articleTitle|contain:"企业级" %} <p>文章标题强调了“企业级”特性。</p> {% else %} <p>文章标题未突出“企业级”特性。</p> {% endif %}数组(slice)中的元素查找: 当
obj是一个数组时,contain会检查数组中是否存在一个与指定关键词完全匹配的元素。{% set tags = ["CMS", "GoLang", "企业", "效率"] %} {% if tags|contain:"GoLang" %} <p>这篇文章的标签包含了“GoLang”</p> {% else %} <p>这篇文章的标签不包含“GoLang”</p> {% endif %}映射(map)或结构体(struct)的键名查找: 当
obj是一个映射或结构体时,contain会判断其中是否存在指定的键名(或字段名)。需要注意的是,它判断的是键名,而不是键值。{# 假设有一个名为 `contactInfo` 的映射变量 #} {% set contactInfo = {"email": "[email protected]", "phone": "123456789"} %} {% if contactInfo|contain:"phone" %} <p>联系方式中提供了电话号码。</p> {% else %} <p>联系方式中未提供电话号码。</p> {% endif %}
相关但略有不同的用途:in 操作符
除了 contain 过滤器,安企CMS的模板引擎还支持 in 操作符,它在某些场景下与 contain 类似,但侧重于精确匹配元素的存在。in 操作符主要用于判断一个元素是否精确存在于一个数组(slice)或映射(map)的键中。
{# 判断数字 5 是否存在于数字列表 simple.intmap 中 #}
{% if 5 in simple.intmap %}
<p>数字 5 存在于列表中。</p>
{% else %}
<p>数字 5 不存在于列表中。</p>
{% endif %}
{# 判断字符串 "Hello" 是否存在于字符串列表 simple.misc_list 中 #}
{% if "Hello" in simple.misc_list %}
<p>“Hello”存在于列表中。</p>
{% else %}
<p>“Hello”不存在于列表中。</p>
{% endif %}
contain 与 in 的区别总结:
contain过滤器:- 用于字符串时,进行子串查找。
- 用于数组时,进行精确元素匹配。
- 用于映射/结构体时,检查键名(字段名)是否存在。
in操作符:- 用于数组时,进行精确元素匹配。
- 用于映射时,检查精确键名是否存在。
- 不能直接用于字符串的子串查找。
简单来说,如果您需要对字符串进行子串模糊匹配,或者判断映射的键名是否存在,contain 是更通用的选择。如果您只需检查数组中是否存在某个精确的元素,或者映射中是否存在某个精确的键,in 操作符则更为简洁。
其他辅助判断方式
除了上述直接返回布尔结果的方法,还有一些过滤器通过返回特定数值来间接表达”包含”或”不包含”的状态:
index过滤器: 用于查找关键词在字符串或数组中首次出现的位置。如果返回-1,则表示未找到。{% if "安企CMS"|index:"CMS" != -1 %} <p>“CMS”在字符串中出现。</p> {% endif %}count过滤器: 用于计算关键词在字符串或数组中出现的次数。如果返回0,则表示未找到。
这些辅助方法在需要获取更多信息(如位置、次数)的同时,也能通过简单的比较操作实现布尔判断。{% if "安企CMS"|count:"CMS" > 0 %} <p>“CMS”在字符串中至少出现一次。</p> {% endif %}
通过灵活运用 contain 过滤器和 in 操作符,结合 if 逻辑标签,您可以轻松地在安企CMS模板中实现各种复杂的条件判断,让您的网站内容展示更加动态和智能化。
常见问题 (FAQ)
contain过滤器是否区分大小写? 是的,contain过滤器在进行字符串匹配时是区分大小写的。例如,"AnQiCMS"|contain:"cms"将返回False。如果您需要进行不区分大小写的判断,可以考虑先使用lower或upper过滤器将待检查的字符串和关键词都转换为相同的大小写(例如都转换为小写),然后再使用contain过滤器。 示例:{% if articleTitle|lower|contain:keyword|lower %}如何判断一个字符串是否包含多个关键词(例如同时包含“CMS”和“GoLang”)? 您可以在
if语句中结合使用and或or逻辑操作符来判断是否包含多个关键词。- 同时包含(and):
{% if articleTitle|contain:"CMS" and articleTitle|contain:"GoLang" %} - 包含其中任意一个(or):
{% if articleTitle|contain:"CMS" or articleTitle|contain:"GoLang" %}
- 同时包含(and):
contain过滤器能否判断映射(map)中的键值是否包含某个关键词? 不能。contain过滤器在用于映射(map)时,只会检查映射中是否存在特定的键名,