Cómo usar messageManager para mostrar un error después de redirigir


23

Tengo un módulo que procesa una acción de publicación y luego redirige.

Ahora hay casos de error, y me gustaría mostrarles mensajes a los usuarios.

Ya sé que este código agrega el mensaje a la sesión.

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

Pero no veo cómo activar el renderizado.

Actualmente solo se muestra cuando ejecuto otra acción, que ya usa esto de manera funcional.

Como, por ejemplo, el inicio de sesión con una contraseña incorrecta.


¿encuentra alguna solución a este problema?
Shaheer Ali

1
Ya hay una función de verificación incorporada. Vea mi respuesta: magento.stackexchange.com/a/219143/33057
Khoa TruongDinh

este código donde se agrega?
SUDHAKAR ARUNACHALAM

Respuestas:


22

Debe usar el método de inyección de objetos en la clase de acción de su módulo para inyectar el objeto del administrador de mensajes, proporcioné un ejemplo de lo que puede hacer. Espero eso ayude

class Example
{
    protected $_messageManager;

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

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

¿hay alguna función getError? quiero recuperar el mensaje
jafar pinjar

1
el addErrormétodo está en desuso debería ser addErrorMessage ahora
jamil

@jafarpinjar, no. Lo cambiaría en la traducción, pero si no puede cambiarlo en la traducción, puede obtener el mensaje de error por observador de eventos y manipularlo allí.
Karvin Ong

@jamil, sí, de acuerdo. addError se deprecia pero aún se admite en la versión 2.3.1 :)
Karvin Ong

6

No estoy seguro de si esto es lo que estás buscando, pero lo estoy probando.
Puede recuperar los mensajes como este:

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

dónde messageManager es una instancia de \Magento\Framework\Message\ManagerInterface.

En el núcleo, esto se usa para llamadas ajax para devolver los mensajes de error en la respuesta 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 acciones con salida no deberías hacer nada (creo). El default.xmlarchivo de diseño de laMagento_Theme módulo ya contiene este bloque <block class="Magento\Framework\View\Element\Messages" name="messages" as="messages" template="Magento_Theme::messages.phtml"/>que debe manejar los mensajes.

[Nota al margen]:
No usar $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message). Inyecte en su constructor una instancia de Magento\Framework\Escapery use eso.


La acción loginPost también puede desencadenar esto, y luego redirige a la página de inicio de sesión y luego lo muestra. Ese es el caso que tengo yo también. Sin ajax, sin la misma página.
Flyingmana

Eso es lo que dije ... esto debería manejarse por defecto. No debería necesitar hacer ningún cambio. El mensaje de la sesión debe mostrarse en la página siguiente.
Marius

2
Y es por eso que hago esta pregunta. Porque no lo es. Incluso redirijo a la misma página (inicio de sesión), por lo que obviamente se necesita un paso adicional. Como dije, incluso en la página de inicio de sesión, mi mensaje solo se muestra después de intentar el inicio de sesión que publica su propio mensaje
Flyingmana, el

1
OKAY. Cavaré más profundo. Esto me parece extraño.
Marius

1
@Flyingmana. Encontré algo. Los mensajes de sesión se recuperan después de realizar una llamada /customer/section/load/. Quizás eso ayude.
Marius

4

También puede encontrar el administrador de mensajes accesible a través de $contextque se inyecta en los constructores de acciones:

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

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

Luego, solo use como se menciona en las respuestas anteriores

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

Espero eso ayude


2

Para mí, parece que necesita agregar un bloque especial para sus mensajes si desea mostrarlos de una manera que no sea JS.

Por ejemplo, en Magento \ Checkout \ view \ frontend \ layout \ checkout_cart_index.xml hay:

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

Magento\Checkout\Block\Cart\ValidationMessages bloque extiende núcleo \Magento\Framework\View\Element\Messages que se encarga de representar los mensajes.

Los bloques definidos en default.xmlson solo para mensajes JS, creo.


¿Cómo lo agregas checkout_index_index.xml?
Stevie G

1

Echa un vistazo a

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

Como podemos ver, ya hay una función de verificación incorporada . Si nuestra respuesta contiene palabras clave:, 'redirect', 'backUrl'el mensaje se cargará después de redirigir.

  • Después de completar ajax, el cliente será invalidado. Esta será la sesión de mensaje de recarga "activadora".
  • Comprobación de palabras clave: 'redirect', 'backUrl'.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.