Ich bin kürzlich auf ein neues Konzept in Magento 2 gestoßen, das ich interessant fand: Kundenbereiche
Einige von Ihnen haben möglicherweise das Vorhandensein von sections.xml
Dateien bemerkt , die wie folgt aussehen:
<?xml version="1.0"?>
<!--
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
<action name="sales/guest/reorder">
<section name="cart"/>
</action>
<action name="sales/order/reorder">
<section name="cart"/>
</action>
</config>
Nach meinem Verständnis geben diese Dateien an, welche Kundenbereiche aktualisiert werden sollen, wenn die entsprechende Aktion aufgerufen wird.
Das ist mir zum Beispiel mit Magento/Checkout/etc/frontend/sections.xml
folgendem Teil aufgefallen :
<action name="checkout/cart/add">
<section name="cart"/>
</action>
Löst das Minicart-Update aus, nachdem Sie ein Produkt in den Warenkorb gelegt haben.
Ich habe versucht, ein benutzerdefiniertes Modul mit der folgenden etc/frontend/sections.xml
Datei zu erstellen, um diese Funktion zu testen:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
<action name="checkout/cart/index">
<section name="cart"/>
</action>
</config>
Es scheint jedoch nicht zu versuchen, meinen Warenkorbbereich zu aktualisieren, wenn ich die Warenkorbseite erreiche (keine GET-Anforderung in der Konsole). Es sieht so aus, als würde die Funktionalität des gesamten Abschnitts Magento_Customer
in irgendeiner Weise vom Modul übernommen.
- Was sind genau diese Abschnitte? Wie definieren Sie einen Abschnitt?
- Wie werden die Abschnittsaktualisierungen ausgelöst?
- (Optional) Wie kann ich meinen Testcode korrigieren, um das Minicart zu aktualisieren, wenn ich die Warenkorbseite erreiche?
quelle
Antworten:
Ein Abschnitt ist ein Teil der Kundendaten, die zusammen gruppiert sind. Jeder Abschnitt wird durch einen Schlüssel dargestellt, mit dem auf Daten und Daten selbst zugegriffen und diese verwaltet werden. Magento lädt Abschnitte per AJAX-Anfrage
/customer/section/load/
und speichert geladene Daten im lokalen Speicher des Browsers unter dem Schlüssel zwischenmage-cache-storage
. Magento verfolgt, wenn ein Abschnitt geändert wird, und lädt den aktualisierten Abschnitt automatisch.Ein Abschnitt, der in
di.xml
Datei definiert wird, indem ein neuer Abschnitt in den Abschnittspool eingefügt wirdHier sind also zwei neue Rubriken eingetragen
cart
unddirectory-data
.Magento\Checkout\CustomerData\Cart
undMagento\Checkout\CustomerData\DirectoryData
implementiertMagento\Customer\CustomerData\SectionSourceInterface
und liefert tatsächliche Daten als Ergebnis dergetSectionData
Methode.Magento geht davon aus, dass die privaten Daten des Kunden geändert wird , wenn ein Kunde eine Zustandsänderungsanforderung sendet (
POST
,PUT
,DELETE
). Um die Belastung des Servers zu minimieren, sollten Entwickler angeben, welche Aktion (oder Anforderung) welchen Kundendatenabschnitt in aktualisiertetc/section.xml
.Der Aktionsname ist ein Aktionsschlüsselmuster. Wenn ein Benutzer eine Aktion aufruft, die dem angegebenen Muster entspricht, erkennt Magento, dass der entsprechende Abschnitt veraltet ist, und lädt ihn erneut. Wenn der Aktionsname lautet
*
, bedeutet dies, dass der Abschnitt bei jeder POST- und PUT-Anforderung aktualisiert wird. Wenn das Abschnitts-Tag fehlt, werden alle Abschnitte aktualisiert.Konzeptionell ist es also falsch, den Mini-Warenkorb zu aktualisieren, wenn Sie eine umfangreiche Warenkorbseite haben. Zu diesem Zeitpunkt sollte der Mini Cart (oder der Cart-Bereich) bereits aktualisiert sein.
Weitere Informationen zu Kundendaten finden Sie hier
Interne Implementierung
Um zu verstehen, wann und wie Abschnitte aktualisiert werden, sehen wir uns die Implementierung an. Der Schlüssel zum Verständnis sind Dateien
magento2ce/app/code/Magento/Customer/view/frontend/web/js/section-config.js
undmagento2ce/app/code/Magento/Customer/view/frontend/web/js/customer-data.js
.Am Ende des letzten Tages ist einer der beiden Event-Handler für
ajaxComplete
und registriertsubmit
. Das bedeutet , dass , wenn irgendeine Form geschrieben wird (mit POST oder PUT - Methoden) an dem Server, oder wenn JavaScript sendet einenAJAX
,POST
oderPUT
Wunsch werden die Handler aufgerufen. Beide Handler haben eine ähnliche Logik: Mit Hilfe vonMagento_Customer/js/section-config
check sollte jeder Abschnitt aktualisiert werden oder nicht. Wenn ein Abschnitt aktualisiert werden soll,customerData.invalidate(sections)
wird aufgerufen. Und später werden alle ungültigen Abschnitte von einem Server geladen.Woher
Magento_Customer/js/section-config
weiß man also , welcher Abschnitt entfernt werden soll und auf welche Aktion? Die Antwort ist inMagento/Customer/view/frontend/templates/js/section-config.phtml
:Auf diese Weise übergibt ein Server die Konfiguration zusammengeführter Abschnitte an einen Browser.
Unter der Annahme, dass dies alles der Fall ist , kann der Abschnitt nur durch POST- oder PUT-Formularübermittlung oder AJAX-Anforderung aktualisiert werden
Außerdem gibt es nur zwei Noten:
require('Magento_Customer/js/customer-data').reload(['cart'], false)
quelle
Aktion, die Sie im Tag definiert haben, sollte über die POST-Anforderung ausgelöst werden. z.B:
Auch wenn Sie Kundendaten in allen Bereichen aktualisieren möchten, verwenden Sie einfach (siehe Hersteller / magento / module-customer / etc / frontend / areas.xml).
Sie können auch am Ende der Datei nachsehen.
vendor/magento/module-customer/view/frontend/web/js/section-config.js
Finden Sie den Code:
quelle
Ein hackiger Weg, den ich gefunden habe:
In meiner Action-Klasse, die zum Einkaufswagen umleitet, mache ich Folgendes:
Dann habe ich Folgendes zu meiner Warenkorb-Seite hinzugefügt:
Dann habe ich in meinem Block:
Und meine
Refresh.php
Actionklasse sieht so aus:quelle
Ich habe das gleiche Problem wie der Fragesteller. Nach ein paar Stunden Recherche und Durchforsten der Dokumentation und des Kerncodes bekam ich plötzlich eine Lösung. In meinem Fall habe ich ... / etc / frontend / areas.xml Datei mit
Und es wollte nicht funktionieren. Nachdem ich dieses Thema und diese Ausgabe https://github.com/magento/magento2/issues/3287 gelesen hatte, war ich so verwirrt, dass ich anfing zu experimentieren. Für mich hilft das Hinzufügen von Schrägstrichen:
Hoffe, es wird jemandem helfen, weniger Zeit für die Lösungsfindung zu verwenden.
quelle