Mulțumesc misterdidi pentru că m-a pus pe drumul cel bun.
Articolul pe care l-ați oferit a ajutat, dar pentru a afla soluția, a trebuit să mai studiez câteva zeci și, în cele din urmă, a venit soluția.
Deci, pentru această sarcină, singura soluție sigură pe care am găsit-o este următoarea:
- Citiți orice se află în „Filtru radio”.
- Modificați „filtru de casetă de selectare”, astfel încât să conțină valoarea din „filtru radio” în fiecare opțiune.
- Îmbină toate „câmpurile de stare” într-un câmp cu mai multe valori, astfel încât să putem...
- Utilizați filtre contextuale pentru a citi valoarea „filtru casetă de selectare” din URL și căutați-o în câmpul nostru cu mai multe valori.
1. Citirea valorii din filtrul Radio
Am realizat asta cu views_pre_view cârlig:
funcția MY_MODULE_views_pre_view($view, $display_id, array &$args) {
if ($view->id() == 'MY_VIEW') {
comutator ($display_id) {
cazul „MY_DISPLAY”:
$filter_input = $view->getExposedInput();
global $arg;
$arg= $filter_input['RADIO_FILTER'];
}
}
}
(Aici și înainte, totul în majuscule sunt numele pe care trebuie să le înlocuiți cu cele pe care le folosiți)
Cu acest cod, citesc ce este în filtrul radio și îl pun într-o variabilă globală $arg.
2. Introduceți valoarea din Filtru radio în Filtru casetă de selectare
Pentru aceasta parte am folosit form_views_exposed_form_alter cârlig:
funcția MY_MODULE_form_views_exposed_form_alter(&$form, $form_state, $form_id) {
global $arg;
dacă ($arg == '1') {
$arg= 'AC';
}
elseif ($arg == '2') {
$arg= 'ÎNCĂLZIRE';
}
elseif ($arg == „Toate”) {
$arg= '';
}
$arg_on = ($arg . '_on');
$arg_off = ($arg . '_off');
dacă ($form['#id'] == 'EXPOSED_FILTER_FORM_ID') {
dacă ($arg != '') {
$form['CHECKBOX_FILTER']['#options'] = array(
$arg_on => $arg_on,
$arg_off => $arg_off,
);
}
else {
$form['CHECKBOX_FILTER']['#options'] = array(
'_on' => '_on',
'_off' => '_off', );
}
dacă ($form['CHECKBOX_FILTER']['#value'] == '') {
$form['CHECKBOX_FILTER']['#value'] = [$arg_on, $arg_off];
}
}
}
În acest fel modific valorile din Filtrul casetei de selectare. Acest lucru le face aproape inoperabile ca filtre expuse (nu sunt sigur de ce, dar în momentul în care formularul este modificat prin cârlig - nu mai filtrează nimic), dar oferă parametri URL, pe care îi vom folosi pentru filtre contextuale. .
3. Îmbinarea tuturor câmpurilor de parametri într-unul singur
Acesta este ceva pentru care mă așteptam să găsesc un modul, dar nu am reușit, deci hook_entity_presave este.
funcția MY_MODULE_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
dacă ($entity->bundle() == 'MY_NODE_TYPE') {
$par_ac = ($entity->field_AC_CHECK->value);
$par_încălzitor = ($entitate->field_HEATER_CHECK->valoare);
$par_all = ($par_ac . ',' . $par_heater);
if (str_contains($par_all, 'on')) {
$par_cont_on = '_on';
}
if (str_contains($par_all, 'off')) {
$par_cont_off = '_off';
}
$entity->field_par_comb = [$par_ac, $par_heater, $par_cont_on, $par_cont_off];
}
}
Nu sunt deosebit de mulțumit de faptul că câmpurile sunt codificate și nu sunt adunate dinamic, poate mai târziu mă voi gândi la o modalitate de a le decoda.
Dar, deocamdată, avem un câmp cu mai multe valori care conține o stare pentru fiecare parametru și, în sfârșit, putem...
4. Utilizați filtrul contextual
După cum am aflat la p. 2, filtrul de casetă de selectare expus nu face nimic atunci când este modificat. Dar îl putem face să verifice parametrul URL al unui filtru de casetă de selectare. În acest fel, dacă avem „checkbox_filter=heater_on”, filtrul contextual va căuta în câmpul nostru cu valori multiple de la p. 3 pentru valoarea „încălzitor_pornit”.
Deoarece Checkbox Filter poate conține mai multe valori, ar trebui să alegem conjuncția „SAU” în setările unui filtru.
Rețineți că filtrul radio ar trebui să fie „nu este necesar”. Se datorează faptului că, atunci când vizualizarea este încărcată pentru prima dată, valorile implicite ale filtrului expuse NU sunt afișate în parametrii URL, din anumite motive. Dar, deoarece valoarea implicită a filtrului radio este „Orice” (și ar trebui să o ascundem cu CSS prin :primul copil selector), în codul nostru există o parte care ține cont de acest caz prin înlocuirea valorii „Toate” filtrului radio cu „”. Și, deoarece avem valori speciale de verificare și „_on”/”_off” în câmpul nostru cu mai multe valori, va funcționa bine:
- Dacă valoarea implicită „Orice” este aleasă în Radio Filter, codul nu va înlocui valorile Checkbox Filter.
- În setările de vizualizare, valorile implicite ale filtrului casetei de selectare sunt setate la „_on” și „_off”, iar filtrul este operabil.
- Când utilizatorul alege „AC”, „Încălzire” sau orice altă opțiune din Filtrul radio, acesta este introdus în valorile Filtrului casetei de selectare modificate și se activează Filtrul contextual.
Acesta a fost un caz al naibii pentru prima experiență de dezvoltare a modulelor Drupal, dar funcționează impecabil. Clientul este fericit, eu sunt fericit.