In my previous article, I have written about how you can change the currency symbol by making some change in the Zend (lib/Zend/Locale/Data/en.xml) file.
It's easy way but the main drawback of this method is that all your changes will vanish once you upgrade Magento.
A better way will be overriding Magento model classes that are responsible for fetching the currency symbol.
In this article, I will be showing you how to override Magento model classes to change the currency symbol.
Scenario
I need to change the currency symbol of Nepalese Rupee (from Nrs to Rs). By default, the currency symbol for Nepalese Rupee is Nrs.
Solution
Create a new module and Override two model classes.
1) Mage_Core_Model_Locale_Currency
2) Mage_Core_Model_Locale
2) Mage_Core_Model_Locale
Config file of my module
(MyNamespace/MyModule/etc/config.xml)
(MyNamespace/MyModule/etc/config.xml)
< global > < models > < core > < rewrite > < locale_currency >MyNamespace_MyModule_Model_Locale_Currency</ locale_currency > < locale >MyNamespace_MyModule_Model_Locale</ locale > </ rewrite > </ core > </ models > </ global > |
MyNamespace_MyModule_Model_Locale_Currency class of my module
(MyNamespace/MyModule/Model/Locale/Currency.php)
(MyNamespace/MyModule/Model/Locale/Currency.php)
In this class I have changed currency symbol from Nrs to Rs.
class MyNamespace_MyModule_Model_Locale_Currency extends Mage_Core_Model_Locale_Currency { /** * Creates a currency instance. Every supressed parameter is used from the actual or the given locale. * * @param string $currency OPTIONAL currency short name * @param string|Zend_Locale $locale OPTIONAL locale name * @throws Zend_Currency_Exception When currency is invalid */ public function __construct( $currency = null, $locale = null) { if (Zend_Locale::isLocale( $currency , true, false)) { $temp = $locale ; $locale = $currency ; $currency = $temp ; } $this ->setLocale( $locale ); // Get currency details $this ->_options[ 'currency' ] = Zend_Currency::getShortName( $currency , $this ->_locale); $this ->_options[ 'name' ] = Zend_Currency::getName( $currency , $this ->_locale); //$this->_options['symbol'] = Zend_Currency::getSymbol($currency, $this->_locale); /************************************************ * Here's the logic to change the currency symbol ************************************************ */ if (Zend_Currency::getSymbol( $currency , $this ->_locale) == 'Nrs' ) { $this ->_options[ 'symbol' ] = 'Rs' ; } else { $this ->_options[ 'symbol' ] = Zend_Currency::getSymbol( $currency , $this ->_locale); } if (( $this ->_options[ 'currency' ] === null) and ( $this ->_options[ 'name' ] === null)) { # require_once 'Zend/Currency/Exception.php' ; throw new Zend_Currency_Exception( "Currency '$currency' not found" ); } // Get the format $this ->_options[ 'position' ] = $this ->_updateFormat(); $this ->_options[ 'display' ] = Zend_Currency::NO_SYMBOL; if ( empty ( $this ->_options[ 'symbol' ]) === false) { $this ->_options[ 'display' ] = Zend_Currency::USE_SYMBOL; } else if ( empty ( $this ->_options[ 'currency' ]) === false) { $this ->_options[ 'display' ] = Zend_Currency::USE_SHORTNAME; } //parent::__construct($currency, $locale); $this ->_options[ 'symbol_choice' ] = self::getSymbolChoice( $currency , $this ->_locale); } } |
MyNamespace_MyModule_Model_Locale class of my module
(MyNamespace/MyModule/Model/Locale.php)
(MyNamespace/MyModule/Model/Locale.php)
class MyNamespace_MyModule_Model_Locale extends Mage_Core_Model_Locale { /** * Create Mage_Core_Model_Locale_Currency object for current locale * * @param string $currency * @return Mage_Core_Model_Locale_Currency */ public function currency( $currency ) { Varien_Profiler::start( 'locale/currency' ); if (!isset(self:: $_currencyCache [ $this ->getLocaleCode()][ $currency ])) { try { $currencyObject = new MyNamespace_MyModule_Model_Locale_Currency( $currency , $this ->getLocale()); } catch (Exception $e ) { $currencyObject = new MyNamespace_MyModule_Model_Locale_Currency( $this ->getCurrency(), $this ->getLocale()); $options = array ( 'name' => $currency , 'currency' => $currency , 'symbol' => $currency ); $currencyObject ->setFormat( $options ); } self:: $_currencyCache [ $this ->getLocaleCode()][ $currency ] = $currencyObject ; } Varien_Profiler::stop( 'locale/currency' ); return self:: $_currencyCache [ $this ->getLocaleCode()][ $currency ]; } } |
In this way, you can override Magento Model classes to change the currency symbol.
No comments:
Post a Comment