Magento 2:イベントオブザーバーの例外が画面に表示されない


8

カスタム拡張では、このようにオブザーバーを作成しています。

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>

そして私の観察者:

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

オブザーバー関数が呼び出されましたが、ページにカスタムエラーが表示されません。これのInstadeはそれがこのexception.logようなファイルに私のメッセージを示しています。

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 

デフォルトのメッセージがどのように表示されるかを確認してください。 ここに画像の説明を入力してください


オブザーバーが実行されたとき、あなたのページはどのように見えましたか?
Rendy Eko Prastiyo 2017

デフォルトのメッセージ「アイテムを削除できません」が表示されます。カスタムメッセージのinstade。質問チェックを今すぐ更新します。
Dhiren Vasoya 2017

実行したい思考が実行されますか?デバッグ方法:のようにブラウザーに出力を送信Hello Nasty World!して追加exitし、$message = 'blablabla'行の上のコード実行を終了します。メッセージが表示された場合は、次のステップに進むことができます。試してみてHello Nasty World!、ブラウザに送信された場合は、今すぐ許可してください。
Rendy Eko Prastiyo 2017

はい、その横にexitを配置すると、画面にメッセージが表示されます。あなたが望むなら、私はスクリーンソートを提供しました。
Dhiren Vasoya 2017

どのメッセージを見ましたか?Hello nasty WorldまたはWe can't remove the item!または他の何か?スクリーンショットも提供してください。
Rendy Eko Prastiyo 2017

回答:


11

私はこれについていくつかのことを検索し、最終的に私の解決策を見つけました、

このようにオブザーバーコードを変更するだけです。

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

私の終わりで働いていない理由はわからない:)
SURENDER SINGH 2017年

完璧な答え!!! 私の日を作りました。+1 :)
SagarPPanchal 2018

カートは空である場合は、エラーメッセージが表示されない...
ジャファルpinjar

@jafarpinjarあなたが何をしようとしているのですか?
Dhiren Vasoya

@DhirenVasoya、ごめんなさい
jafar pinjar 19/07/12

4

クラスを次のように更新します。

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

画面にメッセージが表示されますが、それでもカートからアイテムが削除されます。目標は、オブザーバーがエラーを生成した場合、カートからアイテムを削除せず、画面にカスタムメッセージを表示することです。
Dhiren Vasoya 2017

sales_quote_remove_itemアイテムを削除した後に発生します。アイテムを削除する直前にチェックを行いたい場合はsales_quote_item_delete_before、ではなく、監視する必要がありsales_quote_remove_itemます。<event name="sales_quote_remove_item">xmlを次のように更新します<event name="sales_quote_item_delete_before">
Rendy Eko Prastiyo 2017

まだ同じ出力。メッセージを表示しますが、カートからアイテムを削除します。
Dhiren Vasoya 2017

bin/magento cache:clean && bin/magento cache:flushxmlを更新した後、キャッシュを消去してフラッシュしましたか?
Rendy Eko Prastiyo 2017

はい、コマンドを実行します
Dhiren Vasoya 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.