在安企CMS的模板开发中,我们经常需要根据内容的特定条件来动态展示或隐藏某些元素,或者执行不同的逻辑分支。直接在模板中输出某个判断的结果固然直观,但在需要根据这个判断进行更复杂的逻辑分支时,直接输出就显得力不从心了。这时,将判断结果存储到一个变量中,就成为了实现精细化控制的关键。

安企CMS提供了功能强大的contain过滤器,它可以帮助我们判断一个字符串、数组或键值对中是否包含特定的内容。这个过滤器执行判断后,会返回一个布尔值(TrueFalse),完美地契合了后续复杂逻辑判断的需求。

理解contain过滤器

首先,我们来了解一下contain过滤器的基本用法。contain过滤器的作用是检查一个目标对象(可以是字符串、数组、键值对或结构体)中是否包含指定的“关键词”。它的基本语法是{{obj|contain:关键词}}

例如,如果您想检查一段文字中是否含有“AnQiCMS”这个词:

{{"欢迎使用安企CMS(AnQiCMS)内容管理系统"|contain:"AnQiCMS"}}

这段代码会直接输出True,因为它在字符串中找到了“AnQiCMS”。

contain判断结果存储到变量

当我们需要基于contain的判断结果进一步操作时,仅仅直接输出TrueFalse是不足够的。这时,安企CMS模板引擎提供的set标签就派上用场了。set标签允许我们在模板中声明并赋值一个变量,我们可以将contain过滤器的判断结果赋值给这个变量。

语法示例如下:

{% set 变量名 = 表达式 %}

结合contain过滤器,您可以这样将判断结果存储到变量中:

{% set content_string = "安企CMS是一款基于Go语言开发的企业级内容管理系统。" %}
{% set has_go_keyword = content_string|contain:"Go语言" %}

现在,has_go_keyword这个变量就存储了一个布尔值。如果content_string中包含“Go语言”,那么has_go_keyword的值就是True;否则,就是False

利用变量进行复杂逻辑判断

一旦contain的判断结果被存储到变量中,我们就可以结合安企CMS模板的if逻辑判断标签,实现更精细化的条件控制。

延续上面的例子:

{% set content_string = "安企CMS是一款基于Go语言开发的企业级内容管理系统。" %}
{% set has_go_keyword = content_string|contain:"Go语言" %}

{% if has_go_keyword %}
    <p>这段内容提到了Go语言,可能是一篇技术类文章。</p>
{% else %}
    <p>这段内容没有提及Go语言,可能是通用性文章。</p>
{% endif %}

这段代码会根据has_go_keyword的值,选择性地显示不同的段落。如果内容中包含“Go语言”,第一段文字会显示;否则,会显示第二段文字。

这只是一个简单的if-else示例,您可以根据实际需求,构建更复杂的if-elif-else结构,或者将这个变量与其他条件进行组合判断。

实用场景拓展

contain结果存储到变量的能力,在多种场景下都能显著提升模板的灵活性和可维护性:

  1. 动态展示内容模块: 假设您的文章详情页需要根据文章内容是否包含特定关键词(如“产品评测”、“新品发布”)来显示不同的侧边栏广告或推荐内容。您可以先用contain判断,然后将结果存入变量,再用if来控制模块的显示。

    {% set article_title = archive.Title %} {# 假设 archive.Title 是当前文章标题 #}
    {% set is_review_article = article_title|contain:"评测" %}
    
    
    {% if is_review_article %}
        <div class="sidebar-promo">
            <h4>最新评测产品推荐</h4>
            {# ... 显示评测相关的推荐内容 ... #}
        </div>
    {% endif %}
    
  2. 筛选列表数据: 在自定义列表(例如archiveList)循环中,您可能希望对循环中的每个项目进行额外判断,例如只展示标题中不含“已过期”的文档。

    {% archiveList archives with type="list" limit="10" %}
        {% for item in archives %}
            {% set is_expired = item.Title|contain:"已过期" %}
            {% if not is_expired %}
                <li><a href="{{item.Link}}">{{item.Title}}</a></li>
            {% endif %}
        {% endfor %}
    {% endarchiveList %}
    
  3. 检查自定义字段的存在性或特定值: 安企CMS支持自定义内容模型字段。有时,您可能需要判断某个自定义字段(例如product_features)是否存在,或者其值是否包含某个特定属性。contain过滤器可以用于检查键值对(map)或结构体(struct)中是否存在某个键名。

    {% archiveParams custom_params with id=archive.Id sorted=false %} {# 获取文章的自定义参数 #}
    {% set has_features_field = custom_params|contain:"product_features" %}
    
    
    {% if has_features_field %}
        <p>产品特性:{{custom_params.product_features.Value}}</p>
    {% else %}
        <p>该产品未配置特性信息。</p>
    {% endif %}
    

    这里,custom_params|contain:"product_features"判断的是custom_params这个map中是否存在名为product_features的键。

通过将contain过滤器的判断结果存储到变量中,我们不仅能让模板逻辑更加清晰,也为实现安企CMS网站的动态、智能化内容展示提供了强大的工具。这种方法避免了重复的判断逻辑,提高了模板的复用性和可读性,让您的内容运营策略得以更灵活地实现。


常见问题 (FAQ)

  1. contain过滤器是否区分大小写? 是的,根据Go语言的默认字符串处理机制,contain过滤器通常是区分大小写的。例如,"AnQiCMS"|contain:"cms"会返回False。如果需要进行不区分大小写的判断,您可能需要在进行contain判断之前,先将目标字符串和关键词都转换为统一的大小写(例如都转为小写),再进行比较。

  2. 除了set标签,还有其他方式可以将contain的结果存储到变量中吗? 安企CMS模板引擎也支持with标签来定义变量,通常用于为include标签传递局部变量,或者在某个代码块内声明临时变量。虽然with标签也可以用来存储contain的结果,但set标签在模板中进行全局或局部变量赋值时通常更为简洁和常用。例如:{% with my_result = "string"|contain:"keyword" %}...{% endwith %}

  3. contain过滤器可以用来判断数值或布尔值吗? contain过滤器主要用于判断字符串中是否包含子字符串,或者在数组/切片、键值对/结构体中是否存在特定元素或键名。它不会直接用来判断变量本身的类型是否为数值或布尔值,也不会直接用于数值或布尔值的比较。如果您需要判断数值是否在某个范围内,或者布尔值为真假,应直接使用if标签配合比较运算符(如==><)来进行。例如:{% if archive.Views > 1000 %}