리디렉션 후 messageManager를 사용하여 오류를 표시하는 방법


23

Post 액션을 처리 한 다음 리디렉션하는 모듈이 있습니다.

이제 오류가 발생하여 사용자에게 메시지를 표시하고 싶습니다.

이 코드는 메시지를 세션에 추가한다는 것을 이미 알고 있습니다.

$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

메시지 관리자 객체를 주입하기 위해 ur 모듈 액션 클래스에서 객체 주입 메소드를 사용해야합니다. 내가 할 수있는 일의 예를 제공했습니다. 그것이 도움이되기를 바랍니다.

class Example
{
    protected $_messageManager;

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

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

getError 함수가 있습니까? 내가 메시지를 가져 오려는
자파르 pinjar


@jafarpinjar, 아뇨. 번역에서 변경하지만 번역에서 변경할 수 없으면 이벤트 관찰자가 오류 메시지를 가져 와서 조작 할 수 있습니다.
Karvin Ong

@jamil, 동의합니다. addError는 감가 상각되지만 ver 2.3.1에서 계속 지원됩니다 :)
Karvin Ong

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"/>메시지를 처리해야하는 이 블록이 이미 포함되어 있습니다 .

[측면 참고] :
사용하지 마십시오 $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message). 생성자에 인스턴스를 삽입 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 ($ message);

그것이 도움이되기를 바랍니다.


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

보시다시피 내장 검사 기능이 이미 있습니다. 응답에 키워드 :가 포함 된 경우 'redirect', 'backUrl'리디렉션 후 메시지가로드됩니다.

  • 아약스가 완료되면 고객이 무효화됩니다. "트리거"메시지 세션을 다시로드합니다.
  • 키워드 확인 : 'redirect', 'backUrl'.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.