Я задал этот вопрос на 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;
}
}
}
}
Я предполагаю, что я не использовал правильные кодовые имена методов доставки или кодовые имена методов оплаты, но я не уверен. У кого-нибудь есть совет?
РЕДАКТИРОВАТЬ:
У меня включено только 3 способа доставки:
РЕДАКТИРОВАТЬ 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
Хоть принятый ответ работает, это не элегантное решение, так как оно побуждает нас проверять данные записей в файле phtml, что не является хорошим методом. Вместо этого вы обязательно должны найти событие, чтобы сделать эту работу.
К счастью, у нас есть идеальное мероприятие, чтобы сделать эту работу и которая payment_method_is_active
, Посмотри пожалуйста подробный ответ здесь.
По сути, вы должны установить способ оплаты неактивным через этот метод, как вы можете видеть в ответе.
В дополнение к решению для OnePage Checkout IWD, предоставленному @ 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;
}
}