¿Qué son exactamente esas secciones?
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 clave mage-cache-storage
. Magento rastrea cuando se cambia alguna sección y carga la sección actualizada automáticamente.
¿Cómo se define una sección?
Una sección definida en el di.xml
archivo al agregar una nueva sección al grupo de secciones
<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>
Así que aquí están registradas dos nuevas secciones cart
y directory-data
. Magento\Checkout\CustomerData\Cart
y Magento\Checkout\CustomerData\DirectoryData
implementos Magento\Customer\CustomerData\SectionSourceInterface
y proporciona datos reales como resultado de getSectionData
método.
¿Cómo se activan las actualizaciones de la sección?
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 cliente etc/section.xml
.
<action name="checkout/cart/add">
<section name="cart"/>
</action>
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
y magento2ce/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
y submit
. Eso significa que cuando se registró ninguna forma (con POST o PUT métodos) al servidor, o cuando envía un JavaScript AJAX
, POST
o PUT
petición, se invocarán los manipuladores. Ambos manejadores tienen una lógica similar: con la ayuda de Magento_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á en 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 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:
- todo lo que se describe aquí es una implementación interna y puede modificarse, por lo que puede usar con seguridad solo secciones.xml y esperar actualizaciones de la sección cuando se activen acciones POST o PUT o DELETE especificadas.
- si está seguro de que realmente necesita actualizar alguna sección, siempre puede hacer algo como esto:
require('Magento_Customer/js/customer-data').reload(['cart'], false)