magento2-1.0.0-beta4를 사용하고 있습니다
checkout.root
블록을 app/code/Magento/Checkout/view/frontend/layout/checkout_index_index.xml
제품 페이지로 복사했습니다 .
내가 활성화 할 때까지 모든 것이 잘 작동합니다 page_cache
. 이 블록은 cacheable="false"
Layout XML에 있습니다.
이제 제품 페이지를 열면 블록이 전혀 렌더링되지 않습니다.
페이지 캐시를 올바르게 이해했다면 AJAX 호출을 통해 해당 블록을로드해야합니다. 그러나 내 중단 점이 \Magento\PageCache\Controller\Block\Render::execute
절대로 맞지 않는 AJAX 호출은 발생하지 않는 것 같습니다 .
열 때 /checkout/
또는 /checkout/cart/
모든 것이 작동합니다. 그러나 AJAX 호출도 발생하지 않는 것 같습니다. 대신 전체 페이지가 캐시에서 렌더링되지 않은 것으로 보이므로 장바구니에 적합합니다.
따라서 제품보기 페이지를 page_cache
? 그러나 나는 그렇게 할 방법을 찾지 못했습니까?
답변
이 문제는 여전히 Magento 2.0.0 Stable에서 재현 할 수 있습니다.
Magento 2 예외 처리에는 다른 모든 블록이 여전히 렌더링되는 동안 깨진 블록의 렌더링을 방지하는 기능이 있습니다. 개발자 모드에서는 비활성화되어 모든 예외가 브라우저에 바로 표시됩니다. 기본 및 프로덕션 모드에서 블록 렌더링 중 예외가 발생하면 해당 블록은 출력에서 제거됩니다 (해당 예외는 여전히 var / log / system.log에 기록됩니다 ). 참조하십시오 \Magento\Framework\View\Layout::renderNonCachedElement()
.
제품 페이지에서 체크 아웃 블록 렌더링 중에 다음 예외가 발생하므로이 블록이 누락되었습니다 main.CRITICAL: No such entity with customerId = [] []
.
이 예외의 이유 customerLoggedIn == true
는 \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()
실행 후 세션 스토리지의 고객 데이터가 일관성이없는 상태 이고 고객 데이터가 누락 되었기 때문입니다. 이 플러그인은 현재 PHP 세션을 닫고 세션 스토리지에서 고객 데이터를 제거합니다. 이것은 페이지가 완전히 캐시 가능하고 실제로있는 경우에만 발생합니다.
레이아웃에 블록이 포함되지 않은 경우에만 페이지 캐시 모듈에서 페이지를 캐시 할 수있는 것으로 간주됩니다 cacheable="false"
. 이 속성을 추가해도 Ajax가이 블록을로드하지는 않습니다 (질문에서 가정). Ajax가 일부 블록을로드하려면이 블록 _isScopePrivate
은로 설정된 속성 을 선언 true
해야하며 cacheable="false"
페이지에 블록이 없어야합니다 . 참조 \Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()
와 mage.pageCache._replacePlaceholder()
의 젠토 / 페이지 캐시 /보기 / 프론트 엔드 / 웹 / JS / 페이지 cache.js . 페이지 캐시 모듈 readme 에서 고급 문서도 확인하십시오.
cacheable="false"
Checkout 블록에 대해 설정 되었으므로 제품 페이지를 캐시 할 수 없어야합니다 . 그러나 캐시되지 않은 블록이 캐시 되어 있다는 알려진 문제 때문 입니다. 이 문제가 해결 될 때까지 다음 해결 방법을 사용할 수 있습니다 (작동 원인을 묻지 말고 긴 이야기입니다).
- 로 이동
\Magento\Framework\Pricing\Render\Layout::__construct
- 변경
['cacheable' => $generalLayout->isCacheable()]
에['cacheable' => false]
결제 블록을 추가 한 후에는 제품 페이지가 캐시되지 않으므로 해가되지 않습니다.
또 다른 질문은 내장 페이지 캐시 또는 니스로 제품 페이지를 캐시 할 수 없게 만들고 싶습니까?