Làm cách nào để vô hiệu hóa bộ đệm của chế độ xem được nhúng?


7

Tôi có một loại nút "Bài viết" có chứa trường Đoạn lặp lại . Một trong các loại đoạn văn cho phép người dùng nhúng chế độ xem bằng trường tham chiếu thực thể. Khi kết xuất một nút Article chứa tham chiếu lượt xem, tôi đã nhúng chế độ xem được chọn vào hook_preprocess_paragraphnhư sau:

$view_id = $paragraph->field_view->target_id;
$view = \Drupal\views\Views::getView($view_id);
$view->setDisplay('embed_1');
$vars['content'] = $view->preview();

Điều này đang hoạt động tốt, ngoại trừ khi tôi kích hoạt bộ nhớ đệm. Ví dụ: một trong các khung nhìn của tôi liệt kê các nút thuộc loại "Sự kiện". Khi tôi thêm một Sự kiện mới, nó không hiển thị trong danh sách cho đến khi tôi xóa bộ đệm. Tôi có thể buộc xóa bộ nhớ cache khi chèn / cập nhật / xóa "Sự kiện" nhưng tôi muốn sử dụng hệ thống thẻ bộ nhớ cache của Drupal 8 và chỉ làm mất hiệu lực nội dung được lưu trong bộ nhớ cache có chứa danh sách sự kiện. Vấn đề là tôi không thể làm cho nó hoạt động.

Cho đến nay tôi đã thử thêm các thẻ bộ đệm vào nút, chế độ xem và đoạn trong hook_preprocess_paragraphhook_preprocess_nodenhư thế này:

$vars['paragraph']->addCacheTags(['node_list']);
...
$view->storage->addCacheTags(['node_list']);
...
$vars['node']->addCacheTags(['node_list']);

Theo trang này node_list có thể được sử dụng cho danh sách nút để vô hiệu hóa bộ đệm bất cứ khi nào một nút được cập nhật. Nhưng nó không có tác dụng. Có lẽ các móc tiền xử lý là muộn để thêm thẻ bộ nhớ cache?

Tôi đang thiếu gì?

Biên tập:

Sau một số thử nghiệm nữa tôi thấy rằng nếu tôi chỉnh sửa một sự kiện, những thay đổi có thể được nhìn thấy trong danh sách và nếu tôi xóa một sự kiện thì nó sẽ biến mất khỏi danh sách. Vấn đề chỉ xảy ra khi thêm các sự kiện mới.

Câu trả lời:


9

Hãy thử sử dụng buildRenderable(), điều đó sẽ đảm bảo rằng siêu dữ liệu có thể lưu trong bộ nhớ cache cần thiết được thêm tự động.

$vars['content'] = $view->buildRenderable();

Gợi ý: Bạn có thể quan tâm đến dự án Thẻ bộ nhớ cache tùy chỉnh của tôi . Thẻ bộ đệm của node_list bị vô hiệu hóa mỗi khi bất kỳ loại nút nào được lưu, mặc dù chế độ xem của bạn chỉ thay đổi khi một sự kiện thay đổi. Sử dụng mô-đun đó và một chút mã tùy chỉnh như được hiển thị trên trang dự án, bạn có ít hiệu lực bộ đệm hơn và hiệu suất tốt hơn.


Làm cách nào để hiển thị kết quả $view-buildRenderable()trong tệp twig của tôi? Khi sử dụng $view->preview()tôi chỉ có thể làm {{ content }}trong mẫu twig của mình nhưng nó không hoạt động.
reekris

1
Nó trả về một mảng render, điều đó sẽ tốt. Bạn đang sử dụng màn hình nhúng? Nếu vậy, gần đây tôi đã tìm thấy một lỗi cốt lõi ở đó, xem drupal.org/node/2711973 . như một cách giải quyết, chỉ cần đặt #embed => TRUE mình trong $ biến ['nội dung'].
Berdir

Đúng, tôi đang sử dụng màn hình nhúng và cài đặt #embed => true hoạt động thủ công tuyệt vời! Cảm ơn Berdir! Chắc chắn sẽ kiểm tra mô-đun của bạn là tốt.
reekris

3

Thêm thẻ bộ đệm vào mảng kết xuất, không phải đối tượng:

$vars['#cache']['tags'][] = 'node_list';

Trong tiền xử lý, bạn đang làm việc với các mảng kết xuất, không phải các đối tượng. Xem trang này của tài liệu: https://www.drupal.org/developing/api/8/render/arrays/cachablesility


Cám ơn giải thích rõ ràng! Đối với vấn đề của tôi, Berdirs trả lời đã khắc phục sự cố của tôi mà không cần phải thêm thẻ bộ nhớ cache theo cách thủ công.
reekris

Cảm ơn vì bạn đã phản hồi. Tôi đồng ý, đó là một câu trả lời tuyệt vời từ @Berdir. Tôi cũng ủng hộ nó.
4k4

0

Tôi đã giải quyết vấn đề tương tự bằng cách sử dụng mô-đun Lượt xem Bộ nhớ cache tùy chỉnh :

Trong trình chỉnh sửa chế độ xem, bên dưới Nâng cao, nhấp vào Bộ đệm, sau đó chọn "Dựa trên thẻ tùy chỉnh". Để chế độ xem được đăng ký lại mỗi lần thay đổi nút, hãy nhập 'node_list' trong cài đặt thẻ tùy chỉnh.

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.