Bu bölümler tam olarak nedir?
Bir bölüm birlikte gruplandırılmış bir müşteri verisi parçasıdır. Her bölüm, verilere ve verilere erişmek ve bunları yönetmek için kullanılan anahtarla temsil edilir. Magento, AJAX isteğine göre bölümleri yükler /customer/section/load/
ve yüklenen verileri anahtarın altındaki tarayıcı yerel deposuna önbelleğe alır mage-cache-storage
. Magento bazı bölümler değiştirildiğinde izlenir ve güncellenmiş bölümü otomatik olarak yükler.
Bir bölümü nasıl tanımlarsınız?
di.xml
Bölümler havuzuna yeni bir bölüm ekleyerek dosyada tanımlanan bölüm
<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>
Yani burada iki yeni bölüm kayıtlıdır cart
ve directory-data
. Magento\Checkout\CustomerData\Cart
ve yöntemin sonucu olarak gerçek verileri Magento\Checkout\CustomerData\DirectoryData
uygular Magento\Customer\CustomerData\SectionSourceInterface
ve sağlar getSectionData
.
Bölüm güncellemeleri nasıl tetiklenir?
Magento bir müşterinin bazı devlet modifikasyon istek gönderdiğinde müşterinin özel veri değiştiğinde varsayar ( POST
, PUT
, DELETE
). Sunucu yükünü en aza indirmek için, geliştiricilerin hangi müşteri verileri bölümünde hangi eylemi (veya isteği) güncelleyeceğini belirtmesi gerekir etc/section.xml
.
<action name="checkout/cart/add">
<section name="cart"/>
</action>
İşlem adı, bir işlem anahtarı kalıbıdır. Bir kullanıcı belirtilen kalıba uyan bir eylemi aradığında, Magento ilgili bölümün eski olduğunu tespit eder ve tekrar yükler. Eylem adı bu ise *
, bu bölüm her POST ve PUT isteğinde güncellenecektir. Bölüm etiketi kaçırılırsa tüm bölüm güncellenir.
Bu yüzden kavramsal olarak bu, sepeti sayfasını zenginleştirdiğinizde mini sepeti güncellemek yanlıştır. Bu noktada, mini alışveriş sepeti (veya alışveriş sepeti bölümü) zaten güncellenmelidir.
Müşteri Verileri hakkında daha fazla bilgiyi burada bulabilirsiniz.
Dahili Uygulama
Bölümlerin ne zaman ve nasıl güncellendiğini anlamak için uygulamaya geçelim. Anlamanın anahtarı, dosyalar magento2ce/app/code/Magento/Customer/view/frontend/web/js/section-config.js
ve magento2ce/app/code/Magento/Customer/view/frontend/web/js/customer-data.js
.
Son olayın sonunda, iki olay işleyicisinden biri için ajaxComplete
ve kayıtlıdır submit
. Bu demektir ki, herhangi bir şekilde bir sunucuya veya JavaScript bir gönderdiğinde (POST veya PUT yöntemlerle) gönderilen zaman AJAX
, POST
ya da PUT
talebi, yükleyiciler çağrılır. Her iki işleyicide de benzer bir mantık var: Magento_Customer/js/section-config
kontrol yardımı ile güncellenen ya da olmayan herhangi bir bölüm olmalıdır. Bazı bölüm güncellenmesi gerekiyorsa o customerData.invalidate(sections)
zaman denir. Ve daha sonra bütün geçersiz bölümler bir sunucudan yüklenir.
Peki Magento_Customer/js/section-config
hangi bölümün kaldırılması ve hangi eylemde bulunulması gerektiğini nasıl bilebilir? Cevap içinde 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>
Bu şekilde, bir sunucu birleştirilmiş bölümlerin yapılandırmasını bir tarayıcıya iletir.
Bunların hepsini varsayarsak, bölüm yalnızca POST veya PUT formu göndererek veya AJAX isteği ile güncellenebilir
Ayrıca, sadece iki not vardır:
- burada açıklanan tüm iç uygulamalardır ve değiştirilebilir, bu nedenle yalnızca POST veya PUT veya DELETE eylemleri tetiklendiğinde güvenle yalnızca bölüm.xml kullanabilir ve bölüm güncellemelerini bekleyebilirsiniz.
- Eğer bazı bölümleri gerçekten güncellemeniz gerektiğinden eminseniz, daima şöyle bir şey yapabilirsiniz:
require('Magento_Customer/js/customer-data').reload(['cart'], false)