Cosa sono esattamente quelle sezioni?
Una sezione è un pezzo di dati dei clienti raggruppati insieme. Ogni sezione è rappresentata dalla chiave utilizzata per accedere e gestire i dati e i dati stessi. Magento carica sezioni su richiesta AJAX /customer/section/load/
e memorizza nella cache i dati caricati nella memoria locale del browser sotto la chiave mage-cache-storage
. Magento tiene traccia di quando una sezione viene modificata e carica automaticamente la sezione aggiornata.
Come si definisce una sezione?
Una sezione definita nel di.xml
file aggiungendo una nuova sezione nel pool di sezioni
<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>
Quindi qui sono registrate due nuove sezioni cart
e directory-data
. Magento\Checkout\CustomerData\Cart
e Magento\Checkout\CustomerData\DirectoryData
implementa Magento\Customer\CustomerData\SectionSourceInterface
e fornisce dati effettivi come risultato del getSectionData
metodo.
Come vengono attivati gli aggiornamenti della sezione?
Magento presuppone che i dati privati del cliente è cambiata quando un cliente invia alcune richieste di modifica dello stato ( POST
, PUT
, DELETE
). Per ridurre al minimo il carico sul server, gli sviluppatori dovrebbero specificare quale azione (o richiesta) aggiorna la sezione dei dati del cliente in etc/section.xml
.
<action name="checkout/cart/add">
<section name="cart"/>
</action>
Il nome dell'azione è un modello chiave di azione. Quando un utente chiama all'azione che corrisponde al modello specificato Magento rileverà che la sezione corrispondente è obsoleta e la carica di nuovo. Se il nome dell'azione *
indica che la sezione verrà aggiornata su ogni richiesta POST e PUT. Se manca un tag di sezione, tutte le sezioni verranno aggiornate.
Quindi concettualmente questo è sbagliato per aggiornare il mini carrello quando la pagina del carrello è ricca. A questo punto, il mini carrello (o la sezione carrello) dovrebbe già essere aggiornato.
Puoi trovare ulteriori informazioni sui dati dei clienti qui
Implementazione interna
Per capire quando e come vengono aggiornate le sezioni, vediamo l'implementazione. La chiave per comprendere sono i file magento2ce/app/code/Magento/Customer/view/frontend/web/js/section-config.js
e magento2ce/app/code/Magento/Customer/view/frontend/web/js/customer-data.js
.
Alla fine dell'ultimo uno dei due gestori di eventi sono registrati per ajaxComplete
e submit
. Ciò significa che quando qualsiasi forma è pubblicato (con POST o metodi PUT) al server, o quando JavaScript invia una AJAX
, POST
o PUT
richiesta, verranno richiamati i gestori. Entrambi i gestori hanno una logica simile: con l'aiuto di Magento_Customer/js/section-config
check dovrebbe essere aggiornata o meno qualsiasi sezione. Se alcune sezioni devono essere aggiornate, customerData.invalidate(sections)
viene chiamato. E in seguito tutte le sezioni invalidate vengono caricate da un server.
Quindi, come fa a Magento_Customer/js/section-config
sapere quale sezione dovrebbe essere rimossa e su quale azione? La risposta è 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>
In tal modo, un server passa la configurazione delle sezioni unite a un browser.
Quindi, supponendo tutto ciò, la sezione può essere aggiornata solo tramite l'invio di un modulo POST o PUT o una richiesta AJAX
Inoltre, ci sono solo due note:
- tutto ciò che è descritto qui è un'implementazione interna e può essere modificato, quindi puoi tranquillamente utilizzare solo sezioni.xml e aspettarti aggiornamenti di sezione quando vengono attivate le azioni POST o PUT o DELETE specificate.
- se sei sicuro di aver davvero bisogno di aggiornare alcune sezioni puoi sempre fare qualcosa del genere:
require('Magento_Customer/js/customer-data').reload(['cart'], false)