Недавно я познакомился с новой концепцией в Magento 2, которая показалась мне интересной: разделы для клиентов
Некоторые из вас могут заметить наличие sections.xml
файлов, которые выглядят так:
<?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>
Из того, что я понял, эти файлы указывают, какие разделы клиента должны обновляться при вызове соответствующего действия.
Я заметил, например, со Magento/Checkout/etc/frontend/sections.xml
следующей частью:
<action name="checkout/cart/add">
<section name="cart"/>
</action>
Это то, что запускает обновление миникарты после того, как вы добавили товар в корзину.
Я попытался создать пользовательский модуль со следующим etc/frontend/sections.xml
файлом для проверки этой функции:
<?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>
Но, похоже, он не пытается обновить мой раздел корзины, когда я попадаю на страницу корзины (нет запроса GET в консоли). Кажется, что вся эта функциональность раздела Magento_Customer
каким-то образом обрабатывается модулем.
- Что именно эти разделы? Как вы определяете раздел?
- Как запускаются обновления раздела?
- (Необязательно) Как я могу исправить свой тестовый код для обновления мини-карты, когда я попадаю на страницу корзины?
источник
Ответы:
Раздел - это часть данных клиента, сгруппированных вместе. Каждый раздел представлен ключом, который используется для доступа и управления данными и самими данными. Magento загружает разделы по запросу AJAX
/customer/section/load/
и кэширует загруженные данные в локальном хранилище браузера под ключомmage-cache-storage
. Magento отслеживает изменение какого-либо раздела и автоматически загружает обновленный раздел.Раздел, определенный в
di.xml
файле путем добавления нового раздела в пул разделовТаким образом , здесь два новых раздела регистрируются
cart
иdirectory-data
.Magento\Checkout\CustomerData\Cart
иMagento\Checkout\CustomerData\DirectoryData
реализуетMagento\Customer\CustomerData\SectionSourceInterface
и предоставляет фактические данные как результатgetSectionData
метода.Magento предполагает , что личные данные клиента изменяется , когда клиент отправляет запрос на некоторое состояние модификации (
POST
,PUT
,DELETE
). Чтобы свести к минимуму нагрузку на сервер, разработчики должны указать, какое действие (или запрос) обновляет какой раздел данных клиентаetc/section.xml
.Имя действия - это шаблон ключа действия. Когда пользователь вызывает действие, соответствующее указанному шаблону, 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
:Таким образом, сервер передает конфигурацию объединенных секций в браузер.
Таким образом, при условии всего этого, раздел может быть обновлен только путем отправки формы POST или PUT или запроса AJAX.
Кроме того, есть только две заметки:
require('Magento_Customer/js/customer-data').reload(['cart'], false)
источник
Действие, которое вы определили в теге, должно вызываться через запрос POST. например:
Также, если вы хотите обновить данные клиентов во всех разделах, просто используйте (посмотрите на vendor / magento / module-customer / etc / frontend / section.xml)
Вы также можете посмотреть в конце файла.
vendor/magento/module-customer/view/frontend/web/js/section-config.js
Найдите код:
источник
Хакерский способ, который я нашел, чтобы сделать это:
В моем классе действий, который перенаправляет в корзину, я делаю:
Затем я добавил на свою корзину следующее:
Тогда в моем блоке у меня есть:
И мой
Refresh.php
класс действий выглядит так:источник
Я столкнулся с той же проблемой, что и автор вопроса. После нескольких часов изучения документации и основного кода я внезапно нашел решение. В моем случае я получил ... / etc / frontend / section.xml файл с
И это не хотело работать. После прочтения этой темы и этой проблемы https://github.com/magento/magento2/issues/3287 я был настолько растерян, что начал экспериментировать. Для меня помогает добавление слешей:
Надеюсь, это поможет кому-то потратить меньше времени на поиск решения.
источник