Puncte:0

Întâmpinați probleme de filtrare a vizualizării în mod programatic

drapel jp

Folosesc un bloc de vizualizări pe site-ul meu, conținutul acestei vizualizări este filtrat programatic. Acum primesc mesaje de la utilizatori care văd informații greșite. Filtrul se bazează pe utilizatorul conectat în prezent. Deoarece am nevoie de aceste informații în filtrul obișnuit și nu în filtrul contextual, am creat un modul simplu pentru a schimba valoarea filtrului.

Filtrul meu este cam asa:

(
Tipul de conținut = tipul de conținut_a
ȘI
uid(autor de noduri) = */această valoare este adăugată programatic*/
)

SAU

(
Tipul de conținut = contenttype_b
ȘI
user_target_id(reference) = */această valoare este adăugată programatic*/
)

Deci folosesc asta în modulul meu:

 */
function entity_access_views_pre_view(ViewExecutable $view, $display_id, array &$args){
  $currentUser = \Drupal::currentUser();
  $cuid = $currentUser->id();

    /* @ Vizualizare filtru: Media */
    if ($view->id() == 'my_view_id') {
      dacă ($display_id == 'bloc_1' || $display_id == 'pagina_1' || $display_id == 'pagina_2') {
        $filtre = $view->display_handler->getOption('filtre');
        $filters['uid']['value']['value'] = $cuid;
        $filters['user_target_id']['value']['value'] = $cuid;
        $view->display_handler->overrideOption('filtre', $filtre);
      }
    }
}

Deoarece se pare că nu pot găsi problema, am îndoieli dacă mai sus funcționează așa cum vreau. Așa că am vrut să verific dacă vezi ceva ciudat sau fals. Această valoare a filtrului poate fi stocată în cache într-un fel? Sau poate că există o modalitate mai bună de a face asta.

Nu pot folosi filtrul contextual, pe care l-aș prefera, deoarece vizualizarea arată două tipuri de conținut, unde pentru fiecare tip de conținut filtrul ar trebui să fie diferit.

Mulțumesc anticipat.

Puncte:0
drapel cn

Mai întâi puteți încerca să adăugați un context cache la elementul de randare al Viewului înainte de a fi randat:

/**
 * Implementează hook_views_pre_render().
 *
 */
function mymodule_views_pre_render(ViewExecutable $view) {
  if ($view->id() == 'my_view_id') {
    if ($view->current_display == 'block_1') {
      $view->element['#cache']['contexts'][] = 'utilizator';
      // sau adăugați un cache max-age 0 pentru un număr mare de utilizatori
      $view->element['#cache']['max-age'] = 0;
    }
  }
}

Totuși, acest lucru nu ajută dacă Views memorează interogarea în cache. Apoi puteți încerca să dezactivați stocarea în cache configurând Nici unul sau Bazat pe timp plugin pentru cache în View. Totuși, nu puteți configura un context de cache aici, doar o vârstă maximă de cache de 0. Aceasta nu este neapărat o idee rea dacă aveți un număr mare de utilizatori și nu doriți să stocați în cache aceeași cantitate de variante. Drupal are un sistem excelent de stocare în cache pentru a furniza blocuri care nu pot fi stocate în cache utilizatorilor autentificați (Dynamic Page Cache + BigPipe).

Joost avatar
drapel jp
Mulțumesc, dezactivarea memoriei cache în vizualizarea în sine este prima mea încercare de a rezolva acest lucru. Acum aștept să văd dacă asta rezolvă problema.

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.