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

时间:2019-09-03 14:35:37

标签: php prestashop product prestashop-1.7

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

现在,当生成/显示报价时,我需要进行一些计算,以将这些价格添加到产品总数和订单总数中。

通过模板中的简单foreach,我拥有所有价格。

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

输出

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

但是,我希望这些数字能够彼此添加(例如,此处总计为0.60欧元)。

顺便说一句,我知道我们应该在php文件而不是模板中这样做(我也尝试过这种方法,但是非常复杂...)。而且,我不需要保存这些数字,仅用于显示...

有什么想法吗?

谢谢;)

1 个答案:

答案 0 :(得分:1)

以下将处理它。在第一部分中,我模拟了您的数据,然后运行与您的问题完全相同的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 €

但是,正如您已经知道的那样,这是非常棘手的操作,出于以下原因,通常不应该在模板内部对其进行处理:

  1. 执行类似上述的字符串替换操作以从service属性中删除欧元符号非常脆弱。
  2. 您不应在模板内创建新变量。它们应该在您的业务规则类中计算。

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