在AnqiCMS中,灵活地根据内容判断和动态展示信息,是提升网站用户体验和SEO效果的关键。想象一下,您的网站可以根据文章是否提及某个特定产品,自动显示相关的购买链接;或者根据用户所在的分类,推荐不同的侧边栏内容。这不仅让您的网站更智能,也大大提高了内容运营的效率。

AnqiCMS的模板引擎提供了强大的功能,帮助您轻松实现这些动态逻辑。它借鉴了Django模板引擎的语法,让条件判断和数据遍历变得直观。今天,我们就来深入探讨如何在AnqiCMS模板中,判断字符串、数组或对象是否包含特定关键词,并基于此动态显示内容。

理解 AnqiCMS 模板中的判断逻辑

AnqiCMS模板的核心在于其简洁而强大的标签。变量通常用双花括号 {{变量}} 包裹,而逻辑控制(如条件判断和循环)则使用单花括号和百分号 {% 标签 %}。在需要根据数据内容进行动态展示时,if 逻辑判断标签 {% if ... %} 是我们的基础工具,它允许我们定义条件,当条件为真时执行相应的模板代码。

然而,仅仅有 if 标签还不够。我们还需要一个方法来判断变量中是否“包含”某个特定的值。这时,AnqiCMS提供的一个非常有用的工具就派上用场了——那就是 contain 过滤器。

核心利器:contain 过滤器

contain 过滤器是AnqiCMS模板引擎中专门用于检测内容是否包含特定关键词的工具。它的功能非常强大,不仅可以判断一行字符串中是否包含某个关键词,还能检测数组(slice)中是否存在某个元素,甚至可以判断键值对(map)或结构体(struct)中是否存在某个键名。

contain 过滤器的基本用法非常简单:您只需将待检查的变量通过管道符 | 传递给 contain 过滤器,并在冒号 : 后指定您要查找的关键词。

例如:{{ obj|contain:"关键词" }}

这个过滤器会返回一个布尔值(TrueFalse)。如果找到关键词,则返回 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 过滤器与 ifelseelif 标签的结合,可以实现非常复杂的动态内容逻辑。例如,您可以根据文章内容的不同关键词,展示不同的侧边栏推荐文章、调用不同的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 %}

通过这样的组合,您的