পুনঃনির্দেশের পরে ত্রুটি দেখানোর জন্য কীভাবে বার্তা ম্যানেজার ব্যবহার করবেন


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 অবমূল্যায়ন করা হয়েছে তবে এখনও
২.৩.১

6

আপনি যা সন্ধান করছেন এটি এটি কিনা তা নিশ্চিত নই, তবে আমি এটি শট দিচ্ছি।
আপনি এই বার্তা পুনরুদ্ধার করতে পারেন:

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

messageManagerএকটি উদাহরণ যেখানে \Magento\Framework\Message\ManagerInterface

মূলত, এটি জাজসনের প্রতিক্রিয়াতে ত্রুটি বার্তাগুলি ফেরত দেওয়ার জন্য এজ্যাক্স কলগুলির জন্য এটি ব্যবহার করা হয় ( \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
আর কেন আমি এই প্রশ্নটি করি tha কারণ এটি না। আমি এমনকি একই পৃষ্ঠাতে পুনঃনির্দেশ করেছি (লগইন) যাতে স্পষ্টতই অতিরিক্ত পদক্ষেপের প্রয়োজন হয়। যেমনটি আমি বলেছি, এমনকি লগইন পৃষ্ঠায় আমার বার্তাটি কেবল তখনই প্রদর্শিত হবে যা আমি লগইন চেষ্টা করার পরে যা তার নিজস্ব বার্তা পোস্ট করে
ফ্লায়িংম্যানা

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 \ চেকআউট \ দেখুন \ সম্মুখভাগ \ লেআউট \ চেকআউট_কার্ট_ইন্ডেক্স.এক্সএমএল রয়েছে:

<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'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.