0

在 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 文件,包括:

app/code/core/Mage/Directory/Model/Currency.php

public function format <-- 这个函数改变的是实际价格,而不是价格的显示。

app/code/core/Mage/Catalog/Model/Product.php:

public function getFormatedPrice <-- 这个函数看起来很有希望,但对我没有任何作用。

我还查看了这些文件,没有任何明显的地方跳出来:

app/code/core/Mage/Catalog/Block/Product.php

app/code/core/Mage/Catalog/Block/Product/Price.php

app/code/core/Mage/Catalog/Block/Product/View.php

你认为有可能在 Magento 中找到一个地方,我可以破解我的自定义 PHP 函数来显示价格(而不是购物车中的实际数字价格)吗?

4

2 回答 2

0

您可以为此使用观察者catalog_product_get_final_price

配置.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;
} 
?>
于 2013-01-18T19:54:33.247 回答
0

我不确定 catalog_product_get_final_price 是否会按您的意愿工作,因此我建议的另一个解决方案是formatTxtMage_Directory_Model_Currency

在该功能中,您可以检查价格是否有小数,并设置选项$options['precision']=0;是否希望该价格没有小数(如 xx.00)。

例如:

public function formatTxt($price, $options=array())
{
  if(is_numeric( $price ) && floor( $price ) == $price){
     $options['precision']=0;
  }
  return parent::formatTxt($price, $options);
}
于 2013-01-18T20:22:49.143 回答