Comment utiliser messageManager pour afficher une erreur après la redirection

23

J'ai un module qui traite une action de publication, puis redirige.

Maintenant, il y a des cas d'erreur, et je voudrais leur montrer des messages aux utilisateurs.

Je sais déjà que ce code ajoute le message à la session.

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

Mais je ne vois pas comment déclencher le rendu.

Actuellement, il n'est affiché que lorsque j'exécute une autre action, qui l'utilise déjà de manière fonctionnelle.

Comme par exemple la connexion avec un mauvais mot de passe.

Flyingmana
la source
vous trouvez une solution à ce problème?
Shaheer Ali
1
il y a déjà une fonction de vérification intégrée. Voir ma réponse: magento.stackexchange.com/a/219143/33057
Khoa TruongDinh
ce code où est ajouté?
SUDHAKAR ARUNACHALAM

Réponses:

22

Vous devez utiliser la méthode d'injection d'objet sur la classe d'action du module ur pour y injecter l'objet gestionnaire de messages, j'ai fourni un exemple de ce que vous pouvez faire. J'espère que ça aide

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
la source
existe-t-il une fonction getError? je veux aller chercher le message
jafar pinjar
1
la addErrorméthode est déconseillée devrait être addErrorMessage maintenant
jamil
@jafarpinjar, non. Je le changerais en traduction, mais si vous ne pouvez pas le changer en traduction, vous pouvez obtenir le message d'erreur par l'observateur d'événements et le manipuler.
Karvin Ong
@jamil, oui d'accord. addError est déprécié mais toujours pris en charge sur la version 2.3.1 :)
Karvin Ong
6

Je ne sais pas si c'est ce que vous cherchez, mais je lui donne un coup de feu.
Vous pouvez récupérer les messages comme ceci:

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

messageManagerest une instance de \Magento\Framework\Message\ManagerInterface.

Dans le noyau, ceci est utilisé pour les appels ajax afin de renvoyer les messages d'erreur dans la réponse json comme ceci ( \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
]);

Pour les actions avec sortie, vous ne devriez rien faire (je pense). Le default.xmlfichier de mise en page du Magento_Thememodule contient déjà ce bloc <block class="Magento\Framework\View\Element\Messages" name="messages" as="messages" template="Magento_Theme::messages.phtml"/>qui doit gérer les messages.

[Note latérale]:
Ne pas utiliser $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message). Injectez dans votre constructeur une instance de Magento\Framework\Escaperet utilisez-la.

Marius
la source
L'action loginPost est également capable de déclencher cela, et il redirige ensuite vers la page de connexion et l'affiche ensuite. C'est le cas que j'ai aussi. Pas d'ajax, pas de même page.
Flyingmana
C'est ce que j'ai dit ... cela devrait être géré par défaut. Vous ne devriez pas avoir à apporter de modifications. Le message de session doit être affiché sur la page suivante.
Marius
2
Et c'est pourquoi je fais cette question. Parce que ce n'est pas le cas. Je redirige même vers la même page (connexion), il est donc évident qu'une étape supplémentaire est nécessaire. Comme je l'ai dit, même sur la page de connexion, mon message n'est affiché qu'après avoir essayé la connexion qui affiche son propre message
Flyingmana
1
D'ACCORD. Je vais creuser plus profondément. Cela me semble étrange.
Marius
1
@Flyingmana. J'ai trouvé quelque chose. Les messages de session sont récupérés après un appel à /customer/section/load/. Peut-être que cela aide.
Marius
4

vous pouvez également trouver le gestionnaire de messages accessible via $contextqui est injecté dans les constructeurs d'actions:

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

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

Ensuite, utilisez simplement comme mentionné dans les réponses ci-dessus

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

J'espère que ça aide

medmek
la source
2

Pour moi, il semble que vous devez ajouter un bloc spécial pour vos messages si vous souhaitez les afficher de manière non JS.

Par exemple, dans Magento \ Checkout \ view \ frontend \ layout \ checkout_cart_index.xml, il y a:

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

Magento\Checkout\Block\Cart\ValidationMessagesblock étend le \Magento\Framework\View\Element\Messagesbloc central qui est responsable du rendu des messages.

Les blocs définis dans default.xmlsont pour les messages JS seulement je crois.

Michał Biarda
la source
Comment l'ajoutez-vous checkout_index_index.xml?
Stevie G
1

Jeter un coup d'œil à

fournisseur / magento / module-client / vue / 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);
        }
    }
});

Comme nous pouvons le voir, il existe déjà une fonction de vérification intégrée . Si notre réponse contient des mots clés:, 'redirect', 'backUrl'le message se chargera après la redirection.

  • Une fois ajax terminé, le client sera invalidé. Ce sera la session de message de rechargement "déclencheur".
  • Vérification des mots - clés: 'redirect', 'backUrl'.
Khoa TruongDinh
la source