Magento 2: Ngoại lệ của trình quan sát sự kiện không hiển thị trên màn hình


8

Trong phần mở rộng tùy chỉnh, tôi tạo người quan sát như thế này.

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>

Và người quan sát của tôi:

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

Chức năng Observer của tôi được gọi, nhưng nó không hiển thị lỗi tùy chỉnh trên trang. Ngay lập tức, nó hiển thị thông điệp của tôi trong exception.logtập tin như thế này.

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 

Xem cách nó hiển thị thông báo mặc định. nhập mô tả hình ảnh ở đây


Trang của bạn trông như thế nào khi người quan sát được thực thi?
Rendy Eko Prastiyo

Nó hiển thị thông báo mặc định "Chúng tôi không thể xóa mục này." xâm nhập tin nhắn tùy chỉnh. Tôi cập nhật kiểm tra câu hỏi ngay bây giờ.
Dhiren Vasoya

Bạn có chắc rằng suy nghĩ bạn muốn thực hiện được thực thi? Cách gỡ lỗi: hãy thử gửi đầu ra tới trình duyệt thích Hello Nasty World!và thêm exitđể thoát thực thi mã phía trên $message = 'blablabla'dòng. Nếu bạn thấy thông báo, thì bạn có thể chuyển sang bước tiếp theo. Hãy thử nó và cho tôi ngay bây giờ nếu Hello Nasty World!nó được gửi đến trình duyệt.
Rendy Eko Prastiyo

Có, nếu tôi đặt lối ra bên cạnh, nó sẽ hiển thị thông báo trên màn hình. Nếu bạn muốn thì tôi cung cấp sắp xếp màn hình.
Dhiren Vasoya

Bạn đã thấy tin nhắn gì? Cái Hello nasty Worldhay We can't remove the item!cái gì khác? Vui lòng cung cấp ảnh chụp màn hình.
Rendy Eko Prastiyo

Câu trả lời:


11

Tôi tìm kiếm thêm một số thứ về điều này và cuối cùng tìm thấy giải pháp của tôi,

Tôi chỉ cần thay đổi mã quan sát như thế này.

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

Không làm việc ở cuối của tôi không biết tại sao :)
SURENDER SINGH

câu trả lời hoàn hảo!!! làm cho ngày của tôi +1 :)
SagarPPanchal

Thông báo lỗi không hiển thị nếu giỏ hàng trống ..
jafar pinjar

@jafarpinjar bạn đang cố gắng làm gì?
Dhiren Vasoya

@ DhirenVasoya, xin lỗi, nó hoạt động với tôi
jafar pinjar

4

Cập nhật lớp học của bạn để được như thế này:

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

Nó hiển thị thông báo trên màn hình, nhưng nó vẫn xóa mục khỏi giỏ hàng. Mục tiêu là nếu người quan sát tạo ra lỗi thì nó không xóa mục khỏi giỏ hàng và hiển thị thông báo tùy chỉnh của chúng tôi trên màn hình.
Dhiren Vasoya

sales_quote_remove_itembị sa thải sau khi bạn loại bỏ một mục. Nếu bạn muốn làm một kiểm tra ngay trước khi loại bỏ một mục, bạn phải quan sát sales_quote_item_delete_before, không sales_quote_remove_item. Cập nhật <event name="sales_quote_remove_item">xml của bạn lên<event name="sales_quote_item_delete_before">
Rendy Eko Prastiyo

vẫn đầu ra như cũ. Nó hiển thị thông báo, nhưng loại bỏ các mục từ giỏ hàng.
Dhiren Vasoya

Bạn đã dọn dẹp và xóa bộ nhớ cache bin/magento cache:clean && bin/magento cache:flushsau khi cập nhật xml của mình chưa?
Rendy Eko Prastiyo

vâng, tôi chạy lệnh
Dhiren Vasoya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.