Magento 2: eccezione dell'osservatore di eventi non visualizzata sullo schermo


8

Nell'estensione personalizzata, creo un osservatore come questo.

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>

E il mio osservatore:

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

La funzione My Observer viene chiamata, ma non mostra errori personalizzati nella pagina. A parte questo, mostra il mio messaggio in un exception.logfile come questo.

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 

Guarda come mostra il messaggio predefinito. inserisci qui la descrizione dell'immagine


Com'era la tua pagina quando è stato eseguito l'osservatore?
Rendy Eko Prastiyo

Mostra il messaggio predefinito "Impossibile rimuovere l'elemento". instade del messaggio personalizzato. Ora aggiorno il controllo delle domande.
Dhiren Vasoya,

Sei sicuro che pensi di voler eseguire? Come eseguire il debug: prova a inviare l'output al browser come Hello Nasty World!e aggiungi exitper uscire dall'esecuzione del codice sopra la $message = 'blablabla'riga. Se vedi il messaggio, puoi andare al passaggio successivo. Provalo e fammi ora se Hello Nasty World!viene inviato al browser.
Rendy Eko Prastiyo

Sì, se metto l'uscita accanto ad esso, mostra il messaggio sullo schermo. Se lo desideri, ti ho fornito un ordinamento dello schermo.
Dhiren Vasoya,

Che messaggio hai visto? Il Hello nasty Worldo We can't remove the item!qualcos'altro? Fornisci anche lo screenshot.
Rendy Eko Prastiyo

Risposte:


11

Cerco altre cose su questo e alla fine ho trovato la mia soluzione,

Devo solo cambiare il codice dell'osservatore in questo modo.

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

Non lavorando alla mia fine non so perché :)
SURENDER SINGH il

risposta perfetta !!! ha reso la mia giornata. +1 :)
SagarPPanchal,

Messaggio di errore non visualizzato se il carrello è vuoto ..
jafar pinjar

@jafarpinjar cosa stai cercando di fare?
Dhiren Vasoya,

@ DhirenVasoya, scusami se ha funzionato per me
jafar pinjar

4

Aggiorna la tua classe in modo che sia così:

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

Mostra il messaggio sullo schermo, ma rimuove comunque l'oggetto dal carrello. L'obiettivo è se l'osservatore genera l'errore, quindi non rimuove l'articolo dal carrello e mostra il nostro messaggio personalizzato sullo schermo.
Dhiren Vasoya,

sales_quote_remove_itemviene attivato dopo aver rimosso un oggetto. Se vuoi fare un controllo appena prima di rimuovere un oggetto, devi osservare sales_quote_item_delete_before, no sales_quote_remove_item. Aggiornamento <event name="sales_quote_remove_item">del tuo XML a<event name="sales_quote_item_delete_before">
Rendy Eko Prastiyo

sempre lo stesso output. Mostra il messaggio, ma rimuove l'oggetto dal carrello.
Dhiren Vasoya,

Hai pulito e svuotato la cache bin/magento cache:clean && bin/magento cache:flushdopo aver aggiornato il tuo XML?
Rendy Eko Prastiyo

sì,
eseguo il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.