रीडायरेक्ट के बाद त्रुटि दिखाने के लिए मैसेजमैनेजर का उपयोग कैसे करें


23

मेरे पास एक मॉड्यूल है जो पोस्ट एक्शन को संसाधित करता है, और फिर रीडायरेक्ट करता है।

अब त्रुटि के मामले हैं, और मैं उनके लिए उपयोगकर्ताओं को संदेश दिखाना चाहूंगा।

मुझे पहले से ही पता है, कि यह कोड सत्र में संदेश जोड़ता है।

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

लेकिन मुझे नहीं लगता कि रेंडरिंग को कैसे ट्रिगर किया जाए।

वर्तमान में यह केवल तब दिखाया जाता है जब मैं किसी अन्य कार्य को निष्पादित करता हूं, जो पहले से ही काम करने के तरीके का उपयोग करता है।

उदाहरण के लिए गलत पासवर्ड के साथ लॉगिन।


आप इस समस्या का कोई हल ढूंढ सकते हैं?
शहीर अली

1
एक अंतर्निहित चेकिंग फ़ंक्शन पहले से ही है। मेरा उत्तर देखें: magento.stackexchange.com/a/219143/33057
खोआ ट्रूंगडिन्ह

यह कोड कहाँ जोड़ा गया है?
सुधाकर अरुणाचलम

जवाबों:


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 फ़ंक्शन है? मैं संदेश लाना चाहता हूं
हूं

1
addErrorविधि बहिष्कृत हो गई है अब addErrorMessage होना चाहिए
जमील

@ जफरपिनजर, नप। मैं इसे अनुवाद में बदल दूंगा, लेकिन यदि आप इसे अनुवाद में नहीं बदल सकते हैं, तो आप घटना पर्यवेक्षक द्वारा त्रुटि संदेश प्राप्त कर सकते हैं और इसे वहां जोड़-तोड़ कर सकते हैं।
करविन ओंग

@ जमील, हां मान गया। addError को ह्रास किया गया है लेकिन अभी भी 2.3.1 पर समर्थित है :)
Karvin Ong

6

यकीन नहीं होता कि यह वही है जो आप ढूंढ रहे हैं, लेकिन मैं इसे एक शॉट दे रहा हूं।
आप इस तरह से संदेश पुनः प्राप्त कर सकते हैं:

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

जहां messageManagerका एक उदाहरण है \Magento\Framework\Message\ManagerInterface

कोर में, यह इस तरह से (j) प्रतिक्रिया में त्रुटि संदेशों को वापस करने के लिए अजाक्स कॉल के लिए प्रयोग किया जाता है \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और इसका उपयोग करें।


लॉगिनपॉस्ट कार्रवाई भी इसे ट्रिगर करने में सक्षम है, और यह इसके बाद लॉगिन पेज पर रीडायरेक्ट करता है और फिर दिखाता है। मेरे पास भी यही मामला है। कोई अजाक्स, कोई एक ही पृष्ठ।
फ्लाइंगमैन

यही मैंने कहा है ... इसे डिफ़ॉल्ट रूप से नियंत्रित किया जाना चाहिए। आपको कोई परिवर्तन करने की आवश्यकता नहीं है। सत्र संदेश अगले पृष्ठ पर प्रदर्शित किया जाना चाहिए।
मेरियस

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

इसके बाद जैसा कि ऊपर दिए गए उत्तरों में बताया गया है

इस $ -> _ messageManager-> addError ($ संदेश);

आशा करता हूँ की ये काम करेगा


2

मेरे लिए ऐसा लगता है कि आपको अपने संदेशों के लिए विशेष ब्लॉक जोड़ने की आवश्यकता है यदि आप उन्हें गैर-जेएस तरीके से दिखाना चाहते हैं।

उदाहरण के लिए 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जेएस संदेशों के लिए परिभाषित ब्लॉक केवल मेरा मानना ​​है।


आप इसे कैसे जोड़ते हैं checkout_index_index.xml?
स्टीव जी

1

पर एक नज़र डालें

विक्रेता / Magento / मॉड्यूल-ग्राहक / देखें / दृश्यपटल / वेब / js / ग्राहक 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'संदेश पुनर्निर्देशित करने के बाद लोड हो जाएगा।

  • अजाक्स पूरा होने के बाद, ग्राहक को अमान्य कर दिया जाएगा। यह "ट्रिगर" होगा संदेश सत्र फिर से लोड करना।
  • कीवर्ड जाँच हो रही है: 'redirect', 'backUrl'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.