Как создать собственный тип валюты в Magento или Zend? - PullRequest
5 голосов
/ 11 марта 2011

Я хочу создать новую валюту бонусных баллов, поэтому вместо моего магазина 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, поэтому он выглядит как Reward Points800.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 голосов
/ 11 марта 2011

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

Наконец, поскольку это переполнение стека, для Magento уже реализован ряд систем бонусных баллов. Изучите их, чтобы увидеть, как они решают проблемы, с которыми вы сталкиваетесь, возможно, стоит.

...