So zeigen Sie mit messageManager einen Fehler nach der Umleitung an

23

Ich habe ein Modul, das eine Post-Aktion verarbeitet und dann umleitet.

Jetzt gibt es Fehlerfälle, und ich möchte den Benutzern Nachrichten für sie anzeigen.

Ich weiß bereits, dass dieser Code der Sitzung die Nachricht hinzufügt.

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

Aber ich verstehe nicht, wie ich das Rendern auslösen soll.

Derzeit wird es nur angezeigt, wenn ich eine andere Aktion ausführe, die dies bereits auf eine funktionierende Weise verwendet.

Wie zum Beispiel das Login mit falschem Passwort.

Flyingmana
quelle
Finden Sie eine Lösung für dieses Problem?
Shaheer Ali
1
Es gibt bereits eine eingebaute Prüffunktion. Siehe meine Antwort: magento.stackexchange.com/a/219143/33057
Khoa TruongDinh
Dieser Code, wo hinzugefügt wird?
SUDHAKAR ARUNACHALAM

Antworten:

22

Sie müssen die Objektinjektionsmethode für Ihre Modulaktionsklasse verwenden, um das Nachrichtenmanagerobjekt darin zu injizieren. Ich habe ein Beispiel dafür bereitgestellt, was Sie tun können. Ich hoffe es hilft

class Example
{
    protected $_messageManager;

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

    public function method( ) {
        ..
        $message = '...';
        $this->_messageManager->addError($message);
        ..
    }
}
Karvin Ong
quelle
Gibt es eine getError-Funktion? Ich möchte die Nachricht
abrufen
1
die addErrorveraltete Methode sollte jetzt addErrorMessage sein
jamil
@jafarpinjar, nein. Ich würde es in der Übersetzung ändern, aber wenn Sie es in der Übersetzung nicht ändern können, können Sie die Fehlermeldung durch Ereignisbeobachter erhalten und es dort manipulieren.
Karvin Ong
@jamil, ja einverstanden. addError wird abgeschrieben, aber immer noch auf Version 2.3.1 unterstützt :)
Karvin Ong
6

Ich bin mir nicht sicher, ob Sie danach suchen, aber ich probiere es aus.
Sie können die Nachrichten folgendermaßen abrufen:

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

wo messageManagerist eine Instanz von \Magento\Framework\Message\ManagerInterface.

Im Kern wird dies für Ajax-Aufrufe verwendet, um die Fehlermeldungen in der JSON-Antwort wie folgt zurückzugeben ( \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
]);

Für Aktionen mit Ausgabe sollte man nichts tun (denke ich). Die default.xmlLayoutdatei aus dem Magento_ThemeModul enthält bereits diesen Block <block class="Magento\Framework\View\Element\Messages" name="messages" as="messages" template="Magento_Theme::messages.phtml"/>, der die Meldungen verarbeiten soll.

[Randnotiz]:
Nicht verwenden $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message). Injizieren Sie in Ihrem Konstruktor eine Instanz von Magento\Framework\Escaperund verwenden Sie diese.

Marius
quelle
Die Aktion loginPost kann dies ebenfalls auslösen und führt anschließend eine Weiterleitung zur Anmeldeseite durch und zeigt diese dann an. Das ist der Fall, den ich auch habe. Kein Ajax, keine gleiche Seite.
Flyingmana
Das habe ich gesagt ... das sollte standardmäßig behandelt werden. Sie sollten keine Änderungen vornehmen müssen. Die Sitzungsnachricht sollte auf der nächsten Seite angezeigt werden.
Marius
2
Und deshalb mache ich diese Frage. Weil es nicht so ist. Ich leite sogar auf dieselbe Seite um (Login), sodass offensichtlich ein zusätzlicher Schritt erforderlich ist. Wie gesagt, selbst auf der Anmeldeseite wird meine Nachricht erst angezeigt, nachdem ich versucht habe,
mich anzumelden, wobei
1
OKAY. Ich werde tiefer graben. Das kommt mir komisch vor.
Marius
1
@Flyingmana. Ich habe etwas gefunden. Die Sitzungsnachrichten werden abgerufen, nachdem ein Anruf an getätigt wurde /customer/section/load/. Vielleicht hilft das ja.
Marius
4

Sie können auch den Nachrichtenmanager finden, auf den Sie zugreifen können, $contextindem er in Aktionskonstruktoren eingefügt wird:

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

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

Als nächstes verwenden Sie einfach wie in den Antworten oben erwähnt

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

Ich hoffe es hilft

medmek
quelle
2

Für mich sieht es so aus, als müssten Sie einen speziellen Block für Ihre Nachrichten hinzufügen, wenn Sie sie auf Nicht-JS-Weise anzeigen möchten.

Zum Beispiel in Magento \ Checkout \ view \ frontend \ layout \ checkout_cart_index.xml gibt es:

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

Magento\Checkout\Block\Cart\ValidationMessagesblock erweitert den Kernblock \Magento\Framework\View\Element\Messages, der für das Rendern von Nachrichten zuständig ist.

Die in definierten Blöcke default.xmlsind meines Erachtens nur für JS-Nachrichten bestimmt.

Michał Biarda
quelle
Wie fügst du es hinzu checkout_index_index.xml?
Stevie G
1

Schauen Sie sich an

vendor / magento / module-customer / 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);
        }
    }
});

Wie wir sehen können, gibt es bereits eine eingebaute Prüffunktion . Wenn unsere Antwort Keywords enthält 'redirect', 'backUrl', wird die Nachricht nach der Umleitung geladen.

  • Nachdem Ajax abgeschlossen ist, wird der Kunde ungültig. Dies wird das Neuladen der Nachrichtensitzung "auslösen".
  • Überprüfen Schlüsselwörter: 'redirect', 'backUrl'.
Khoa TruongDinh
quelle