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

Posted

技术标签:

【中文标题】Magento - OnePage Checkout - 根据送货方式隐藏付款方式【英文标题】:Magento - OnePage Checkout - Hide Payment method depending on Shipping Method 【发布时间】:2014-12-23 14:49:30 【问题描述】:

我在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>

希望这些额外的信息对我有所帮助!

【问题讨论】:

你能告诉我代码是在哪个事件中触发的吗? 嗨,阿米特。它旨在在人们必须选择付款方式的地方触发单页结帐。 抱歉,您的意思是代码中的事件,对吗?在此模块的 config.xml 中,事件称为 payment_method_is_active,观察者称为 paymentfilter_payment_method_is_active @Amit:编辑我的帖子以包含config.xml 输出 你能知道payment_method_is_active事件上的paymentMethodIsActive函数吗? 【参考方案1】:

至于我得到的,你试图隐藏一些基于送货方式的付款方式。为此,您根本不需要观察事物。只要你能做到,跟着我,

每个方法(在一个页面中签出)都将选择的方法发布到下一个级别。因此您可以在付款方式级别获得选择的运输方式。只需在

中打印帖子内容
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-&gt;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

【讨论】:

@Elvarasan:谢谢!我知道我应该修改 PHTML。更有意义。我将为我的子主题覆盖 PHTML 问题:我会在哪里坚持&lt;?php print_r($_POST); ?&gt; Elvarasan,你是明星!工作精美。即使我返回几个步骤并选择不同的运输方式,它也会更新..无需检查 Mage 结帐会话或类似的东西 出色的解决方案。谢谢 Elavarasan。 如果我有 IWD 的 OnePage Checkout,我的所有步骤都在同一页面中,所以我不能使用 POST。我怎么能在这个 methods.phtml 中有来自 shipping_method/available.phtml 的数组 $_shippingRateGroups?如果我能得到这个,我可以做这样的检查... foreach ($methods as $_method): $_code = $_method-&gt;getCode(); if ( array_key_exists('freeshipping', $_shippingRateGroupsCheck )) if($_code == 'msp_cashondelivery') continue; ...【参考方案2】:

虽然the accepted answer 有效,但它不是一个优雅的解决方案,因为它会提示我们检查 phtml 文件中的帖子数据,这不是一个好方法。相反,您绝对应该寻找一个事件来完成这项工作。

幸运的是,我们有一个完美的活动来完成这项工作,那就是payment_method_is_active。请看the detailed answer here。

基本上,您需要通过此方法将付款方式设置为无效,如您在答案中所见。

【讨论】:

我完全同意。在模板文件中进行此类检查并不是最佳做法。如果主题发生变化,它也将不起作用【参考方案3】:

除了@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;   
             
        

【讨论】:

真的很抱歉恢复这篇旧帖子。我到底应该把这段代码放在哪里?在哪个文件中?

以上是关于Magento - OnePage Checkout - 根据送货方式隐藏付款方式的主要内容,如果未能解决你的问题,请参考以下文章

Magento Onepage签出-添加自定义步骤

扩展 Magento 购物车

Magento 1.9:使用事件sales_order_place_after检出页面不会重定向到成功页面

Magento 布局缓存正在保存错误的模板名称

magento 将结帐付款重定向到第三方网关

什么可能导致 Magento 在 Paypal 重定向时将新地址更改回默认地址?