Как использовать messageManager для отображения ошибки после перенаправления


23

У меня есть модуль, который обрабатывает действие Post, а затем перенаправляет.

Сейчас есть случаи ошибок, и я хотел бы показать сообщения для них пользователям.

Я уже знаю, что этот код добавляет сообщение в сеанс.

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

Но я не вижу, как запустить рендеринг.

В настоящее время это отображается только тогда, когда я выполняю другое действие, которое уже использует это в рабочем режиме.

Как например логин с неправильным паролем.


Вы нашли какое-либо решение этой проблемы?
Шахир Али

1
Уже есть встроенная функция проверки. Смотрите мой ответ: magento.stackexchange.com/a/219143/33057
Khoa TruongDinh

этот код куда добавляется?
Судхакар Аруначалам

Ответы:


22

Вам нужно использовать метод инъекции объекта в классе действий вашего модуля, чтобы внедрить в него объект диспетчера сообщений, я привел пример того, что вы можете сделать. Надеюсь, это поможет

class Example
{
    protected $_messageManager;

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

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

есть ли функция getError? я хочу получить сообщение
Джафар Пинджар

1
addErrorметод является устаревшим должен быть addErrorMessage Теперь
Джамиль

@jafarpinjar, нет. Я бы изменил его в переводе, но если вы не можете изменить его в переводе, вы можете получить сообщение об ошибке наблюдателем событий и манипулировать им там.
Карвин Онг

@ Джамиль, да, согласился. addError устарела, но все еще поддерживается версией 2.3.1 :)
Карвин Онг

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

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

Далее просто используйте как указано в ответах выше

$ Это -> _ messageManager-> addError ($ сообщение);

Надеюсь, это поможет


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 / модуль-клиент / вид / интерфейс / веб / JS / клиент-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'.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.