Блок с Cachable = false не отображается на странице просмотра продукта

21

Я использую magento2-1.0.0-beta4

Я скопировал checkout.rootблок с app/code/Magento/Checkout/view/frontend/layout/checkout_index_index.xmlна страницу продукта.

Все работает нормально, пока не включу page_cache. Этот блок находится cacheable="false"в XML-формате.

Теперь, когда я открываю страницу своего продукта, блок вообще не отображается.

Если я правильно понял кеш страниц, он должен загружать такие блоки с помощью вызова AJAX. Но, похоже, такого AJAX-вызова не происходит, так как моя точка \Magento\PageCache\Controller\Block\Render::executeостанова никогда не срабатывает.

При открытии /checkout/или /checkout/cart/все работает. Но там также, кажется, не происходит вызов AJAX. Вместо этого вся страница, кажется, не отображается из кэша, что имеет смысл для корзины.

Так я должен просто исключить страницу представления продукта из page_cache? Но я не нашел способ сделать это?

Alex
источник

Ответы:

15

Эта проблема по-прежнему воспроизводима в стабильной версии Magento 2.0.0.

В обработке исключений 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()в Magento / PageCache / view / frontend / web / js / page-cache.js . Также проверьте высокоуровневые документы в readme модуля кеширования страниц.

Страница продукта не должна кэшироваться, поскольку cacheable="false"она установлена ​​для блока извлечения, однако это происходит из-за известной проблемы, что кэшируемые блоки не кэшируются . Пока эта проблема не будет решена, можно использовать следующий обходной путь (не спрашивайте меня, почему это работает, это длинная история):

  1. Перейти к \Magento\Framework\Pricing\Render\Layout::__construct
  2. Изменить ['cacheable' => $generalLayout->isCacheable()]на['cacheable' => false]

Это не должно повредить, потому что страницы продукта не будут кэшироваться в любом случае после добавления блока проверки

Другой вопрос: вы действительно хотите сделать страницы продукта не кешируемыми с помощью встроенного кеша страниц или Varnish?

Алекс Палиаруш
источник
1
Есть какие-нибудь обновления для этой проблемы в последней версии magento2? @Alex
Кейур Шах
Алекс, я просто хочу один phtml удалить из кеша. и этот вызов файла HTML в контейнер заголовка. Любая идея, пожалуйста, дайте мне знать
Camit1dk