วิธีใช้ข้อความผู้จัดการเพื่อแสดงข้อผิดพลาดหลังจากเปลี่ยนเส้นทาง


23

ฉันมีโมดูลซึ่งประมวลผลการดำเนินการโพสต์แล้วเปลี่ยนเส้นทาง

ขณะนี้มีกรณีข้อผิดพลาดและฉันต้องการที่จะแสดงข้อความให้กับผู้ใช้

ฉันรู้แล้วว่ารหัสนี้เพิ่มข้อความในเซสชัน

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

แต่ฉันไม่เห็นวิธีการทริกเกอร์การแสดงผล

ปัจจุบันมันจะปรากฏเฉพาะเมื่อฉันดำเนินการกระทำอื่นซึ่งใช้แล้วในวิธีการทำงาน

เช่นเข้าสู่ระบบด้วยรหัสผ่านผิด


หาวิธีแก้ไขปัญหานี้หรือไม่?
Shaheer Ali

1
มีฟังก์ชั่นตรวจสอบในตัวอยู่แล้ว ดูคำตอบของฉัน: magento.stackexchange.com/a/219143/33057
Khoa TruongDinh

รหัสนี้จะถูกเพิ่มที่ไหน?
SUDHAKAR ARUNACHALAM

คำตอบ:


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 ไหม? ฉันต้องการดึงข้อความ
jafar pinjar

1
addErrorวิธีเลิกควรจะ addErrorMessage ตอนนี้
Jamil

@jafarpinjar ไม่ ฉันจะเปลี่ยนมันในการแปล แต่ถ้าคุณไม่สามารถเปลี่ยนมันในการแปลคุณสามารถได้รับข้อความข้อผิดพลาดโดยผู้สังเกตการณ์เหตุการณ์และจัดการกับมัน
Karvin Ong

@jamil ใช่ตกลง addError คิดค่าเสื่อมราคา แต่ยังคงได้รับการสนับสนุนในเวอร์ชั่น 2.3.1 :)
Karvin องค์

6

ไม่แน่ใจว่านี่คือสิ่งที่คุณกำลังมองหาหรือไม่ แต่ฉันให้มันยิง
คุณสามารถดึงข้อความเช่นนี้:

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

ที่เป็นตัวอย่างของmessageManager\Magento\Framework\Message\ManagerInterface

ในแกนกลางสิ่งนี้ใช้สำหรับการโทร ajax เพื่อส่งคืนข้อความแสดงข้อผิดพลาดในการตอบสนอง json เช่นนี้ ( \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"/>ว่าควรจะจัดการกับข้อความ

[บันทึก Side]: ไม่ได้ใช้
$this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message)ฉีดอินสแตนซ์ของ constructor ของคุณMagento\Framework\Escaperและใช้มัน


การกระทำของ loginPost ก็สามารถทริกเกอร์สิ่งนี้ได้และมันจะทำการเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบหลังจากนี้และจะแสดงขึ้นมา นั่นเป็นกรณีที่ฉันมีเช่นกัน ไม่มีอาแจ็กซ์ไม่มีหน้าเดียวกัน
Flyingmana

นั่นคือสิ่งที่ฉันพูด ... สิ่งนี้ควรจัดการโดยค่าเริ่มต้น คุณไม่จำเป็นต้องทำการเปลี่ยนแปลงใด ๆ ข้อความเซสชันควรปรากฏในหน้าถัดไป
Marius

2
และนั่นคือเหตุผลที่ฉันทำคำถามนี้ เพราะมันไม่ใช่ ฉันยังเปลี่ยนเส้นทางไปยังหน้าเดียวกัน (ล็อกอิน) ดังนั้นเห็นได้ชัดว่ามีขั้นตอนเพิ่มเติมที่จำเป็น อย่างที่ฉันพูดถึงแม้ในหน้าเข้าสู่ระบบข้อความของฉันจะปรากฏหลังจากที่ฉันพยายามเข้าสู่ระบบซึ่งโพสต์ข้อความของตัวเอง
Flyingmana

1
ตกลง. ฉันจะขุดลึกลงไป มันดูแปลกสำหรับฉัน
Marius

1
@Flyingmana ฉันพบบางสิ่ง /customer/section/load/ข้อความเซสชั่นจะถูกเรียกหลังจากที่มีการโทรที่เกิดขึ้นกับ บางทีนั่นอาจช่วย
Marius

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

ถัดไปเพียงใช้ตามที่กล่าวไว้ในคำตอบข้างต้น

$ this -> _ messageManager-> addError (ข้อความ $);

หวังว่ามันจะช่วย


2

สำหรับฉันดูเหมือนว่าคุณจะต้องเพิ่มบล็อกพิเศษสำหรับข้อความของคุณหากคุณต้องการที่จะแสดงพวกเขาในแบบที่ไม่ใช่ JS

ตัวอย่างเช่นใน 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ใช้สำหรับข้อความ JS เท่านั้นที่ฉันเชื่อ


คุณจะทำอย่างไรที่จะเพิ่มcheckout_index_index.xml?
Stevie G

1

ลองดูที่

ผู้ขาย / วีโอไอพี / โมดูลลูกค้า / view / ส่วนหน้า / เว็บ / 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'ข้อความจะโหลดหลังจากเปลี่ยนเส้นทาง

  • หลังจากเสร็จสิ้น Ajax ลูกค้าจะถูกยกเลิก นี่จะเป็น "ทริกเกอร์" การรีโหลดข้อความเซสชัน
  • การตรวจสอบคำหลัก: 'redirect', 'backUrl'.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.