在网站运营中,我们常常需要根据内容的特定属性或关键词来动态调整页面的显示。例如,当文章标题包含“最新”二字时,我们可能想给它加上一个醒目的“NEW”标签;或者当某个产品描述中提及“包邮”时,自动显示一个免运费的图标。安企CMS(AnQiCMS)提供了强大的模板功能和丰富的过滤器,让实现这些需求变得轻而易举。
本文将深入探讨AnQiCMS如何通过判断字符串或数组是否包含某个关键词,并据此灵活地显示或隐藏内容。我们将重点介绍 contain 过滤器,并结合实际场景,帮助您轻松驾驭动态内容显示。
核心功能:contain 过滤器——判断内容是否包含关键词
AnQiCMS模板引擎内置了一个非常实用的 contain 过滤器,它能够帮助我们快速判断一个变量(无论是字符串、数组、甚至是结构体或映射的键名)是否包含了我们指定的关键词。这个过滤器会返回一个布尔值(True 或 False),我们就可以根据这个结果来控制内容的显示逻辑。
contain 过滤器的基本用法:
{{ 待检查的变量 | contain:"关键词" }}
示例一:判断字符串是否包含特定词
假设您有一篇新闻文章,需要在标题中包含“独家”二字时,在页面上显示一个“Special”角标。
首先,我们可以通过 archiveDetail 标签获取文章标题:
{% archiveDetail articleTitle with name="Title" %}
然后,使用 contain 过滤器判断标题是否含有“独家”:
{% if articleTitle | contain:"独家" %}
<span class="special-badge">Special</span>
{% endif %}
这样,只有当文章标题中含有“独家”时,页面上才会出现“Special”角标。
示例二:判断数组中是否存在某个关键词的值
网站的文章通常会打上许多Tag标签。假设我们想判断当前文章是否含有“促销”这个标签,如果有,就显示一个特殊的优惠信息。
我们可以先获取当前文章的所有Tag列表:
{% tagList tags with itemId=archive.Id limit="10" %}
tags 变量此时是一个数组。接着,我们就可以用 contain 过滤器来检查这个数组:
{% if tags | contain:"促销" %}
<p class="promo-text">🎉 购买此商品可享受限时促销优惠!</p>
{% endif %}
请注意,当检查数组时,contain 过滤器会检查数组中的每个元素是否 完全等于 您提供的关键词。例如,如果 tags 数组中有一个元素是 ["大促销"],而您检查的是 contain:"促销",结果将是 False。如果需要模糊匹配,您可能需要将数组元素转换为字符串,然后逐一进行包含判断,或者采用下文介绍的 split 过滤器进行更精细的处理。
获取待判断的内容:多样的内容来源
在AnQiCMS中,您可以通过各种内置标签获取需要进行关键词判断的内容。以下是一些常见的例子:
- 文章标题或内容:
{% archiveDetail article with name="Title" %} {% archiveDetail articleContent with name="Content" %} - 分类名称或描述:
{% categoryDetail categoryName with name="Title" %} {% categoryDetail categoryDesc with name="Description" %} - 单页面内容:
{% pageDetail pageContent with name="Content" %} - 自定义字段: 如果您为内容模型定义了自定义字段(例如
product_features),也可以直接获取其值进行判断。{% archiveDetail productFeatures with name="product_features" %}
灵活运用:构建动态显示逻辑
结合 contain 过滤器和AnQiCMS强大的 if 条件判断以及 for 循环,您可以实现各种复杂的动态显示需求。
场景:根据自定义字段内容,展示不同的联系方式图标
假设您的产品详情页有一个自定义字段 support_method,用户可以在后台填写“微信、电话、邮件”等联系方式。您希望根据这些关键词显示对应的联系图标。
- 获取自定义字段内容:
{% archiveDetail supportMethod with name="support_method" %} - 进行判断并显示:
<div class="contact-icons"> {% if supportMethod | contain:"微信" %} <a href="#" class="icon-wechat" title="微信联系"></a> {% endif %} {% if supportMethod | contain:"电话" %} <a href="tel:{{ contact with name='Cellphone' }}" class="icon-phone" title="电话联系"></a> {% endif %} {% if supportMethod | contain:"邮件" %} <a href="mailto:{{ contact with name='Email' }}" class="icon-email" title="邮件联系"></a> {% endif %} </div>
在这个例子中,我们还结合了 contact 标签来获取预设的电话和邮箱,让联系方式更加动态和完善。
进阶技巧与注意事项
1. 将字符串拆分成数组后再判断:split 或 fields 过滤器
如果您的某个字段是一个包含多个关键词的字符串,例如 tags_string = "安企CMS,建站,教程",您想检查其中是否包含“教程”,直接使用 contain:"教程" 可能会因为分隔符的存在而不够精确(如果关键词是 安企CMS,而字符串是 安企CMS入门,直接 contain 会返回 True)。此时,可以先将其拆分为数组:
{% set tagsArray = tags_string | split:"," %} {# 使用逗号作为分隔符 #}
{% if tagsArray | contain:"教程" %}
<p>包含“教程”关键词</p>
{% endif %}
fields 过滤器则可以按照空格将字符串拆分成数组。
2. 判断关键词出现的次数:count 过滤器
如果不仅仅是判断是否存在,还需要知道关键词出现了多少次,可以使用 count 过滤器:
{% set content = "安企CMS是强大的CMS,安企CMS易于使用。" %}
{% set cmsCount = content | count:"安企CMS" %}
<p>“安企CMS”在内容中出现了 {{ cmsCount }} 次。</p>
{% if cmsCount > 1 %}
<p>这是一个重要词汇!</p>
{% endif %}
3. 替代方案:index 过滤器
index 过滤器会返回关键词在字符串中首次出现的位置(从0开始计数)。如果关键词不存在,则返回 -1。这也可以用来判断关键词是否存在:
{% set title = "安企CMS最新动态" %}
{% if title | index:"最新" != -1 %}
<span>发现最新动态!</span>
{% endif %}
index 在处理中文时,可能会涉及到字符编码的长度问题,计算位置时需要注意,一个中文通常算3个位置。对于简单的包含判断,contain 过滤器会更为直观和方便。
4. 大小写敏感性
AnQiCMS模板中的字符串比较通常是大小写敏感的。这意味着 contain:"CMS" 不会匹配 cms。如果您需要进行大小写不敏感的判断,可以在判断前,先将字符串转换为统一的大小写(例如全部转为小写),再进行判断:
{% set title = "AnQiCMS更新" %}
{% if title | lower | contain:"cms" %}
<p>标题中包含不区分大小写的“cms”</p>
{% endif %}
5. 性能考量
虽然过滤器功能强大,但在处理大量内容或循环中频繁使用复杂的过滤器可能会对页面加载速度产生轻微影响。在大多数常见场景下,这种影响微乎其微,但如果遇到性能瓶颈,可以考虑在控制器层(Go语言后端)预处理数据,直接将布尔结果传递给模板。
总结
AnQiCMS的模板过滤器,特别是 contain 过滤器,为网站运营者提供了极大的灵活性,能够根据字符串或数组中的关键词动态地显示内容。通过巧妙地结合 if 语句、for 循环以及其他辅助过滤器,您可以构建出高度个性化和响应用户需求的内容展示逻辑,从而显著提升网站的用户体验和运营效率。掌握这些技巧,将让您的AnQiCMS网站运营更加得心应手。
常见问题 (FAQ)
Q1:contain 过滤器是否区分大小写?如何实现大小写不敏感的判断?
A1:是的