Como usar o messageManager para mostrar um erro após o redirecionamento

23

Eu tenho um módulo que processa uma ação Post e, em seguida, redireciona.

Agora, existem casos de erro e eu gostaria de mostrar mensagens para eles aos usuários.

Eu já sei que esse código adiciona a mensagem à sessão.

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

Mas não vejo como acionar a renderização.

Atualmente, isso só é mostrado quando executo outra ação, que já a utiliza de maneira funcional.

Como por exemplo o login com senha errada.

Flyingmana
fonte
você encontra alguma solução para esse problema?
Shaheer Ali
1
já existe uma função de verificação interna. Veja a minha resposta: magento.stackexchange.com/a/219143/33057
Khoa TruongDinh
este código onde é adicionado?
SUDHAKAR ARUNACHALAM

Respostas:

22

Você precisa usar o método de injeção de objeto em sua classe de ação do módulo para injetar o objeto do gerenciador de mensagens nele, forneci um exemplo do que você pode fazer. Espero que ajude

class Example
{
    protected $_messageManager;

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

    public function method( ) {
        ..
        $message = '...';
        $this->_messageManager->addError($message);
        ..
    }
}
Karvin Ong
fonte
existe alguma função getError? eu quero buscar a mensagem
Jafar pinjar
1
o addErrormétodo está obsoleto deve ser addErrorMessage agora
Jamil
@jafarpinjar, não. Eu o alteraria na tradução, mas se você não puder alterá-lo na tradução, poderá receber a mensagem de erro pelo observador de eventos e manipulá-la lá.
Karvin Ong
@jamil, sim concordou. O addError está depreciado, mas ainda é suportado na versão 2.3.1 :)
Karvin Ong 07/07
6

Não tenho certeza se é isso que você está procurando, mas estou tentando.
Você pode recuperar as mensagens assim:

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

Onde messageManageré uma instância de \Magento\Framework\Message\ManagerInterface.

No núcleo, isso é usado para chamadas ajax para retornar as mensagens de erro na resposta json como esta ( \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
]);

Para ações com saída, você não deve fazer nada (eu acho). O default.xmlarquivo de layout do Magento_Thememódulo já contém esse bloco <block class="Magento\Framework\View\Element\Messages" name="messages" as="messages" template="Magento_Theme::messages.phtml"/>que deve lidar com as mensagens.

[Nota lateral]:
não use $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message). Injete no seu construtor uma instância Magento\Framework\Escapere use-a.

Marius
fonte
A ação loginPost também é capaz de acionar isso e faz um redirecionamento para a página de logon depois disso e a mostra. Também é esse o caso. Sem ajax, sem a mesma página.
Flyingmana 15/09/2015
Foi o que eu disse ... isso deve ser tratado por padrão. Você não precisa fazer alterações. A mensagem da sessão deve ser exibida na próxima página.
Marius
2
E é por isso que faço essa pergunta. Porque não é. Eu até redireciono para a mesma página (login), então obviamente há uma etapa adicional necessária. Como eu disse, mesmo na página de login minha mensagem é mostrada somente depois que eu tentei o login que as mensagens a sua própria mensagem
Flyingmana
1
ESTÁ BEM. Eu vou cavar mais fundo. Isso me parece estranho.
Marius
1
@Flyingmana. Eu encontrei algo. As mensagens da sessão são recuperadas após uma chamada /customer/section/load/. Talvez isso ajude.
Marius
4

você também pode encontrar o gerenciador de mensagens acessível através do $contextqual é injetado nos construtores de ações:

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

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

Em seguida, use como mencionado nas respostas acima

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

Espero que ajude

medmek
fonte
2

Para mim, parece que você precisa adicionar um bloco especial para suas mensagens, se quiser mostrá-las de maneira não JS.

Por exemplo, no Magento \ Checkout \ view \ frontend \ layout \ checkout_cart_index.xml, existe:

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

Magento\Checkout\Block\Cart\ValidationMessagesO bloco estende o bloco principal, \Magento\Framework\View\Element\Messagesresponsável pela renderização de mensagens.

Os blocos definidos default.xmlsão apenas para mensagens JS, acredito.

Michał Biarda
fonte
Como você o adiciona checkout_index_index.xml?
Stevie G
1

Dê uma olhada em

fornecedor / 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);
        }
    }
});

Como podemos ver, já existe uma função de verificação interna . Se nossa resposta contiver palavras-chave:, 'redirect', 'backUrl'a mensagem será carregada após o redirecionamento.

  • Após a conclusão do ajax, o cliente será invalidado. Isso será "acionar" a sessão de mensagem de recarregamento.
  • Verificar palavras-chave: 'redirect', 'backUrl'.
Khoa TruongDinh
fonte