如何在Magento或Zend中创建自定义货币类型?

时间:2011-03-11 16:50:25

标签: zend-framework magento currency

我打算创建一个新的奖励积分货币,所以我不想在我的Magento商店销售价值300美元的产品,而是希望它显示300个奖励积分。

我已经尝试过将其添加到lib / Zend / Locale / Data / en.xml中的currency部分的错误练习解决方案

<currency type="RWP">
            <displayName>Reward Point</displayName>
            <displayName count="one">Reward Point</displayName>
            <displayName count="other">Reward Points</displayName>
            <symbol>Reward Points</symbol>
</currency>

我可以通过以下线程在Magento中启用和使用它: http://www.magentocommerce.com/boards/viewthread/56508/  但它仍然使用默认格式模式:¤ #,##0.00所以看起来像奖励积分800.00

我的区域设置设置为 en_CA ,据我所知,我无法在不影响CDN和USD格式的情况下更改格式模式。

我尝试重写Mage_Core_Model_Store,这样如果当前货币代码是RWP,它将使用一系列格式化选项格式化价格,但是当我在产品视图中时这不起作用。更不用说这似乎是一种非常肮脏的方式来实现我想要的东西。

 /**
 * Format price with currency filter (taking rate into consideration)
 *
 * @param   double $price
 * @param   bool $includeContainer
 * @return  string
 */
public function formatPrice($price, $includeContainer = true)
{
    if ($this->getCurrentCurrency()) {
        /**
        * Options array
        *
        * The following options are available
        * 'position'  => Position for the currency sign
        * 'script'    => Script for the output
        * 'format'    => Locale for numeric output
        * 'display'   => Currency detail to show
        * 'precision' => Precision for the currency
        * 'name'      => Name for this currency
        * 'currency'  => 3 lettered international abbreviation
        * 'symbol'    => Currency symbol
        */
        $options = array();

        if ($this->getCurrentCurrencyCode() == 'RWP') {
            $options = array(
                'position' => 16,
                'precision' => 0,
                'format'=> '#,##0.00 '
            );
        }
        return $this->getCurrentCurrency()->format($price, $options, $includeContainer);
    }
    return $price;
}

1 个答案:

答案 0 :(得分:0)

货币体系是我唯一熟悉的货币体系,所以要把这一切都拿出来。 (另外,假设Magento 1.4.2)

一种方法是directory/currency模型。这是所有货币格式化函数和方法最终调用的类。你会在整个源代码中看到这样的调用

Mage::getModel('directory/currency')

看起来没有办法说“将这种货币模型/类用于这种货币”,所以你将不得不在这里重写类重写。 formatPrecisionformatTxt方法是您追求的方法。

此外,看起来directory/currency类包装了对Magento语言环境对象的调用(对getNumbercurrency的调用)

public function formatTxt($price, $options=array())
{
    if (!is_numeric($price)) {
        $price = Mage::app()->getLocale()->getNumber($price);
    }
    /**
     * Fix problem with 12 000 000, 1 200 000
     *
     * %f - the argument is treated as a float, and presented as a floating-point number (locale aware).
     * %F - the argument is treated as a float, and presented as a floating-point number (non-locale aware).
     */
    $price = sprintf("%F", $price);
    return Mage::app()->getLocale()->currency($this->getCode())->toCurrency($price, $options);
}

语言环境对象是core/locale。你也可以重写这个类。如果那些是你追求的方法。

最后,因为这是Stack Overflow,所以Magento已经实施了许多奖励积分系统。检查这些问题以了解他们如何解决您遇到的问题可能是值得的。