Как показать сеансовые сообщения в интерфейсе в бета-версии magento 2

12

Я хочу показать сообщение об ошибке или успехе в моем модуле magento 2. Я расширил свой интерфейсный контроллер с именем класса \Magento\Framework\App\Action\Action. Затем я перенаправляю клиента на домашнюю страницу, используя следующий код

$this->messageManager->addError($SomeMessage);
$resultRedirect = $this->resultRedirectFactory->create();
$resultRedirect->setPath($base_path);

Все работает нормально но эта строка никогда не печатает ошибку

$this->messageManager->addError($SomeMessage);
Шахир Али
источник
Вы должны показывать сообщения на витрине или в админ-панели?
Канди
Я хочу показывать сообщения на витрине магазина
Шахир Али

Ответы:

7

Я столкнулся с проблемой, связанной с отображением сообщения в источнике бета-версии Magento2. В некоторых источниках по умолчанию отображается сообщение об ошибке и об успешном выполнении, но в некоторых случаях оно не отображается, а затем выполните следующие действия.

Шаг 1: Я создал файл Message.php в своем пользовательском модуле в Darsh \ Crud \ Block \ Message.php


пространство имен Darsh \ Crud \ Block;

Класс Message extends \ Magento \ Framework \ View \ Element \ Messages {

    публичная функция __construct (
        \ Magento \ Framework \ View \ Element \ Template \ Context $ context,
        \ Magento \ Framework \ Message \ Factory $ messageFactory,
        \ Magento \ Framework \ Message \ CollectionFactory $ collectionFactory,
        \ Magento \ Framework \ Message \ ManagerInterface $ messageManager,       
        массив $ data = []
    ) {
        Родитель :: __ конструкт (
            $ Контекст,
            $ MessageFactory,
            $ CollectionFactory,
            $ MessageManager,
            $ данных
        );       
    }

    защищенная функция _prepareLayout ()
    {
        $ This-> addMessages ($ this-> messageManager-> GetMessages (истина));       
        вернуть родителя :: _ prepareLayout ();
    }

}

Шаг 2: Добавлен блок сообщений в handeler в Darsh \ Crud \ view \ frontend \ layout \ crud_index_form.xml

   <referenceContainer name="page.messages">
        <block class="Darsh\Crud\Block\Message" name="darsh.crud.message" />
    </referenceContainer>

Пожалуйста, добавьте открывающий и закрывающий тег <> для дескриптора макета.

Теперь вы можете увидеть свое собственное сообщение, добавленное в Darsh \ Crud \ Controller \ Index \ Form.

Если у вас возникли проблемы, см. Пример модуля на https://github.com/Darshanmodi1427/Magento2_Crud_Operation.git.

Дарш моди
источник
После некоторых модификаций я получил результаты :)
Шахир Али
7

В файле макета я использовал следующий код. Теперь я получил сообщение в веб-интерфейсе.

<referenceContainer name="page.messages">            
    <block class="Magento\Framework\View\Element\Template" name="ajax.message.placeholder" template="Magento_Theme::html/messages.phtml"/>
    <block class="Magento\Framework\View\Element\Messages" name="messages" as="messages" template="Magento_Theme::messages.phtml"/>
</referenceContainer>
Naveenbos
источник
Спасибо Мариус
Навинбос
1
Спасибо @Naveen. Прекрасно работает в Magento 2 в моем пользовательском модуле
Ankit Shah
6

Я столкнулся с той же проблемой, и мне удалось ее исправить, добавив в файл макета следующее:

<body>
    <!-- your layout content -->
    <referenceContainer name="page.messages">
        <block class="Magento\Framework\View\Element\Messages" name="messages" as="messages"/>
    </referenceContainer>
</body>

Это должно это исправить;)

user3245246
источник
2

Вы пытались вернуть свою последнюю строку кода?

return $resultRedirect->setPath($base_path);

Реальная addErrorфункция выглядит нормально, если $SomeMessageпеременная не пустая, вы это тоже проверяли?

Если это не удастся, возможно, вы можете попробовать перенаправить, используя _redirectфункцию вместо этого:

$this->_redirect('*/*/');

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

Хавьер Вильянуэва
источник
2

Да, я добавил сообщение, используя объект $ resultRedirect с

$ ResultRedirect-> setUrl ($ это -> _ редирект ( 'падла / индекс / форма'));

Пожалуйста, смотрите ниже код контроллера

пространство имен Darsh \ Crud \ Controller \ Index;

использовать Magento \ Framework \ App \ Filesystem \ DirectoryList;

Класс Post extends \ Magento \ Contact \ Controller \ Index {
// класс Post extends \ Magento \ Framework \ App \ Action \ Action {


    публичная функция execute () {
        $ data = $ this-> getRequest () -> getPostValue ();

        if (! $ data) {
            $ Это -> _ редирект ( 'падла / индекс / форма');
            возвращение;
        }

        $ resultRedirect = $ this-> resultRedirectFactory-> create ();
        пытаться {
            $ model = $ this -> _ objectManager-> create ('Darsh \ Crud \ Model \ Crud');
            if (isset ($ _ FILES ['image'] ['name']) && $ _FILES ['image'] ['name']! = '') {
                пытаться {
                    $ uploader = $ this -> _ objectManager-> create ('\ Magento \ MediaStorage \ Model \ File \ Uploader', массив ('fileId' => 'image'));
                    $ uploader-> setAllowedExtensions (array ('jpg', 'jpeg', 'gif', 'png'));
                    $ Uploader-> setAllowRenameFiles (истина);
                    $ Uploader-> setFilesDispersion (истина);
                    $ mediaDirectory = $ this -> _ objectManager-> get ('Magento \ Framework \ Filesystem')
                            -> getDirectoryRead (DirectoryList :: СМИ);
                    $ config = $ this -> _ objectManager-> get ('Darsh \ Crud \ Model \ Crud');
                    $ result = $ uploader-> save ($ mediaDirectory-> getAbsolutePath ('bannerlider / images'));
                    снята с охраны ($ результат [ 'tmp_name']);
                    снята с охраны ($ результат [ 'путь']);
                    $ data ['image'] = $ result ['file'];
                } catch (исключение $ e) {
                    $ data ['image'] = $ _FILES ['image'] ['name'];
                }
            } else if (isset ($ data ['image'] ['delete'])) {
                $ data ['image'] = '';
            } else if (isset ($ data ['image'] ['value'])) {
                $ data ['image'] = $ data ['image'] ['value'];
            }

            $ Модели-> УстановитьДанные ($ данных);
            $ Модели-> setStoreId ($ this-> storeManager-> getStore () -> GetId ())
                        -> setStores ([$ this-> storeManager-> getStore () -> GetId ()])
                        -> Save ();
            пытаться {
                $ Модели-> Save ();
                $ This-> messageManager-> addSuccess (
                        __ («Спасибо, что связались с нами с вашими комментариями и вопросами. Мы очень скоро ответим вам.»)
                );
                // $ это -> _ редирект ( 'падла / индекс / форма');
                //возвращение;
            } catch (\ Exception $ e) {
                $ This-> messageManager-> addError (
                        __ («Мы не можем обработать ваш запрос прямо сейчас. Извините, это все, что мы знаем.»));
                // $ это -> _ редирект ( 'падла / индекс / форма');
                //возвращение;
            }
        } catch (\ Exception $ e) {
            $ This-> messageManager-> addError (
                    __ («Мы не можем обработать ваш запрос прямо сейчас. Извините, это все, что мы знаем».)
            );
            // $ это -> _ редирект ( 'падла / индекс / форма');
            //возвращение;
        }

        $ ResultRedirect-> setUrl ($ это -> _ редирект ( 'падла / индекс / форма'));

        вернуть $ resultRedirect;
    }

}

Благодарю.

Дарш моди
источник
2

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

Де Нгуен
источник