如何在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,通常不应在模板内部处理,原因如下:
- 像上面那样进行字符串替换以从
service
属性中删除欧元符号是非常脆弱的。
- 您不应在模板内创建新变量。它们应该在您的业务规则中计算 class.
通常,您应该在将欧元符号添加到字符串之前进行求和,因为将字符串解析回数字总是很脆弱。即使您将来在 service
属性 中进行的微小更改(例如将其存储为 '€0,30' 而不是 '0,30 €' ,也足以破坏求和逻辑。
我目前正在为我的 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,通常不应在模板内部处理,原因如下:
- 像上面那样进行字符串替换以从
service
属性中删除欧元符号是非常脆弱的。 - 您不应在模板内创建新变量。它们应该在您的业务规则中计算 class.
通常,您应该在将欧元符号添加到字符串之前进行求和,因为将字符串解析回数字总是很脆弱。即使您将来在 service
属性 中进行的微小更改(例如将其存储为 '€0,30' 而不是 '0,30 €' ,也足以破坏求和逻辑。