Was sind genau diese Abschnitte?
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 zwischen mage-cache-storage
. Magento verfolgt, wenn ein Abschnitt geändert wird, und lädt den aktualisierten Abschnitt automatisch.
Wie definieren Sie einen Abschnitt?
Ein Abschnitt, der in di.xml
Datei definiert wird, indem ein neuer Abschnitt in den Abschnittspool eingefügt wird
<type name="Magento\Customer\CustomerData\SectionPoolInterface">
<arguments>
<argument name="sectionSourceMap" xsi:type="array">
<item name="cart" xsi:type="string">Magento\Checkout\CustomerData\Cart</item>
<item name="directory-data" xsi:type="string">Magento\Checkout\CustomerData\DirectoryData</item>
</argument>
</arguments>
</type>
Hier sind also zwei neue Rubriken eingetragen cart
und directory-data
. Magento\Checkout\CustomerData\Cart
und Magento\Checkout\CustomerData\DirectoryData
implementiert Magento\Customer\CustomerData\SectionSourceInterface
und liefert tatsächliche Daten als Ergebnis der getSectionData
Methode.
Wie werden die Abschnittsaktualisierungen ausgelöst?
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 aktualisiert etc/section.xml
.
<action name="checkout/cart/add">
<section name="cart"/>
</action>
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
und magento2ce/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 registriert submit
. Das bedeutet , dass , wenn irgendeine Form geschrieben wird (mit POST oder PUT - Methoden) an dem Server, oder wenn JavaScript sendet einen AJAX
, POST
oder PUT
Wunsch werden die Handler aufgerufen. Beide Handler haben eine ähnliche Logik: Mit Hilfe von Magento_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 in Magento/Customer/view/frontend/templates/js/section-config.phtml
:
<script type="text/x-magento-init">
<?php
/* @noEscape */ echo $this->helper(\Magento\Framework\Json\Helper\Data::class)->jsonEncode([
'*' => ['Magento_Customer/js/section-config' => [
'sections' => $block->getSections(),
'clientSideSections' => $block->getClientSideSections(),
'baseUrls' => array_unique([
$block->getUrl(null, ['_secure' => true]),
$block->getUrl(null, ['_secure' => false]),
]),
]],
]);
?>
</script>
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:
- Alles, was hier beschrieben wird, ist eine interne Implementierung und kann geändert werden. Daher können Sie sicher nur die Datei section.xml verwenden und Abschnittsaktualisierungen erwarten, wenn bestimmte POST-, PUT- oder DELETE-Aktionen ausgelöst werden.
- Wenn Sie sicher sind, dass Sie einen Abschnitt wirklich aktualisieren müssen, können Sie immer so etwas tun:
require('Magento_Customer/js/customer-data').reload(['cart'], false)