MessageManager nasıl yönlendirilir sonra bir hata göstermek için kullanılır


23

Bir Post eylemini işleyen ve sonra yönlendiren bir Modül var.

Şimdi hata durumları var ve onlar için mesajları kullanıcılara göstermek istiyorum.

Biliyorum, bu kodun iletiyi oturuma eklediğini.

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

Ancak render tetiklemek nasıl görmüyorum.

Şu anda yalnızca, bunu zaten çalışan bir şekilde kullanan başka bir eylem yürüttüğümde gösteriliyor.

Mesela yanlış şifre ile giriş yapın.


Bu soruna herhangi bir çözüm bulabilir misiniz?
Shaheer Ali

1
zaten yerleşik bir kontrol işlevi var. Cevabımı gör: magento.stackexchange.com/a/219143/33057
Khoa TruongDinh

bu kod nereye eklenir?
SUDHAKAR ARUNACHALAM

Yanıtlar:


22

Mesaj yöneticisi nesnesini içine enjekte etmek için ur modülü eylem sınıfında nesne enjeksiyon yöntemini kullanmanız gerekir, ne yapabileceğinize dair bir örnek verdim. Umarım yardımcı olur

class Example
{
    protected $_messageManager;

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

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

Herhangi bir getError işlevi var mı? mesajı almak istiyorum
jafar pinjar

1
addErroryöntem eskimiştir artık addErrorMessage olmalıdır
jamil

@jafarpinjar, hayır. Çeviride değiştirirdim, ancak çeviride değiştiremezseniz, hata iletisini olay gözlemcisi tarafından alabilir ve orada işleyebilirsiniz.
Karvin Ong

@ jamil, evet kabul etti. addError, amortimana tabi tutulmuş ancak halen 2.3.1'de destekleniyor :)
Karvin Ong

6

Aradığın şeyin bu olup olmadığından emin değilim, ama ben bir şans veriyorum.
Bu gibi mesajları alabilirsiniz:

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

messageManagerbir örneği nerede \Magento\Framework\Message\ManagerInterface.

Çekirdekte, bu, ( \Magento\Catalog\Controller\Adminhtml\Category\Move) gibi json yanıtındaki hata mesajlarını döndürmek için ajax çağrıları için kullanılır :

$block = $this->layoutFactory->create()->getMessagesBlock();
...
$block->setMessages($this->messageManager->getMessages(true));
$resultJson = $this->resultJsonFactory->create();

return $resultJson->setData([
    'messages' => $block->getGroupedHtml(),
    'error' => $error
]);

Çıktı içeren eylemler için hiçbir şey yapmamalısınız (bence). default.xmlDan düzen dosya Magento_Thememodülü zaten bu bloğunu içerir <block class="Magento\Framework\View\Element\Messages" name="messages" as="messages" template="Magento_Theme::messages.phtml"/>iletileri işlemek gerekir.

[Yan not]:
Kullanmayın $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message). Yapıcınıza bir örnek enjekte edin Magento\Framework\Escaperve bunu kullanın.


LoginPost eylemi bunu tetikleyebilir ve bundan sonra giriş sayfasına bir yönlendirme yapar ve sonra bunu gösterir. Benim de durum böyle. Ajax yok, aynı sayfa yok.
Flyingmana 15:15

Dediğim şey buydu ... bu varsayılan olarak ele alınmalı. Herhangi bir değişiklik yapmanıza gerek yoktur. Oturum mesajı bir sonraki sayfada gösterilmelidir.
Marius

2
Bu yüzden bu soruyu yapıyorum. Çünkü değil. Aynı sayfaya (giriş) bile yönlendiriyorum, bu yüzden açıkça gerekli olan ek bir adım var. Ben giriş çalıştıktan sonra, hatta giriş sayfasında ileti yalnızca gösterildiği dediği gibi hangi mesajlar Kendi mesajı
Flyingmana

1
TAMAM. Daha derine ineceğim. Bu bana garip görünüyor.
Marius

1
@Flyingmana. Bir şey buldum. Bir mesaj yapıldıktan sonra oturum mesajları alınır /customer/section/load/. Belki bu yardımcı olur.
Marius

4

Ayrıca $contexteylem yöneticilerine enjekte edilen mesaj yöneticisini erişilebilir olarak da bulabilirsiniz :

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

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

Sonraki sadece yukarıdaki cevaplarda belirtildiği gibi kullanın

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

Umarım yardımcı olur


2

Bana göre, JS olmayan bir şekilde göstermek istiyorsanız, mesajlarınız için özel bir blok eklemeniz gerekiyor.

Örneğin, Magento \ Checkout \ view \ frontend \ layout \ checkout_cart_index.xml dosyasında:

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

Magento\Checkout\Block\Cart\ValidationMessagesblok, \Magento\Framework\View\Element\Messagesmesajların oluşturulmasından sorumlu olan çekirdek bloğu genişletir .

Tanımlanan bloklar default.xmlJS mesajları içindir sadece inanıyorum.


Bunu nasıl eklersiniz checkout_index_index.xml?
Stevie G

1

Şuna baksana

satıcı / Magento / modül-müşteri / görüş / kullanıcı arayüzü / web / js / müşteri 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);
        }
    }
});

Gördüğümüz gibi, zaten yerleşik bir kontrol işlevi var . Yanıtımız anahtar kelimeler içeriyorsa:, 'redirect', 'backUrl'yönlendirmeden sonra mesaj yüklenir.

  • Ajax tamamlandıktan sonra müşteri geçersiz hale gelir. Bu mesaj oturumu yeniden yükleme "tetik" olacaktır.
  • Anahtar kelimeleri kontrol etme: 'redirect', 'backUrl'.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.