Ця проблема досі відтворюється в 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()
в Magento / PageCache / view / frontend / web / js / page-cache.js . Також перевірте документи високого рівня в модулі кешування сторінок
Сторінка продукту не повинна бути кешованою, оскільки cacheable="false"
вона встановлена для блоку оформлення замовлення, однак вона є через кешовану відому проблему . Поки це питання не буде вирішено, може бути використаний наступний спосіб вирішення питань (не запитуйте мене, чому це працює, це довга історія):
- Йти до
\Magento\Framework\Pricing\Render\Layout::__construct
- Змінити
['cacheable' => $generalLayout->isCacheable()]
на['cacheable' => false]
Це не повинно завдати шкоди, оскільки сторінки продуктів не будуть кешовані після додавання блоку замовлення
Інше питання: чи дійсно ви хочете, щоб сторінки продуктів не були кешовані вбудованим кешем сторінок або лаком?