在安企CMS中,内容模型的灵活性是其核心优势之一,它让我们可以根据不同的业务需求,创建各种自定义字段来承载特定类型的内容。当我们自定义了一些字段来存储网址链接,例如“外部参考链接”或“相关资源下载地址”时,你可能会发现这些链接在前端页面上默认只是纯文本,无法直接点击跳转。这不仅影响用户体验,也无法充分发挥链接的价值。

幸运的是,安企CMS内置了强大的模板过滤器,其中就包括 urlize 过滤器,它能够自动识别文本中的URL或邮箱地址,并将其转换为可点击的HTML链接。这篇文章将详细讲解如何在自定义内容模型字段的输出中,巧妙地应用 urlize 过滤器来解析URL,让你的网站内容更加生动和实用。

理解安企CMS的自定义内容模型

安企CMS之所以受到中小企业和内容运营者的青睐,很大程度上得益于其高度灵活的内容模型。它允许你跳出传统“文章”、“产品”的框架,根据自己的业务逻辑创建全新的内容类型,并为之定义专属的字段。

例如,你可能为“客户案例”模型添加一个“项目官网地址”的单行文本字段,或者为“行业报告”模型添加一个“报告下载链接”的多行文本字段。这些字段在后台录入时,存储的往往是纯文本的URL。而在前端页面展示时,我们自然希望这些URL能够被正确解析,方便用户直接点击访问。

urlize 过滤器:让链接动起来

urlize 是安企CMS模板引擎提供的一个非常实用的过滤器。它的主要作用是自动检测输入文本中的URL和电子邮件地址,并将它们自动包裹在 <a href="...">...</a> 标签中,使其成为可点击的超链接。更棒的是,它还会为外部链接自动添加 rel="nofollow" 属性,这对于SEO优化来说是一个非常有用的默认行为。

基本用法示例:

假设你有一个名为 external_link 的自定义字段,其值为 https://www.anqicms.com。在模板中直接输出时,它可能只是显示为纯文本:

<p>外部链接:{{ archive.ExternalLink }}</p>
{# 页面显示:外部链接:https://www.anqicms.com #}

为了让它变成可点击的链接,只需要简单地加上 urlize 过滤器:

<p>外部链接:{{ archive.ExternalLink|urlize }}</p>

这时,浏览器就会把它渲染成:

<p>外部链接:<a href="https://www.anqicms.com" rel="nofollow">https://www.anqicms.com</a></p>

需要特别注意的是,当 urlize 过滤器将URL转换为HTML标签后,这些HTML标签默认是会被模板引擎自动转义的,以防止潜在的安全问题(如XSS攻击)。为了让浏览器能够正确地解析并显示这些HTML链接,我们需要在 urlize 过滤器之后,再添加一个 safe 过滤器,明确告诉模板引擎这些HTML代码是安全的,无需转义。

<p>外部链接:{{ archive.ExternalLink|urlize|safe }}</p>

这样才能确保最终在页面上看到的是一个正常的、可点击的链接。

在自定义字段中应用 urlize

在安企CMS中,获取自定义内容模型字段的值有两种主要方式:直接通过字段名访问,或者通过 archiveParams 标签循环遍历。

1. 直接访问已知字段

如果你明确知道自定义字段的“调用字段”名称(例如,你在后台创建时填写的 external_link),并且确定这个字段会存储URL,那么你可以直接像访问系统内置字段一样来调用它,并应用 urlize 过滤器。

假设你的自定义内容模型中有一个名为 external_link(调用字段)的单行文本字段,用于存储外部参考链接。在模板中,你可以这样使用:

<section class="external-resources">
    <h3>参考资源</h3>
    <p>访问我们的合作伙伴网站:
        {{- archive.ExternalLink|urlize|safe -}}
    </p>
</section>

这里的 archive.ExternalLink 假设 ExternalLink 是你的自定义字段 external_link 经过安企CMS驼峰命名转换后的调用方式。

2. 通过 archiveParams 循环遍历自定义字段

有时,一个内容模型可能有多个自定义字段,或者你希望编写一个通用的模板代码,能够自动处理所有可能包含URL的自定义字段。这时,archiveParams 标签就派上了用场。它允许你遍历当前文档(或指定文档)的所有自定义参数。

<section class="custom-fields-display">
    <h3>更多详情</h3>
    {% archiveParams params %}
        {% for item in params %}
            <p>
                <strong>{{ item.Name }}:</strong>
                {# 判断如果字段值包含常见的URL前缀,则应用urlize过滤器 #}
                {% if item.Value|contain:"http://" or item.Value|contain:"https://" or item.Value|contain:"www." or item.Value|contain:".com" %}
                    {{ item.Value|urlize|safe }}
                {% else %}
                    {{ item.Value }}
                {% endif %}
            </p>
        {% endfor %}
    {% endarchiveParams %}
</section>

在这个例子中,我们遍历了 params 数组,每个 item 代表一个自定义字段。我们通过简单的条件判断,检查 item.Value 是否可能是一个URL(通过判断是否包含 http://、`https://