在安企CMS中,自定义内容模型为我们提供了极大的灵活性,能够根据不同的业务需求构建出个性化的内容结构。无论是产品详情页的功能列表、文章的关键词标签,还是服务介绍的优势点,我们常常会遇到需要在一个字段中存储多个相关信息,并在前端页面上将这些信息分开展示或处理的场景。

这种情况下,如果将所有信息一股脑儿地塞进一个普通文本字段,在前端展示时就可能面临解析困难、样式不统一等问题。而安企CMS提供的模板过滤器,特别是split过滤器,正是解决这一挑战的利器。它能帮助我们将存储在单一字段内的多值字符串数据,轻松地切割成可独立操作的数据项,从而实现更精细、更美观的数据展示。

理解自定义内容模型与多值字段

首先,我们来明确一下什么是自定义内容模型以及“多值字段”在这里的含义。安企CMS的核心优势之一就是其灵活的内容模型功能。通过后台的“内容管理”->“内容模型”设置,我们可以根据实际业务(例如“产品”、“服务”、“案例”等)创建专属的模型,并为每个模型定义其特有的字段,比如产品名称、产品图片、产品详情等。

当我们提到“多值字段”时,通常指的是这样一个自定义字段:我们在后台录入内容时,会在这个字段中输入多个相关的值,并用一个特定的符号(如逗号、分号、竖线等)将它们分隔开。例如,在“产品”模型中,我们可以添加一个名为“产品特性”的“单行文本”字段。录入数据时,用户可能会输入“防水,防震,高清屏幕,长续航”这样的字符串。虽然在数据库中这是一个单一的字符串,但在前端,我们希望它能以“防水”、“防震”等独立的列表项形式呈现。

split过滤器:数据处理的得力助手

split过滤器的核心作用,顾名思义,就是将一个字符串按照指定的分隔符切割成一个数组(在Go语言中通常称为slice)。一旦字符串被切割成数组,我们就可以利用模板的循环标签(for循环)对数组中的每一个元素进行单独的遍历和展示。

它的基本使用语法非常直观:

{{ obj|split:"分隔符" }}

其中,obj是待切割的字符串变量,而"分隔符"则是用来指定切割字符串的那个特定字符或字符串(比如逗号“,”、分号“;”等)。如果指定的分隔符在字符串中不存在,split过滤器会返回一个只包含原始字符串本身的数组。如果分隔符为空字符串,它会将原始字符串中的每一个UTF-8字符都作为单独的元素拆分成数组。

实战:在自定义模型字段中应用split过滤器

现在,让我们通过一个实际的例子,看看如何在自定义内容模型中利用split过滤器来展示多值字段数据。

假设我们有一个名为“产品”的自定义内容模型,其中包含一个自定义字段叫做features(产品特性),其类型为“单行文本”,后台录入时用逗号 , 分隔,例如:高性能CPU,大容量内存,SSD硬盘,独立显卡。我们希望在产品详情页面,将这些特性以列表的形式美观地展示出来。

步骤一:在自定义模型中添加多值字段

在安企CMS后台,进入“内容管理”->“内容模型”,选择您的“产品”模型(或者您创建的任何自定义模型),点击“修改”。在“内容模型自定义字段”部分,添加一个新字段:

  • 参数名: 产品特性 (前端显示名称)
  • 调用字段: features (模板中调用的字段名)
  • 字段类型: 单行文本
  • 是否必填: 根据需求选择
  • 默认值: 可留空或设置默认分隔符提示

保存您的自定义模型设置。之后在发布产品内容时,在“其他参数”中找到“产品特性”字段,并按照“高性能CPU,大容量内存,SSD硬盘,独立显卡”这样的格式录入。

步骤二:在前端模板中调用split过滤器进行展示

在您的产品详情页模板(例如product/detail.html)中,您可以按照以下方式调用并处理features字段:

{# 假设我们已经通过 archiveDetail 获取了当前产品的详情 #}
{# 首先,获取自定义字段 'features' 的值 #}
{% archiveDetail productFeaturesStr with name="features" %}

{# 检查 productFeaturesStr 是否有值,避免对空字符串进行操作 #}
{% if productFeaturesStr %}
    {# 使用 split 过滤器将字符串按逗号切割成数组,并赋值给一个新的变量 'featureList' #}
    {% set featureList = productFeaturesStr|split:"," %}

    <h2>产品特性</h2>
    <ul class="product-features">
        {# 遍历切割后的 featureList 数组 #}
        {% for feature in featureList %}
            {# 对每个特性项进行 trim 处理,去除可能存在的首尾空格,然后显示 #}
            <li>{{ feature|trim }}</li>
        {% empty %}
            {# 如果 featureList 为空(例如原始字段为空或切割后没有有效项),则显示提示信息 #}
            <li>暂无特性信息。</li>
        {% endfor %}
    </ul>
{% else %}
    {# 如果整个 'features' 字段都没有值,则不显示产品特性部分 #}
    <p>该产品暂未添加任何特性。</p>
{% endif %}

代码解析:

  1. {% archiveDetail productFeaturesStr with name="features" %}:这一行首先从当前文档详情中,提取出名为features的自定义字段内容,并将其赋值给productFeaturesStr变量。
  2. {% if productFeaturesStr %}:这是一个条件判断,确保只有当productFeaturesStr有内容时,才执行后续的切割和遍历,避免不