Puncte:1

Setarea programatică a filtrului expus nu este posibilă atunci când se folosește și filtrul contextual

drapel ru

Am o vizualizare care trebuie să seteze valoarea implicită pentru un filtru expus pe baza unui câmp de entitate utilizator. Practic, funcționează:

funcția MYMODULE_views_pre_build(\Drupal\views\ViewExecutable $view) {
  dacă ($view->current_display !== 'MY_VIEW_DISPLAY') {
    întoarcere;
  }
  $exposedFilterValues ​​= $view->getExposedInput();
  dacă (!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() );
  }
}

DAR:

Această pagină de vizualizări are, de asemenea, un filtru contextual care filtrează un câmp complet diferit. De îndată ce o valoare a filtrului contextual este prezentă în URL, codul de mai sus este încă executat, dar nu are niciun efect asupra front-end. Fără o valoare de filtru contextual, funcționează perfect.

De ce nu funcționează codul pentru câmpul expus când există o valoare contextuală complet diferită a câmpului?

sonfd avatar
drapel in
Când spui că acest cod se execută, vrei să spui chiar și codul din interiorul acestei instrucțiuni if: `if (!array_key_exists('MY_FIELD', $exposedFilterValues))`? Mă întreb dacă filtrul expus primește o valoare (șir gol) atunci când filtrul contextual este prezent - poate că filtrul contextual declanșează o procesare a filtrului care altfel nu s-ar întâmpla în această etapă.
drapel ru
Folosind punctele de întrerupere xdebug, am verificat că `setExposedInput()` în interiorul `if(!array_key_exists)` este executat corect în ambele cazuri.
Pushpinder Rana avatar
drapel us
Asigurați-vă că interogarea Views nu este modificată după codul personalizat, deoarece hook views_query_alter() rulează după views_pre_build().
sonfd avatar
drapel in
Ok, deci iată ce am făcut pentru a testa asta: am creat o vizualizare cu un filtru expus, „my_filter”. Apoi am creat un `mymodule_views_pre_build()` cu o linie de cod: `$view->setExposedInput(['my_filter' => 'test']);`. Încarc vizualizarea și văd că filtrul meu expus este setat la „test”. Îmi actualizez apoi vizualizarea cu un filtru contextual Content ID, cu doar configurația implicită și salvat. Apoi îmi încarc din nou vizualizarea și filtrul meu expus este încă setat la „test”. De asemenea, testez cu o valoare pentru filtrul meu contextual în URL și văd că filtrul expus este încă setat la „test”.
sonfd avatar
drapel in
De asemenea, veți dori să adăugați un context cache pentru utilizatorul dvs., deoarece modificați rezultatele pe utilizator. Pe măsură ce stocarea în cache este setată acum, va fi stocată în cache pentru primul utilizator și apoi va fi șters când acel utilizator este actualizat, dar altfel nu va varia în funcție de utilizator.
drapel ru
Codul funcționează într-o instalare vanilla Drupal, trebuie să fie o problemă cu un modul contrib. Doar că nu știu cum să-l găsesc, există _o mulțime de module personalizate în acest proiect :-(
Pushpinder Rana avatar
drapel us
Ați încercat să verificați alte cârlige Views (cum ar fi views_query_alter()) în modulul dvs. personalizat? Activați depanarea și triați codul folosind debug_backtrace. Ar trebui să identificați ce alt modul înlocuiește această modificare. Puteți să-l triați utilizând lista de evenimente/hooks Devel (Interfața de utilizare admin) care oferă o listă cu toate funcțiile executate pentru fiecare solicitare. Sper ca ajuta.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.