在Magento中,我想将自定义PHP函数应用于前端价格的显示而不改变后端/购物车的实际数值。
具体来说,我想在价格中没有美分时删除显示价格上的小数。例如,19.00美元将显示为19美元,但19.99美元显示为19.99美元。
我在PHP.net上找到了一个PHP函数,它将为我执行此更改:
// formats money to a whole number or with 2 decimals; includes a dollar sign in front
function formatMoney($number, $cents = 1) { // cents: 0=never, 1=if needed, 2=always
if (is_numeric($number)) { // a number
if (!$number) { // zero
$money = ($cents == 2 ? '0.00' : '0'); // output zero
} else { // value
if (floor($number) == $number) { // whole number
$money = number_format($number, ($cents == 2 ? 2 : 0)); // format
} else { // cents
$money = number_format(round($number, 2), ($cents == 0 ? 0 : 2)); // format
} // integer or decimal
} // value
return $money;
} // numeric
} // formatMoney
我不想更改Magento模板来应用此功能,因为价格会出现在各处。更新所有模板将是一场噩梦。
我想知道是否有一个地方我可以使用此功能来格式化全球价格的显示,因此它会影响从一个地方到处显示所有价格。
我已经花了几个小时探索各种Magento文件,包括:
应用程序/代码/核心/法师/目录/型号/ Currency.php
公共功能格式< - 此功能更改实际价格,而不是价格的显示。
应用程序/代码/核心/法师/目录/型号/ Product.php:
公共函数getFormatedPrice< - 这个函数看起来很有前途,但对我没有任何作用。
我也看了这些文件而没有任何跳出来作为一个显而易见的地方:
应用程序/代码/核心/法师/目录/砌块/ Product.php
应用程序/代码/核心/法师/目录/砌块/产品/ Price.php
应用程序/代码/核心/法师/目录/砌块/产品/ View.php
您是否认为在Magento找到一个我可以破解将自定义PHP功能应用于价格显示(而不是购物车中的实际数字价格)的地方?
答案 0 :(得分:0)
你可以在catalog_product_get_final_price
上使用观察者:
config.xml中:
<config>
<frontend>
<events>
<catalog_product_get_final_price>
<observers>
<catalogrule>
<class>myextension/observer</class>
<method>processFrontFinalPrice</method>
</catalogrule>
</observers>
</catalog_product_get_final_price>
</events>
</frontend>
</config>
在观察者类中:
<?php
public function processFrontFinalPrice($observer)
{
$product = $observer->getEvent()->getProduct();
$finalPrice = 123.45; //modify your price here
return $this;
}
?>
答案 1 :(得分:0)
我不确定catalog_product_get_final_price是否可以正常工作,因此我建议的另一个解决方案是覆盖formatTxt
Mage_Directory_Model_Currency
在该功能中,您可以检查价格是否有小数,如果您希望价格不具有小数(如xx.00),请设置选项$options['precision']=0;
。
例如:
public function formatTxt($price, $options=array())
{
if(is_numeric( $price ) && floor( $price ) == $price){
$options['precision']=0;
}
return parent::formatTxt($price, $options);
}