Creare link “precedente” e “successivo” in Drupal

Con Drupal si possono creare siti internet basati su dati anche molto complessi, senza scrivere una riga di codice. Alla base di questa notevole capacità c’è la possibilità di descrivere in Drupal nuovi tipi di entità, di collegarle tra loro e di rappresentarle filtrandole secondo molteplici criteri (le cosiddette “Viste” sulle entità).

Ogni tanto però ci si scontra con problemi apparentemente banali ma che non hanno una soluzione semplice: uno di questi è creare link che puntino all’entità precedente e successiva rispetto all’entità mostrata. Il problema sembra banale, perché con le Viste è facile mostrare un elenco ordinato di entità e quindi viene spontaneo pensare che, definita la “Vista giusta, si possa semplicemente dire a Drupal “data l’entità B mostrami l’entità successiva C (o la precedente A) rispetto all’ordine definito in quella Vista”. Purtroppo questa funzione non c’è. Ci sono diversi moduli che promettono una cosa del genere, ma nella realtà nessuno di essi risolve esattamente il problema, o almeno io non ci sono riuscito.

Ma il bello di Drupal è che un medesimo problema può essere risolto in diversi modi e recentemente ho trovato una soluzione, un po’ articolata e che può non funzionare in tutti i casi, ma che ha il pregio di essere facilmente adattabile e che funziona!

La ricetta prevede l’installazione e l’utilizzo dei seguenti moduli aggiuntivi:

I primi due moduli sono tra i più comuni nella costruzione di siti Drupal e quindi non li spiego in dettaglio qui ma mi limito a ricordare che EVA serve per richiamare nella pagina di una entità una Vista che mostra altre entità correlate alla prima e Views Field View serve per richiamare una Vista dentro un’altra Vista.

Il modulo chiave per il problema che stiamo affrontando è Contextual Range Filter, che aggiunge la possibilità di filtrare una Vista passandole un intervallo di valori anziché un singolo valore. L’intervallo di valori può essere chiuso (“inizio–fine”) oppure aperto (“inizio–” oppure “–fine”). Quest’ultima possibilità è esattamente quella che ci serve per risolvere il nostro problema.

Supponiamo di avere un tipo di entità con un campo “Ordine” di tipo testo che contiene il valore rispetto cui vogliamo ordinare le entità, per cui l’entità con Ordine=”B” ha come entità “precedente” quella con Ordine=”A” e come “successiva” quella con Ordine=”C” (ovviamente il campo Ordine può contenere testi più lunghi, es. “Bici”, “Aereo” e “Camion”, ma anche stringhe che rappresentano il mese di un anno es. “2022-12”, “2022-11” e “2023-01”). Per trovare l’entità successiva all’entità B cercheremo quindi la prima entità disponibile nell’intervallo aperto “B–“, mentre per trovare l’entità precedente a B cercheremo in “–B”.

Compreso questo passaggio logico, vediamo come arrivare al risultato:

  1. Costruiamo una Vista “Entità Successiva” che elenca i titoli delle entità in ordine crescente del campo “Ordine”, mettiamo come filtro contestuale il campo “Ordine” e fissiamo a 1 il numero di entità da mostrare e indichiamo di saltare la prima entità (in modo da escludere dalla Vista l’entità stessa).
  2. Sotto “Configurazione” andiamo nella sezione “Contextual Range Filter” e spuntiamo il campo “Ordine”: con questa spunta il campo “Ordine” nella Vista viene trattato come un intervallo di valori anziché come un singolo valore. Attenzione: in questa sezione vengono mostrati tutti e soli i campi che sono già stati utilizzati come filtri contestuali in Viste, ecco perché abbiamo dovuto creare la Vista al punto 1 prima di poter fare questo passaggio.
  3. Torniamo alla Vista “Entità Successiva” e proviamo a richiamarla dandole come parametro “B–” cioè il valore del campo Ordine dell’entità B seguito da due trattini. In questo modo stiamo chiedendo alla Vista di mostrare la seconda entità il cui campo Ordine cade nell’intervallo di valori da “B” in poi, quindi mostrerà l’entità C. Abbiamo quindi creato il link che, dato il valore del campo Ordine di una entità, mostra il link verso l’entità successiva !
  4. Per richiamare quel link nella pagina di una entità, basta creare una Vista “Richiama Link Entità Successiva” di tipo EVA, formata da tre campi: (a) il campo “Ordine” dell’entità stessa (da non mostrare) (b) un campo “Intervallo” di tipo Globale Testo Personalizzato” che richiama il valore del campo Ordine seguito da due trattini (“{{ fields.ordine}}–“) (c) un campo “Globale Visualizza” che richiama la Vista “Entità Successiva” passandole come parametro il campo Intervallo (“{{ fields.nothing}}”): quando viene mostrata la pagina dell’entità B, viene automaticamente richiamata la Vista EVA “Richiama Link Entità Successiva” che a sua volta richiama la Vista “Entità Successiva” passandole come parametro “B–“, ottenendo così la visualizzazione del link all’entità C.

I passaggi sopra elencati vanno ripetuti per la costruzione del link verso l’entità precedente, con queste variazioni: la Vista “Entità Precedente” dovrà essere ordinata per campo “Ordine” decrescente; nella Vista “Richiama Link Entità Precedente” dovremo scrivere nel campo Intervallo il valore del campo Ordine preceduto dai due trattini (“–{{ fields.ordine}}”)

Sembra complicato, ma se si ha un po’ di familiarità con le Viste Drupal (ed è impossibile non averla se si usa Drupal…) in realtà è piuttosto facile. Il trucco sta tutto nella definizione di quegli intervalli “aperti” B– e –B che lasciano a Drupal il compito di trovare la prima entità successiva o precedente a B. Ovviamente si può arricchire le Viste con ulteriori vincoli per raffinare la selezione delle entità ed è quindi una soluzione molto flessibile e riutilizzabile in diversi contesti, una volta imparata.

Lascia un commento

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

Blog su WordPress.com.

Su ↑