Jak wyświetlać komunikaty sesji w interfejsie użytkownika w Magento 2 beta

12

Chcę wyświetlić komunikat o błędzie lub sukcesie w moim module magento 2. Rozszerzyłem mój kontroler front-end o nazwę klasy \Magento\Framework\App\Action\Action. Następnie przekierowuję klienta do strony głównej za pomocą następującego kodu

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

Wszystko działa dobrze, ale ta linia nigdy nie drukuje błędu

$this->messageManager->addError($SomeMessage);
Shaheer Ali
źródło
Czy musisz wyświetlać wiadomości w sklepie lub w panelu administracyjnym?
KAndy,
Chcę wyświetlać wiadomości w sklepie
Shaheer Ali

Odpowiedzi:

7

Napotkałem problem związany z wyświetlaniem komunikatu w źródle Magento2 Beta. W niektórych źródłach domyślnie wyświetlany jest komunikat o błędzie i komunikat o powodzeniu, ale w niektórych przypadkach nie wyświetla się, a następnie wykonaj poniższe czynności.

Krok 1: Utworzyłem plik Message.php w moim module niestandardowym w Darsh \ Crud \ Block \ Message.php


przestrzeń nazw Darsh \ Crud \ Block;

klasa Wiadomość rozszerza \ Magento \ Framework \ View \ Element \ Messages {

    funkcja publiczna __construct (
        \ Magento \ Framework \ View \ Element \ Template \ Context $ kontekst,
        \ Magento \ Framework \ Message \ Factory $ messageFactory,
        \ Magento \ Framework \ Message \ CollectionFactory $ collectionFactory,
        \ Magento \ Framework \ Message \ ManagerInterface $ messageManager,       
        tablica $ data = []
    ) {
        rodzic :: __ konstrukcja (
            $ kontekst,
            $ messageFactory,
            $ collectionFactory,
            $ messageManager,
            dane $
        );       
    }

    funkcja chroniona _prepareLayout ()
    {
        $ this-> addMessages ($ this-> messageManager-> getMessages (true));       
        return parent :: _ preparLayout ();
    }

}

Krok 2: Dodano blok komunikatów do handeler w Darsh \ Crud \ view \ frontend \ layout \ crud_index_form.xml

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

Dodaj otwierający i zamykający tag <> dla uchwytu układu.

Teraz możesz zobaczyć swoją niestandardową wiadomość dodaną w Darsh \ Crud \ Controller \ Index \ Form.

Jeśli napotkasz jakiś problem, zobacz Przykładowy moduł na https://github.com/Darshanmodi1427/Magento2_Crud_Operation.git

Darsh modi
źródło
Po kilku modyfikacjach otrzymałem wyniki :)
Shaheer Ali
7

W pliku układu użyłem poniższego kodu. teraz mam wiadomość w interfejsie.

<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
źródło
Thankyou Marius
Naveenbos 27.07.16
1
Dzięki @Naveen. Działa dobrze w Magento 2 w moim module niestandardowym
Ankit Shah,
6

Napotkałem ten sam problem i udało mi się go rozwiązać, dodając następujące elementy w moim pliku układu:

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

To powinno to naprawić;)

jony974
źródło
2

Czy próbowałeś zwrócić ostatnią linię kodu?

return $resultRedirect->setPath($base_path);

Rzeczywista addErrorfunkcja wygląda dobrze, chyba że $SomeMessagezmienna jest pusta, czy też to sprawdziłeś?

Jeśli to się nie powiedzie, możesz spróbować przekierować za pomocą _redirectfunkcji zamiast:

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

Być może resultRedirectfunkcja usuwa sesję wiadomości, dzięki czemu wiadomość nigdy się nie wyświetla.

Javier Villanueva
źródło
2

Tak, dodałem wiadomość za pomocą obiektu $ resultRedirect z

$ resultRedirect-> setUrl ($ this -> _ redirect ('crud / index / form'));

Zobacz poniższy kod kontrolera

przestrzeń nazw Darsh \ Crud \ Controller \ Index;

użyj Magento \ Framework \ App \ Filesystem \ DirectoryList;

klasa Post przedłuża \ Magento \ Kontakt \ Kontroler \ Indeks {
// class Post extends \ Magento \ Framework \ App \ Action \ Action {


    funkcja publiczna execute () {
        $ data = $ this-> getRequest () -> getPostValue ();

        if (! $ data) {
            $ this -> _ redirect ('crud / index / form');
            powrót;
        }

        $ resultRedirect = $ this-> resultRedirectFactory-> create ();
        próbować {
            $ model = $ this -> _ objectManager-> create ('Darsh \ Crud \ Model \ Crud');
            if (isset ($ _ FILES ['image'] ['name']) && $ _FILES ['image'] ['name']! = '') {
                próbować {
                    $ uploader = $ this -> _ objectManager-> create ('\ Magento \ MediaStorage \ Model \ File \ Uploader', tablica ('fileId' => 'image'));
                    $ uploader-> setAllowedExtensions (tablica („jpg”, „jpeg”, „gif”, „png”));
                    $ uploader-> setAllowRenameFiles (prawda);
                    $ uploader-> setFilesDispersion (true);
                    $ mediaDirectory = $ this -> _ objectManager-> get ('Magento \ Framework \ Filesystem')
                            -> getDirectoryRead (DirectoryList :: MEDIA);
                    $ config = $ this -> _ objectManager-> get ('Darsh \ Crud \ Model \ Crud');
                    $ result = $ uploader-> save ($ mediaDirectory-> getAbsolutePath ('bannerlider / images'));
                    unset ($ wynik ['tmp_name']);
                    unset ($ result ['path']);
                    $ data ['image'] = $ result ['file'];
                } catch (wyjątek $ e) {
                    $ data ['image'] = $ _FILES ['image'] ['name'];
                }
            } else if (isset ($ data ['image'] ['delete'])) {
                $ data ['image'] = '';
            } else if (isset ($ data ['image'] ['value'])) {
                $ data ['image'] = $ data ['image'] ['wartość'];
            }

            $ model-> setData ($ data);
            $ model-> setStoreId ($ this-> storeManager-> getStore () -> getId ())
                        -> setStores ([$ this-> storeManager-> getStore () -> getId ()])
                        -> save ();
            próbować {
                $ model-> save ();
                $ this-> messageManager-> addSuccess (
                        __ („Dziękujemy za skontaktowanie się z nami z komentarzami i pytaniami. Odpowiemy wkrótce”.)
                );
                // $ this -> _ redirect ('crud / index / form');
                //powrót;
            } catch (\ Exception $ e) {
                $ this-> messageManager-> addError (
                        __ („Nie możemy teraz przetworzyć Twojego żądania. Przepraszamy, to wszystko, co wiemy.”));
                // $ this -> _ redirect ('crud / index / form');
                //powrót;
            }
        } catch (\ Exception $ e) {
            $ this-> messageManager-> addError (
                    __ („Nie możemy teraz przetworzyć Twojego żądania. Przepraszamy, to wszystko, co wiemy.”)
            );
            // $ this -> _ redirect ('crud / index / form');
            //powrót;
        }

        $ resultRedirect-> setUrl ($ this -> _ redirect ('crud / index / form'));

        return $ resultRedirect;
    }

}

Dzięki.

Darsh modi
źródło
2

Spróbuj użyć XDEBUG, ustaw punkt przerwania w akcji kontrolera. Może to było zduplikowane przekierowanie i zgubienie wiadomości w menedżerze.

De Nguyen
źródło