Quelles sont exactement ces sections?
Une section est une donnée client regroupée. Chaque section est représentée par une clé utilisée pour accéder aux données et les gérer elles-mêmes. Magento charge les sections par requête AJAX /customer/section/load/
et met en cache les données chargées dans la mémoire de stockage locale du navigateur, sous la clé mage-cache-storage
. Magento assure le suivi du changement de section et le chargement de la section mise à jour automatiquement.
Comment définissez-vous une section?
Une section définie dans un di.xml
fichier en ajoutant une nouvelle section au pool de sections
<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>
Donc ici deux nouvelles sections sont enregistrées cart
et directory-data
. Magento\Checkout\CustomerData\Cart
et Magento\Checkout\CustomerData\DirectoryData
implémente Magento\Customer\CustomerData\SectionSourceInterface
et fournit les données réelles en tant que résultat de la getSectionData
méthode.
Comment les mises à jour de section sont-elles déclenchées?
Magento suppose que lorsqu'un client envoie une demande de modification d'état est changé les données privées du client ( POST
, PUT
, DELETE
). Pour minimiser la charge sur le serveur, les développeurs doivent spécifier quelle action (ou demande) met à jour la section de données client de etc/section.xml
.
<action name="checkout/cart/add">
<section name="cart"/>
</action>
Le nom de l'action est un modèle de clé d'action. Lorsqu'un utilisateur appelle une action correspondant au modèle spécifié, Magento détectera cette section et la rechargera. Si nom de l'action est *
défini, cela signifie que cette section sera mise à jour à chaque demande POST et PUT. Si la balise de section est manquée, toutes les sections seront mises à jour.
Donc, conceptuellement, il est faux de mettre à jour le mini-panier lorsque vous utilisez une page de panier riche. À ce stade, le mini-panier (ou la section du panier) devrait déjà être mis à jour.
Vous pouvez trouver plus d'informations sur les données client ici
Mise en œuvre interne
Pour comprendre quand et comment les sections sont mises à jour, voyons l'implémentation. Les fichiers magento2ce/app/code/Magento/Customer/view/frontend/web/js/section-config.js
et magento2ce/app/code/Magento/Customer/view/frontend/web/js/customer-data.js
.
À la fin du dernier des deux événements, les gestionnaires sont enregistrés pour ajaxComplete
et submit
. Cela signifie que lorsqu'un formulaire est posté (avec des méthodes POST ou PUT) sur le serveur, ou que JavaScript envoie une AJAX
, POST
ou une PUT
demande, les gestionnaires sont appelés. Les deux gestionnaires ont une logique similaire: avec l'aide de Magento_Customer/js/section-config
check, toute section doit être mise à jour ou non. Si une section doit être mise à jour, elle customerData.invalidate(sections)
est appelée. Et plus tard, toutes les sections invalidées sont chargées depuis un serveur.
Alors, comment Magento_Customer/js/section-config
savoir quelle section doit être supprimée et pour quelle action? La réponse est dans 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>
De cette manière, un serveur transmet la configuration des sections fusionnées à un navigateur.
Donc, en supposant que tout cela, section peut être mise à jour uniquement par la soumission de formulaire POST ou PUT ou demande AJAX
De plus, il n'y a que deux notes:
- Tout ce qui est décrit ici est une implémentation interne et peut être modifié. Vous pouvez donc utiliser en toute sécurité uniquement sections.xml et attendre des mises à jour de section lorsque des actions POST, PUT ou DELETE spécifiées sont déclenchées.
- si vous êtes sûr que vous avez vraiment besoin de mettre à jour une section, vous pouvez toujours faire quelque chose comme ceci:
require('Magento_Customer/js/customer-data').reload(['cart'], false)