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


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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.