Как переопределить Класс блока модуля оплаты Mage?


Я попытался переопределить способ оплаты наложенным платежом.

Мне пришлось показывать опцию COD только в том случае, если почтовый индекс/почтовый индекс для выставления счетов входит в список, который у меня есть в таблице в моей БД.

Мне пришлось изменить следующее, чтобы выполнить свою задачу.

mage_payment_block_form_container ->функция GetMethods() Mage_Payment_Model_Method_Cashondelivery ->функция получения кодов()

[getcodpincodes() - это пользовательский метод проверки таблицы пинкодов и формы массив для сверки с почтовым индексом для выставления счетов]

Это сработало!!!

Но когда я пытаюсь создать модуль с этим.

Мой config.xml

<?xml version="1.0"?>
<config>
<modules>
    <Royal_Payment>
        <version>1.0.0</version>
    </Royal_Payment>
</modules>
<global>
    <models>
        <payment>
            <rewrite>
                <method_cashondelivery>Royal_Payment_Model_Method_Cashondelivery</method_cashondelivery>
            </rewrite>
        </payment>
    </models>
    <blocks>
        <payment>
            <rewrite>
                <form_container>Royal_Payment_Block_Form_Container</form_container>
            </rewrite>
        </payment>
    </blocks>
</global>

Моя структура папок

App\code\local\Royal\Payment\Block\Form\Container.php

<?php
class Royal_Payment_Block_Form_Container extends Mage_Payment_Block_Form_Container
{
public function getMethods()
{
    $methods = $this->getData('methods');
    if (is_null($methods)) {
        $quote = $this->getQuote();
        $store = $quote ? $quote->getStoreId() : null;
        $methods = $this->helper('payment')->getStoreMethods($store, $quote);
        $total = $quote->getBaseSubtotal() + $quote->getShippingAddress()->getBaseShippingAmount();
        foreach ($methods as $key => $method) {
            $allowCOD = 1;
            if($method->getCode() == "cashondelivery"){
                $postcodes = Mage::getModel('payment/method_cashondelivery')->getCODPincodes();
                $shippingPincode = $this->getQuote()->getBillingAddress()->getData('postcode');
                if(!in_array($shippingPincode, $postcodes)){
                    $allowCOD = 0;      // don't allow cod method -- it goes to else part in next if... else... block
                }
            }           
            if ($this->_canUseMethod($method)
                && ($total != 0
                    || $method->getCode() == 'free'
                    || ($quote->hasRecurringItems() && $method->canManageRecurringProfiles())) && ($allowCOD == 1)) {
                $this->_assignMethod($method);
            } else {
                unset($methods[$key]);
            }
        }
        $this->setData('methods', $methods);
    }
    return $methods;
}
}

App\code\local\Royal\Payment\Model\Method\Cashondelivery.php

<?php
class Royal_Payment_Model_Method_Cashondelivery extends Mage_Payment_Model_Method_Cashondelivery
{
    public function getCODPincodes(){
    $write = Mage::getSingleton('core/resource')->getConnection('core_read');
    $query = "select pincode from `pincode`";
    $results = $write->fetchAll($query);
    foreach($results as $result){
        $postcodes[] = $result['pincode'];
    }
    return $postcodes;
}
}

Моя переопределенная модель работает нормально. Но метод блока не вызывается

Где я ошибаюсь? Кто-нибудь может помочь пожалуйста?

Author: Shathish, 2013-05-17

2 answers

Вместо того, чтобы переписывать основной блок, вы могли бы использовать событие "payment_method_is_active"

В вашей конфигурации добавьте следующее:

<models>
    <royal_payment>
        <class>Royal_Payment_Model</class>
    </royal_payment>
</models>
<events>
    <payment_method_is_active>
        <observers>
            <royal_payment>
                <class>royal_payment/observer</class>
                <method>payment_method_is_active</method>
            </royal_payment>
        </observers>
    </payment_method_is_active>
</events>

Затем создайте свой класс наблюдателя Royal_Payment_Model_Observer с функцией payment_method_is_active

public function payment_method_is_active(Varien_Event_Observer $observer) {
    $quote = $observer->getData('quote');
    $method = $observer->getData('result');
    $methodInstance = $observer->getData('method_instance');

    // Here you can do your checking on the quote and if you dont want to show the method
    $method->isAvailable = false;
}

Используя параметр $methodinstance, вы можете подтвердить, что вы проверяете только метод COD.

 5
Author: David Manners, 2014-11-21 06:14:40

Если вы хотите изменить one-page checkout form, вы должны переопределить соответствующий блок, потому что instance из Mage_Payment_Block_Form_Container не вызывается напрямую, поэтому он не будет переопределен при прямой перезаписи.

Класс, который необходимо переопределить, - это Mage_Checkout_Block_Onepage_Payment_Methods, поскольку он в конечном счете расширяет Mage_Payment_Block_Form_Container и является классом, который фактически вызывается. Поэтому ваш переписанный текст должен гласить:

Ваш config.xml файл должен содержать

<global>
      <blocks>
        <checkout>
         <rewrite>
           <onepage_payment_methods>MyCompany_Checkout_Block_Onepage_Payment_Methods</onepage_payment_methods>
         </rewrite>
        </checkout>
       </blocks>
     </global>

И ваш класс объявлен как:

class MyCompany_Checkout_Block_Onepage_Payment_Methods extends Mage_Checkout_Block_Onepage_Payment_Methods
{

     //do your stuff here

} 

Позвольте мне знайте, есть ли у вас какие-либо вопросы

 2
Author: Keyur Shah, 2015-10-16 15:35:12