J'ai récemment découvert un nouveau concept intéressant dans Magento 2: les sections client
Certains d'entre vous ont peut-être remarqué la présence de sections.xml
fichiers ressemblant à ceci:
<?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>
D'après ce que j'ai compris, ces fichiers spécifient quelles sections du client doivent être mises à jour lorsque l'action correspondante est appelée.
J'ai remarqué par exemple avec la Magento/Checkout/etc/frontend/sections.xml
partie suivante:
<action name="checkout/cart/add">
<section name="cart"/>
</action>
C’est ce qui déclenche la mise à jour minicart après avoir ajouté un produit au panier.
J'ai essayé de créer un module personnalisé avec le etc/frontend/sections.xml
fichier suivant pour tester cette fonctionnalité:
<?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>
Mais il ne semble pas essayer de mettre à jour la section de mon panier lorsque j'atteins la page du panier (aucune demande GET dans la console). Il semble que toute cette fonctionnalité de section soit gérée par le Magento_Customer
module d’une manière ou d’une autre.
- Quelles sont exactement ces sections? Comment définissez-vous une section?
- Comment les mises à jour de section sont-elles déclenchées?
- (Facultatif) Comment puis-je corriger mon code de test pour mettre à jour le minicart lorsque j'atteins la page du panier?
la source
Réponses:
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.Une section définie dans un
di.xml
fichier en ajoutant une nouvelle section au pool de sectionsDonc ici deux nouvelles sections sont enregistrées
cart
etdirectory-data
.Magento\Checkout\CustomerData\Cart
etMagento\Checkout\CustomerData\DirectoryData
implémenteMagento\Customer\CustomerData\SectionSourceInterface
et fournit les données réelles en tant que résultat de lagetSectionData
méthode.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 deetc/section.xml
.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
etmagento2ce/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
etsubmit
. Cela signifie que lorsqu'un formulaire est posté (avec des méthodes POST ou PUT) sur le serveur, ou que JavaScript envoie uneAJAX
,POST
ou unePUT
demande, les gestionnaires sont appelés. Les deux gestionnaires ont une logique similaire: avec l'aide deMagento_Customer/js/section-config
check, toute section doit être mise à jour ou non. Si une section doit être mise à jour, ellecustomerData.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 dansMagento/Customer/view/frontend/templates/js/section-config.phtml
: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:
require('Magento_Customer/js/customer-data').reload(['cart'], false)
la source
L'action que vous avez définie dans la balise doit être évoquée via une requête POST. par exemple:
De même, si vous souhaitez actualiser les données client dans toutes les sections, utilisez simplement (consultez le site / fournisseur / module-client / etc / frontend / sections.xml du module).
Vous pouvez aussi regarder à la fin du fichier
vendor/magento/module-customer/view/frontend/web/js/section-config.js
Trouver le code:
la source
Une façon hacky que j'ai trouvée pour faire ça:
Dans ma classe d'action qui redirige vers le panier, je fais:
Ensuite, j'ai ajouté ce qui suit à ma page de panier:
Puis dans mon bloc j'ai:
Et ma
Refresh.php
classe d'action ressemble à ceci:la source
J'ai rencontré le même problème que l'auteur de la question. Après quelques heures de recherche et de manipulation de la documentation et du code principal, j'ai soudain eu la solution. Dans mon cas, j'ai ... le fichier / etc / frontend / sections.xml avec
Et ça ne voulait pas marcher. Après avoir lu ce sujet et ce problème https://github.com/magento/magento2/issues/3287, j'étais tellement confus que j'ai commencé à expérimenter. Pour moi, aide en ajoutant des barres obliques:
J'espère que cela aidera quelqu'un à passer moins de temps à trouver une solution.
la source