Magento 2: исключение наблюдателя событий не отображается на экране

8

В пользовательском расширении я создаю обозреватель, как это.

app\code\Vendor\Extension\etc\frontend\events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="sales_quote_remove_item">
    <observer name="sales_quote_remove_item_handler" instance="Vendor\Extension\Observer\RemovecartbeforeObserver" shared="false" />
  </event>
</config>

И мой наблюдатель:

app\code\Vendor\Extension\Observer\RemovecartbeforeObserver.php

use Magento\Framework\Event\ObserverInterface;

class RemovecartbeforeObserver implements ObserverInterface
{
   public function execute(\Magento\Framework\Event\Observer $observer)
   {
       // HERE IS MY CODE
       $message = "THIS IS CUSTOM ERROR MESSAGE";
       throw new \Magento\Framework\Exception\LocalizedException(__($message));
       return;
    }
 }

Вызвана функция My Observer, но она не отображает пользовательскую ошибку на странице. Instade этого показывает мое сообщение в exception.logфайле, как это.

main.CRITICAL: exception 'Magento\Framework\Exception\LocalizedException' with message 'THIS IS CUSTOM ERROR MESSAGE' in E:\xampp\htdocs\myworks\magento213\app\code\Vendor\Extension\Observer\RemovecartbeforeObserver.php:106 

Посмотрите, как он показывает сообщение по умолчанию. введите описание изображения здесь

Дирен Васоя
источник
Как выглядела ваша страница, когда наблюдатель был казнен?
Ренди Эко Прастийо,
По умолчанию отображается сообщение «Мы не можем удалить элемент». вместо обычного сообщения. Я обновляю проверку вопроса сейчас.
Дирен Васоя
Вы уверены, что мысль, которую вы хотите выполнить, выполнена? Как отлаживать: попробуйте отправить вывод в браузер, как Hello Nasty World!и добавить, exitчтобы выйти из кода выполнения над $message = 'blablabla'строкой. Если вы видите сообщение, то вы можете перейти к следующему шагу. Попробуйте и дайте мне сейчас, если Hello Nasty World!отправлено в браузер.
Ренди Эко Прастийо
Да, если я поставлю выход рядом с ним, он покажет сообщение на экране. Если хотите, то я предоставил сортировку экрана.
Дирен Васоя
Какое сообщение вы видели? Hello nasty WorldИли We can't remove the item!или что - то еще? Пожалуйста, предоставьте также скриншот.
Ренди Эко Прастийо,

Ответы:

11

Я ищу еще кое-что по этому поводу и наконец нашел свое решение,

Мне нужно просто изменить код наблюдателя, как это.

app\code\Vendor\Extension\Observer\RemovecartbeforeObserver.php

use Magento\Framework\Event\ObserverInterface;

class RemovecartbeforeObserver implements ObserverInterface
{
   protected $messageManager;
   protected $_responseFactory;
   protected $_url;

    public function __construct(\Magento\Framework\Message\ManagerInterface $messageManager,
    \Magento\Framework\App\ResponseFactory $responseFactory,
    \Magento\Framework\UrlInterface $url)
   {
       $this->messageManager = $messageManager;
       $this->_responseFactory = $responseFactory;
       $this->_url = $url;
   }

   public function execute(\Magento\Framework\Event\Observer $observer)
   {
       // HERE IS MY CODE
       $message = "THIS IS CUSTOM ERROR MESSAGE";
       $this->messageManager->addError($message);
       $cartUrl = $this->_url->getUrl('checkout/cart/index');
       $this->_responseFactory->create()->setRedirect($cartUrl)->sendResponse();            
       exit;
    }
 }
Дирен Васоя
источник
Не работает в моем конце, не знаю почему :)
SURENDER SINGH
идеальный ответ !!! сделал мой день. +1 :)
SagarPPanchal
Сообщение об ошибке не отображается, если корзина пуста ..
Джафар Пинджар
@jafarpinjar что ты пытаешься сделать?
Дирен Васоя
@ DhirenVasoya, извините, это работает для меня
Джафар Пинджар
4

Обновите свой класс, чтобы он был таким:

use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;
use Magento\Framework\Message\ManagerInterface as MessageManagerInterface;
use Magento\Framework\Controller\Result\RedirectFactory;

class RemovecartbeforeObserver implements ObserverInterface
{
    protected $messageManager;
    protected $redirectFactory;

    public function __construct(
        MessageManagerInterface $messageManager,
        RedirectFactory $redirectFactory
    ) {
        $this->messageManager = $messageManager;
        $this->redirectFactory = $redirectFactory;
    }

    public function execute(Observer $observer)
    {
        $observer->getRequest()->setParam('item', false);

        $message = "THIS IS CUSTOM ERROR MESSAGE";
        $this->messageManager->addError($message);

        return $this->redirectFactory->create()->setPath('*/*/');
    }
}
Ренди Эко Прастийо
источник
Он показывает сообщение на экране, но все равно удаляет товар из корзины. Цель состоит в том, что если наблюдатель сгенерирует ошибку, он не удалит товар из корзины и не покажет наше пользовательское сообщение на экране.
Дирен Васоя
sales_quote_remove_itemсрабатывает после удаления предмета. Если вы хотите сделать проверку непосредственно перед удалением какого-либо предмета, вы должны соблюдать sales_quote_item_delete_before, а не sales_quote_remove_item. Обновление <event name="sales_quote_remove_item">вашего xml до<event name="sales_quote_item_delete_before">
Ренди Эко Прастийо,
все тот же вывод. Он показывает сообщение, но удаляет товар из корзины.
Дирен Васоя
Вы очистили и очистили кеш bin/magento cache:clean && bin/magento cache:flushпосле обновления вашего xml?
Ренди Эко Прастийо,
да, я управляю командой
Dhiren Vasoya