在网站运营过程中,我们经常会遇到需要对自定义数据进行计算的场景,例如根据商品参数动态计算价格、展示评分统计、或者进行其他基于用户输入或内容属性的数值处理。安企CMS以其灵活的内容模型和强大的模板引擎,为我们提供了实现这些需求的能力。本文将详细介绍如何在安企CMS中,根据用户自定义的字符串参数进行数值计算。

第一步:准备工作——定义你的自定义参数

首先,我们需要在后台定义存储这些参数的字段。安企CMS的“内容模型”功能是实现这一点的核心。

  1. 进入内容模型管理: 登录安企CMS后台,在左侧导航栏找到“内容管理”,点击进入“内容模型”。
  2. 编辑或新建模型: 您可以选择编辑一个已有的内容模型(如“文章模型”或“产品模型”),也可以根据需要新建一个自定义模型。
  3. 添加自定义字段: 在模型的编辑页面中,找到“内容模型自定义字段”区域,点击“添加字段”。
    • 参数名: 填写您希望在后台显示和识别的中文名称(例如“商品价格”、“库存数量”)。
    • 调用字段: 填写在模板中用于引用的英文字段名(例如pricestock)。这个字段名至关重要,请确保它的唯一性和规范性。
    • 字段类型: 虽然我们最终要进行数值计算,但考虑到用户输入可能的多样性,我们建议您将字段类型选择为“数字”。这有助于在后台输入时进行初步的数据验证,确保用户输入的是数字,减少后续处理的复杂性。
    • 其他设置: 根据实际需求设置是否必填、默认值等。
  4. 保存并应用: 保存您的模型更改。

完成以上步骤后,在发布或编辑属于该内容模型的内容时,您就可以在“其他参数”区域看到这些自定义字段,并填入相应的数值了。

第二步:在模板中获取自定义参数的值

定义好参数并为内容填写了数据后,下一步就是在网站前端模板中获取并使用这些参数。安企CMS提供了多种方式来获取自定义参数。

获取单个自定义参数的值

如果您知道具体要获取哪个自定义字段(例如price),可以直接使用 archiveDetail 标签:

{# 假设当前页面是商品详情页,并有一个名为 'price' 的自定义字段 #}
<div>商品价格:{% archiveDetail with name="price" %} 元</div>
{# 如果自定义字段的值需要赋值给一个变量,以便后续计算使用 #}
{% archiveDetail productPrice with name="price" %}
<div>商品价格(通过变量):{{ productPrice }} 元</div>

这里的productPrice就是我们为这个自定义字段指定的一个临时变量名。

获取所有自定义参数并遍历

如果您需要获取当前内容的所有自定义参数,或者您想动态地展示它们,可以使用 archiveParams 标签。这个标签会返回一个包含所有自定义参数的数组对象:

{# 获取当前内容的所有自定义参数,并命名为 params #}
{% archiveParams params %}
<div class="custom-params">
    {% for item in params %}
    <div>
        <span>{{ item.Name }}:</span>
        <span>{{ item.Value }}</span>
    </div>
    {% endfor %}
</div>
{% endarchiveParams %}

在这种情况下,item.Name会显示您在后台设置的“参数名”(中文),item.Value则会显示该参数的实际值。

第三步:进行数值计算——核心步骤

在模板中获取到自定义参数的值后,我们就可以利用安企CMS模板引擎的算术运算能力来进行计算了。这里需要注意一个关键点:类型转换

理解类型转换的重要性

即使您在后台将自定义字段设置为“数字”类型,安企CMS的模板引擎在某些情况下可能仍会将其读取为字符串。直接对字符串进行数学运算,可能会导致错误或非预期的结果(例如“10” + “5” 可能会变成“105”而不是“15”)。因此,在进行数值计算前,我们强烈建议使用过滤器将这些值显式地转换为数字类型。

使用过滤器进行类型转换

安企CMS提供了 integerfloat 两种过滤器用于类型转换:

  • integer:将值转换为整数。如果值包含小数,它会向下取整。如果值无法转换为数字,则返回 0
  • float:将值转换为浮点数(带小数的数字)。如果值无法转换为数字,则返回 0.0

转换方法很简单,只需将过滤器应用于您的参数变量:

{% archiveDetail productPriceString with name="price" %} {# 获取到的值可能是字符串 "100.50" #}
{% set productPrice = productPriceString | float %} {# 转换为浮点数 100.50 #}

{% archiveDetail productStockString with name="stock" %} {# 获取到的值可能是字符串 "5" #}
{% set productStock = productStockString | integer %} {# 转换为整数 5 #}

执行算术运算

安企CMS的模板引擎支持基本的算术运算符,您可以在双大括号 {{ }} 内直接使用它们,就像在编程语言中一样:

  • +:加法
  • -:减法
  • *:乘法
  • /:除法
  • %:取模(求余数)
  • ^:幂运算(求次方)

将类型转换后的数字与运算符结合,即可进行计算:

{# 假设我们已经通过 archiveDetail 获取了 price 和 stock 并转换为了数字类型 #}
{% archiveDetail priceString with name="price" %}
{% set price = priceString | float %}

{% archiveDetail stockString with name="stock" %}
{% set stock = stockString | integer %}

{% set totalValue = price * stock %} {# 计算总价值 #}

<div>商品总价值:{{ totalValue }} 元</div>

为了使代码更清晰和易读,尤其是当计算涉及多个步骤时,您可以使用 {% set %} 标签来定义临时变量存储中间结果。

完整计算示例:计算商品打折后的价格

假设我们有一个商品,除了价格price外,还有一个自定义字段discount_rate用于表示折扣率(例如0.8代表八折)。

  1. 定义字段: 在产品模型中添加 price(数字类型)和 discount_rate(数字类型)字段。

  2. 模板代码:

    {# 获取商品价格 #}
    {% archiveDetail priceString with name="price" %}
    {% set price = priceString | float %}
    
    
    {# 获取折扣率 #}
    {% archiveDetail discountRateString with name="discount_rate" %}
    {% set discountRate = discountRateString | float %}
    
    
    {# 执行计算 #}
    {% set finalPrice = price * discountRate %}
    
    
    <div>
        <p>原价:{{ price }} 元</p>
        <p>折扣率:{{ discountRate }}</p>
        <p>折后价:{{ finalPrice | floatformat:2 }} 元</p> {# 使用 floatformat:2 保留两位小数 #}
    </div>
    

通过这种方式,您可以根据后台自定义的参数,在前端灵活地展示各种计算结果。

小贴士

  • 数据验证与默认值: 如果自定义参数可能为空或包含非数字字符,直接