Эта проблема по-прежнему воспроизводима в стабильной версии 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"
она установлена для блока извлечения, однако это происходит из-за известной проблемы, что кэшируемые блоки не кэшируются . Пока эта проблема не будет решена, можно использовать следующий обходной путь (не спрашивайте меня, почему это работает, это длинная история):
- Перейти к
\Magento\Framework\Pricing\Render\Layout::__construct
- Изменить
['cacheable' => $generalLayout->isCacheable()]
на['cacheable' => false]
Это не должно повредить, потому что страницы продукта не будут кэшироваться в любом случае после добавления блока проверки
Другой вопрос: вы действительно хотите сделать страницы продукта не кешируемыми с помощью встроенного кеша страниц или Varnish?