Magento 2: la excepción del observador de eventos no se muestra en la pantalla


8

En extensión personalizada, creo un observador como este.

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>

Y mi observador:

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;
    }
 }

Se llama a mi función Observador, pero no muestra un error personalizado en la página. Instade esto, muestra mi mensaje en un exception.logarchivo como este.

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 

Vea cómo muestra el mensaje predeterminado. ingrese la descripción de la imagen aquí


¿Cómo se veía tu página cuando el observador fue ejecutado?
— Rendy Eko Prastiyo

Muestra el mensaje predeterminado "No podemos eliminar el elemento". instade de mensaje personalizado. Actualizo la comprobación de preguntas ahora.
— Dhiren Vasoya

¿Estás seguro de que se ejecuta el pensamiento que quieres ejecutar? Cómo depurar: intente enviar la salida al navegador como Hello Nasty World!y agregue exitpara salir de la ejecución del código sobre la $message = 'blablabla'línea. Si ve el mensaje, puede ir al siguiente paso. Pruébalo y déjame ahora si Hello Nasty World!se envía al navegador.
— Rendy Eko Prastiyo

Sí, si pongo salir al lado, muestra el mensaje en la pantalla. Si lo desea, proporcioné la clasificación de pantalla.
— Dhiren Vasoya

¿Qué mensaje viste? ¿El Hello nasty Worldo We can't remove the item!algo más? Proporcione también la captura de pantalla.
— Rendy Eko Prastiyo

Respuestas:


11

Busqué algunas cosas más en esto y finalmente encontré mi solución,

Solo necesito cambiar el código de observador de esta manera.

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;
    }
 }

No funciona a mi fin, no sé por qué :)
— ENTREGA SINGH

¡¡¡Respuesta perfecta!!! me alegró el día. +1 :)
— SagarPPanchal

Mensaje de error no se muestra si la compra está vacía ..
— Jafar Pinjar

@jafarpinjar, ¿qué intentas hacer?
— Dhiren Vasoya

@ DhirenVasoya, lo siento, me está funcionando
— jafar pinjar

4

Actualiza tu clase para que sea así:

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('*/*/');
    }
}

Muestra el mensaje en la pantalla, pero aún así elimina el artículo del carrito. El objetivo es que si el observador genera el error, no elimina el artículo del carrito y muestra nuestro mensaje personalizado en la pantalla.
— Dhiren Vasoya

sales_quote_remove_itemse dispara después de eliminar un elemento. Si desea hacer una verificación justo antes de eliminar un elemento, debe observar que sales_quote_item_delete_beforeno sales_quote_remove_item. Actualización <event name="sales_quote_remove_item">de su xml a<event name="sales_quote_item_delete_before">
— Rendy Eko Prastiyo

sigue siendo la misma salida. Muestra el mensaje, pero elimina el artículo del carrito.
— Dhiren Vasoya

¿Ha limpiado y vaciado el caché bin/magento cache:clean && bin/magento cache:flushdespués de actualizar su xml?
— Rendy Eko Prastiyo

sí, ejecuto el comando
— Dhiren Vasoya
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.