Introduction
Q: How will you filter the payment method in one-page checkout based on some conditions?
A: There are different ways to do so. Some of them are:
- By overriding template:
app/design/frontend/[interface]/[theme]/template/checkout/onepage/payment/methods.phtml
- By overriding method:
Mage_Checkout_Block_Onepage_Payment_Methods::_canUseMethod()
- By overriding method:
Mage_Payment_Model_Method_Abstract::isAvailable()
- By overriding method:
Mage_Checkout_Block_Onepage_Payment_Methods::getMethods()
- By observing event:
payment_method_is_active
- and so on.
Among the above methods obviously using event-observer technique is the best way to go (#5).
And here I will be discussing how to enable the PayPal (Website Standard) method only when current currency is USD.
Steps
Suppose a skeleton module(MagePsycho_Paymentfilter) has already been created.
1> Register the event: ‘payment_method_is_active’ in config.xml.
Add the following XML code in app/code/local/MagePsycho/Paymentfilter/etc/config.xml:
...
<frontend>
...
<events>
<payment_method_is_active>
<observers>
<paymentfilter_payment_method_is_active>
<type>singleton</type>
<class>paymentfilter/observer</class>
<method>paymentMethodIsActive</method>
</paymentfilter_payment_method_is_active>
</observers>
</payment_method_is_active>
</events>
...
</frontend>
...
2> Implement the observer model
Create observer file: app/code/local/MagePsycho/Paymentfilter/Model/Observer.php and paste the following code:
<?php
/**
* @category MagePsycho
* @package MagePsycho_Paymentfilter
* @author [email protected]
* @website https://www.magepsycho.com
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
class MagePsycho_Paymentfilter_Model_Observer {
public function paymentMethodIsActive(Varien_Event_Observer $observer) {
$event = $observer->getEvent();
$method = $event->getMethodInstance();
$result = $event->getResult();
$currencyCode = Mage::app()->getStore()->getCurrentCurrencyCode();
if( $currencyCode == 'USD'){
if($method->getCode() == 'paypal_standard' ){
$result->isAvailable = true;
}else{
$result->isAvailable = false;
}
}
}
}
3> Go ahead for testing.
Happy E-Commerce!