重定向后如何使用messageManager显示错误


23

我有一个模块,该模块处理Post操作,然后重定向。

现在有错误的情况,我想向用户显示有关它们的消息。

我已经知道,此代码将消息添加到会话中。

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

但是我看不到如何触发渲染。

当前仅在我执行另一个操作时才显示,该操作已经以一种有效的方式使用了它。

例如使用错误的密码登录。


您找到此问题的任何解决方案吗?
沙赫尔·阿里

1
已经有一个内置的检查功能。看到我的答案:magento.stackexchange.com/a/219143/33057
Khoa TruongDinh,

此代码在何处添加?
SUDHAKAR ARUNACHALAM

Answers:


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函数吗?我想获取消息
贾法尔·派贾尔(Jafar Pinjar),

1
addError方法已过时,现在应该是addErrorMessage
jamil

@jafarpinjar,不。我会在翻译中进行更改,但是如果无法在翻译中进行更改,则可以通过事件观察器获取错误消息并在那里进行操作。

@jamil,同意。addError已弃用,但在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,没有同一页。
Flyingmana

这就是我说的...应默认处理。您无需进行任何更改。会话消息应显示在下一页上。
马吕斯

2
这就是为什么我要问这个问题。因为不是。我什至重定向到同一页面(登录),因此显然需要执行其他步骤。正如我所说,即使在登录页面上,我的消息也只有在我尝试登录后才显示,该登录发布了自己的消息
Flyingmana 2015年

1
好。我会更深入。这在我看来很奇怪。
马里乌斯

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\ValidationMessages块扩展了\Magento\Framework\View\Element\Messages负责渲染消息的核心块。

default.xml我相信,其中定义的块仅适用于JS消息。


您如何将其添加到checkout_index_index.xml
Stevie G

1

看一眼

供应商/ magento /模块客户/视图/前端/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'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.