Niedawno natknąłem się na nową koncepcję Magento 2, która mnie zainteresowała: sekcje dla klientów
Niektórzy z was mogą zauważyć obecność sections.xml
plików, które wyglądają tak:
<?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>
Z tego, co zrozumiałem, pliki te określają, które sekcje klientów powinny zostać zaktualizowane po wywołaniu odpowiedniej akcji.
Zauważyłem na przykład Magento/Checkout/etc/frontend/sections.xml
następującą część:
<action name="checkout/cart/add">
<section name="cart"/>
</action>
To właśnie powoduje aktualizację minicart po dodaniu produktu do koszyka.
Próbowałem utworzyć niestandardowy moduł z następującym etc/frontend/sections.xml
plikiem, aby przetestować tę funkcję:
<?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>
Ale nie wydaje się, aby próbować zaktualizować sekcję koszyka, gdy dojdę do strony koszyka (brak żądania GET w konsoli). Wygląda na to, że Magento_Customer
moduł w jakiś sposób obsługuje całą tę sekcję .
- Czym dokładnie są te sekcje? Jak definiujesz sekcję?
- W jaki sposób uruchamiane są aktualizacje sekcji?
- (Opcjonalnie) Jak mogę naprawić kod testowy, aby zaktualizować minikart po przejściu na stronę koszyka?
źródło
Odpowiedzi:
Sekcja to zgrupowane dane klienta. Każda sekcja jest reprezentowana przez klucz, który służy do uzyskiwania dostępu do danych i zarządzania nimi. Magento ładuje sekcje według żądania AJAX
/customer/section/load/
i buforuje załadowane dane w lokalnej pamięci przeglądarki pod kluczemmage-cache-storage
. Magento śledzi zmiany niektórych sekcji i automatycznie ładuje zaktualizowane sekcje.Sekcja zdefiniowana w
di.xml
pliku przez dodanie nowej sekcji do puli sekcjiWięc tutaj zarejestrowane są dwie nowe sekcje
cart
idirectory-data
.Magento\Checkout\CustomerData\Cart
orazMagento\Checkout\CustomerData\DirectoryData
wdrażaMagento\Customer\CustomerData\SectionSourceInterface
i dostarcza rzeczywiste dane w wynikugetSectionData
metody.Magento zakłada, że prywatne dane klienta ulega zmianie, gdy klient wysyła żądanie modyfikacji jakiś stan (
POST
,PUT
,DELETE
). Aby zminimalizować obciążenie serwera, programiści powinni określić, które działanie (lub żądanie) aktualizuje sekcję danych klientaetc/section.xml
.Nazwa akcji to wzór klucza akcji. Gdy użytkownik wezwie do działania pasującego do określonego wzorca, Magento wykryje, że odpowiednia sekcja jest nieaktualna i załaduje ją ponownie. Jeśli nazwa akcji to
*
oznacza, że sekcja będzie aktualizowana przy każdym żądaniu POST i PUT. Jeśli tag sekcji zostanie pominięty, wszystkie sekcje zostaną zaktualizowane.Więc koncepcyjnie źle jest aktualizować mini koszyk, gdy strona z bogatym koszykiem jest. W tym momencie mini koszyk (lub sekcja koszyka) powinien już zostać zaktualizowany.
Więcej informacji o danych klientów można znaleźć tutaj
Wdrożenie wewnętrzne
Aby zrozumieć, kiedy i jak sekcje są aktualizowane, zobaczmy implementację. Kluczem do zrozumienia są pliki
magento2ce/app/code/Magento/Customer/view/frontend/web/js/section-config.js
imagento2ce/app/code/Magento/Customer/view/frontend/web/js/customer-data.js
.Na koniec ostatniego z dwóch zarejestrowanych programów obsługi zdarzeń dla
ajaxComplete
isubmit
. Oznacza to, że gdy każda forma jest zamieszczona (z metody POST lub PUT) do serwera lub gdy JavaScript wysyłaAJAX
,POST
lubPUT
wniosek, koparki zostanie wywołany. Oba programy obsługi mają podobną logikę: przy pomocyMagento_Customer/js/section-config
sprawdzania należy zaktualizować dowolną sekcję. Jeśli jakaś sekcja powinna zostać zaktualizowana, wówczascustomerData.invalidate(sections)
jest wywoływana. A później wszystkie unieważnione sekcje są ładowane z serwera.Magento_Customer/js/section-config
Skąd więc wiadomo, którą sekcję należy usunąć i na której akcji? Odpowiedź jest wMagento/Customer/view/frontend/templates/js/section-config.phtml
:W ten sposób serwer przekazuje konfigurację scalonych sekcji do przeglądarki.
Zakładając, że wszystko to, sekcja może być aktualizowana tylko przez przesłanie formularza POST lub PUT lub żądanie AJAX
Ponadto istnieją tylko dwie notatki:
require('Magento_Customer/js/customer-data').reload(['cart'], false)
źródło
Czynność zdefiniowana w tagu powinna zostać wywołana przez żądanie POST. na przykład:
Również jeśli chcesz odświeżyć dane klienta we wszystkich sekcjach, po prostu użyj (Spójrz na dostawcę / magento / module-customer / etc / frontend / section.xml)
Możesz także spojrzeć na koniec pliku
vendor/magento/module-customer/view/frontend/web/js/section-config.js
Znajdź kod:
źródło
Hacky sposób, w jaki znalazłem to zrobić:
W mojej klasie akcji, która przekierowuje do koszyka, robię:
Następnie dodałem następujące elementy do mojej strony koszyka:
Następnie w moim bloku mam:
A moja
Refresh.php
klasa akcji wygląda następująco:źródło
Napotkałem ten sam problem co autor pytania. Po kilku godzinach poszukiwań i analizowania dokumentacji i podstawowego kodu nagle znalazłem rozwiązanie. W moim przypadku mam plik ... / etc / frontend / section.xml z
I nie chciał działać. Po przeczytaniu tego tematu i tego problemu https://github.com/magento/magento2/issues/3287 byłem tak zdezorientowany, że zacząłem eksperymentować. Dla mnie pomaga dodawanie ukośników:
Mam nadzieję, że pomoże to komuś poświęcić mniej czasu na znalezienie rozwiązania.
źródło