我在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>
希望这些额外信息可以证明对我有用!
答案 0 :(得分:11)
至于我的意思,你试图隐藏一些基于运输方式的付款方式。为此,你根本不需要观察事物。只需你能做到这一点,就跟着我,
每个方法(在一页中检出)都会将选择的方法发布到下一级别。因此,您可以在付款方式级别获取所选的送货方式。只需在
中打印帖子app/design/frontend/base/default/template/checkout/onepage/payment/methods.phtml
在下面添加一个,
<?php print_r($_POST); ?>
现在您可以获得上一步选择的送货方式。请注意,现在,您可以在同一个文件中添加简单的逻辑(if else)条件以隐藏付款,
例如,如果送货方式为check / money order
,我需要隐藏flat
付款方式。此处的付款方式代码为checkmo
。您只需在同一文件中打印echo $_code = $_method->getCode();
之类的变量即可获得付款方式代码。所以这里只需添加简单的if else,
<?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
答案 1 :(得分:1)
尽管the accepted answer有效,但它不是一个优雅的解决方案,因为它提示我们检查phtml文件中的帖子数据,这不是一个好方法。相反,你一定要找一个事件去做这个工作。
幸运的是,我们有一个完美的活动来完成这项工作,payment_method_is_active
。请参阅the detailed answer here。
基本上,您需要通过此方法将付款方式设置为无效,如答案中所示。
答案 2 :(得分:0)
除了@ Simbus82提供的OnePage Checkout IWD解决方案:
$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;
}
}