Come utilizzare messageManager per mostrare un errore dopo il reindirizzamento


23

Ho un modulo che elabora un'azione Post e quindi reindirizza.

Ora ci sono casi di errore e vorrei mostrare i messaggi agli utenti.

So già che questo codice aggiunge il messaggio alla sessione.

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

Ma non vedo come attivare il rendering.

Attualmente viene mostrato solo quando eseguo un'altra azione, che già lo utilizza in modo funzionante.

Come ad esempio il login con password errata.


trovi qualche soluzione a questo problema?
Shaheer Ali,

1
esiste già una funzione di controllo integrata. Vedi la mia risposta: magento.stackexchange.com/a/219143/33057
Khoa TruongDinh

questo codice dove viene aggiunto?
SUDHAKAR ARUNACHALAM,

Risposte:


22

È necessario utilizzare il metodo di iniezione dell'oggetto sulla classe di azione del modulo ur per iniettare l'oggetto gestore messaggi in esso, ho fornito un esempio di ciò che è possibile fare. Spero che sia d'aiuto

class Example
{
    protected $_messageManager;

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

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

c'è qualche funzione getError? voglio recuperare il messaggio
jafar pinjar,

1
il addErrormetodo è obsoleto dovrebbe essere addErrorMessage ora
jamil

@jafarpinjar, no. Lo cambierei nella traduzione, ma se non puoi cambiarlo nella traduzione, puoi ottenere il messaggio di errore dall'osservatore di eventi e manipolarlo lì.
Karvin Ong,

@jamil, sì, d'accordo. addError è ammortizzato ma ancora supportato sulla versione 2.3.1 :)
Karvin Ong

6

Non sono sicuro se questo è quello che stai cercando, ma ci sto provando.
Puoi recuperare i messaggi in questo modo:

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

dove messageManagerè un'istanza di \Magento\Framework\Message\ManagerInterface.

In sostanza, questo viene usato per le chiamate ajax al fine di restituire i messaggi di errore nella risposta json in questo modo ( \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
]);

Per le azioni con output non dovresti fare nulla (penso). Il default.xmlfile di layout del Magento_Thememodulo contiene già questo blocco <block class="Magento\Framework\View\Element\Messages" name="messages" as="messages" template="Magento_Theme::messages.phtml"/>che dovrebbe gestire i messaggi.

[Nota a margine]:
non usare $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message). Inietti nel tuo costruttore un'istanza di Magento\Framework\Escapere usala.


L'azione loginPost è anche in grado di innescare questo, quindi esegue un reindirizzamento alla pagina di accesso e quindi lo mostra. Questo è anche il caso. No ajax, nessuna stessa pagina.
Flyingmana,

Questo è quello che ho detto ... questo dovrebbe essere gestito di default. Non è necessario apportare modifiche. Il messaggio della sessione dovrebbe essere visualizzato nella pagina successiva.
Marius

2
Ed è per questo che faccio questa domanda. Perché non lo è. Devo anche reindirizzare alla stessa pagina (login), quindi ovviamente è necessario un passaggio aggiuntivo. Come ho detto, anche nella pagina di accesso il mio messaggio viene mostrato solo dopo aver provato l'accesso che pubblica il suo messaggio
Flyingmana,

1
OK. Scaverò più a fondo. Mi sembra strano.
Marius

1
@Flyingmana. Ho trovato qualcosa I messaggi di sessione vengono recuperati dopo aver effettuato una chiamata /customer/section/load/. Forse questo aiuta.
Marius

4

puoi anche trovare il gestore dei messaggi accessibile attraverso $contextquello che viene iniettato nei costruttori di azioni:

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

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

Quindi basta usare come indicato nelle risposte sopra

$ This -> _ messageManager-> addError ($ messaggio);

Spero che sia d'aiuto


2

Per me sembra che tu debba aggiungere un blocco speciale per i tuoi messaggi se vuoi mostrarli in modo non JS.

Ad esempio in Magento \ Checkout \ view \ frontend \ layout \ checkout_cart_index.xml c'è:

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

Magento\Checkout\Block\Cart\ValidationMessagesIl blocco estende il blocco principale \Magento\Framework\View\Element\Messagesche è responsabile del rendering dei messaggi.

I blocchi definiti in default.xmlsono solo per i messaggi JS, credo.


Come lo aggiungi checkout_index_index.xml?
Stevie G,

1

Date un'occhiata al

vendor / magento / module-cliente / view / frontend / web / js / cliente-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);
        }
    }
});

Come possiamo vedere, esiste già una funzione di controllo integrata . Se la nostra risposta contiene parole chiave:, 'redirect', 'backUrl'il messaggio verrà caricato dopo il reindirizzamento.

  • Dopo il completamento di Ajax, il cliente verrà invalidato. Questo sarà "trigger" per ricaricare la sessione del messaggio.
  • Controllo parole chiave: 'redirect', 'backUrl'.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.