Điểm:1

Render view inside block with caching

lá cờ lc

My setup is a bit unconventional. I have a view displaying a block, relying on a contextual filter (let's call it product ID). I also have a custom block that renders this view programmatically because I need to include this block in multiple places on the page and I have some custom logic that pulls the actual product ID to call the view with. Basically:

$view = Views::getView('view_id'); 
$args = ['product_id' => $whatever_product];
return $view->buildRenderable('views_block_id', $args);

The process basically works but, as usual, I'll have problems when there are several such blocks on the page. Views only caches using the block id as a cache tag, so the first rendered view gets cached and displayed in all places. Naturally, switching off the cache would work:

return $view->buildRenderable('views_block_id', $args, FALSE);

but not exactly what I have in mind, I don't want to lose the benefits of caching.

My initial thought was quite simple, let's use custom cache tags in the view, thanks to views_custom_cache_tag. So I did, including the argument from the contextual filter:

views_block:view_id-views_block_id
custom:{{ arguments.product_id }}

But it still doesn't work.

Is there any other way I missed? I can't push new cache tags right before I try to render the view. The usual view hooks don't get called in this case (the second block already gets the cached variant, without even bothering to go near the hooks).

4uk4 avatar
lá cờ cn
*Đương nhiên, việc tắt bộ nhớ cache sẽ hoạt động* `return $view->buildRenderable('views_block_id', $args, FALSE);`. Nếu điều này hoạt động sau đó sử dụng nó. Bạn không cần lưu trữ kết quả được hiển thị của Chế độ xem khi bạn đang ở trong một khối được lưu trữ riêng.
lá cờ lc
Nếu tôi có cùng một khối hai lần trên trang tình cờ đề cập đến một sản phẩm khác, tôi sẽ không hài lòng lắm nếu khối đó tự lưu vào bộ đệm với một trong số chúng. :-) Hãy nghĩ về nó, nếu khối tự lưu vào bộ đệm với ID cá thể được thêm vào của chính nó, không chỉ là ID chung chung ...
lá cờ lc
OK, cảm ơn, nếu bạn sao chép tương tự vào câu trả lời, tôi rất sẵn lòng chấp nhận nó.
Điểm:2
lá cờ cn

Trong một khối, bạn có thể tắt bộ nhớ đệm của Chế độ xem được hiển thị trong ViewExecutable::buildRenderable:

$view->buildRenderable('views_block_id', $args, FALSE)

bởi vì kết quả hiển thị của từng phiên bản khối đã được lưu vào bộ đệm.

Nhân tiện, các thẻ bộ đệm không liên quan khi lưu các biến thể của cùng một phần tử vào bộ nhớ đệm.Điều này chỉ được kiểm soát bởi các khóa và bối cảnh bộ đệm. Với cache=FALSE, bạn vô hiệu hóa các khóa bộ đệm, nhưng không tắt các ngữ cảnh, các ngữ cảnh này vẫn sẽ nổi lên ở cấp độ khối. Nếu thiếu ngữ cảnh, bạn có thể đặt ngữ cảnh bộ đệm theo cách thủ công, chẳng hạn như đối với tuyến đường hoặc truy vấn đường dẫn url nếu ID sản phẩm phụ thuộc vào ngữ cảnh đó.

Chỉnh sửa: Tôi đã xóa câu lệnh return vì có thể cần phải tạo một mảng kết xuất thực với Chế độ xem được nhúng.

lá cờ lc
Trong trường hợp cụ thể này, nó hoạt động tốt với trả về, đây đã là dòng cuối cùng của hàm `build()`. Cảm ơn.
steve avatar
lá cờ in
Tôi có thứ mà tôi _think_ là một thiết lập tương tự, ngoại trừ việc tôi nên thêm rằng khối tùy chỉnh, duy nhất của mình có thể hiển thị một _hoặc nhiều hơn_ khối chế độ xem. Các dạng xem được tham chiếu từ một trường xem đa giá trị trên nút và trong một số trường hợp, cùng một dạng xem được tham chiếu với một màn hình và đối số khác. Trong những trường hợp mà cùng một chế độ xem được tham chiếu nhiều lần, chỉ màn hình đầu tiên được sử dụng cho tất cả các chế độ xem đó và việc thêm đối số `FALSE` vào phương thức `buildRenderable` không giải quyết được vấn đề này.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.