Cachable = false 인 블록은 제품보기 페이지에서 렌더링되지 않습니다 해당 블록을로드해야합니다. 그러나

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 블록에 대해 설정 되었으므로 제품 페이지를 캐시 할 수 없어야합니다 . 그러나 캐시되지 않은 블록이 캐시 되어 있다는 알려진 문제 때문 입니다. 이 문제가 해결 될 때까지 다음 해결 방법을 사용할 수 있습니다 (작동 원인을 묻지 말고 긴 이야기입니다).

  1. 로 이동 \Magento\Framework\Pricing\Render\Layout::__construct
  2. 변경 ['cacheable' => $generalLayout->isCacheable()]['cacheable' => false]

결제 블록을 추가 한 후에는 제품 페이지가 캐시되지 않으므로 해가되지 않습니다.

또 다른 질문은 내장 페이지 캐시 또는 니스로 제품 페이지를 캐시 할 수 없게 만들고 싶습니까?