Điểm:0

Chuyển một bộ lọc tiếp xúc sang một bộ lọc khác? (D9)

lá cờ pk

Tôi có khoảng một chục trường chuỗi chứa các đối tượng và trạng thái của chúng (ví dụ: hãy lấy 'AC_on' và 'heater_off'). Và tôi có chế độ xem hiển thị các nút chứa các trường đó. Nhiệm vụ tôi đang cố gắng đạt được là đây. Người dùng nên có hai bộ tùy chọn để lọc các nút theo các trường đã nói ở trên:

  • Để chọn một trong các đối tượng thông qua nút radio (AC hoặc lò sưởi);
  • Để chọn các trạng thái trong đó tùy chọn đã chọn trước đó phải nằm trong tập hợp các nút được lọc (chỉ "bật" hoặc chỉ "tắt" hoặc "bật" và "tắt" - vì vậy rõ ràng là các hộp kiểm).

Tạo các bộ lọc mong muốn về mặt thẩm mỹ không phải là vấn đề lớn: chúng ta có thể sử dụng bộ lọc trường kết hợp cho tập hợp các nút radio (tìm kiếm qua tất cả các trường đối tượng và nếu người dùng chọn "AC", hãy lọc ra tất cả các giá trị "AC_null") và một lần nữa - đối với các hộp kiểm (đối với "Bật" bao gồm các giá trị có chứa "bật" v.v.). Vấn đề là, cách tiếp cận này không hoạt động :) Bộ thứ hai không quan tâm đối tượng nào có trạng thái "tắt" mà nó lọc ra.

Vì vậy, tôi nghĩ rằng bằng cách nào đó tôi có thể chuyển bất kỳ thứ gì người dùng đã chọn trong phần radio (AC) vào các giá trị của bộ lọc hộp kiểm (để nó không chỉ tìm kiếm "bật" mà tìm kiếm "AC_on"). Vấn đề là, đối với cuộc sống của tôi, tôi không thể tìm thấy một mô-đun nào cho phép tôi làm điều đó.

"Lượt xem Bộ lọc phụ thuộc" có vẻ như chỉ là công cụ cho công việc, nhưng thật không may, nó dành cho D7 và tôi có D9. Có bất kì cách nào để đạt được điều này không? Bất cứ sự giúp đỡ nào cũng được đánh giá cao.

Tái bút: Tôi không thể viết mã, ngoại trừ CSS và CSS đơn giản nhất PHP, vì vậy giải pháp không cần mã được ưu tiên hơn.

misterdidi avatar
lá cờ de
Xin chào, chào mừng bạn đến với Câu trả lời của Drupal. Có lẽ bạn nên xem hướng dẫn này https://bouteillenicolas.com/fr/blog-drupal/views-ajax-dynamic-dependent-exposed-filters. Mặc dù nó dành cho D7, nhưng logic đằng sau vẫn giữ nguyên cho D9 (thêm vào đó, hook_form_alter() vẫn tồn tại trong D9). Tuy nhiên, tôi e rằng bạn không thể thoát khỏi một chút mã tùy chỉnh.
Basil Vlasyuk avatar
lá cờ pk
Xin chào @misterdidi! Cảm ơn bạn. Tôi đã yên tâm rằng giải pháp không dùng mã không tồn tại trong trường hợp này. Tôi đã tạo mô-đun của riêng mình, nhưng điều làm tôi khó chịu là thường xuyên hơn không, các giải pháp mã được đề xuất cho D8 không hoạt động trên D9 (và các giải pháp D7 hầu như không bao giờ hoạt động). Vì vậy, sự thích nghi của họ đòi hỏi kiến ​​thức mà tôi thiếu. Bài viết này bạn đã gửi giống hệt như thứ tôi cần, tôi sẽ kiểm tra và quay lại để biết nó có hoạt động không. Cảm ơn một lần nữa!
Điểm:1
lá cờ pk

Cảm ơn bạn tiểu thư để đưa tôi đi đúng hướng. Bài báo bạn cung cấp đã giúp ích, nhưng để tìm ra giải pháp, tôi phải nghiên cứu thêm vài chục bài nữa, và cuối cùng giải pháp cũng xuất hiện.

Vì vậy, đối với nhiệm vụ này, giải pháp nhất định duy nhất tôi tìm thấy là:

  1. Đọc bất cứ thứ gì có trong "Bộ lọc radio".
  2. Thay đổi "bộ lọc hộp kiểm", để nó chứa giá trị từ "bộ lọc radio" trong mọi tùy chọn.
  3. Hợp nhất tất cả "các trường trạng thái" thành một trường đa giá trị, để chúng tôi có thể...
  4. Sử dụng bộ lọc theo ngữ cảnh để đọc giá trị "bộ lọc hộp kiểm" từ URL và tìm giá trị đó trong trường đa giá trị của chúng tôi.

1. Đọc giá trị từ bộ lọc Radio

Tôi đã đạt được điều này với lượt xem_pre_view cái móc:

function MY_MODULE_views_pre_view($view, $display_id, array &$args) {  
  // Kiểm tra xem đã đúng chế độ xem và hiển thị chưa
  if ($view->id() == 'MY_VIEW') {
    công tắc ($display_id) {
      trường hợp 'MY_DISPLAY':
        // Lấy bất kỳ giá trị nào trong Radio Filter và viết nó vào biến toàn cục
        $filter_input = $view->getExposedInput();
        toàn cầu $arg;
        $arg= $filter_input['RADIO_FILTER'];
    }
  }
}

(Ở đây và chuyển tiếp, mọi thứ IN HOA là tên bạn phải thay thế bằng tên bạn sử dụng)

Với mã này, tôi đọc những gì trong Bộ lọc Radio và đặt nó vào một biến toàn cục $arg.

2. Đặt giá trị từ Radio Filter vào Checkbox Filter

Đối với phần này tôi đã sử dụng form_views_exposed_form_alter cái móc:

function MY_MODULE_form_views_exposed_form_alter(&$form, $form_state, $form_id) {
  
  // Gọi biến toàn cục có giá trị là Radio Filter
  toàn cầu $arg;
  
  // Chuyển đổi giá trị thô của Radio Filter thành thứ mà chúng ta có thể sử dụng cho bộ lọc theo ngữ cảnh
  nếu ($arg == '1') {
    $arg= 'AC'; 
  }
  otherif ($arg == '2') {
    $arg= 'NHIỆT'; 
  }
  otherif ($arg == 'Tất cả') {
    $arg= ''; 
  }
  
  $arg_on = ($arg . '_on');
  $arg_off = ($arg . '_off');
  
  // Kiểm tra xem nó có đúng dạng không
  if ($form['#id'] == 'EXPOSED_FILTER_FORM_ID') {
    
    // Chúng tôi cần các giá trị bộ lọc khác nhau, tùy thuộc vào việc giá trị trong Bộ lọc Radio được chọn hay nếu nó được đặt thành mặc định ("Tất cả")
    nếu ($arg != '') {
    $form['CHECKBOX_FILTER']['#options'] = mảng(
      $arg_on => $arg_on,
      $arg_off => $arg_off,
      ); 
    }
    khác {
      $form['CHECKBOX_FILTER']['#options'] = mảng(
      '_bật' => '_bật',
      '_off' => '_off', );
    }
    // Nếu không có gì được chọn, chúng ta nên coi mọi thứ đã được chọn.
    if ($form['CHECKBOX_FILTER']['#value'] == '') {
      $form['CHECKBOX_FILTER']['#value'] = [$arg_on, $arg_off];
    }
  }
}

Bằng cách này, tôi sửa đổi các giá trị trong Bộ lọc hộp kiểm. Làm như vậy khiến chúng gần như không hoạt động được dưới dạng các bộ lọc bị lộ (tôi không chắc tại sao, nhưng tại thời điểm biểu mẫu được sửa đổi qua hook - nó không lọc bất cứ thứ gì nữa), nhưng nó cung cấp các tham số URL mà chúng tôi sẽ sử dụng cho các bộ lọc theo ngữ cảnh .

3. Hợp nhất tất cả các trường tham số thành một

Đây là thứ mà tôi đã mong đợi để tìm một mô-đun, nhưng không thành công, vì vậy hook_entity_presave nó là.

function MY_MODULE_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  
  // Ở đây chúng ta chuẩn bị các biến cho mọi trường mà chúng ta sẽ cần hợp nhất ...
  if ($entity->bundle() == 'MY_NODE_TYPE') {
    $par_ac = ($entity->field_AC_CHECK->value);
    $par_heater = ($entity->field_HEATER_CHECK->value);
    $par_all = ($par_ac . ',' . $par_heater);
  
    // ... và cũng kiểm tra xem có bất kỳ "bật" hay "tắt" nào trong số chúng không ...
    if (str_contains($par_all, 'on')) {
      $par_cont_on = '_on';
    }
    if (str_contains($par_all, 'off')) {
      $par_cont_off = '_off';
    }

    // ... để hợp nhất tất cả chúng vào một trường và cung cấp các giá trị "bật" và "tắt" tổng thể cho các trường hợp Bộ lọc Radio không được lấp đầy
    $entity->field_par_comb = [$par_ac, $par_heater, $par_cont_on, $par_cont_off];
  }
}

Tôi không đặc biệt hài lòng với thực tế là các trường được mã hóa cứng và không được thu thập động, có thể sau này tôi sẽ nghĩ ra cách giải mã cứng những trường này.

Nhưng hiện tại, chúng ta có một trường đa giá trị chứa trạng thái cho mọi tham số và cuối cùng chúng ta có thể...

4. Sử dụng bộ lọc theo ngữ cảnh

Như chúng tôi đã tìm hiểu trong p. 2, Bộ lọc Hộp kiểm được hiển thị không thực hiện bất kỳ điều gì khi nó được sửa đổi. Nhưng chúng ta có thể làm cho nó kiểm tra tham số URL của Bộ lọc hộp kiểm. Bằng cách này, nếu chúng ta có "checkbox_filter=heater_on", bộ lọc theo ngữ cảnh sẽ tìm trong trường đa giá trị của chúng ta từ p. 3 cho giá trị "heater_on".

Vì Bộ lọc hộp kiểm có thể chứa một số giá trị, nên chúng ta nên chọn kết hợp "HOẶC" trong cài đặt của bộ lọc.

Lưu ý rằng Bộ lọc Radio phải là "không bắt buộc". Đó là bởi vì, khi chế độ xem được tải lần đầu tiên, vì một số lý do, các giá trị bộ lọc được hiển thị mặc định KHÔNG được hiển thị trong các tham số URL. Tuy nhiên, vì giá trị Bộ lọc Radio mặc định là "Bất kỳ" (và chúng ta nên ẩn nó bằng CSS thông qua :con đầu lòng bộ chọn), trong mã của chúng tôi có một phần tính đến trường hợp này bằng cách thay thế giá trị Bộ lọc Radio "Tất cả" bằng ''. Và, vì chúng tôi có các giá trị kiểm tra đặc biệt và "_on"/"_off" trong trường đa giá trị của mình, nên nó sẽ hoạt động tốt:

  • Nếu giá trị "Bất kỳ" mặc định được chọn trong Bộ lọc Radio, mã sẽ không thay thế các giá trị Bộ lọc hộp kiểm.
  • Trong cài đặt chế độ xem, các giá trị Bộ lọc hộp kiểm mặc định được đặt thành "_on" và "_off" và bộ lọc có thể hoạt động được.
  • Khi người dùng chọn "AC", "Heater" hoặc bất kỳ tùy chọn nào khác trong Bộ lọc Radio, nó sẽ được đưa vào các giá trị Bộ lọc hộp kiểm đã sửa đổi và Bộ lọc theo ngữ cảnh sẽ khởi động.

Đây là một trường hợp tồi tệ đối với trải nghiệm phát triển mô-đun Drupal đầu tiên, nhưng nó hoạt động hoàn hảo. Khách hàng vui, tôi vui.

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