Cách sử dụng messageManager để hiển thị lỗi sau khi chuyển hướng


23

Tôi có một Mô-đun xử lý một hành động Đăng, và sau đó chuyển hướng.

Bây giờ có trường hợp lỗi và tôi muốn hiển thị thông báo cho người dùng.

Tôi đã biết rằng mã này thêm thông báo vào phiên.

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

Nhưng tôi không thấy làm thế nào để kích hoạt kết xuất.

Hiện tại nó chỉ được hiển thị khi tôi thực hiện một hành động khác, đã sử dụng hành động này.

Ví dụ như đăng nhập với mật khẩu sai.


Bạn tìm giải pháp nào cho vấn đề này?
Shaheer Ali

1
đã có chức năng kiểm tra tích hợp sẵn. Xem câu trả lời của tôi: magento.stackexchange.com/a/219143/33057
Khoa

mã này được thêm vào đâu?
SUDHAKAR ARUNACHALAM

Câu trả lời:


22

Bạn cần sử dụng phương thức tiêm đối tượng trên lớp hành động mô-đun ur để tiêm đối tượng quản lý thông báo vào nó, tôi đã cung cấp một ví dụ về những gì bạn có thể làm. Hy vọng nó giúp

class Example
{
    protected $_messageManager;

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

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

Có chức năng getError nào không? tôi muốn lấy tin nhắn
jafar pinjar


@jafarpinjar, không. Tôi sẽ thay đổi nó trong bản dịch, nhưng nếu bạn không thể thay đổi nó trong bản dịch, bạn có thể nhận được thông báo lỗi bởi người quan sát sự kiện và thao tác ở đó.
Karvin Ong

@jamil, có đồng ý. addError không được dùng nữa nhưng vẫn được hỗ trợ trên phiên bản 2.3.1 :)
Karvin Ong

6

Không chắc đây có phải là thứ bạn đang tìm không, nhưng tôi sẽ cho nó một shot.
Bạn có thể truy xuất các tin nhắn như thế này:

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

nơi messageManagerlà một thể hiện của \Magento\Framework\Message\ManagerInterface.

Trong lõi, điều này được sử dụng cho các cuộc gọi ajax để trả về các thông báo lỗi trong phản hồi json như thế này ( \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
]);

Đối với các hành động với đầu ra, bạn không nên làm bất cứ điều gì (tôi nghĩ). Tệp default.xmlbố cục từ Magento_Thememô-đun đã chứa khối này <block class="Magento\Framework\View\Element\Messages" name="messages" as="messages" template="Magento_Theme::messages.phtml"/>sẽ xử lý các thông báo.

[Ghi chú bên cạnh]:
Không sử dụng $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message). Tiêm vào hàm tạo của bạn một thể hiện Magento\Framework\Escapervà sử dụng nó.


Hành động loginPost cũng có thể kích hoạt điều này và nó thực hiện chuyển hướng đến trang đăng nhập sau đó và hiển thị nó sau đó. Đó cũng là trường hợp tôi có. Không có ajax, không có trang giống nhau.
Flyingmana

Đó là những gì tôi đã nói ... điều này nên được xử lý theo mặc định. Bạn không cần phải thực hiện bất kỳ thay đổi. Thông báo phiên sẽ được hiển thị trên trang tiếp theo.
Marius

2
Và đó là lý do tại sao tôi làm câu hỏi này. Bởi vì nó không phải. Tôi thậm chí còn chuyển hướng đến cùng một trang (đăng nhập) vì vậy rõ ràng cần thêm một bước nữa. Như tôi đã nói, ngay cả trên trang đăng nhập, tin nhắn của tôi chỉ được hiển thị sau khi tôi thử đăng nhập có đăng tin nhắn của riêng mình
Flyingmana

1
ĐƯỢC. Tôi sẽ đào sâu hơn. Điều này có vẻ lạ đối với tôi.
Marius

1
@Fendingmana. Tôi tìm thấy một cái gì đó. Các thông điệp phiên được lấy sau khi một cuộc gọi được thực hiện /customer/section/load/. Có lẽ điều đó giúp.
Marius

4

bạn cũng có thể tìm thấy trình quản lý thư có thể truy cập thông qua $contextđó được đưa vào các hàm tạo hành động:

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

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

Tiếp theo chỉ sử dụng như đã đề cập trong câu trả lời ở trên

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

Hy vọng nó giúp


2

Đối với tôi, có vẻ như bạn cần thêm khối đặc biệt cho tin nhắn của mình nếu bạn muốn hiển thị chúng theo cách không phải là JS.

Ví dụ: trong Magento \ Checkout \ view \ frontend \ layout \ checkout_cart_index.xml có:

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

Magento\Checkout\Block\Cart\ValidationMessageskhối mở rộng khối lõi \Magento\Framework\View\Element\Messageschịu trách nhiệm hiển thị thông điệp.

Các khối được xác định trong default.xml chỉ dành cho các thông điệp JS.


Làm thế nào để bạn thêm nó vào checkout_index_index.xml?
Stevie G

1

Hãy xem

nhà cung cấp / magento / mô-đun khách hàng / xem / 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);
        }
    }
});

Như chúng ta có thể thấy, đã có sẵn chức năng kiểm tra . Nếu phản hồi của chúng tôi chứa từ khóa : 'redirect', 'backUrl', thông báo sẽ tải sau khi chuyển hướng.

  • Sau khi ajax hoàn thành, khách hàng sẽ bị vô hiệu. Đây sẽ là "kích hoạt" tải lại phiên tin nhắn.
  • Kiểm tra từ khóa : 'redirect', 'backUrl'.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.