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

问题描述 投票:0回答:2

我在 Magento 2 中创建了新表,用于存储自定义 promorules,现在我已经为事件

controller_action_predispatch_checkout_cart_couponPost
创建了观察者,在该观察者中我想检查用户是否输入了任何自定义规则,然后根据该规则应用折扣。

下面是我的代码:

<?php
namespace Webkul\Grid\Observer;

use Magento\Framework\Event\ObserverInterface;

class coupenAppliedAfter implements ObserverInterface
{
    /**
     * @var ObjectManagerInterface
     */
    protected $_objectManager;

    /**
     * @param \Magento\Framework\ObjectManagerInterface $objectManager
     */
    public function __construct(
        \Magento\Framework\ObjectManagerInterface $objectManager
    ) {
        $this->_objectManager = $objectManager;
    }

    /**
     * customer register event handler
     *
     * @param \Magento\Framework\Event\Observer $observer
     * @return void
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        // get enetered coupen code
        $controller = $observer->getControllerAction();
        $couponCode = $controller->getRequest()->getParam('coupon_code');

        $objectManager =   \Magento\Framework\App\ObjectManager::getInstance();
        $connection = $objectManager->get('Magento\Framework\App\ResourceConnection')->getConnection('\Magento\Framework\App\ResourceConnection::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

请为此提出解决方案。

php magento2 observers magento2.1 cart-rules
2个回答
0
投票

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

我还将把 $result 的初始化移到 foreach 语句上方。


0
投票

问题是您尝试使用的结果未作为参数传递给控制器预调度事件

$observer->getEvent()->getResult(); // always null.

如果您检查触发预补丁事件的前端控制器

vendor/magento/framework/App/FrontController.php

您会注意到两个对象被传递给事件:

['controller_action' => $subject, 'request' => $this->request];

我认为您对插件感到困惑,它们可以从插入的方法中提供 $result,而事件可以通过事件调度程序将不同的参数传递给它们。

© www.soinside.com 2019 - 2024. All rights reserved.