Які саме ці розділи?
Розділ - це частина даних про клієнтів, згрупованих разом. Кожен розділ представлений ключем, який використовується для доступу та управління самими даними та даними. Magento завантажує розділи за запитом AJAX /customer/section/load/
і кешує завантажені дані у локальну пам’ять браузера під клавішею mage-cache-storage
. Magento відслідковує, коли деякий розділ змінюється та завантажує оновлений розділ автоматично.
Як визначити розділ?
Розділ, визначений у di.xml
файлі, додавши новий розділ у пул розділів
<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>
Тож тут зареєстровано два нові розділи cart
та directory-data
. Magento\Checkout\CustomerData\Cart
і Magento\Checkout\CustomerData\DirectoryData
реалізує Magento\Customer\CustomerData\SectionSourceInterface
та надає фактичні дані в результаті getSectionData
методу.
Як спрацьовують оновлення розділу?
Magento передбачає , що особисті дані клієнта змінюється , коли клієнт відправляє запит на деякий стан модифікації ( POST
, PUT
, DELETE
). Щоб мінімізувати навантаження на сервер, розробники повинні вказати, яку дію (або запит) оновлює, в якому розділі даних клієнта etc/section.xml
.
<action name="checkout/cart/add">
<section name="cart"/>
</action>
Назва дії - це ключ дії дії. Коли користувач закликає до дії, що відповідає заданому шаблону, Magento виявить, що відповідний розділ застарів, і завантажує його знову. Якщо назва дії - *
це означає, що цей розділ буде оновлюватися для кожного запиту POST та PUT. Якщо тег розділу пропущено, весь розділ буде оновлений.
Тож концептуально це невірно оновлювати міні-кошик, коли ви багата сторінка кошика. На цьому етапі вже слід оновити міні-кошик (або секцію кошика).
Ви можете знайти більше інформації про дані клієнта тут
Внутрішня реалізація
Щоб зрозуміти, коли і як оновлюються розділи, подивимося на реалізацію. Ключовими для розуміння є файли magento2ce/app/code/Magento/Customer/view/frontend/web/js/section-config.js
та magento2ce/app/code/Magento/Customer/view/frontend/web/js/customer-data.js
.
Наприкінці останнього один з двох обробників подій зареєстрований на ajaxComplete
та submit
. Це означає , що , коли будь-яка форма розміщена (з POST або методів PUT) до сервера, або коли JavaScript посилає AJAX
, POST
або PUT
запит, обробники будуть викликатися. Обидва обробники мають схожу логіку: за допомогою Magento_Customer/js/section-config
перевірки будь-який розділ повинен бути оновлений чи ні. Якщо якийсь розділ слід оновити, тоді customerData.invalidate(sections)
він викликається. А пізніше всі недійсні розділи завантажуються з сервера.
Тож як Magento_Customer/js/section-config
знати, який розділ слід видалити та який дії? Відповідь 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>
Таким чином, сервер передає конфігурацію об'єднаних розділів у браузер.
Отже, припускаючи все це, розділ може бути оновлений лише шляхом надсилання форми POST або PUT або запиту AJAX
Крім того, є лише дві примітки:
- все описане тут є внутрішньою реалізацією і може бути змінено, тому ви можете безпечно використовувати лише section.xml і очікувати оновлення розділів, коли запускаються вказані дії POST або PUT або DELETE.
- якщо ви впевнені, що вам дійсно потрібно оновити деякий розділ, ви завжди можете зробити щось подібне:
require('Magento_Customer/js/customer-data').reload(['cart'], false)