Как создать собственный тип валюты в Magento или Zend?

Я хочу создать новую валюту для бонусных баллов, поэтому вместо моего магазина Magento, продающего товары стоимостью 300 долларов США, я хочу, чтобы он отображал 300 бонусных баллов.

Я уже пробовал решение для плохой практики, добавив его в раздел валют в lib / Zend / Locale / Data / en.xml

<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;
}

person Mark Murphy    schedule 11.03.2011    source источник
comment
У вас когда-нибудь получалось с этим? Я работаю над тем же в Magento 2, и добавление новой валюты кажется нетривиальной задачей.   -  person sdaugherty    schedule 16.03.2017
comment
Да, я думаю, что так и было, но это было 6 лет назад, и я почти столько же времени не касался PHP, не говоря уже о Magento. Извини :(   -  person Mark Murphy    schedule 17.03.2017


Ответы (1)


С валютной системой я знаком лишь поверхностно, так что относитесь ко всему этому с недоверием. (также, при условии, что Magento 1.4.2)

Один из подходов - это модель directory/currency. Это класс, который в конечном итоге вызывают все функции и методы форматирования валюты. Вы увидите подобные вызовы в исходном коде.

Mage::getModel('directory/currency')

Не похоже, что есть способ сказать «используйте эту модель / класс валюты для этой валюты», так что здесь вы застрянете с переписыванием класса. Вам нужны методы formatPrecision и formatTxt.

Кроме того, похоже, что класс directory/currency обертывает вызовы объекта локали Magento (вызовы getNumber и currency)

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 уже реализован ряд систем начисления баллов. Возможно, стоит проверить их, чтобы увидеть, как они решают проблемы, с которыми вы сталкиваетесь.

person Alan Storm    schedule 11.03.2011