Điểm:1

Không thể lập trình bộ lọc tiếp xúc khi cũng sử dụng bộ lọc theo ngữ cảnh

lá cờ ru

Tôi có chế độ xem cần đặt giá trị mặc định cho bộ lọc được hiển thị dựa trên trường thực thể người dùng. Điều này về cơ bản hoạt động:

function MYMODULE_views_pre_build(\Drupal\views\ViewExecutable $view) {
  if ($view->current_display !== 'MY_VIEW_DISPLAY') {
    trở lại;
  }
  $exposedFilterValues ​​= $view->getExposedInput();
  if (!array_key_exists('MY_FIELD', $exposedFilterValues)) {
    $personalizedDefaultValue = $someUserEntity->getMyCustomDefaultFilterValue();
    $view->setExposedInput(array_merge($exposedFilterValues, ['MY_FIELD' => $personalizedDefaultValue] );
    $view->element['#cache']['tags'] = Cache::mergeTags($view->element['#cache']['tags'] ?? [], $someUserEntity->getCacheTags() );
  }
}

NHƯNG:

Trang dạng xem này cũng có bộ lọc theo ngữ cảnh lọc một trường hoàn toàn khác. Ngay khi giá trị bộ lọc theo ngữ cảnh xuất hiện trong URL, đoạn mã trên vẫn được thực thi nhưng không có tác dụng đối với giao diện người dùng. Không có giá trị bộ lọc theo ngữ cảnh, nó hoạt động hoàn hảo.

Tại sao mã cho trường được hiển thị không hoạt động khi tồn tại giá trị theo ngữ cảnh của trường hoàn toàn khác?

sonfd avatar
lá cờ in
Khi bạn nói mã này thực thi, có phải ý bạn là mã bên trong câu lệnh if này: `if (!array_key_exists('MY_FIELD', $exposedFilterValues))`? Tôi tự hỏi liệu bộ lọc tiếp xúc của bạn có nhận được giá trị (chuỗi trống) khi có bộ lọc theo ngữ cảnh hay không - có thể bộ lọc theo ngữ cảnh kích hoạt một số quá trình xử lý bộ lọc sẽ không xảy ra ở giai đoạn này.
lá cờ ru
Sử dụng các điểm ngắt xdebug, tôi đã xác minh rằng `setExposedInput()` bên trong `if(!array_key_exists)` được thực thi chính xác trong cả hai trường hợp.
Pushpinder Rana avatar
lá cờ us
Đảm bảo truy vấn Chế độ xem không bị thay đổi sau mã tùy chỉnh của bạn vì móc views_query_alter() chạy sau views_pre_build().
sonfd avatar
lá cờ in
Được rồi, đây là những gì tôi đã làm để kiểm tra điều này: Tôi đã tạo chế độ xem có bộ lọc được hiển thị, "my_filter". Sau đó, tôi đã tạo một `mymodule_views_pre_build()` bằng một dòng mã: `$view->setExposedInput(['my_filter' => 'test']);`. Tôi tải chế độ xem và có thể thấy rằng bộ lọc tiếp xúc của tôi được đặt thành "thử nghiệm". Sau đó, tôi cập nhật chế độ xem của mình bằng bộ lọc theo ngữ cảnh Content ID, chỉ với cấu hình mặc định và được lưu. Sau đó, tôi tải lại chế độ xem của mình và bộ lọc tiếp xúc của tôi vẫn được đặt thành "thử nghiệm". Tôi cũng kiểm tra một giá trị cho bộ lọc theo ngữ cảnh của mình trong URL và thấy rằng bộ lọc bị lộ vẫn được đặt thành "thử nghiệm".
sonfd avatar
lá cờ in
Ngoài ra, bạn sẽ muốn thêm ngữ cảnh bộ đệm cho người dùng của mình vì bạn đang thay đổi kết quả cho mỗi người dùng. Khi bộ nhớ đệm của bạn được đặt ngay bây giờ, nó sẽ được lưu vào bộ nhớ đệm cho người dùng đầu tiên và sau đó sẽ bị xóa khi người dùng đó được cập nhật, nhưng nếu không thì sẽ không thay đổi theo từng người dùng.
lá cờ ru
Mã này không hoạt động trên bản cài đặt vanilla Drupal, phải có sự cố với mô-đun đóng góp. Chỉ không biết làm thế nào để tìm thấy nó, có rất nhiều mô-đun tùy chỉnh trong dự án này :-(
Pushpinder Rana avatar
lá cờ us
Bạn đã thử kiểm tra bất kỳ hook Chế độ xem nào khác (chẳng hạn như views_query_alter()) trong mô-đun tùy chỉnh của mình chưa? Bật gỡ lỗi và phân loại mã bằng cách sử dụng debug_backtrace. Bạn nên xác định mô-đun nào khác sẽ ghi đè thay đổi này. Bạn có thể phân loại nó bằng cách sử dụng danh sách móc/sự kiện Devel (Admin UI) cung cấp danh sách tất cả các chức năng được thực thi cho từng yêu cầu. Hy vọng nó giúp.

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