Recientemente me encontré con un nuevo concepto en Magento 2 que me pareció interesante: secciones de clientes
Algunos de ustedes pueden haber notado la presencia de sections.xml
archivos que se ven así:
<?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>
Por lo que entendí, esos archivos especifican qué secciones del cliente deben actualizarse cuando se llama a la acción correspondiente.
Me di cuenta por ejemplo con Magento/Checkout/etc/frontend/sections.xml
la siguiente parte:
<action name="checkout/cart/add">
<section name="cart"/>
</action>
Es lo que desencadena la actualización de minicart después de haber agregado un producto al carrito.
Intenté crear un módulo personalizado con el siguiente etc/frontend/sections.xml
archivo para probar esa característica:
<?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>
Pero no parece intentar actualizar la sección de mi carrito cuando llego a la página del carrito (no hay solicitud GET en la consola). Parece que toda la funcionalidad de esta sección es manejada por el Magento_Customer
módulo de alguna manera.
- ¿Qué son exactamente esas secciones? ¿Cómo se define una sección?
- ¿Cómo se activan las actualizaciones de la sección?
- (Opcional) ¿Cómo puedo corregir mi código de prueba para actualizar el minicart cuando llegue a la página del carrito?
fuente
Respuestas:
Una sección es una pieza de datos del cliente agrupada. Cada sección está representada por una clave que se utiliza para acceder y administrar datos y datos en sí. Magento carga secciones por solicitud AJAX
/customer/section/load/
y almacena en caché los datos cargados en el almacenamiento local del navegador bajo la clavemage-cache-storage
. Magento rastrea cuando se cambia alguna sección y carga la sección actualizada automáticamente.Una sección definida en el
di.xml
archivo al agregar una nueva sección al grupo de seccionesAsí que aquí están registradas dos nuevas secciones
cart
ydirectory-data
.Magento\Checkout\CustomerData\Cart
yMagento\Checkout\CustomerData\DirectoryData
implementosMagento\Customer\CustomerData\SectionSourceInterface
y proporciona datos reales como resultado degetSectionData
método.Magento supone que los datos privados del cliente se cambia cuando un cliente envía alguna solicitud de modificación del estado (
POST
,PUT
,DELETE
). Para minimizar la carga en el servidor, los desarrolladores deben especificar qué acción (o solicitud) actualiza en qué sección de datos del clienteetc/section.xml
.El nombre de la acción es un patrón de clave de acción. Cuando un usuario llama a la acción que coincide con el patrón especificado, Magento detectará que la sección correspondiente está desactualizada y la cargará nuevamente. Si el nombre de la acción es
*
eso significa que esa sección se actualizará en cada solicitud POST y PUT. Si se pierde la etiqueta de sección, se actualizará toda la sección.Conceptualmente, esto es incorrecto para actualizar el mini carrito cuando haces una página de carrito enriquecido. En este punto, el mini carrito (o sección del carrito) ya debería estar actualizado.
Puede encontrar más información sobre los datos del cliente aquí
Implementación interna
Para entender cuándo y cómo se actualizan las secciones, veamos la implementación. La clave para entender son los archivos
magento2ce/app/code/Magento/Customer/view/frontend/web/js/section-config.js
ymagento2ce/app/code/Magento/Customer/view/frontend/web/js/customer-data.js
.Al final del último de los dos controladores de eventos están registrados para
ajaxComplete
ysubmit
. Eso significa que cuando se registró ninguna forma (con POST o PUT métodos) al servidor, o cuando envía un JavaScriptAJAX
,POST
oPUT
petición, se invocarán los manipuladores. Ambos manejadores tienen una lógica similar: con la ayuda deMagento_Customer/js/section-config
check debería haber cualquier sección actualizada o no. Si alguna sección debe actualizarse,customerData.invalidate(sections)
se llama. Y más tarde, todas las secciones invalidadas se cargan desde un servidor.Entonces, ¿cómo
Magento_Customer/js/section-config
saber qué sección debe eliminarse y en qué acción? La respuesta está enMagento/Customer/view/frontend/templates/js/section-config.phtml
:De esta manera, un servidor pasa la configuración de secciones fusionadas a un navegador.
Asumiendo todo eso, la sección puede actualizarse solo mediante el envío de un formulario POST o PUT o una solicitud AJAX
Además, solo hay dos notas:
require('Magento_Customer/js/customer-data').reload(['cart'], false)
fuente
La acción que definió en la etiqueta debe evocarse mediante la solicitud POST. p.ej:
Además, si desea actualizar los datos del cliente en todas las secciones, simplemente use (Consulte vendor / magento / module-customer / etc / frontend / secciones.xml)
También puedes mirar al final del archivo
vendor/magento/module-customer/view/frontend/web/js/section-config.js
Encuentra el código:
fuente
Una forma hacky que encontré para hacer eso:
En mi clase de acción que redirige al carrito que hago:
Luego agregué lo siguiente a mi página de carrito:
Entonces en mi bloque tengo:
Y mi
Refresh.php
clase de acción se ve así:fuente
Me he enfrentado al mismo problema que el autor de la pregunta. Después de algunas horas de investigación y análisis de documentación y código central, de repente obtuve una solución. En mi caso obtuve el archivo ... / etc / frontend / secciones.xml con
Y no quería trabajar. Después de leer este tema y este problema https://github.com/magento/magento2/issues/3287, estaba tan confundido que comencé a experimentar. Para mí ayuda a agregar barras:
Espero que ayude a alguien a pasar menos tiempo para encontrar una solución.
fuente