Как переопределить Класс блока модуля оплаты 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;
}
}
Моя переопределенная модель работает нормально. Но метод блока не вызывается
Где я ошибаюсь? Кто-нибудь может помочь пожалуйста?
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.
Если вы хотите изменить 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
}
Позвольте мне знайте, есть ли у вас какие-либо вопросы