在AnqiCMS中,灵活地根据内容判断和动态展示信息,是提升网站用户体验和SEO效果的关键。想象一下,您的网站可以根据文章是否提及某个特定产品,自动显示相关的购买链接;或者根据用户所在的分类,推荐不同的侧边栏内容。这不仅让您的网站更智能,也大大提高了内容运营的效率。
AnqiCMS的模板引擎提供了强大的功能,帮助您轻松实现这些动态逻辑。它借鉴了Django模板引擎的语法,让条件判断和数据遍历变得直观。今天,我们就来深入探讨如何在AnqiCMS模板中,判断字符串、数组或对象是否包含特定关键词,并基于此动态显示内容。
理解 AnqiCMS 模板中的判断逻辑
AnqiCMS模板的核心在于其简洁而强大的标签。变量通常用双花括号 {{变量}} 包裹,而逻辑控制(如条件判断和循环)则使用单花括号和百分号 {% 标签 %}。在需要根据数据内容进行动态展示时,if 逻辑判断标签 {% if ... %} 是我们的基础工具,它允许我们定义条件,当条件为真时执行相应的模板代码。
然而,仅仅有 if 标签还不够。我们还需要一个方法来判断变量中是否“包含”某个特定的值。这时,AnqiCMS提供的一个非常有用的工具就派上用场了——那就是 contain 过滤器。
核心利器:contain 过滤器
contain 过滤器是AnqiCMS模板引擎中专门用于检测内容是否包含特定关键词的工具。它的功能非常强大,不仅可以判断一行字符串中是否包含某个关键词,还能检测数组(slice)中是否存在某个元素,甚至可以判断键值对(map)或结构体(struct)中是否存在某个键名。
contain 过滤器的基本用法非常简单:您只需将待检查的变量通过管道符 | 传递给 contain 过滤器,并在冒号 : 后指定您要查找的关键词。
例如:{{ obj|contain:"关键词" }}
这个过滤器会返回一个布尔值(True 或 False)。如果找到关键词,则返回 True;否则,返回 False。有了这个布尔值,我们就可以结合 if 标签,轻松实现动态内容展示。
实际应用场景:根据内容动态显示
让我们通过具体的例子,看看 contain 过滤器在不同数据类型下的应用。
1. 判断文本字符串是否包含特定关键词
这是最常见的应用场景。例如,您希望如果一篇文章的标题或描述中包含“优惠”二字,就显示一个特殊的促销图标或链接。
{% archiveDetail article with name="Description" %} {# 获取当前文章的描述内容 #}
{% if article|contain:"优惠" %}
<span class="promo-badge">限时优惠!</span>
<a href="/promotions" class="btn btn-primary">立即查看优惠商品</a>
{% else %}
<a href="/products" class="btn btn-secondary">浏览所有商品</a>
{% endif %}
在这个例子中,archiveDetail 标签获取了当前页面的文章描述。然后,我们使用 article|contain:"优惠" 来判断这个描述字符串是否含有“优惠”一词。如果包含,则显示促销信息;否则,显示普通商品链接。
2. 判断数组(Slice)中是否存在特定元素
有时,您会遇到列表类型的数据,例如文章的标签(Tag)列表。您可能希望如果文章被标记为“新品”,就显示一个“NEW”的角标。
假设 tags 是一个包含字符串的数组,比如 ["GoLang", "CMS", "SEO"]。
{% tagList tags with itemId=archive.Id limit="10" %} {# 获取当前文章的标签列表 #}
{% if tags|contain:"新品" %}
<span class="new-badge">NEW</span>
{% endif %}
{# 也可以遍历标签列表,判断每个标签的Title属性 #}
{% for tag in tags %}
{% if tag.Title|contain:"新品" %}
<span class="new-badge">NEW</span>
{% endif %}
{% endfor %}
这里,tagList 标签获取了当前文章关联的所有标签。tags|contain:"新品" 会检查这个标签名称数组中是否有“新品”这个元素。当然,如果 tags 是一个对象数组(如 tag.Title),您可能需要遍历数组,并对每个元素的特定属性进行判断。
3. 判断对象(Map/Struct)中是否存在特定键名
自定义字段在AnqiCMS中非常灵活,您可以通过内容模型为文章或产品添加任意自定义字段。假设您为产品模型添加了一个名为“VideoLink”的自定义字段,用于存储产品演示视频的链接。如果这个字段存在,您就想在页面上嵌入一个视频播放器。
{% archiveParams params with sorted=false %} {# 获取当前文章的所有自定义参数,以map形式返回 #}
{% if params|contain:"VideoLink" %}
<div class="product-video">
<h3>产品演示</h3>
<iframe src="{{ params.VideoLink.Value }}" frameborder="0" allowfullscreen></iframe>
</div>
{% else %}
<p>暂无产品演示视频。</p>
{% endif %}
在这个例子中,archiveParams 标签获取了文章的所有自定义参数。params|contain:"VideoLink" 判断 params 这个对象中是否存在名为“VideoLink”的键。如果存在,我们就可以通过 params.VideoLink.Value 来获取视频链接并嵌入播放器。
灵活组合:让内容呈现更智能、更精准
contain 过滤器与 if、else、elif 标签的结合,可以实现非常复杂的动态内容逻辑。例如,您可以根据文章内容的不同关键词,展示不同的侧边栏推荐文章、调用不同的CSS样式,甚至改变页面的整体布局。
{% archiveDetail articleContent with name="Content" %} {# 获取文章完整内容 #}
{# 如果内容包含“联系我们”且包含“定制服务”,显示定制服务表单 #}
{% if articleContent|contain:"联系我们" and articleContent|contain:"定制服务" %}
<div class="custom-service-form">
<h4>定制服务需求提交</h4>
{% guestbook fields %}
{# 这里嵌入留言表单的字段 #}
{% endguestbook %}
</div>
{# 如果只包含“联系我们”,显示基础联系信息 #}
{% elif articleContent|contain:"联系我们" %}
<div class="contact-info">
<h4>联系我们</h4>
<p>电话:{% contact with name="Cellphone" %}</p>
<p>邮箱:{% contact with name="Email" %}</p>
</div>
{% else %}
<p>如果您有任何疑问,请随时<a href="/contact">联系我们</a>。</p>
{% endif %}
通过这样的组合,您的