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.