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.