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

前端 未结 2 1287
渐次进展
渐次进展 2020-12-10 19:40

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.

相关标签:
2条回答
  • 2020-12-10 20:08

    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>
    
    0 讨论(0)
  • 2020-12-10 20:26

    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     magepsycho@gmail.com
     * @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;
                }
    
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题