Apa sebenarnya bagian-bagian itu?
Bagian adalah sepotong data pelanggan yang dikelompokkan bersama. Setiap bagian diwakili oleh kunci yang digunakan untuk mengakses dan mengelola data dan data itu sendiri. Magento memuat bagian dengan permintaan AJAX ke /customer/section/load/
dan cache data yang dimuat di penyimpanan lokal browser di bawah kunci mage-cache-storage
. Magento melacak ketika beberapa bagian diubah dan memuat bagian yang diperbarui secara otomatis.
Bagaimana Anda mendefinisikan bagian?
Bagian yang didefinisikan dalam di.xml
file dengan menambahkan bagian baru ke bagian kumpulan
<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>
Jadi di sini dua bagian baru terdaftar cart
dan directory-data
. Magento\Checkout\CustomerData\Cart
dan Magento\Checkout\CustomerData\DirectoryData
mengimplementasikan Magento\Customer\CustomerData\SectionSourceInterface
dan menyediakan data aktual sebagai hasil dari getSectionData
metode.
Bagaimana pembaruan bagian dipicu?
Magento mengasumsikan bahwa data pribadi pelanggan berubah ketika seorang pelanggan mengirimkan beberapa permintaan modifikasi negara ( POST
, PUT
, DELETE
). Untuk meminimalkan beban di server, pengembang harus menentukan tindakan (atau permintaan) mana yang memperbarui bagian data pelanggan etc/section.xml
.
<action name="checkout/cart/add">
<section name="cart"/>
</action>
Nama tindakan adalah pola kunci aksi. Ketika seorang pengguna menelepon untuk bertindak yang cocok dengan pola yang ditentukan Magento akan mendeteksi bahwa bagian yang sesuai sudah usang dan memuatnya lagi. Jika nama tindakan *
itu berarti bagian itu akan diperbarui pada setiap permintaan POST dan PUT. Jika tag bagian dilewatkan maka semua bagian akan diperbarui.
Jadi secara konsep ini salah untuk memperbarui mini cart saat Anda kaya halaman cart. Pada titik ini, kereta mini (atau bagian kereta) sudah harus diperbarui.
Anda dapat menemukan informasi lebih lanjut tentang Data Pelanggan di sini
Implementasi Internal
Untuk memahami kapan dan bagaimana bagian diperbarui mari kita lihat implementasi. Kunci untuk memahami adalah file magento2ce/app/code/Magento/Customer/view/frontend/web/js/section-config.js
dan magento2ce/app/code/Magento/Customer/view/frontend/web/js/customer-data.js
.
Pada akhir dari salah satu dari dua acara yang didaftarkan oleh penangan ajaxComplete
dan submit
. Itu berarti bahwa ketika formulir apa pun diposting (dengan metode POST atau PUT) ke server, atau ketika JavaScript mengirim AJAX
, POST
atau PUT
meminta, penangan akan dipanggil. Kedua penangan memiliki logika yang sama: dengan bantuan Magento_Customer/js/section-config
pemeriksaan harus ada bagian yang diperbarui atau tidak. Jika beberapa bagian harus diperbarui maka customerData.invalidate(sections)
dipanggil. Dan kemudian semua bagian yang tidak valid dimuat dari server.
Jadi, bagaimana cara Magento_Customer/js/section-config
mengetahui bagian mana yang harus dihapus dan tindakan apa? Jawabannya ada di 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>
Sedemikian rupa, server meneruskan konfigurasi bagian yang digabungkan ke browser.
Jadi dengan asumsi semua itu, bagian dapat diperbarui hanya dengan mengirimkan formulir POST atau PUT atau permintaan AJAX
Selain itu, hanya ada dua catatan:
- semua yang dijelaskan di sini adalah implementasi internal dan dapat diubah, sehingga Anda hanya dapat menggunakan bagian.xml dengan aman dan mengharapkan pembaruan bagian ketika tindakan POST atau PUT atau DELETE yang ditentukan dipicu.
- jika Anda yakin, bahwa Anda benar-benar perlu memperbarui beberapa bagian, Anda selalu dapat melakukan sesuatu seperti ini:
require('Magento_Customer/js/customer-data').reload(['cart'], false)