Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disable payment options-only cash on delivery for particular product-magento

Tags:

magento

I am using Magento 1.4.1.1 and i want to disable payment option for some products.i want to show only Cash on Delivery method for some products and need to hide other.

Any body there to help me?How can i manage this?Is there any option at admin or do i need to customize the code.If so,could you please provide me a code and the exact path to the files?

thanks in advance.

like image 265
Harikris Avatar asked Dec 15 '22 16:12

Harikris


2 Answers

An unobtrusive way of filtering payment method is to implement observer for event called payment_method_is_active

Steps
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:

...
<global>
    ...
    <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>
    ...
</global>
...

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    http://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($someTrueConditionGoesHere){
                $result->isAvailable = true;
            }else{
                $result->isAvailable = false;
            }

    }

}
like image 68
MagePsycho Avatar answered May 01 '23 13:05

MagePsycho


First create a product attribute (name : 'magepal_payment_filter_by_product', type : yes/no) to identify these products.

E.g base of Magento v1.7 you could

  1. Auto enable payment module programmatically see https://stackoverflow.com/a/14023210/1191288

  2. Enable all applicable payment module and filter which module to show where

In /app/code/local/MagePal/PaymentFilterByProduct/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <MagePal_PaymentFilterByProduct>
            <version>1.0.1</version>
        </MagePal_PaymentFilterByProduct>
    </modules>
    <global>
        <helpers>
            <paymentfilterbyproduct>
                <class>MagePal_PaymentFilterByProduct_Helper</class>
            </paymentfilterbyproduct>
            <payment>
                <rewrite>
                    <data>MagePal_PaymentFilterByProduct_Helper_Payment_Data</data>
                </rewrite>
            </payment>            
        </helpers>      
    </global>
</config>

In /app/code/local/MagePal/PaymentFilterByProduct/Helper/Payment/Data.php

<?php
class MagePal_PaymentFilterByProduct_Helper_Payment_Data extends Mage_Payment_Helper_Data
{

    public function getStoreMethods($store = null, $quote = null)
    {   
        $methods = parent::getStoreMethods($store, $quote);

        if(!Mage::getStoreConfig('paymentfilterbyproduct/general_option/paymentfilterbyproduct_enable', Mage::app()->getStore()) || !$quote){
            return $methods;
        }

        //get a list of product in cart
        $cart = Mage::getSingleton('checkout/session');

        $specialProductInCart = array();

        foreach ($cart->getQuote()->getAllItems() as $item) {
            $specialProductInCart[] = $item->getMagepalPaymentFilterByProduct();                 
        }

        // if special product in cart 
        // need to if check $item->getMagepalPaymentFilterByProduct() return 'yes/no' or '0/1)
        if(in_array('yes', $specialProductInCart)){
           $filter_csv = Mage::getStoreConfig('paymentfilterbyproduct/filter_option/paymentfilter_special_products', Mage::app()->getStore()); 
        }
        else{
            $filter_csv = Mage::getStoreConfig('paymentfilterbyproduct/filter_option/paymentfilter_all_product', Mage::app()->getStore());
        }

        $filter_array = explode(",", $filter_csv);

        foreach ($methods as $k => $method){
            if(!in_array($method->getCode(), $filter_array))
                unset($methods[$k]);       
        }//methods

        return $methods;
    }
}

In /app/code/local/MagePal/PaymentFilterByProduct/etc/system.xml

<?xml version="1.0"?>
<config>
    <tabs>
        <magepal translate="label" module="paymentfilterbyproduct">
            <label>MagePal</label>
            <sort_order>900</sort_order>
        </magepal>
    </tabs>
    <sections>
        <paymentfilterbyproduct translate="label" module="paymentfilterbyproduct">
            <label>Payment Method Filter by Product</label>
            <tab>magepal</tab>
            <sort_order>1000</sort_order>
            <show_in_default>1</show_in_default>
            <show_in_website>1</show_in_website>
            <show_in_store>1</show_in_store>
            <groups>
                <general_option translate="label">
                    <label>General Options</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>1</sort_order>
                    <show_in_default>1</show_in_default>
                    <show_in_website>1</show_in_website>
                    <show_in_store>1</show_in_store>
                    <fields>
                        <paymentfilter_enable translate="label">
                            <label>Enable Payment Filter</label>
                            <frontend_type>select</frontend_type>
                            <source_model>adminhtml/system_config_source_yesno</source_model>
                            <sort_order>50</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </paymentfilter_enable>
                    </fields>
                </general_option>
                <filter_option translate="label">
                    <label>Payment Method Filter Configuration</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>2</sort_order>
                    <show_in_default>1</show_in_default>
                    <show_in_website>1</show_in_website>
                    <show_in_store>1</show_in_store>
                    <comment>Please enable all applicable payment methods in system payment config</comment>
                    <fields>
                        <paymentfilter_all_products translate="label">
                            <label>Select Default Payment option for All Products</label>
                            <frontend_type>multiselect</frontend_type>
                            <source_model>MagePal_PaymentFilterByProduct_ActivePaymentMethod</source_model>
                            <sort_order>30</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </paymentfilter_admin>
                        <paymentfilter_special_products translate="label">
                            <label>Select Payments for Cart with Special Products</label>
                            <frontend_type>multiselect</frontend_type>
                            <source_model>MagePal_PaymentFilterByProduct_ActivePaymentMethod</source_model>
                            <sort_order>40</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </paymentfilter_store>
                    </fields>
                </filter_option>
            </groups>
        </paymentfilterbyproduct>
    </sections>
</config>

In /app/code/local/MagePal/PaymentFilterByProduct/Helper/Data.php

<?php 
class MagePal_PaymentFilterByProduct_Helper_Data extends Mage_Core_Block_Template
{
}

In /app/code/local/MagePal/PaymentFilterByProduct/ActivePaymentMethod.php

<?php
class MagePal_PaymentFilterByProduct_ActivePaymentMethod
{
    //get all active (enable) payment method
    public function toOptionArray()
    {
       $payments = Mage::getSingleton('payment/config')->getActiveMethods();

       foreach ($payments as $paymentCode=>$paymentModel) {
           if($paymentModel->canUseCheckout() == 1){
                $paymentTitle = Mage::getStoreConfig('payment/'.$paymentCode.'/title');
                $methods[$paymentCode] = array(
                    'label'   => $paymentTitle,
                    'value' => $paymentCode,
                );
           }
        }

        return $methods;
    }
}

In /app/etc/modules/MagePal_PaymentFilterByProduct.xml

<?xml version="1.0"?>
<config>
    <modules>
        <MagePal_PaymentFilterByProduct>
            <active>true</active>
            <codePool>local</codePool>
        </MagePal_PaymentFilterByProduct>
    </modules>
</config>
like image 40
Renon Stewart Avatar answered May 01 '23 15:05

Renon Stewart