Magento 2: exception Observateur d'événements ne s'affiche pas à l'écran

8

Dans l'extension personnalisée, je crée un observateur comme celui-ci.

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>

Et mon observateur:

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

Ma fonction Observateur est appelée, mais elle n'affiche pas d'erreur personnalisée sur la page. Instade de cela, il affiche mon message dans un exception.logfichier comme celui-ci.

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 

Voyez comment il affiche le message par défaut. entrez la description de l'image ici

Dhiren Vasoya
la source
À quoi ressemblait votre page lorsque l'observateur a été exécuté?
Rendy Eko Prastiyo
Il affiche le message par défaut «Nous ne pouvons pas supprimer l'élément». instade de message personnalisé. Je mets à jour la vérification des questions maintenant.
Dhiren Vasoya
Êtes-vous sûr que la réflexion que vous souhaitez exécuter est exécutée? Comment déboguer: essayez d'envoyer la sortie au navigateur comme Hello Nasty World!et ajoutez exitpour quitter l'exécution du code au-dessus de la $message = 'blablabla'ligne. Si vous voyez le message, vous pouvez passer à l'étape suivante. Essayez-le et laissez-moi maintenant si le Hello Nasty World!est envoyé au navigateur.
Rendy Eko Prastiyo
Oui, si je mets exit à côté, il affichera un message à l'écran. Si vous le souhaitez, j'ai fourni un tri par écran.
Dhiren Vasoya
Quel message avez-vous vu? Le Hello nasty Worldou We can't remove the item!ou autre chose? Veuillez également fournir la capture d'écran.
Rendy Eko Prastiyo

Réponses:

11

Je cherche encore plus de choses là-dessus et j'ai finalement trouvé ma solution,

Je dois juste changer le code d'observateur comme ça.

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;
    }
 }
Dhiren Vasoya
la source
Ne fonctionne pas de mon côté, je ne sais pas pourquoi :)
SURENDER SINGH
réponse parfaite !!! fait ma journée. +1 :)
SagarPPanchal
Message d'erreur ne montrant pas si le panier est vide ..
jafar pinjar
@jafarpinjar ce que vous essayez de faire?
Dhiren Vasoya
@ DhirenVasoya, désolé que ça marche pour moi
jafar pinjar
4

Mettez à jour votre classe pour qu'elle ressemble à ceci:

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('*/*/');
    }
}
Rendy Eko Prastiyo
la source
Il affiche un message à l'écran, mais il supprime toujours l'article du panier. Le but est que si l'observateur génère l'erreur, il ne supprime pas l'article du panier et affiche notre message personnalisé à l'écran.
Dhiren Vasoya
sales_quote_remove_itemest renvoyé après avoir supprimé un élément. Si vous souhaitez effectuer une vérification juste avant de supprimer un élément, vous devez observer sales_quote_item_delete_before, non sales_quote_remove_item. Mise à jour <event name="sales_quote_remove_item">de votre xml vers<event name="sales_quote_item_delete_before">
Rendy Eko Prastiyo
toujours la même sortie. Il affiche un message, mais supprime l'article du panier.
Dhiren Vasoya
Avez-vous nettoyé et vidé le cache bin/magento cache:clean && bin/magento cache:flushaprès la mise à jour de votre xml?
Rendy Eko Prastiyo
oui, je lance la commande
Dhiren Vasoya