それらのセクションは何ですか?
セクションは、グループ化された顧客データです。各セクションは、データおよびデータ自体へのアクセスと管理に使用されるキーで表されます。Magentoは、AJAXリクエストによってセクションを/customer/section/load/
ロードし、ロードされたデータをブラウザのローカルストレージのキーの下にキャッシュしますmage-cache-storage
。一部のセクションが変更されると、Magentoは追跡し、更新されたセクションを自動的にロードします。
セクションをどのように定義しますか?
di.xml
セクションプールに新しいセクションを追加することでファイルに定義されたセクション
<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>
だからここに二つの新しいセクションが登録されているcart
とdirectory-data
。メソッドの結果として実際のデータMagento\Checkout\CustomerData\Cart
をMagento\Checkout\CustomerData\DirectoryData
実装Magento\Customer\CustomerData\SectionSourceInterface
および提供しますgetSectionData
。
セクションの更新はどのようにトリガーされますか?
Magentoのは、顧客がいくつかの状態変更要求を送信するときに、お客様の個人データが変更されていることを前提と(POST
、PUT
、DELETE
)。サーバーの負荷を最小限に抑えるために、開発者は、どのアクション(または要求)がのどの顧客データセクションを更新するかを指定する必要がありますetc/section.xml
。
<action name="checkout/cart/add">
<section name="cart"/>
</action>
アクション名はアクションキーパターンです。ユーザーが指定されたパターンに一致するアクションを呼び出すと、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
。
2つのイベントハンドラーの最後の1つが終了する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
。
<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>
このようにして、サーバーはマージされたセクションの構成をブラウザーに渡します。
そのため、セクションはPOSTまたはPUTフォームの送信またはAJAXリクエストによってのみ更新される可能性があります
さらに、2つのメモのみがあります。
- ここで説明されているものはすべて内部実装であり、変更される可能性があるため、sections.xmlのみを安全に使用し、指定されたPOSTまたはPUTまたはDELETEアクションがトリガーされたときにセクションの更新を期待できます。
- 確かに、いくつかのセクションを本当に更新する必要がある場合は、いつでも次のようなことができます。
require('Magento_Customer/js/customer-data').reload(['cart'], false)