messageManagerを使用してリダイレクト後にエラーを表示する方法


23

Postアクションを処理してリダイレクトするモジュールがあります。

現在、エラーのケースがあり、それらのメッセージをユーザーに表示したいと思います。

このコードがメッセージをセッションに追加することは既に知っています。

$this->messageManager->addError(
   $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message)
);

しかし、レンダリングをトリガーする方法がわかりません。

現在、別のアクションを実行するときにのみ表示されます。アクションは、これを既に使用しています。

たとえば、間違ったパスワードでのログインなど。


この問題の解決策はありますか?
Shaheerアリ

1
組み込みのチェック機能が既にあります。私の答えを見てください:magento.stackexchange.com/a/219143/33057
Khoa TruongDinh

このコードはどこに追加されますか?
スダカールアルナチャラム

回答:


22

urモジュールアクションクラスでオブジェクトインジェクションメソッドを使用して、メッセージマネージャーオブジェクトをインジェクトする必要があります。それが役に立てば幸い

class Example
{
    protected $_messageManager;

    public function __construct(
        \Magento\Framework\Message\ManagerInterface $messageManager
    ) {
        $this->_messageManager = $messageManager;
    }

    public function method( ) {
        ..
        $message = '...';
        $this->_messageManager->addError($message);
        ..
    }
}

getError関数はありますか?私はメッセージを取得したい
ジャファルpinjar

1
addErrorこの方法は推奨されません、今addErrorMessageする必要があります
ジャミル

@jafarpinjarいや。翻訳で変更しますが、翻訳で変更できない場合は、イベントオブザーバーでエラーメッセージを取得し、そこで操作できます。
Karvin Ong

@jamilはい、同意しました。addErrorは減価されていますが、ver 2.3.1で引き続きサポートされています:)
Karvin Ong

6

これがあなたが探しているものかどうかはわかりませんが、試してみます。
次のようなメッセージを取得できます。

$messages = $this->messageManager->getMessages(true);  

どこmessageManagerのインスタンスです\Magento\Framework\Message\ManagerInterface

コアでは、これはajax呼び出しに使用され、次のようにJSON応答でエラーメッセージを返します(\Magento\Catalog\Controller\Adminhtml\Category\Move)。

$block = $this->layoutFactory->create()->getMessagesBlock();
...
$block->setMessages($this->messageManager->getMessages(true));
$resultJson = $this->resultJsonFactory->create();

return $resultJson->setData([
    'messages' => $block->getGroupedHtml(),
    'error' => $error
]);

出力を伴うアクションの場合、何もすべきではありません(私は思う)。モジュールのdefault.xmlレイアウトファイルには、メッセージを処理するMagento_Themeこのブロック<block class="Magento\Framework\View\Element\Messages" name="messages" as="messages" template="Magento_Theme::messages.phtml"/>が既に含まれています。

[サイドノート]:を
使用しないでください$this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message)。コンストラクタにのインスタンスを注入し、Magento\Framework\Escaperそれを使用します。


loginPostアクションもこれをトリガーすることができ、この後にログインページへのリダイレクトを行い、それを表示します。私もそうです。Ajaxも、同じページもありません。
フライングマナ

それが私が言ったことです...これはデフォルトで処理されるべきです。変更を加える必要はありません。セッションメッセージは次のページに表示されます。
マリウス

2
そして、それが私がこの質問をする理由です。そうではないからです。同じページ(ログイン)にリダイレクトすることもあるので、明らかに追加のステップが必要です。私が言ったように、ログインページでも、自分のメッセージを投稿するログインを試みた後にのみ私のメッセージが表示されます
-Flyingmana

1
OK。もっと深く掘り下げます。これは私には奇妙に見えます。
マリウス

1
@Flyingmana。何かを見つけました。セッションメッセージは、が呼び出された後に取得され/customer/section/load/ます。たぶんそれが役立ちます。
マリウス

4

また、$contextアクションコンストラクターに挿入されることにより、アクセス可能なメッセージマネージャーを見つけることができます。

class yourAction extends \Magento\Framework\App\Action\Action
{
    /** var ... */
    protected $_messageManager;

    public function __construct(Context $context)
    {
        $this->_messageManager = $context->getMessageManager();
        parent::__construct($context);
    }

次に、上記の回答に記載されているとおりに使用します

$ this-> _ messageManager-> addError($ message);

それが役に立てば幸い


2

私にとって、非JSの方法でメッセージを表示したい場合は、メッセージに特別なブロックを追加する必要があるようです。

たとえば、Magento \ Checkout \ view \ frontend \ layout \ checkout_cart_index.xmlには次のものがあります。

<referenceContainer name="page.messages">
    <block class="Magento\Checkout\Block\Cart\ValidationMessages" name="checkout.cart.validationmessages"/>
</referenceContainer>

Magento\Checkout\Block\Cart\ValidationMessagesblockは\Magento\Framework\View\Element\Messages、メッセージのレンダリングを担当するコアブロックを拡張します。

で定義されてdefault.xmlいるブロックは、私が信じているJSメッセージ専用です。


どのように追加しcheckout_index_index.xmlますか?
スティービーG

1

を見てみましょう

vendor / magento / module-customer / view / frontend / web / js / customer-data.js

/**
 * Events listener
 */
$(document).on('ajaxComplete', function (event, xhr, settings) {
    var sections,
        redirects;

    if (settings.type.match(/post|put/i)) {
        sections = sectionConfig.getAffectedSections(settings.url);

        if (sections) {
            customerData.invalidate(sections);
            redirects = ['redirect', 'backUrl'];

            if (_.isObject(xhr.responseJSON) && !_.isEmpty(_.pick(xhr.responseJSON, redirects))) {
                return;
            }
            customerData.reload(sections, true);
        }
    }
});

ご覧のとおり、組み込みのチェック機能が既にあります。応答にキーワードが含まれている場合:'redirect', 'backUrl'、リダイレクト後にメッセージが読み込まれます。

  • Ajaxが完了すると、顧客は無効になります。これは、「トリガー」リロードメッセージセッションになります。
  • キーワードの確認:'redirect', 'backUrl'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.