如何在foreach Smarty中对prestashop产品进行简单计算?

How to make simple calculation for prestashop products in foreach Smarty?

我目前正在为我的 Prestashop 1.7.5 开发报价模块。我已经添加了产品价格(通过覆盖 Product.php)。

现在,我必须在报价为 generated/displayed 时进行一些计算,以将这些价格添加到产品总数和订单总数中。

通过模板中的一个简单的 foreach,我得到了我所有的价格。

{foreach $products as $product}
   {$product.service}
{/foreach}

输出

0,30 € 0,10 € 0,20 € 

但是,我希望这些数字相互相加(例如,这里总共为 0.60 欧元)。

顺便说一句,我知道我们应该在 php 文件中而不是在模板中执行此操作(我也尝试过这种方式,但非常复杂...)。而且,我不需要保存这些数字,它只是为了显示...

有什么想法吗?

谢谢 ;)

下面会处理。在第一个块中,我模拟了您的数据,然后 运行 与您的问题完全相同 foreach,以比较输出。

最后,在第三块中,我向您展示了计算总数的代码,并将输出格式化为货币。

{* Sample code to simulate your data *}
{assign var="products" value=[
    ['service' => '0,30 €'],
    ['service' => '0,10 €'],
    ['service' => '0,20 €']
]}

{* Original code, exactly as showed in the question *}
{foreach $products as $product}
   {$product.service}
{/foreach}

{* This is the new code for calculating the total *}
{assign var="total" value=0}
{foreach $products as $product}
   {assign var="total" value=$total + $product.service|replace:' €':''|replace:',':'.'}
{/foreach}
Total: {$total|number_format:2:",":''} €

输出:

0,30 € 0,10 € 0,20 € Total: 0,60 €

但是正如您已经知道的那样,这非常 hacky,通常不应在模板内部处理,原因如下:

  1. 像上面那样进行字符串替换以从 service 属性中删除欧元符号是非常脆弱的。
  2. 您不应在模板内创建新变量。它们应该在您的业务规则中计算 class.

通常,您应该在将欧元符号添加到字符串之前进行求和,因为将字符串解析回数字总是很脆弱。即使您将来在 service 属性 中进行的微小更改(例如将其存储为 '€0,30' 而不是 '0,30 €' ,也足以破坏求和逻辑。