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


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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.