정확히 그 섹션은 무엇입니까?
섹션은 함께 그룹화 된 고객 데이터입니다. 각 섹션은 데이터 및 데이터 자체에 액세스하고 관리하는 데 사용되는 키로 표시됩니다. 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
방법.
섹션 업데이트는 어떻게 트리거됩니까?
마 젠토는 고객이 어떤 상태 수정 요청 (보낼 때 고객의 개인 데이터가 변경되는 것으로 가정 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
입니다.
마지막에 두 이벤트 핸들러 중 하나가 ajaxComplete
및에 등록됩니다 submit
. 즉, 즉, 어떤 형태의 서버, 또는 자바 스크립트가 전송할 때 (POST 또는 PUT 방법으로) 배치 될 때 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 요청에 의해서만 업데이트 될 수 있습니다
또한 두 가지 메모 만 있습니다.
- 여기에 설명 된 모든 내용은 내부 구현이며 변경 될 수 있으므로 section.xml 만 안전하게 사용할 수 있으며 지정된 POST 또는 PUT 또는 DELETE 작업이 트리거 될 때 섹션 업데이트를 기대할 수 있습니다.
- 확실하다면 일부 섹션을 업데이트해야하므로 항상 다음과 같이 할 수 있습니다.
require('Magento_Customer/js/customer-data').reload(['cart'], false)