Як використовувати messageManager, щоб показати помилку після перенаправлення


23

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

Зараз є випадки помилок, і я хотів би показати повідомлення про них користувачам.

Я вже знаю, що цей код додає повідомлення до сеансу.

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

Але я не бачу, як запустити візуалізацію.

Наразі це показано лише тоді, коли я виконую іншу дію, яка вже використовує це робочим способом.

Як, наприклад, логін із неправильним паролем.


Ви знаходите якесь рішення цієї проблеми?
Шахер Алі

1
вже є вбудована функція перевірки. Дивіться мою відповідь: magento.stackexchange.com/a/219143/33057
Khoa TruongDinh

цей код, куди додано?
SUDHAKAR ARUNACHALAM

Відповіді:


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? Я хочу отримати повідомлення
jafar pinjar

1
addErrorметод є застарілим повинен бути addErrorMessage Тепер
Джаміль

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

@jamil, так погодився. 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 також може запустити це, і після цього воно перенаправляє на сторінку входу і показує це потім. Такий у мене теж є. Ніякого аяксу, жодної сторінки.
Flyingmana

Ось що я сказав ... Це слід вирішувати за замовчуванням. Вам не потрібно вносити жодних змін. Повідомлення сеансу має відображатися на наступній сторінці.
Маріус

2
Ось чому я і роблю це питання. Тому що його немає. Я навіть переспрямовую на ту саму сторінку (логін), тому очевидно, що потрібен додатковий крок. Як я вже сказав, навіть на сторінці входу моє повідомлення відображається лише після того, як я спробував увійти, який
розміщує

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

Далі просто використовуйте, як зазначено у відповідях вище

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

Сподіваюся, це допомагає


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?
Стіві Г

1

Подивись на

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

Як ми бачимо, вже є вбудована функція перевірки . Якщо наша відповідь містить ключові слова:, 'redirect', 'backUrl'повідомлення буде завантажено після перенаправлення.

  • Після завершення Ajax клієнт буде визнаний недійсним. Це буде "тригерним" перезавантаженням сеансу повідомлень.
  • Перевірка ключових слів: 'redirect', 'backUrl'.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.