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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.