บล็อกด้วย 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"อยู่ใน Layout XML

ตอนนี้เมื่อฉันเปิดหน้าผลิตภัณฑ์บล็อกจะไม่แสดงผลเลย

หากฉันเข้าใจแคชของหน้าอย่างถูกต้องมันควรโหลดบล็อคดังกล่าวผ่านการโทร AJAX แต่ดูเหมือนจะไม่เกิดขึ้นเช่นการโทร AJAX เป็นจุดพักของฉันใน\Magento\PageCache\Controller\Block\Render::executeไม่เคยโดน

เมื่อเปิด/checkout/หรือใช้/checkout/cart/งานทุกอย่าง แต่ดูเหมือนจะไม่เกิดขึ้นกับการโทร AJAX แต่ดูเหมือนว่าหน้าทั้งหมดจะไม่ได้รับการแสดงผลจากแคชซึ่งเหมาะสมสำหรับรถเข็น

ดังนั้นผมจึงควรยกเว้นเพียงหน้ามุมมองสินค้าจากpage_cache? แต่ฉันไม่พบวิธีที่จะทำเช่นนั้น?

คำตอบ:


15

ปัญหานี้ยังคงมีอยู่ใน Magento 2.0.0 Stable

มีคุณสมบัติในการจัดการข้อยกเว้นวีโอไอพี 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()เข้าวีโอไอพี / PageCache / view / ส่วนหน้า / เว็บ / js / หน้า cache.js ตรวจสอบเอกสารระดับสูงในโมดูลแคชของเพจ

สินค้าหน้าไม่ควรจะเป็นแคชตั้งแต่cacheable="false"การตั้งค่าสำหรับการเช็คเอาต์บล็อก แต่มันเป็นเนื่องจากปัญหาที่ทราบบล็อก uncacheable ถูกเก็บไว้ชั่วคราว จนกว่าปัญหานี้จะได้รับการแก้ไขอาจใช้วิธีแก้ปัญหาต่อไปนี้ (อย่าถามฉันว่าทำไมจึงใช้งานได้มันเป็นเรื่องยาว):

  1. ไปที่ \Magento\Framework\Pricing\Render\Layout::__construct
  2. เปลี่ยน['cacheable' => $generalLayout->isCacheable()]เป็น['cacheable' => false]

สิ่งนี้ไม่ควรเป็นอันตรายเพราะหน้าผลิตภัณฑ์จะไม่ถูกแคชหลังจากเพิ่มบล็อกการชำระเงินแล้ว

คำถามอื่นคือคุณต้องการทำให้หน้าผลิตภัณฑ์ไม่สามารถแคชได้โดยแคชในตัวหรือวานิชหรือไม่?


1
มีการอัพเดตใด ๆ สำหรับปัญหานี้ในเวอร์ชั่นล่าสุดของ magento2? @Alex
Keyur Shah

อเล็กซ์ฉันแค่ต้องการลบ phtml หนึ่งรายการออกจากแคช และการเรียกไฟล์ html นี้ลงใน container header ความคิดใด ๆ โปรดแจ้งให้เราทราบ
Camit1dk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.