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;
}
}
}
}
Я предполагаю, что я не использовал правильные кодовые имена методов доставки или кодовые имена методов оплаты, но я не уверен. У кого-нибудь есть совет?
РЕДАКТИРОВАТЬ: у меня есть только 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>
Надеюсь, эта дополнительная информация поможет мне!
3 ответа
Что касается меня, вы пытаетесь скрыть некоторые способы оплаты на основе способа доставки. Для этого вам не нужно вообще что-то наблюдать. Просто ты можешь сделать это, просто следуй за мной,
Каждые методы (на одной странице проверяются) публикуют методы, которые выбраны на следующий уровень. Таким образом, вы можете получить выбранный способ доставки на уровне способа оплаты. Просто распечатайте пост вещи в
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;
}
}