O que são exatamente essas seções?
Uma seção é uma parte dos dados do cliente agrupados. Cada seção é representada pela chave usada para acessar e gerenciar dados e dados em si. O Magento carrega seções por solicitação AJAX /customer/section/load/
e armazena em cache os dados carregados no armazenamento local do navegador sob a chave mage-cache-storage
. O Magento rastreia quando alguma seção é alterada e carrega a seção atualizada automaticamente.
Como você define uma seção?
Uma seção definida no di.xml
arquivo adicionando uma nova seção ao conjunto de seções
<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>
Então, aqui duas novas seções são registradas cart
e directory-data
. Magento\Checkout\CustomerData\Cart
e Magento\Checkout\CustomerData\DirectoryData
implementa Magento\Customer\CustomerData\SectionSourceInterface
e fornece dados reais como resultado do getSectionData
método.
Como as atualizações de seção são acionadas?
Magento assume que os dados privados do cliente é alterada quando um cliente envia uma solicitação de modificação do estado ( POST
, PUT
, DELETE
). Para minimizar a carga no servidor, os desenvolvedores devem especificar em qual ação (ou solicitação) serão atualizadas quais seções de dados do cliente etc/section.xml
.
<action name="checkout/cart/add">
<section name="cart"/>
</action>
Nome da ação é um padrão de chave de ação. Quando um usuário chama uma ação que corresponde ao padrão especificado, o Magento detecta que a seção correspondente está desatualizada e a carrega novamente. Se o nome da ação for *
isso significa que a seção será atualizada em cada solicitação POST e PUT. Se a tag da seção estiver ausente, toda a seção será atualizada.
Portanto, conceitualmente, é errado atualizar o carrinho de compras quando a página do carrinho é rica. Neste ponto, o minicarrinho (ou seção do carrinho) já deve estar atualizado.
Você pode encontrar mais informações sobre dados do cliente aqui
Implementação Interna
Para entender quando e como as seções são atualizadas, vamos ver a implementação. A chave para entender são os arquivos 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
.
No final do último, um dos dois manipuladores de eventos está registrado para ajaxComplete
e submit
. Isso significa que quando qualquer forma é publicado (com POST ou métodos PUT) para o servidor, ou quando JavaScript envia um AJAX
, POST
ou PUT
pedido, os manipuladores será invocado. Ambos os manipuladores têm uma lógica semelhante: com a ajuda do Magento_Customer/js/section-config
cheque, deve haver qualquer seção atualizada ou não. Se alguma seção deve ser atualizada, então customerData.invalidate(sections)
é chamado. E depois todas as seções invalidadas são carregadas de um servidor.
Então, como Magento_Customer/js/section-config
saber qual seção deve ser removida e em qual ação? A resposta está em 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>
Dessa forma, um servidor passa a configuração de seções mescladas para um navegador.
Portanto, assumindo tudo isso, a seção pode ser atualizada apenas pelo envio de formulários POST ou PUT ou solicitação AJAX
Além disso, existem apenas duas notas:
- tudo descrito aqui é de implementação interna e pode ser alterado; portanto, você pode usar com segurança apenas o seções.xml e esperar atualizações de seção quando ações POST, PUT ou DELETE especificadas forem acionadas.
- se você tem certeza de que realmente precisa atualizar uma seção, sempre pode fazer algo assim:
require('Magento_Customer/js/customer-data').reload(['cart'], false)