m2 控制前台payment method显示隐藏

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

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>

然后写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;     
    } 
}

这样就行了

最后于 7月前 被admin编辑 ,原因:
编辑问题
0