在安企CMS的模板开发中,我们经常需要根据内容的特定条件来动态展示或隐藏某些元素,或者执行不同的逻辑分支。直接在模板中输出某个判断的结果固然直观,但在需要根据这个判断进行更复杂的逻辑分支时,直接输出就显得力不从心了。这时,将判断结果存储到一个变量中,就成为了实现精细化控制的关键。
安企CMS提供了功能强大的contain过滤器,它可以帮助我们判断一个字符串、数组或键值对中是否包含特定的内容。这个过滤器执行判断后,会返回一个布尔值(True或False),完美地契合了后续复杂逻辑判断的需求。
理解contain过滤器
首先,我们来了解一下contain过滤器的基本用法。contain过滤器的作用是检查一个目标对象(可以是字符串、数组、键值对或结构体)中是否包含指定的“关键词”。它的基本语法是{{obj|contain:关键词}}。
例如,如果您想检查一段文字中是否含有“AnQiCMS”这个词:
{{"欢迎使用安企CMS(AnQiCMS)内容管理系统"|contain:"AnQiCMS"}}
这段代码会直接输出True,因为它在字符串中找到了“AnQiCMS”。
将contain判断结果存储到变量
当我们需要基于contain的判断结果进一步操作时,仅仅直接输出True或False是不足够的。这时,安企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结果存储到变量的能力,在多种场景下都能显著提升模板的灵活性和可维护性:
动态展示内容模块: 假设您的文章详情页需要根据文章内容是否包含特定关键词(如“产品评测”、“新品发布”)来显示不同的侧边栏广告或推荐内容。您可以先用
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 %}筛选列表数据: 在自定义列表(例如
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 %}检查自定义字段的存在性或特定值: 安企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)
contain过滤器是否区分大小写? 是的,根据Go语言的默认字符串处理机制,contain过滤器通常是区分大小写的。例如,"AnQiCMS"|contain:"cms"会返回False。如果需要进行不区分大小写的判断,您可能需要在进行contain判断之前,先将目标字符串和关键词都转换为统一的大小写(例如都转为小写),再进行比较。除了
set标签,还有其他方式可以将contain的结果存储到变量中吗? 安企CMS模板引擎也支持with标签来定义变量,通常用于为include标签传递局部变量,或者在某个代码块内声明临时变量。虽然with标签也可以用来存储contain的结果,但set标签在模板中进行全局或局部变量赋值时通常更为简洁和常用。例如:{% with my_result = "string"|contain:"keyword" %}...{% endwith %}。contain过滤器可以用来判断数值或布尔值吗?contain过滤器主要用于判断字符串中是否包含子字符串,或者在数组/切片、键值对/结构体中是否存在特定元素或键名。它不会直接用来判断变量本身的类型是否为数值或布尔值,也不会直接用于数值或布尔值的比较。如果您需要判断数值是否在某个范围内,或者布尔值为真假,应直接使用if标签配合比较运算符(如==、>、<)来进行。例如:{% if archive.Views > 1000 %}。