Magento - OnePage Checkout - 根据送货方式隐藏付款方式

时间:2014-10-28 09:00:24

标签: php magento payment shipping 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种送货方式:

  • 在商店收集
    标题=在商店收集
    方法名称=在商店收集(Extension link
  • 统一费率
    标题=标准交付方法名称=标准运费
  • 免费送货
    标题=免费送货方法名称=免费

编辑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 个答案:

答案 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;   
            } 
        }