Блокувати за допомогою 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? Але я не знайшов способу це зробити?

Відповіді:


15

Ця проблема досі відтворюється в 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"вона встановлена ​​для блоку оформлення замовлення, однак вона є через кешовану відому проблему . Поки це питання не буде вирішено, може бути використаний наступний спосіб вирішення питань (не запитуйте мене, чому це працює, це довга історія):

  1. Йти до \Magento\Framework\Pricing\Render\Layout::__construct
  2. Змінити ['cacheable' => $generalLayout->isCacheable()]на['cacheable' => false]

Це не повинно завдати шкоди, оскільки сторінки продуктів не будуть кешовані після додавання блоку замовлення

Інше питання: чи дійсно ви хочете, щоб сторінки продуктів не були кешовані вбудованим кешем сторінок або лаком?


1
Будь-які оновлення цього випуску щодо останньої версії magento2? @ Алекс
Кейур Шах

Алекс, я просто хочу один phtml видалити з кеша. і цей html-файл викликає в контейнер заголовка. будь-яка ідея, будь ласка, повідомте мене
Camit1dk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.