Chặn với bộ nhớ cache = false không được hiển thị trên trang xem sản phẩm


21

Tôi đang sử dụng magento2-1.0.0-beta4

Tôi đã sao chép checkout.rootkhối từ app/code/Magento/Checkout/view/frontend/layout/checkout_index_index.xmltrang sản phẩm.

Mọi thứ đều hoạt động tốt, cho đến khi tôi kích hoạt page_cache. Khối đó đang có cacheable="false"trong XML Bố cục.

Bây giờ khi tôi mở trang sản phẩm của mình, khối hoàn toàn không được hiển thị.

Nếu tôi hiểu bộ đệm trang chính xác, nó sẽ tải các khối như vậy thông qua một cuộc gọi AJAX. Nhưng dường như không xảy ra một cuộc gọi AJAX như vậy vì điểm dừng của tôi \Magento\PageCache\Controller\Block\Render::executekhông bao giờ được thực hiện.

Khi mở /checkout/hoặc /checkout/cart/mọi thứ hoạt động. Nhưng dường như cũng không xảy ra một cuộc gọi AJAX. Thay vào đó, toàn bộ trang dường như không được hiển thị từ bộ đệm, điều này có ý nghĩa đối với giỏ hàng.

Vì vậy, tôi chỉ nên loại trừ trang xem sản phẩm từ page_cache? Nhưng tôi đã không tìm ra cách để làm như vậy?

Câu trả lời:


15

Vấn đề này vẫn có thể tái tạo trên Magento 2.0.0 Ổn định.

Có một tính năng trong xử lý ngoại lệ Magento 2, ngăn chặn kết xuất các khối bị hỏng trong khi tất cả các khối khác vẫn được hiển thị. Trong chế độ nhà phát triển, nó bị vô hiệu hóa và tất cả các ngoại lệ được hiển thị ngay trong trình duyệt. Trong chế độ mặc định và sản xuất, nếu ngoại lệ xảy ra trong quá trình kết xuất khối, khối sẽ chỉ bị xóa khỏi đầu ra (ngoại lệ tương ứng vẫn được ghi vào var / log / system.log ). Xem \Magento\Framework\View\Layout::renderNonCachedElement().

Ngoại lệ sau xảy ra trong quá trình kết xuất khối thanh toán trên trang sản phẩm và đó là lý do tại sao khối này bị thiếu : main.CRITICAL: No such entity with customerId = [] [].

Lý do cho ngoại lệ này là dữ liệu khách hàng trong lưu trữ phiên ở trạng thái không nhất quán ( customerLoggedIn == truevà dữ liệu khách hàng bị thiếu) sau khi \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()thực hiện. Plugin này đóng phiên PHP hiện tại và do đó loại bỏ dữ liệu khách hàng khỏi lưu trữ phiên. Điều này chỉ xảy ra nếu trang có đầy đủ bộ nhớ cache (và thực tế là như vậy).

Trang được coi là có thể lưu trong bộ nhớ cache của mô-đun bộ đệm trang chỉ khi bố cục của nó không chứa các khối với cacheable="false". Việc thêm thuộc tính này sẽ không khiến khối này được tải bởi Ajax (như giả định trong câu hỏi). Để có một số khối được tải bởi Ajax, khối này phải có thuộc tính khai báo _isScopePrivateđược đặt thành true, hơn nữa, không nên có khối nào cacheable="false"trên trang. Xem \Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()mage.pageCache._replacePlaceholder()trong Magento / PageCache / view / frontend / web / js / page-cache.js . Đồng thời kiểm tra tài liệu cấp cao trong mô-đun bộ đệm trang readme

Trang sản phẩm không nên được lưu trong bộ nhớ cache vì cacheable="false"được đặt cho khối thanh toán, tuy nhiên, do sự cố đã biết Các khối không thể truy cập được lưu vào bộ đệm . Cho đến khi vấn đề này được giải quyết, cách giải quyết sau đây có thể được sử dụng (đừng hỏi tôi tại sao nó hoạt động, đó là một câu chuyện dài):

  1. Đi đến \Magento\Framework\Pricing\Render\Layout::__construct
  2. Thay đổi ['cacheable' => $generalLayout->isCacheable()]thành['cacheable' => false]

Điều này không gây hại vì dù sao các trang sản phẩm sẽ không được lưu vào bộ nhớ cache sau khi thêm khối thanh toán

Một câu hỏi khác là, bạn có thực sự muốn làm cho các trang sản phẩm không thể lưu trong bộ nhớ cache bằng bộ đệm trang tích hợp hoặc Varnish không?


1
Bất kỳ cập nhật cho vấn đề này trên phiên bản magento2 mới nhất? @Alex
Keyur Shah

Alex, tôi chỉ muốn xóa một phtml khỏi bộ đệm. và tệp html này gọi vào thùng chứa tiêu đề. bất cứ ý tưởng nào xin vui lòng cho tôi biết
Camit1dk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.