Chính xác những phần đó là gì?
Một phần là một phần dữ liệu khách hàng được nhóm lại với nhau. Mỗi phần được đại diện bởi khóa được sử dụng để truy cập và quản lý dữ liệu và chính dữ liệu. Magento tải các phần theo yêu cầu AJAX /customer/section/load/
và lưu trữ dữ liệu được tải trong bộ nhớ cục bộ của trình duyệt theo khóa mage-cache-storage
. Magento theo dõi khi một số phần được thay đổi và tải phần cập nhật tự động.
Làm thế nào để bạn xác định một phần?
Một phần được xác định trong di.xml
tệp bằng cách thêm một phần mới vào nhóm phần
<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>
Vì vậy, ở đây hai phần mới được đăng ký cart
và directory-data
. Magento\Checkout\CustomerData\Cart
và Magento\Checkout\CustomerData\DirectoryData
thực hiện Magento\Customer\CustomerData\SectionSourceInterface
và cung cấp dữ liệu thực tế như là kết quả của getSectionData
phương pháp.
Làm thế nào là các cập nhật phần được kích hoạt?
Magento giả định rằng dữ liệu cá nhân của khách hàng được thay đổi khi một khách hàng gửi một số yêu cầu sửa đổi trạng thái ( POST
, PUT
, DELETE
). Để giảm thiểu tải trên máy chủ, nhà phát triển nên chỉ định hành động (hoặc yêu cầu) cập nhật phần dữ liệu khách hàng nào etc/section.xml
.
<action name="checkout/cart/add">
<section name="cart"/>
</action>
Tên hành động là một mẫu khóa hành động. Khi người dùng gọi hành động phù hợp với mẫu đã chỉ định, Magento sẽ phát hiện phần tương ứng đó đã lỗi thời và tải lại. Nếu tên hành động *
có nghĩa là phần đó sẽ được cập nhật trên mỗi yêu cầu POST và PUT. Nếu thẻ phần bị bỏ lỡ thì tất cả các phần sẽ được cập nhật.
Vì vậy, về mặt khái niệm, điều này là sai khi cập nhật giỏ hàng nhỏ khi bạn trang giàu giỏ hàng. Tại thời điểm này, giỏ hàng nhỏ (hoặc phần giỏ hàng) đã được cập nhật.
Bạn có thể tìm thêm thông tin về Dữ liệu khách hàng tại đây
Thực hiện nội bộ
Để hiểu khi nào và làm thế nào các phần được cập nhật, hãy xem thực hiện. Chìa khóa để hiểu là các tập tin magento2ce/app/code/Magento/Customer/view/frontend/web/js/section-config.js
và magento2ce/app/code/Magento/Customer/view/frontend/web/js/customer-data.js
.
Vào cuối của một trong hai trình xử lý sự kiện được đăng ký ajaxComplete
và submit
. Điều đó có nghĩa rằng khi dưới mọi hình thức được đăng tải (với POST hoặc các phương pháp PUT) đến máy chủ, hoặc khi JavaScript sẽ gửi một AJAX
, POST
hoặc PUT
yêu cầu, xử lý sẽ được gọi. Cả hai trình xử lý có logic tương tự: với sự trợ giúp của Magento_Customer/js/section-config
kiểm tra nên có bất kỳ phần nào được cập nhật hay không. Nếu một số phần nên được cập nhật thì customerData.invalidate(sections)
được gọi. Và sau đó tất cả các phần không hợp lệ được tải từ một máy chủ.
Vậy làm thế nào để Magento_Customer/js/section-config
biết phần nào nên được gỡ bỏ và trên hành động nào? Câu trả lời là trong 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>
Theo cách đó, một máy chủ chuyển cấu hình các phần được hợp nhất vào trình duyệt.
Vì vậy, giả sử tất cả điều đó, phần chỉ có thể được cập nhật bằng cách gửi biểu mẫu POST hoặc PUT hoặc yêu cầu AJAX
Ngoài ra, chỉ có hai lưu ý:
- tất cả được mô tả ở đây là triển khai nội bộ và có thể được thay đổi, do đó bạn chỉ có thể sử dụng một cách an toàn các phần của tệp XML và mong đợi các cập nhật phần khi các hành động POST hoặc PUT hoặc DELETE được chỉ định được kích hoạt.
- nếu bạn chắc chắn rằng bạn thực sự cần cập nhật một số phần bạn luôn có thể làm một cái gì đó như thế này:
require('Magento_Customer/js/customer-data').reload(['cart'], false)