Intereting Posts
Использование метода PUT с библиотекой PHP cUrl mongo сортировать после предела после сортировки – Не работает Просто обновите мой сайт до версии 1.9.3.0 и получите ошибку SQLSTATE : Столбец не найден: 1054 Неизвестный столбец 'catalog_product_entity_group_price.is_percent' regex (в PHP), чтобы соответствовать &, которые не являются объектами HTML Статус доставки AWS SNS Как вставить пост с работой cron в WordPress Почему silverstripe устанавливает мои таблицы страниц как устаревшие Где я могу узнать о внутренних функциях PHP? spl_object_hash, объекты не идентичны Что означает? == оператор сравнения в PHP означает? PHP if-statement игнорируется, когда заголовок (Location: xxx) находится внутри Кажется, не может загрузиться CSV с использованием PHP Curl, когда ответ является содержимым: вложение PDO SQLite запрос с нулевым результатом Включить функцию exec Как отобразить список категорий, содержащих элементы в mysql

Magento – OnePage Checkout – Скрыть Способ оплаты в зависимости от метода доставки

Я задал этот вопрос на 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 . См. Подробный ответ здесь .

В принципе, вам необходимо установить метод оплаты неактивным с помощью этого метода, как вы можете видеть в ответе.