m2 控制前台payment method显示隐藏

4.64K 浏览开发笔记支付方式

m2 控制前台payment method显示隐藏

比如需求是:

B2B 的唯一支付方式为 checkmo 这个支付方式,在checkout 页面需要隐藏所有其他的。   同时,如果不是 b2b用户,那么隐藏checkmo,这个支付方式不能被普通用户选择。

如果重写每个payment method的代码就太麻烦了。

幸好magento给我们提供了一个event为payment_method_is_active。

在events.xml里定义

<event name="payment_method_is_active">
<observer name="yozen_payment_method_is_active" instance="Zou\Test\Observer\CheckPaymentMethod" />
</event>
<event name="payment_method_is_active"> <observer name="yozen_payment_method_is_active" instance="Zou\Test\Observer\CheckPaymentMethod" /> </event>
<event name="payment_method_is_active">
    <observer name="yozen_payment_method_is_active" instance="Zou\Test\Observer\CheckPaymentMethod" />
</event>

然后写php逻辑

在Observer/CheckPaymentMethod.php里

<?php
namespace Zou\Test\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Exception\LocalizedException;
class CheckPaymentMethod implements ObserverInterface {
protected $helper;
public function __construct(
\Zou\Test\Helper\Data $helper
){
$this->helper = $helper;
}
/**
* @param EventObserver $observer
* @return $this
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function execute(\Magento\Framework\Event\Observer $observer) {
$result = $observer->getEvent()->getResult();
$methodInstance = $observer->getEvent()->getMethodInstance();
$code = $methodInstance->getCode();
//$quote = $observer->getEvent()->getQuote();
//echo $code;
if ($this->helper->checkIsB2bCustomer()) {
$result->setData('is_available', false);
if($code == 'checkmo'){
$result->setData('is_available', true);
}
}else{
$result->setData('is_available', true);
if($code == 'checkmo'){
$result->setData('is_available', false);
}
}
return $this;
}
}
<?php namespace Zou\Test\Observer; use Magento\Framework\Event\ObserverInterface; use Magento\Framework\Exception\LocalizedException; class CheckPaymentMethod implements ObserverInterface { protected $helper; public function __construct( \Zou\Test\Helper\Data $helper ){ $this->helper = $helper; } /** * @param EventObserver $observer * @return $this * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function execute(\Magento\Framework\Event\Observer $observer) { $result = $observer->getEvent()->getResult(); $methodInstance = $observer->getEvent()->getMethodInstance(); $code = $methodInstance->getCode(); //$quote = $observer->getEvent()->getQuote(); //echo $code; if ($this->helper->checkIsB2bCustomer()) { $result->setData('is_available', false); if($code == 'checkmo'){ $result->setData('is_available', true); } }else{ $result->setData('is_available', true); if($code == 'checkmo'){ $result->setData('is_available', false); } } return $this; } }
<?php 
namespace Zou\Test\Observer; 
use Magento\Framework\Event\ObserverInterface; 
use Magento\Framework\Exception\LocalizedException;   
class CheckPaymentMethod implements ObserverInterface {     
    protected $helper;     
    public function __construct(         
        \Zou\Test\Helper\Data $helper         
    ){         
        $this->helper = $helper;     
    }     
   /**     
   * @param EventObserver $observer     
   * @return $this     
   * @SuppressWarnings(PHPMD.CyclomaticComplexity)     
   */     
    public function execute(\Magento\Framework\Event\Observer $observer)     {                   
        $result = $observer->getEvent()->getResult();         
        $methodInstance = $observer->getEvent()->getMethodInstance();         
        $code = $methodInstance->getCode();         
        //$quote = $observer->getEvent()->getQuote(); 
        //echo $code;         
       if ($this->helper->checkIsB2bCustomer()) {             
          $result->setData('is_available', false);             
          if($code == 'checkmo'){                 
              $result->setData('is_available', true);             
          }         
       }else{             
          $result->setData('is_available', true);             
          if($code == 'checkmo'){                 
            $result->setData('is_available', false);             
          }         
      }         
      return $this;     
    } 
}

这样就行了

最后于 7月前 被admin编辑 ,原因:
更改状态以发布
0