Điểm:0

Gặp sự cố khi lọc chế độ xem theo chương trình

lá cờ jp

Tôi đang sử dụng khối chế độ xem trong trang web của mình, nội dung của chế độ xem này được lọc theo chương trình. Bây giờ tôi nhận được tin nhắn từ những người dùng nhìn thấy thông tin sai. Bộ lọc dựa trên người dùng hiện đang đăng nhập. Vì tôi cần thông tin này trong bộ lọc thông thường chứ không phải trong bộ lọc theo ngữ cảnh nên tôi đã tạo một mô-đun đơn giản để thay đổi giá trị bộ lọc.

Bộ lọc của tôi là như thế này:

(
Loại nội dung = contenttype_a
VÀ
uid(nodes author) = */giá trị này được thêm vào theo chương trình*/
)

HOẶC

(
Loại nội dung = contenttype_b
VÀ
user_target_id(reference) = */giá trị này được thêm vào theo chương trình*/
)

Hơn tôi sử dụng cái này trong mô-đun của mình:

 */
chức năng entity_access_views_pre_view(ViewExecutable $view, $display_id, array &$args){
  $currentUser = \Drupal::currentUser();
  $cuid = $currentUser->id();

    /* @ Chế độ xem bộ lọc: Phương tiện */
    if ($view->id() == 'my_view_id') {
      if ($display_id == 'block_1' || $display_id == 'page_1' || $display_id == 'page_2') {
        $filters = $view->display_handler->getOption('filters');
        $filters['uid']['value']['value'] = $cuid;
        $filters['user_target_id']['value']['value'] = $cuid;
        $view->display_handler->overrideOption('filters', $filters);
      }
    }
}

Vì dường như tôi không thể tìm ra vấn đề nên tôi nghi ngờ liệu ở trên có hoạt động như tôi muốn không. Vì vậy, tôi muốn kiểm tra xem bạn có thấy điều gì lạ hoặc sai không. Giá trị bộ lọc này có thể được lưu trữ theo một cách nào đó không? Hoặc có thể có một cách tốt hơn để làm điều này.

Tôi không thể sử dụng bộ lọc theo ngữ cảnh mà tôi thích hơn vì chế độ xem đang hiển thị hai loại nội dung trong đó trên mỗi loại nội dung, bộ lọc phải khác nhau.

Cảm ơn trước.

Điểm:0
lá cờ cn

Trước tiên, bạn có thể thử thêm ngữ cảnh bộ đệm vào phần tử kết xuất của Chế độ xem trước khi nó được hiển thị:

/**
 * Triển khai hook_views_pre_render().
 *
 */
function mymodule_views_pre_render(ViewExecutable $view) {
  if ($view->id() == 'my_view_id') {
    if ($view->current_display == 'block_1') {
      $view->element['#cache']['contexts'][] = 'người dùng';
      // hoặc thêm bộ nhớ cache max-age 0 để có số lượng người dùng cao
      $view->element['#cache']['max-age'] = 0;
    }
  }
}

Tuy nhiên, điều này không giúp được gì nếu Chế độ xem đang lưu truy vấn vào bộ nhớ đệm bên trong. Sau đó, bạn có thể thử tắt bộ nhớ đệm bằng cách định cấu hình Không có hoặc dựa trên thời gian plugin bộ đệm trong Chế độ xem. Tuy nhiên, bạn không thể định cấu hình ngữ cảnh bộ đệm ở đây, chỉ có tuổi tối đa của bộ đệm là 0. Đây không nhất thiết là một ý tưởng tồi nếu bạn có số lượng người dùng cao và không muốn lưu vào bộ đệm cùng một lượng biến thể. Drupal có một hệ thống bộ đệm tuyệt vời để phân phối các khối không thể lưu vào bộ đệm cho người dùng đã được xác thực (Bộ đệm trang động + BigPipe).

Joost avatar
lá cờ jp
Cảm ơn, việc vô hiệu hóa bộ đệm trong chế độ xem là lần đầu tiên tôi cố gắng giải quyết vấn đề này. Bây giờ tôi đang chờ xem liệu điều này có giải quyết được vấn đề không.

Đă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.