在日常的网站运营中,我们经常会遇到需要处理各种编码或ID的情况,例如商品编码、订单号、批次号等,它们往往包含着多段信息,而我们可能只需要提取其中的某一部分数字。比如,从复杂的商品编码“PROD20230815BATCH007”中,我们只想快速获取“007”这个批次号。

安企CMS凭借其灵活的内容模型和强大的模板标签系统,能够轻松应对这类需求。接下来,我们将探讨如何在安企CMS中,利用其内置的过滤器功能,从数字字符串中精准提取指定位置的数字。

第一步:准备工作——定义内容模型与字段

首先,我们需要确保你的商品编码等信息存储在安企CMS的内容模型中。如果你还没有专门的字段来存储这些编码,可以通过以下步骤进行设置:

  1. 登录安企CMS后台,导航到“内容管理”下的“内容模型”。
  2. 你可以选择修改现有的内容模型(例如“产品模型”或“文章模型”),或者创建一个全新的内容模型。
  3. 在选择的模型编辑页面,找到“内容模型自定义字段”部分。在这里,你需要添加一个新的字段,例如命名为“商品编码”,字段类型建议选择“单行文本”。这样,在发布或编辑商品内容时,你就可以将完整的商品编码填入这个字段。

假设我们已经创建了一个名为 product_code 的自定义字段,用于存储商品编码。

第二步:在模板中调用商品编码

在我们的网站前端,无论是商品详情页还是商品列表页,我们都需要先获取到包含完整编码的那个字段值。安企CMS提供了 archiveDetailarchiveList 标签来帮助我们实现这一点。

如果你在商品详情页(通常对应 detail.html 模板),可以直接通过 archiveDetail 标签获取当前商品的 product_code 字段值:

{% archiveDetail productCode with name="product_code" %}
{% set fullProductCode = productCode %}

如果你在商品列表页(通常对应 list.html 模板),则需要在 archiveList 标签的循环中获取每个商品的 product_code 字段值:

{% archiveList archives with moduleId="你的产品模型ID" type="page" limit="10" %}
    {% for item in archives %}
        {% set fullProductCode = item.product_code %}
        {# 接下来在这里处理 fullProductCode #}
    {% endfor %}
{% endarchiveList %}

现在,我们已经将完整的商品编码存储在了 fullProductCode 变量中,可以进行下一步的数字提取操作了。

第三步:提取指定位置的数字——get_digit 过滤器显身手

安企CMS内置了一个非常实用的 get_digit 过滤器,专门用于从数字字符串中提取指定位置的单个数字。这个过滤器从数字字符串的“倒数第一位”开始计算位置,位置参数从1开始。

例如,我们的商品编码是 PROD20230815BATCH007,我们想要提取批次号的最后一位“7”。

使用方法如下:

{% set productCode = "PROD20230815BATCH007" %}
{% set lastDigit = productCode|get_digit:1 %}
<p>批次号的最后一位是:{{ lastDigit }}</p>

{% set thirdFromLastDigit = productCode|get_digit:3 %}
<p>批次号的倒数第三位是:{{ thirdFromLastDigit }}</p>

这段代码运行后,lastDigit 将会是 7thirdFromLastDigit 将会是 0

需要注意的是,get_digit 过滤器主要用于提取单个数字字符。如果你的商品编码中包含非数字字符,并且你尝试提取的位置对应的是非数字字符,get_digit 会尝试将其转换为相应的ASCII值并减去48,这可能不是你期望的结果。因此,get_digit 最适合在确定目标位置是数字字符时使用。

第四步:更复杂的场景与通用方法:slice 过滤器

如果我们需要提取的不是单个数字,而是一段连续的数字(比如“007”),或者商品编码中混杂了字母和数字,且我们需要提取的是一个特定范围的子字符串,那么 slice 过滤器会是更通用的选择。

slice 过滤器用于截取字符串、数组中指定位置的元素。它使用 from:to 的格式来定义截取范围,其中 from 是起始索引(从0开始计数),to 是结束索引(不包含该索引位置的字符)。

继续以商品编码 PROD20230815BATCH007 为例:

  • P 对应索引 0
  • R 对应索引 1
  • 0 (批次号第一位) 对应索引 17
  • 0 (批次号第二位) 对应索引 18
  • 7 (批次号第三位) 对应索引 19

要提取批次号 007,它从索引 17 开始,到索引 20 结束(不包含索引 20 的字符)。

{% set productCode = "PROD20230815BATCH007" %}
{% set batchNumber = productCode|slice:"17:20" %}
<p>提取的完整批次号是:{{ batchNumber }}</p>

这段代码运行后,batchNumber 将会是 007

slice 过滤器在处理包含混合字符的字符串时非常灵活,只要你能确定起始和结束的索引位置,就能准确提取所需的子字符串。

小结

通过上述步骤,我们看到安企CMS提供了强大的模板标签和过滤器,使得从复杂的数字字符串中提取特定信息变得简单而直观。无论是提取单个数字还是连续的数字片段,你都可以根据具体需求选择 get_digitslice 过滤器。这种灵活性大大提升了内容运营的效率,让你的网站能够更智能地展示和管理商品数据。


常见问题 (FAQ)

1. 如果我的商品编码中既有字母又有数字,get_digit 过滤器还能准确地提取我想要的数字吗?

get_digit 过滤器在遇到非数字字符时,其行为可能会变得不那么直观,它会尝试将字符转换为ASCII值进行处理。因此,如果你的商品编码中混合了字母和数字,并且你需要提取的数字位置可能对应非数字字符,或者你需要提取多位数字,那么建议优先使用更通用的 slice 过滤器。slice 过滤器会按照你指定的字符索引范围直接截取子字符串,无论是数字还是字母,都能精确获取。

2. 我想提取的批次号不在固定位置,而是通过某个分隔符(例如横杠“-”)识别,安企CMS有办法吗?

当然有!如果批次号是通过特定分隔符界定的,你可以使用 split 过滤器将整个字符串拆分成一个数组,然后根据批次号在数组中的位置来获取。例如,商品编码是 PROD-2023-007,批次号“007”是第三部分,你可以这样做:

{% set productCodeWithDelimiter = "PROD-2023-007" %}
{% set parts = productCodeWithDelimiter|split:"-" %} {# 拆分成 ["PROD", "2023", "007"] #}
{% set batchNumber = parts[2] %} {# 获取第三部分,索引为2 #}
<p>通过分隔符提取的批次号是:{{ batchNumber }}</p>

3. 提取出来的数字(例如库存量)需要进行加减乘除等数学运算,可以直接在模板中操作吗?

是的,安企CMS支持在模板中进行基本的算术运算。你可以使用 add 过滤器进行加法,或者直接在表达式中运用 +-*/ 等运算符。例如:

”`twig {% set stock = “100”|integer %} {# 先将字符串转换为整数 #} {% set newStock = stock|add:50 %} {# 100 + 50 = 150 #}

增加后的库存量是:{{ newStock }}

{% set price = “199.99”|