在安企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 过滤器在处理不同数据类型时展现了其灵活性:

  1. 字符串中的关键词查找:obj 是一个字符串时,contain 会检查该字符串是否包含指定的关键词作为其子串。

    {% set articleTitle = "安企CMS:打造企业级内容管理平台" %}
    {% if articleTitle|contain:"企业级" %}
        <p>文章标题强调了“企业级”特性。</p>
    {% else %}
        <p>文章标题未突出“企业级”特性。</p>
    {% endif %}
    
  2. 数组(slice)中的元素查找:obj 是一个数组时,contain 会检查数组中是否存在一个与指定关键词完全匹配的元素。

    {% set tags = ["CMS", "GoLang", "企业", "效率"] %}
    {% if tags|contain:"GoLang" %}
        <p>这篇文章的标签包含了“GoLang”</p>
    {% else %}
        <p>这篇文章的标签不包含“GoLang”</p>
    {% endif %}
    
  3. 映射(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 %}

containin 的区别总结:

  • 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)

  1. contain 过滤器是否区分大小写? 是的,contain 过滤器在进行字符串匹配时是区分大小写的。例如,"AnQiCMS"|contain:"cms" 将返回 False。如果您需要进行不区分大小写的判断,可以考虑先使用 lowerupper 过滤器将待检查的字符串和关键词都转换为相同的大小写(例如都转换为小写),然后再使用 contain 过滤器。 示例:{% if articleTitle|lower|contain:keyword|lower %}

  2. 如何判断一个字符串是否包含多个关键词(例如同时包含“CMS”和“GoLang”)? 您可以在 if 语句中结合使用 andor 逻辑操作符来判断是否包含多个关键词。

    • 同时包含(and): {% if articleTitle|contain:"CMS" and articleTitle|contain:"GoLang" %}
    • 包含其中任意一个(or): {% if articleTitle|contain:"CMS" or articleTitle|contain:"GoLang" %}
  3. contain 过滤器能否判断映射(map)中的键值是否包含某个关键词? 不能。contain 过滤器在用于映射(map)时,只会检查映射中是否存在特定的键名