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à:
- Đọc bất cứ thứ gì có trong "Bộ lọc radio".
- 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.
- 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ể...
- 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.