Я задал этот вопрос на Magento Stackexchange без каких-либо успехов, поэтому теперь я спрашиваю здесь.
Я использую Magento Community Edition 1.9.0.1 и правильно создал и зарегистрировал свой модуль, но я не могу обнаружить методы доставки. В принципе, я хочу скрыть денежные средства при доставке, если выбрана четная ставка или бесплатная доставка . Вот код, который у меня есть для моего класса наблюдателя:
class Kol_PaymentToggle_Model_Observer { public function paymentMethodIsActive(Varien_Event_Observer $observer) { $event = $observer->getEvent(); $method = $event->getMethodInstance(); $result = $event->getResult(); $quote = $observer->getEvent()->getQuote(); $shippingMethod = $quote->getShippingAddress()->getShippingMethod(); if($shippingMethod == "standardshipping" || $shippingMethod == "free") { if($method->getCode() == 'cashondelivery' ) { $result->isAvailable = false; } } } }
Я предполагаю, что я не использовал правильные имена кодов метода доставки или имена кодов метода оплаты, но я не уверен. У кого-нибудь есть совет?
EDIT: у меня есть только 3 способа доставки:
EDIT 2: вывод файла config.xml
<?xml version="1.0"?> <config> <modules> <Kol_PaymentToggle> <version>0.0.1</version> </Kol_PaymentToggle> </modules> <frontend> <events> <payment_method_is_active> <observers> <paymentfilter_payment_method_is_active> <type>singleton</type> <class>Kol_PaymentToggle_Model_Observer</class> <method>paymentMethodIsActive</method> </paymentfilter_payment_method_is_active> </observers> </payment_method_is_active> </events> </frontend> </config>
Надеюсь, эта дополнительная информация может оказаться полезной для меня!
Что касается меня, вы пытаетесь скрыть некоторые способы оплаты на основе метода доставки. Для этого вам не нужно вообще ничего соблюдать. Просто вы можете это сделать, просто следуйте за мной,
Каждый метод (при проверке на одну страницу) публикует методы, выбранные на следующий уровень. поэтому вы можете выбрать способ доставки, который выбран на уровне метода оплаты. Просто напечатайте сообщения в
app/design/frontend/base/default/template/checkout/onepage/payment/methods.phtml
в этом добавить ниже один,
<?php print_r($_POST); ?>
Итак, теперь вы можете получить методы доставки, которые были выбраны предыдущим шагом. И обратите внимание, что теперь вы можете добавить простое логическое (если еще) условие в том же файле для скрытия оплаты,
Например, здесь я хочу использовать метод check / money order
, если метод доставки является flat
. Здесь код способа оплаты – checkmo
. вы можете получить код метода оплаты, просто распечатав эту переменную, например echo $_code = $_method->getCode();
в том же файле. поэтому здесь просто добавьте простое, если другое,
<?php $methods = $this->getMethods(); $oneMethod = count($methods) <= 1; ?> <?php if (empty($methods)): ?> <dt> <?php echo $this->__('No Payment Methods') ?> </dt> <?php else: foreach ($methods as $_method): echo $_code = $_method->getCode(); if($_POST['shipping_method'] == 'flatrate_flatrate') { if($_code == 'checkmo') { continue; } } ?>
Вот,
if($_POST['shipping_method'] == 'flatrate_flatrate') { if($_code == 'checkmo') { continue; } }
проверяет способ доставки и пропускает способ оплаты, который мы не хотим отображать. Вот и все. Прокомментируйте здесь, если у вас есть какие-либо сомнения.
Заметка:
shipping_method => flatrate_flatrate paymet_method => checkmo
В дополнение к решению для IWD OnePage Checkout, предоставленному @ Simbus82:
$shipping = Mage::getSingleton('checkout/session')->getQuote()->getShippingAddress()->getShippingMethod(); foreach ($methods as $_method): $_code = $_method->getCode(); if ( $shipping == 'matrixrate_matrixrate_140' or $shipping == 'matrixrate_matrixrate_148' ) { if($_code != 'cashondelivery') { continue; } }
Хотя принятый ответ работает, он не является изящным решением, поскольку он предлагает нам проверять данные сообщения в файле phtml, который не является хорошим методом. Вместо этого вам обязательно нужно найти событие, чтобы выполнить эту работу.
К счастью, у нас есть прекрасное событие, чтобы выполнить эту работу, и которая является payment_method_is_active
. См. Подробный ответ здесь .
В принципе, вам необходимо установить метод оплаты неактивным с помощью этого метода, как вы можете видеть в ответе.