Magento 2: Pengecualian Event Observer Tidak Ditampilkan di Layar

8

Dalam ekstensi khusus, saya membuat pengamat seperti ini.

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>

Dan Pengamat Saya:

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

Fungsi Pengamat Saya dipanggil, tetapi tidak menunjukkan kesalahan khusus pada halaman. Instade ini menunjukkan pesan saya di exception.logfile seperti ini.

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 

Lihat bagaimana ini menampilkan pesan default. masukkan deskripsi gambar di sini

Dhiren Vasoya
sumber
Bagaimana tampilan halaman Anda ketika pengamat dieksekusi?
Rendy Eko Prastiyo
Ini menunjukkan pesan default "Kami tidak dapat menghapus item." instade pesan khusus. Saya memperbarui cek pertanyaan sekarang.
Dhiren Vasoya
Apakah Anda yakin pemikiran yang ingin Anda jalankan dieksekusi? Cara debug: coba kirim keluaran ke browser seperti Hello Nasty World!dan tambahkan exituntuk keluar dari eksekusi kode di atas $message = 'blablabla'baris. Jika Anda melihat pesannya, maka Anda dapat pergi ke langkah berikutnya. Coba dan biarkan saya sekarang jika Hello Nasty World!dikirim ke browser.
Rendy Eko Prastiyo
Ya, jika saya keluar di sampingnya, itu akan menampilkan pesan di layar. Jika Anda mau maka saya menyediakan semacam layar.
Dhiren Vasoya
Pesan apa yang kamu lihat? The Hello nasty Worldatau We can't remove the item!atau sesuatu yang lain? Harap berikan tangkapan layar.
Rendy Eko Prastiyo

Jawaban:

11

Saya mencari beberapa hal lagi dan akhirnya menemukan solusi saya,

Saya hanya perlu mengubah kode pengamat seperti ini.

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
sumber
Tidak bekerja pada akhirnya saya tidak tahu mengapa :)
SURENDER SINGH
jawaban sempurna !!! membuatku bahagia. +1 :)
SagarPPanchal
Pesan kesalahan tidak menunjukkan apakah keranjang kosong ..
jafar pinjar
@jafarpinjar apa yang Anda coba lakukan?
Dhiren Vasoya
@ DhirenVasoya, maaf ini berfungsi untuk saya
jafar pinjar
4

Perbarui kelas Anda menjadi seperti ini:

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
sumber
Ini menampilkan pesan di layar, tetapi tetap menghapus item dari keranjang. Tujuannya adalah jika pengamat menghasilkan kesalahan maka itu tidak menghapus item dari keranjang dan menampilkan pesan khusus kami di layar.
Dhiren Vasoya
sales_quote_remove_itemdipecat setelah Anda menghapus item. Jika Anda ingin melakukan pemeriksaan sebelum menghapus item, Anda harus memperhatikan sales_quote_item_delete_before, bukan sales_quote_remove_item. Perbarui <event name="sales_quote_remove_item">xml Anda ke<event name="sales_quote_item_delete_before">
Rendy Eko Prastiyo
output masih sama. Ini menunjukkan pesan, tetapi hapus item dari keranjang.
Dhiren Vasoya
Sudahkah Anda membersihkan & membersihkan cache bin/magento cache:clean && bin/magento cache:flushsetelah memperbarui xml Anda?
Rendy Eko Prastiyo
ya, saya menjalankan perintah
Dhiren Vasoya