Magento 2: Event Observer-Ausnahme wird nicht auf dem Bildschirm angezeigt

8

In der benutzerdefinierten Erweiterung erstelle ich einen solchen Beobachter.

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>

Und mein Beobachter:

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

Meine Observer-Funktion wird aufgerufen, zeigt jedoch keinen benutzerdefinierten Fehler auf der Seite an. In diesem Fall wird meine Nachricht in einer solchen exception.logDatei angezeigt .

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 

Sehen Sie, wie die Standardnachricht angezeigt wird. Geben Sie hier die Bildbeschreibung ein

Dhiren Vasoya
quelle
Wie sah Ihre Seite aus, als der Beobachter ausgeführt wurde?
Rendy Eko Prastiyo
Es wird die Standardmeldung "Wir können den Artikel nicht entfernen." Angezeigt. Instade der benutzerdefinierten Nachricht. Ich aktualisiere jetzt die Fragenprüfung.
Dhiren Vasoya
Sind Sie sicher, dass der Gedanke, den Sie ausführen möchten, ausgeführt wird? So debuggen Sie: Versuchen Sie, eine Ausgabe an einen Browser zu senden, Hello Nasty World!und fügen Sie hinzu exit, um die Codeausführung über der $message = 'blablabla'Zeile zu beenden. Wenn Sie die Nachricht sehen, können Sie mit dem nächsten Schritt fortfahren. Probieren Sie es aus und lassen Sie mich jetzt, wenn das Hello Nasty World!an den Browser gesendet wird.
Rendy Eko Prastiyo
Ja, wenn ich den Ausgang daneben stelle, wird die Meldung auf dem Bildschirm angezeigt. Wenn Sie möchten, habe ich eine Bildschirmsortierung bereitgestellt.
Dhiren Vasoya
Welche Nachricht hast du gesehen? Das Hello nasty Worldoder We can't remove the item!oder etwas anderes? Bitte geben Sie auch den Screenshot an.
Rendy Eko Prastiyo

Antworten:

11

Ich suche noch ein paar Dinge dazu und habe endlich meine Lösung gefunden,

Ich muss nur den Beobachtercode so ändern.

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
quelle
Ich arbeite nicht an meinem Ende und weiß nicht warum :)
SURENDER SINGH
perfekte Antwort!!! meinen Tag gerettet. +1 :)
SagarPPanchal
Fehlermeldung nicht
angezeigt
@jafarpinjar was versuchst du zu tun?
Dhiren Vasoya
@ DhirenVasoya, tut mir leid, dass es für mich funktioniert
jafar pinjar
4

Aktualisieren Sie Ihre Klasse so:

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
quelle
Es zeigt eine Meldung auf dem Bildschirm an, entfernt jedoch den Artikel aus dem Warenkorb. Das Ziel ist, wenn der Beobachter den Fehler generiert, den Artikel nicht aus dem Warenkorb entfernt und unsere benutzerdefinierte Meldung auf dem Bildschirm angezeigt wird.
Dhiren Vasoya
sales_quote_remove_itemwird ausgelöst, nachdem Sie einen Gegenstand entfernt haben. Wenn Sie kurz vor dem Entfernen eines Elements eine Überprüfung durchführen möchten, müssen Sie dies sales_quote_item_delete_beforenicht beachten sales_quote_remove_item. Update <event name="sales_quote_remove_item">Ihrer XML auf<event name="sales_quote_item_delete_before">
Rendy Eko Prastiyo
immer noch die gleiche Ausgabe. Es zeigt Nachricht, aber Artikel aus dem Warenkorb entfernen.
Dhiren Vasoya
Haben Sie den Cache bin/magento cache:clean && bin/magento cache:flushnach dem Aktualisieren Ihrer XML-Datei bereinigt und geleert?
Rendy Eko Prastiyo
Ja, ich
führe