Blokir dengan Cachable = false tidak ditampilkan pada halaman tampilan produk

21

Saya menggunakan magento2-1.0.0-beta4

Saya telah menyalin checkout.rootblok dari app/code/Magento/Checkout/view/frontend/layout/checkout_index_index.xmlke halaman produk.

Semuanya berfungsi dengan baik, sampai saya mengaktifkannya page_cache. Blok itu ada cacheable="false"di Layout XML.

Sekarang ketika saya membuka halaman produk saya, blok tidak dapat ditampilkan sama sekali.

Jika saya memahami halaman cache dengan benar, itu harus memuat blok seperti itu melalui panggilan AJAX. Tapi sepertinya tidak terjadi panggilan AJAX karena break point saya \Magento\PageCache\Controller\Block\Render::executetidak pernah mengenai.

Saat membuka /checkout/atau /checkout/cart/semuanya berfungsi. Namun sepertinya juga tidak terjadi panggilan AJAX. Alih-alih seluruh halaman tampaknya tidak ditampilkan dari cache, yang masuk akal untuk keranjang.

Jadi haruskah saya mengecualikan halaman tampilan produk dari page_cache? Tetapi saya tidak menemukan cara untuk melakukannya?

Alex
sumber

Jawaban:

15

Masalah ini masih dapat direproduksi di Magento 2.0.0 Stable.

Ada fitur dalam penanganan perkecualian Magento 2, yang mencegah rendering dari blok yang rusak sementara semua blok lainnya masih dirender. Dalam mode pengembang itu dinonaktifkan dan semua pengecualian ditampilkan langsung di browser. Dalam mode default dan produksi, jika pengecualian terjadi selama rendering blok, blok hanya akan dihapus dari output (pengecualian yang sesuai masih masuk ke var / log / system.log ). Lihat \Magento\Framework\View\Layout::renderNonCachedElement().

Berikut pengecualian terjadi selama checkout blok render pada halaman produk dan itulah sebabnya blok ini hilang: main.CRITICAL: No such entity with customerId = [] [].

Alasan pengecualian ini adalah bahwa data pelanggan dalam penyimpanan sesi dalam keadaan tidak konsisten ( customerLoggedIn == truedan data pelanggan tidak ada) setelah \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()eksekusi. Plugin ini menutup sesi PHP saat ini dan dengan demikian menghapus data pelanggan dari penyimpanan sesi. Ini terjadi hanya jika halaman sepenuhnya dapat di-cache (dan memang benar).

Halaman dianggap dapat disimpan oleh modul cache halaman hanya jika tata letaknya tidak berisi blok cacheable="false". Menambahkan atribut ini tidak akan membuat blok ini dimuat oleh Ajax (seperti yang diasumsikan dalam pertanyaan). Untuk memiliki beberapa blok yang dimuat oleh Ajax, blok ini seharusnya memiliki properti _isScopePrivateyang ditetapkan true, apalagi, seharusnya tidak ada blok dengan cacheable="false"di halaman. Lihat \Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()dan mage.pageCache._replacePlaceholder()di Magento / PageCache / view / frontend / web / js / page-cache.js . Juga periksa dokumen tingkat tinggi dalam readme modul cache halaman

Halaman produk tidak boleh di-cache karena cacheable="false"diatur untuk blok checkout, namun hal itu, karena masalah yang diketahui Blok yang tidak dapat di-cache sedang di-cache . Sampai masalah ini teratasi, solusi berikut dapat digunakan (jangan tanya saya mengapa ini berhasil, ini adalah cerita yang panjang):

  1. Pergi ke \Magento\Framework\Pricing\Render\Layout::__construct
  2. Ubah ['cacheable' => $generalLayout->isCacheable()]ke['cacheable' => false]

Ini seharusnya tidak merugikan karena halaman produk tidak akan di-cache setelah menambahkan blok checkout

Pertanyaan lain adalah, apakah Anda benar-benar ingin membuat halaman produk tidak dapat di-cache dengan cache halaman bawaan atau Varnish?

Alex Paliarush
sumber
1
Adakah pembaruan untuk masalah ini pada versi magento2 terbaru? @Alex
Keyur Shah
Alex, saya hanya ingin menghapus satu phtml dari cache. dan file html ini memanggil wadah header. ada ide tolong beri tahu saya
Camit1dk