使用Magento 2中的观察者应用自定义促销规则



我已经在Magento 2中创建了新表格,用于存储自定义提议,现在我为事件controller_action_predispatch_checkout_cart_couponPost创建了观察者,在该观察者内部,我想检查用户是否已输入任何自定义规则,然后应用根据该规则的折扣。

以下是我的代码:

<?php
namespace WebkulGridObserver;
use MagentoFrameworkEventObserverInterface;
class coupenAppliedAfter implements ObserverInterface
{
    /**
     * @var ObjectManagerInterface
     */
    protected $_objectManager;
    /**
     * @param MagentoFrameworkObjectManagerInterface $objectManager
     */
    public function __construct(
        MagentoFrameworkObjectManagerInterface $objectManager
    ) {
        $this->_objectManager = $objectManager;
    }
    /**
     * customer register event handler
     *
     * @param MagentoFrameworkEventObserver $observer
     * @return void
     */
    public function execute(MagentoFrameworkEventObserver $observer)
    {
        // get enetered coupen code
        $controller = $observer->getControllerAction();
        $couponCode = $controller->getRequest()->getParam('coupon_code');
        $objectManager =   MagentoFrameworkAppObjectManager::getInstance();
        $connection = $objectManager->get('MagentoFrameworkAppResourceConnection')->getConnection('MagentoFrameworkAppResourceConnection::DEFAULT_CONNECTION'); 
        // get list of coupon codes from that custom table
        $all_custom_codes = $connection->fetchAll("SELECT * FROM custom_promotion_rules");
        foreach($all_custom_codes as $code) {
            $db_coupen_code = $code['code'];
            // matching if user has entered any custom code 
            if($couponCode == $db_coupen_code) {
                // if yes trying to apply custom discount
                $DiscountAmount = $code['discount_amount'];
                $result = $observer->getEvent()->getResult();
                $result->setAmount($DiscountAmount);
                $result->setBaseAmount($DiscountAmount); 
            }
        }
    }
}

,但以上代码不起作用,并且给出错误 Fatal error: Uncaught Error: Call to a member function setAmount() on null

请为此建议解决方案。

$结果为null。您是否要手动运行此功能?如果是,那可能是您的问题,因为$ observer将是空的或空的。

我还将在foreach语句上方移动$结果的初始化。

最新更新