Cara menggunakan messageManager untuk menampilkan kesalahan setelah redirect

23

Saya memiliki Modul yang memproses tindakan Post, dan kemudian dialihkan.

Sekarang ada kasus kesalahan, dan saya ingin menampilkan pesan untuk mereka kepada pengguna.

Saya sudah tahu, bahwa kode ini menambahkan pesan ke sesi.

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

Tapi saya tidak melihat bagaimana memicu rendering.

Saat ini hanya ditampilkan ketika saya menjalankan tindakan lain, yang sudah menggunakan ini dengan cara yang berfungsi.

Seperti misalnya login dengan kata sandi yang salah.

Flyingmana
sumber
Anda menemukan solusi untuk masalah ini?
Shaheer Ali
1
sudah ada fungsi pemeriksaan bawaan. Lihat jawaban saya: magento.stackexchange.com/a/219143/33057
Khoa TruongDinh
kode ini di mana ditambahkan?
SUDHAKAR ARUNACHALAM

Jawaban:

22

Anda perlu menggunakan metode injeksi objek pada kelas aksi modul Anda untuk menyuntikkan objek manajer pesan ke dalamnya, saya memberikan contoh apa yang dapat Anda lakukan. Semoga ini bisa membantu

class Example
{
    protected $_messageManager;

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

    public function method( ) {
        ..
        $message = '...';
        $this->_messageManager->addError($message);
        ..
    }
}
Karvin Ong
sumber
apakah ada fungsi getError? saya ingin mengambil pesan
jafar pinjar
1
yang addErrormetode sudah ditinggalkan harus addErrorMessage sekarang
jamil
@jafarpinjar, tidak. Saya akan mengubahnya dalam terjemahan, tetapi jika Anda tidak dapat mengubahnya dalam terjemahan, Anda bisa mendapatkan pesan kesalahan oleh pengamat acara dan memanipulasi di sana.
Karvin Ong
@ Jamil, ya setuju. addError didepresiasi tetapi masih didukung di ver 2.3.1 :)
Karvin Ong
6

Tidak yakin apakah ini yang Anda cari, tetapi saya mencobanya.
Anda dapat mengambil pesan seperti ini:

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

dimana messageManagerinstance dari \Magento\Framework\Message\ManagerInterface.

Pada intinya, ini digunakan untuk panggilan ajax untuk mengembalikan pesan kesalahan dalam respons json seperti ini ( \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
]);

Untuk tindakan dengan output Anda tidak harus melakukan apa pun (saya pikir). File default.xmltata letak dari Magento_Thememodul sudah berisi blok ini <block class="Magento\Framework\View\Element\Messages" name="messages" as="messages" template="Magento_Theme::messages.phtml"/>yang seharusnya menangani pesan.

[Catatan]:
Jangan gunakan $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message). Suntikkan konstruktor Anda ke instance Magento\Framework\Escaperdan gunakan itu.

Marius
sumber
Tindakan loginPost juga dapat memicu ini, dan melakukan pengalihan ke halaman login setelah ini dan menunjukkannya kemudian. Itulah yang saya miliki juga. Tidak ajax, tidak ada halaman yang sama.
Flyingmana
Itulah yang saya katakan ... ini harus ditangani secara default. Anda tidak perlu melakukan perubahan apa pun. Pesan sesi harus ditampilkan pada halaman berikutnya.
Marius
2
Dan itulah mengapa saya melakukan pertanyaan ini. Karena tidak. Saya bahkan mengarahkan ke halaman yang sama (login) jadi jelas ada langkah tambahan yang diperlukan. Seperti yang saya katakan, bahkan pada halaman login pesan saya hanya ditampilkan setelah saya mencoba login yang memposting pesannya sendiri
Flyingmana
1
BAIK. Saya akan menggali lebih dalam. Ini terlihat aneh bagiku.
Marius
1
@Flyingmana. Aku menemukan sesuatu. Pesan sesi diambil setelah panggilan dibuat /customer/section/load/. Mungkin itu membantu.
Marius
4

Anda juga dapat menemukan pengelola pesan yang dapat diakses melalui $contextyang disuntikkan ke konstruktor tindakan:

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

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

Selanjutnya gunakan saja seperti yang disebutkan dalam jawaban di atas

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

Semoga ini bisa membantu

medmek
sumber
2

Bagi saya sepertinya Anda perlu menambahkan blok khusus untuk pesan Anda jika Anda ingin menunjukkannya dengan cara non-JS.

Misalnya di Magento \ Checkout \ view \ frontend \ layout \ checkout_cart_index.xml ada:

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

Magento\Checkout\Block\Cart\ValidationMessagesblok memperluas blok inti \Magento\Framework\View\Element\Messagesyang bertanggung jawab untuk merender pesan.

Blok yang didefinisikan default.xmluntuk pesan JS hanya saya percaya.

Michał Biarda
sumber
Bagaimana Anda menambahkannya checkout_index_index.xml?
Stevie G
1

Melihat

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

Seperti yang bisa kita lihat, sudah ada fungsi pemeriksaan bawaan . Jika respons kami berisi kata kunci:, 'redirect', 'backUrl'pesan akan dimuat setelah diarahkan.

  • Setelah ajax selesai, pelanggan akan batal. Ini akan menjadi "pemicu" memuat kembali sesi pesan.
  • Memeriksa kata kunci: 'redirect', 'backUrl'.
Khoa TruongDinh
sumber