Puncte:3

Înlocuirea șirurilor în parametrul de filtru contextual Views?

drapel nr

În Drupal 9, am o vizualizare numită Știri.

Vizualizarea este afișată pe următoarea cale:

/știri

Îl pot edita pe următoarea cale:

/admin/structure/views/view/news/edit

Are următorul filtru contextual:

Sursă de date de conținut: tip de conținut

Valorile filtrului contextual sunt furnizate de adresa URL.

Când valoarea filtrului este NU în URL: Furnizați valoarea implicită

Tip: Fix

Valoare fixa: toate

Valoare de excepție: toate

Dacă această valoare este primită, filtrul va fi ignorat; adică „toate valorile”

Acest lucru funcționează bine pentru tipuri de conținut precum articol și postare pe blog.

Când View este afișat pentru cale /articol de stiri, filtrul contextual arată numai Tipul de conținut articol.

Când View este afișat pentru cale /news/blog_post, filtrul contextual arată numai Tipul de conținut postare pe blog.

Până acum, bine.

Acum, clientul are un tip de conținut personalizat numit „Video YouTube” cu numele mașinii youtube_video.

Când această vizualizare este afișată pentru cale /news/youtube_video. filtrul contextual arată numai tipul de conținut youtube_video.

Dar clientul vrea ca calea să fie /știri/video.

Care sunt opțiunile mele?

Câteva constrângeri:

  • Clientul categoric vrea să fie calea /știri/video, și nu ceva de genul /news?type=video.
  • Nu cred că este banal să se potrivească /știri/foo și înlocuitor bar pentru foo ca intrare pentru un filtru contextual.
  • Știu cum să folosesc parametrii de poziție într-o rută, dar nu cred că pot trece cu ușurință pe traseu doar pentru /știri/foo păstrând în același timp filtrul contextual așa cum este pentru celelalte tipuri de conținut.

O oarecare flexibilitate:

  • Site-ul Drupal 9 este nou-nouț și sunt pe cale să migrez conținutul din Drupal 7 prin Migrate API, deci este posibil pentru a schimba numele mașinii youtube_video tip de conținut la video în timpul migrației. Atunci această vizualizare ar funcționa fără modificări. (Problema ar fi să descoperi orice altceva care face referire la numele mașinii youtube_video și schimbându-l în video de asemenea -- potențial mult efort.)
  • Poate fi posibilă modificarea condiționată a parametrilor de interogare folosind hook_views_pre_view() sau hook_views_query_alter(), dar vreau să fac asta numai dacă se potrivește un anumit parametru.
Puncte:3
drapel gf

Ar fi hook_views_pre_view() faci truc?

function hook_views_pre_view(ViewExecutable $view, $display_id, array &$args) {
  if ($view->id() == 'my_view' &&
    $display_id == „afișajul_meu” &&
    $args[0] == „știri” &&
    $args[1] == „videoclip”) {
    $args[1] = 'video_youtube';
  }
}

A inlocui punctul meu de vedere și display-ul meu cu valorile adecvate.

hotwebmatter avatar
drapel nr
Mulțumesc @uberhacker. Am acceptat răspunsul tău, care practic m-a pus pe drumul cel bun.
Puncte:1
drapel nr

Iată prima mea dovadă de concept de lucru bazată pe răspunsul de mai sus:

/**
 * Implementează hook_view_pre_view().
 */
function my_module_views_pre_view(ViewExecutable $view, $display_id, array &$args) {
  if ($view->id() == „știri” && isset($args[0])) {
    dacă ($args[0] == „video”) {
      $args[0] = 'video_youtube';
    }
  }
}

Primul argument din cale /știri/video de fapt doar apelează View cu $view_id = „știri”, astfel încât parametrii filtrului contextual nu pornesc până la al doilea segment din calea respectivă, adică $arg[0].

Și este important să verifici asta $arg[0] este setat înainte de a-și verifica valoarea; în caz contrar, cel /știri calea va genera erori atunci când nu sunt trecute filtre.

În cele din urmă, în cazul meu, nu este nevoie să verifici un anume $display_id, deoarece vreau ca înlocuirea șirului să aibă loc pentru toate afișajele acestei vizualizări particulare.

În afară de asta, răspunsul de mai sus a fost corect.

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.