A cosa serve MieApp e come si usa.
MieApp
Imparare e costruire app senza programmare
"Mi servirebbe una app per gestire le richieste dei miei clienti | le iscrizioni alla mia associazione | i miei dischi in vinile | qualunque altra cosa" MA "non so programmare | chissà quanto costa farla fare | non so a chi chiedere | come faccio a spiegare cosa voglio".
MieApp è qui per aiutarti a dare una risposta a queste tue esigenze, mettendoti in mano uno strumento per creare le tue app, anche se non sai programmare. Con MieApp imparerai a descrivere cosa vuoi e farlo da te, senza bisogno di rivolgerti ad un programmatore e senza spendere soldi in licenze. Le app che realizzerai saranno tue e solo tue e potrai farle usare da colleghi ed amici su pc, tablet e smartphone. Anche MieApp è gratis, non devi neppure iscriverti e lasciare i tuoi dati.
Tutto ciò è reso possibile da Drupal, una piattaforma software open source e gratuita, disponibile in italiano, che mette a disposizione migliaia di funzioni per coprire tutte le tue esigenze. MieApp ti guiderà passo passo a conoscere Drupal, dalla descrizione di cosa vuoi dalla tua app fino al suo rilascio. MieApp è organizzato in brevi Guide, che ti consiglio di leggere nell'ordine in cui sono presentate ma, in base alle tue competenze ed alle tue esigenze, puoi decidere di saltarne qualcuna e tornare indietro.
Limiti di MieApp
Prima di proseguire, ecco alcuni avvisi sui limiti di MieApp:
- MieApp è un tutorial pensato per accompagnarti ad usare Drupal subito, imparando quel che serve e senza doverti preoccupare della sua complessità. Il resto lo scoprirai da te, a mano a mano che ne avrai bisogno. Inoltre contiene una serie di piccoli trucchi ed avvertenze che nascono dalla mio personale utilizzo di Drupal in ambito lavorativo. Se invece preferisci un approccio più strutturato, puoi far riferimento alla guida ufficiale di Drupal per utenti (Drupal User Guide) o a una delle numerose pubblicazioni in italiano.
- MieApp è pensato per chi vuole usare Drupal per costruire applicazioni senza scrivere codice, cioè per coloro che, nel gergo di Drupal sono chiamati "site builder". Non tratta invece di sviluppo di nuovi moduli, operazione che ovviamente richiede competenze di programmazione.
- Anche se non è necessario saper programmare per costruire una app con Drupal, bisogna saper ragionare per modelli e processi ed è utile avere una formazione informatica generale: insomma, Drupal non è proprio per tutti tutti tutti, ma con MieApp provo a rendere più facile tutto questo.
- (la più importante) MieApp è un work in progress, nel senso che le Guide vengono pubblicate a mano a mano che ho tempo, quindi all'inizio ne troverai poche e non sempre complete 😃. E dove non ho tempo o voglia di approfondire metterò rimandi a risorse già disponibili in rete.
Costruire app senza programmare
L'approccio "no code" (senza scrittura di codice software) è molto di moda. Se cerchi "no code platform" in internet puoi scoprire molti servizi on line che promettono di farti produrre app senza saper programmare, Alcune di esse generano app vere e proprie, installabili su smartphone da Apple Store o Play Store. Altre preparano web app, che vengono eseguite dal servizio, che quindi devi tener attivo non solo durante la creazione della app, ma anche per tutto il periodo di utilizzo della app. Con pochissime eccezioni, l'uso di questi servizi è a pagamento.
"No code" non significa però "no work" (nessuna fatica). Anche se non dovrai programmare, creare una app richiede di analizzare il problema che si vuol risolvere con la app, modellare i dati ed i processi che servono per risolverlo. E qualunque piattaforma "no code" tu scelga, dovrai imparare ad usarla.
In questi ultimi mesi, le IA promettono di fare loro tutto il lavoro dei programmatori. Ma, come spesso capita con le IA, per valutarne correttamente il risultato devi conoscere l'argomento, quindi un codice generato dalla IA deve ad oggi essere verificato da qualcuno che sa programmare. Inoltre le IA non possono occuparsi delle fasi successive allo sviluppo ed in particolare ad oggi non provvedono alla distribuzione e mantenimento in cloud della app sviluppata. Sui rapporti tra IA e Drupal prima o poi dedicherò una specifica Guida. Per ora, affidiamoci alla intelligenza naturale presente in ciascuno di noi.
I vantaggi di Drupal
Drupal nasce come una piattaforma software per creare siti aziendali e governativi, intranet, blog ecc., ma col tempo è evoluto a gestire dati, interrogazioni sui dati e processi automatizzati. Queste caratteristiche consentono di usare Drupal anche come una piattaforma "no code" con cui creare web app senza scrivere codice.
Rispetto ad altre piattaforme, Drupal presenta alcuni vantaggi interessanti:
- è gratuito: per usare Drupal non si pagano licenze; puoi creare le tue app con Drupal e farle usare da un numero illimitato di utenti senza dover nulla a nessuno; se lo installi in cloud per condividere le tue app con utenti fuori dalla tua rete locale, l'unica spesa che dovrai sostenere è quella dell'hosting, in cui potrai ospitare più di una app a poche decine di euro all'anno;
- è open source, supportato da una vasta comunità di sviluppatori che mette a disposizione gratuitamente migliaia di moduli aggiuntivi in grado di soddisfare (quasi) tutte le tue esigenze;
- è continuamente aggiornato: esiste dal 2011 e viene periodicamente aggiornato (siamo alla versione 11), con frequenti rilasci minori per la sicurezza e la correzione di errori.
- è supportato da una comunità di migliaia di sviluppatori ed utilizzatori, quindi quando incontri un problema molto spesso trovi anche la soluzione.
Sul sito Drupal ci sono DUE Drupal: CMS e Core. Quale devo guardare?
Da qualche mese, sul sito Drupal sono presentati due filoni di Drupal. Semplificando al massimo: "Drupal CMS" è pensato per la creazione di siti internet "belli" e più "commerciali"; "Drupal Core" è invece pensato per la creazione di applicazioni. Poiché in realtà Drupal CMS è basato su Drupal Core, possiamo ad oggi ignorare questa differenziazione. Dato lo scopo di MieApp, ovviamente nelle Guide si fa riferimento a Drupal Core, quindi ti invito a guardare la parte del sito Drupal dedicata a Drupal Core, ignorando l'altra.
Devo leggere tutte queste Guide?
No. Sei libero di consultare le Guide di MieApp nell'ordine che vuoi. Però ti raccomando - almeno all'inizio - di leggerle nell'ordine in cui sono presentate, perché ogni Guida dà per scontato che tu abbia letto quelle precedenti. Proseguendo nella lettura, scoprirai da te che ci sono approfondimenti che non ti interessano e che puoi saltare, almeno fino a quando non ti serviranno. MieApp vuole infatti farti usare subito Drupal, senza perdere troppo tempo con la teoria. Le sue Guide sono scritte per introdurti a Drupal partendo da zero e per complessità crescente. Se invece vuoi una introduzione più formale a Drupal, ti consiglio di consultare il sito di Drupal.
Come leggerle
Comandi, nomi di campi e di sezioni, messaggi ed altri testi fissi mostrati in Drupal e negli altri software sono evidenziati in rosso.
| ATTENZIONE ! I riquadri con questa scritta contengono avvertenze importanti, da leggere con attenzione |
| APPROFONDIMENTO I riquadri con questa scritta contengono approfondimenti che, se sei di fretta, puoi saltare ad una prima lettura |
| ▶️ Digita questi comandi nel Terminale del computer o in cloud |
Posso trasformare le Guide in un libro da leggere?
Si. In fondo all'Indice che elenca le Guide clicca il comando Guida Completa per accedere alla pagina che contiene il testo di tutte le Guide e che puoi stampare in formato PDF coi comandi del web browser.
Il "vocabolario" di Drupal
Come tutti i software, anche Drupal ha un suo vocabolario, cioè un elenco di termini con un significato preciso. MieApp ti introduce a questi termini a mano a mano che servono. La prima volta che un termine viene usato, ti viene spiegato brevemente cosa significa e, cliccandoci sopra, viene mostrata una pagina di approfondimento. Per distinguere questi termini dal linguaggio comune, vengono sempre presentati con la lettera maiuscola. Infine, puoi consultare il vocabolario Drupal di MieApp.
Mi serve una installazione funzionante di Drupal?
Si. Puoi anche limitarti a leggere le Guide per farti un'idea di Drupal, ma lo scopo vero di MieApp è guidarti a costruire passo passo la app che ti serve e, a questo fine, ti serve una installazione funzionante di Drupal. La Guida alla Installazione ti spiega come procurartela.
Teoria e pratica
Nella maggior parte delle Guide presento un metodo o uno strumento di Drupal utile per costruire le app e, dove possibile, applico la teoria ad una app di esempio. Ovviamente lo scopo di MieApp non è di farti ricostruire quella app sul tuo computer però, partendo da essa, puoi provare a costruire da subito la tua app.
Per costruire una app con Drupal hai bisogno di una installazione di Drupal sul tuo computer locale o in cloud presso un provider internet.
Puoi installare Drupal su un tuo computer locale oppure in cloud presso un provider internet. Ecco qualche domanda per aiutarti a scegliere tra installazione locale e installazione in cloud:
Ho qualche competenza sistemistica?
Per installare Drupal localmente sul tuo computer devi prima trasformare il computer in un server, installandovi alcuni componenti normalmente non presenti o non attive: un web server, un database server ed un interprete del linguaggio PHP. Esistono diverse procedure guidate per farlo, più o meno complesse, ma tutte richiedono qualche competenza sistemistica. L'installazione in cloud è più semplice, perché il server lo predispone il provider. Un suggerimento: prova l'installazione locale per imparare ad usare Drupal e poi passa al cloud se non ne vieni a capo o quando è il momento di condividere la tua app con altri utenti via internet.
Chi userà la mia app?
Se la app sarà usata solo da persone connesse alla rete locale di casa tua o del tuo ufficio, può bastare l'installazione locale. Se invece la tua app sarà usata da persone che accedono da internet, allora devi installare Drupal in cloud (oppure "esporre" il tuo computer su internet, ma questo scenario esula dalle Guide di MieApp).
Sono disposto a spendere qualcosa?
L'installazione locale sul tuo computer non ti costa nulla, se non il tempo che perderai nell'allestimento. L'uso di Drupal in cloud di per sé costa zero, ma devi mettere in conto il costo di un abbonamento per l'uso del server del provider: un "web hosting" (la forma base e meno costosa del cloud) è sufficiente per partire e per la maggior parte delle tue app e costa poche decine di euro all'anno.
Un rapido confronto....
Le operazioni da eseguire nei due casi non sono esattamente le stesse ma il percorso è abbastanza simile (i dettagli li trovi nelle due Guide dedicate):
| Installazione locale | Installazione in cloud | ||
1 | Trasformare il computer in un server | Scegliere il provider che offre il server adatto | |
2 | Configurare il server | (ci pensa il provider) | |
3 | Preparare la cartella dove installare Drupal | Preparare il sito dove installare Drupal | |
| Installazione manuale di Drupal nel sito | Se disponibile: Installazione automatica di Drupal nel sito | ||
4 | Preparare il database necessario a Drupal | Preparare il database necessario a Drupal | (ci pensa il provider) |
5 | Installare Drupal nella cartella | Installare Drupal nel sito | (ci pensa il provider) |
6 | Configurare Drupal per il primo uso | Configurare Drupal per il primo uso | (ci pensa quasi interamente il provider) Configurare solo alcuni aspetti di Drupal |
Ok, ho scelto di...
Leggi questa Guida se hai deciso di installare Drupal sul tuo computer locale, altrimenti passa alla Guida per installare Drupal in cloud.
Per installare Drupal sul tuo computer locale, devi prima trasformarlo in un server e poi installarvi Drupal.
Come trasformo il mio pc in un server?
Per funzionare, Drupal richiede che sul computer siano presenti ed attivate i seguenti componenti software:

- un web server (es. Apache), che cura le comunicazioni tra Drupal e il pc o smartphone dell'utente
- un database server (es. MySQL o MariaDB), che gestisce il database in cui sono archiviate le informazioni necessarie a Drupal
- un interprete di linguaggio PHP, che esegue il codice sorgente di Drupal, scritto appunto in PHP
- composer, un tool che facilita l'installazione delle diverse librerie software di cui è composto Drupal
Se sei sul posto di lavoro, ti consiglio di rivolgiti all'informatico aziendale, che provvederà all'installazione di tutti questi componenti, probabilmente su un computer Linux, facendo riferimento a queste istruzioni nell sito di Drupal.
Se sei a casa o ti devi arrangiare con un computer Windows, la comunità Drupal raccomanda di usare DDEV, una procedura che installa e configura tutti i componenti necessari a Drupal. Semplificando un bel po', DDEV simula un server Linux sul tuo computer Windows. La procedura è guidata, ma richiede parecchie competenze sistemistiche e più di 250 GB di disco libero: per quest'ultimo motivo, non ho finora potuto provarla.
Qualcosa di più semplice?
Per computer Windows ci sono soluzioni più semplici e leggere di DDEV: anche se considerate meno stabili, sono ragionevolmente utilizzabili per app non troppo critiche. Queste soluzioni sono identificate con la sigla "WAMP" (dalle iniziali di Windows, Apache, MySQL/MariaDB e Php) e sono tutte dotate di una procedura di installazione semplificata. Dopo l'installazione, presentano tutte un pannello di controllo, attraverso cui configurare ed attivare i componenti software, ed un Terminale in cui digitare i comandi necessari all'installazione di Drupal.
Tra le soluzioni WAMP più utilizzate ci sono XAMPP, WAMPserver, WAMP.NET e Laragon. Io ho utilizzato XAMPP fino alla versione 10 di Drupal, ma attualmente (settembre 2025) non è possibile usarla con la versione 11 di Drupal, perché XAMPP installa una versione di PHP (8.2) inferiore a quella richiesta da Drupal (8.3). WAMP.NET non installa composer. WAMPserver la conosco poco. Con Laragon ho installato Drupal 11 in pochi minuti sul mio portatile e quindi te la consiglio. La versione gratuita di Laragon non si autoaggiorna e all'avvio mostra un invito a comprare una licenza, però è un disturbo sopportabile. Le istruzioni che seguono sono esemplificate su Laragon, ma sono abbastanza simili per tutte le soluzioni WAMP.
Scaricato ed installato Laragon (o un'altra soluzione WAMP), occorre modificare la configurazione di Apache, MySQL e PHP per tener conto delle esigenze particolari di Drupal. In particolare:
CONFIGURAZIONE PHP: nel file di configurazione php.ini occorre impostare i seguenti parametri:
realpath_cache_size = 10M
memory_limit = 4G
In Laragon, si accede a php.ini col comando PHP - php.ini
Occorre inoltre attivare le estensioni di PHP
gd (obbligatoria)
opcache (raccomandata).
In Laragon, per attivarle basta selezionarle dal menù PHP - Estensioni
Ok, ho trasformato il pc in un server. Come installo Drupal?
Una volta trasformato il pc in un server con tutti i componenti software sopra indicati, il pc è pronto ad ospitare Drupal.
| APPROFONDIMENTO Per inciso, i componenti software che hai installato per Drupal sono gli stessi richiesti anche da altre applicazioni web based scritte in PHP, tra cui Nextcloud per la gestione di documenti, LimeSurvey per la gestione di questionari, Prestashop per avere un negozio online, Moodle per distribuire corsi di formazione, Mediawiki per creare siti informativi, osTicket per gestire richieste di assistenza, Kimai per valorizzare il tuo tempo lavorativo ecc. Accenno a queste opportunità perché, prima di imbarcarti a costruire da zero una app con Drupal, potresti verificare se la tua necessità può essere soddisfatta da una applicazione già disponibile. Per un elenco aggiornato di queste applicazioni cerca "open source php web based applications". |
Poiché sul tuo pc potresti voler ospitare più di una app costruite con Drupal, ti consiglio di fare una installazione separata di Drupal per ogni app, in modo che l'eventuale crash di una app non blocchi le altre. Inoltre questa scelta semplifica la futura migrazione delle singole app in cloud o su un altro server. Le istruzioni che seguono sono quindi da ripetere ogni volta che ti accingi a costruire una nuova app:
- Prepara in Apache una cartella in cui installare Drupal
- Prepara in MySQL un database dedicato alla app
- Prepara in Apache un indirizzo specifico per la app
- Installa Drupal nella cartella
- Configura Drupal per il primo utilizzo
Sono tanti passaggi, ma tutti abbastanza semplici (soprattutto con Laragon).
1. PREPARA LA CARTELLA DOVE INSTALLARE DRUPAL
Con l'aiuto del pannello di controllo della tua soluzione WAMP, identifica la cartella "base" in cui Apache memorizza le pagine da distribuire. Di solito si chiama www o htdocs. Trovata la cartella base, con Gestione Risorse di Windows crea in essa una sottocartella, dandole il nome della app (in minuscolo, senza spazi o caratteri speciali) che intendi costruire. Ad esempio, se la tua app si chiamerà "Gestione Prestiti", la sottocartella potrebbe chiamarsi "gestione-prestiti" o semplicemente "prestiti".
In Laragon, usa il comando Creazione veloce - blank e digita il nome della app. Laragon provvede non solo a creare la sottocartella nel posto giusto, ma crea subito anche il database omonimo in MySQL e crea l'indirizzo specifico per la app, semplificando le istruzioni successive.
2.PREPARA IN MYSQL IL DATABASE DEDICATO ALLA APP
Se stai usando Laragon, il database è già stato creato nel passaggio precedente: col comando Attrezzi - HeidiSQL entra in MySQL, seleziona il database col nome della app, clicca l'icona Utenti, crea un utente con lo stesso nome della app e con password a tua scelta ed attiva tutti i privilegi dell'utente.
Con le altre soluzioni WAMP: dal pannello di controllo lancia la gestione di MySQL (di solito è phpmyadmin); entrato in MySQL, crea un nuovo utente dandogli il nome della app e con password a tua scelta, seleziona l'opzione per creare un database con lo stesso nome dell'utente ed attiva tutti i privilegi per quell'utente sul quel database.
3.PREPARA IN APACHE L'INDIRIZZO DELLA APP
Se stai usando Laragon, l'indirizzo è già stato creato nel primo passaggio ed è:
dove NOMEAPP è il nome che hai dato alla app.
Con altre soluzione WAMP: DA SCRIVERE.
4.INSTALLA DRUPAL NELLA CARTELLA
Se stai usando Laragon, lancia il Terminale col comando Laragon - Terminale. Con le altre soluzioni WAMP, dal pannello di controllo lancia il Terminale.
Dentro il terminale, usando i comandi Windows cd e dir posizionati nella sottocartella della app e digita il comando:
| ▶️ composer create-project drupal/recommended-project . |
Non dimenticare il punto finale "." perché dice a composer di installare Drupal nella cartella corrente.
ATTENZIONE ! Attualmente (settembre 2025) al termine della installazione dei file di Drupal da parte di composer, è necessario eseguire le seguenti istruzioni, per evitare un problema bloccante nel passaggio successivo, riscontrato da me e da altri, e che ha trovato una soluzione temporanea in questa pagina:
|
5.CONFIGURA DRUPAL PER IL PRIMO UTILIZZO
Sul pc vai con un web browser sull'indirizzo della app aggiungendo web in fondo. Ad esempio, con Laragon è:
Nel web browser appare la procedura di prima configurazione di Drupal, in cui occorre specificare:
- la lingua ("italiano")
- il tipo di installazione ("Standard")
- i tre parametri del database (utente, password, nome database) che hai definito nel passaggio 2
- l'indirizzo email del sito (la tua email)
- il nome utente dell'Amministratore Drupal (tipicamente "admin")
- la password dell'Amministratore (a tua scelta)
- l'indirizzo email dell'Amministratore (la tua email)
- il fuso orario ("Roma")
- se attivare le notifiche di aggiornamento (attivale)
Ora Drupal è installato, pronto all'uso e sei dentro Drupal come Amministratore. Prima di iniziare ad esplorare Drupal ti raccomando di installare anche l'utility Drush.
Per installare Drupal in cloud, esegui questi passaggi:
- Scegli il provider
- Prepara presso il provider il sito che ospiterà Drupal
- Installa Drupal nel sito
1. SCEGLI IL PROVIDER
Per scegliere il provider cerca "drupal hosting" e seleziona un servizio cloud con queste caratteristiche:
- per iniziare spendendo poco, è sufficiente un servizio del tipo "web hosting" o "condiviso", meno performante del noleggio di un server vero e proprio, ma molto meno costoso
- il servizio deve includere Apache, Php, MySql o MariaDB, che sono i componenti software necessari a Drupal
- In particolare, verifica che sia disponibile una versione PHP compatibile con quella richiesta Drupal (attualmente almeno PHP 8.3); per gli altri requisiti necessari vedi sul sito di Drupal
- il servizio deve fornire un Terminale in cui poter dare comandi; presso alcuni provider, è chiamato "Shell" o "ssh"; il Terminale è essenziale per poter installare Drupal e i suoi moduli aggiuntivi
- il servizio deve consentire di realizzare più "siti": per ogni app che vorrai costruire con Drupal ti serve un "sito" distinto, quindi più "siti" sono compresi nel servizio più app potrai realizzare con lo stesso abbonamento
- preferisci un servizio che mette a disposizione una procedura per l'installazione automatica di Drupal: non è strettamente necessario, ma se c'è ti semplifica la vita; presso molti provider, a questo scopo viene fornita l'applicazione Softaculous
- preferisci un servizio che mette a disposizione procedure di backup manuali o automatici, utilissime per ripristinare una app dopo un eventuale crash o hackeraggio.
Tra le offerte disponibili (luglio 2025), segnalo a titolo di esempio IONOS OVHcloud Netsons Infomaniak e Hostinger. Personalmente da anni uso Netsons e Infomaniak.
2. PREPARA IL SITO CHE OSPITERA' DRUPAL
Quando attivi un web hosting in cloud, normalmente ti viene assegnato anche un dominio internet, condiviso o tuo personale. Ad esempio, io ho comprato il dominio "bottasini.eu". Per ogni app che intendi ospitare nel cloud, devi prima predisporre il "sito" che la ospiterà e in cui installerai Drupal. Le istruzioni variano da provider a provider, però la procedura di creazione dei siti è solitamente molto guidata. Alla creazione di un nuovo sito, ti viene chiesto se intendi dedicargli l'intero dominio (es. "bottasini.eu") oppure un sottodominio (es. "vicinato.bottasini.eu"): scegli questa opzione se intendi ospitare più app evitando di acquistare un dominio diverso per ogni app. Devi infine specificare la versione di PHP che intendi usare nel sito: ricordati che deve essere uguale o superiore a quella richiesta da Drupal (attualmente PHP 8.3)
3. INSTALLA DRUPAL NEL SITO
Dal pannello di controllo del provider entra nel sito che hai appena creato.
Se il provider ti mette a disposizione una procedura per l'installazione automatica di Drupal, usala: ti risparmierai una serie di attività. Ad esempio, col provider Infomaniak l'installazione di Drupal dentro un sito si presenta così:
![]() |
La procedura di installazione automatica di Drupal crea il database dove la app memorizzerà le informazioni, installa nel sito i file che compongono Drupal e lo configura per il primo utilizzo. La procedura ti chiede solo alcune informazioni base, tra cui la lingua ("italiano"), la username dell'Amministratore (di solito si sceglie "admin"), la password dell'Amministratore (a tua scelta), l'email dell'Amministratore e del sito (normalmente, la tua email). Al termine della procedura automatica, Drupal è pronto all'uso. Prima però ti raccomando di installare anche l'utility Drush.
Se il provider NON ti mette a disposizione una procedura per installare automaticamente Drupal nel sito, niente paura: ecco le istruzioni per installarlo manualmente. I passaggi sono questi:
- 3.1 Prepara il database
- 3.2 Installa Drupal nel sito
- 3.3 Configura Drupal per il primo utilizzo
3.1 Prepara il database
Drupal necessita di un database per memorizzarvi la propria configurazione e le informazioni gestite dalla app. Dal pannello di controllo del provider, lancia il gestore di database (solitamente si chiama phpmyadmin). Le istruzioni che seguono valgono dentro phpmyadmin, ma non cambiano molto se l'applicazione offerta dal provider è un'altra.
- clicca Account utente e crea un nuovo utente
- Scegli come nome utente il nome della app che stai costruendo, per facilitarti l'abbinamento tra database e app
- Scegli una password non banale oppure chiedi di generarla automaticamente
- Accendi le opzioni per la creazione di un database con lo stesso nome dell'utente e per dare all'utente tutti i privilegi sul nuovo database
- Memorizza da qualche parte nome utente, password e nome del database, perché ti serviranno nell'ultimo passaggio
- Clicca "Esegui"
3.2 Installa i file di Drupal
Dal pannello di controllo del provider lancia il Terminale . In esso, usa i comandi Linux, per trovare la cartella che ha lo stesso nome del sito ed entrarvi:
- pwd (per sapere in che cartella sei)
- ls (per elencare il contenuto della cartella)
- cd (per spostarti di cartella)
Alcuni provider collezionano tutte le cartelle dei siti sotto un'unica cartella, ad esempio /sites, in questo caso, per entrare nella casella del sito digita nel Terminale:
| ▶️ cd sites/NOMEAPP |
dove NOMEAPP è il nome che hai dato al sito. Sempre nel Terminale digita il comando:
| ▶️ composer create-project drupal/recommended-project . |
Il punto finale è importante perché dice a Composer di installare Drupal nella cartella corrente.
3.3 Configurare Drupal per il primo utilizzo
Al termine del precedente passaggio esci dal pannello di controllo del provider e lancia un web browser sul sito. Ad esempio, se hai creato il sito "vicinato" nel dominio "bottasini.eu" lancia
Nel web browser appare la procedura di prima configurazione di Drupal, che chiede alcune informazioni per completare l'installazione, tra cui la lingua ("italiano"), la username dell'Amministratore (di solito si sceglie "admin"), la password dell'Amministratore (a tua scelta), l'email dell'Amministratore e del sito (normalmente, la tua email) e le tre informazioni definite al passo 3.2 (nome del database, nome dell'utente del database, password dell'utente del database).
Ora Drupal è installato e pronto all'uso. Prima però ti raccomando di installare anche l'utility Drush.
Cos'è Drush e a cosa mi serve?
Drush è una utility molto importante, perché ti permette di modificare la configurazione di Drupal da Terminale anziché da web browser. Quindi permette di agire sulla tua app anche quando, per qualche motivo, Drupal non risponde più da web browser. Oltre a fare da "salvagente" delle tue app, Drush consente di eseguire diverse operazioni di manutenzione su Drupal.
Come installo drush?
Apri il pannello di controllo del tuo provider (se sei in cloud) o della tua soluzione WAMP (se hai installato Drupal sul tuo computer locale), lancia il Terminale, entra nella cartella dove hai installato Drupal e digita il comando:
| ▶️ composer require drush/drush |
Come si usa drush?
Una volta installato, verifica il funzionamento di Drush: apri il Terminale, entra nella cartella in cui hai installato Drupal e digita il comando:
| ▶️ vendor/bin/drush |
Se sei in una installazione locale su Windows e ottieni un errore, prova con
| ▶️ vendor\bin\drush |
I comandi che puoi dare a Drush sono elencati sul sito di drush. Qui sotto elenco quelli di uso più comune.
Se la tua app non risponde più nel web browser, puoi provare a recuperarla digitando il comando:
| ▶️ vendor/bin/drush cr |
Questo comando pulisce la Cache (memoria temporanea di Drupal): talvolta basta questa semplice operazione per risolvere un crash di Drupal.
DISINSTALLARE UN MODULO
Se la tua app non risponde più dopo che hai installato un modulo aggiuntivo, con Drush puoi disinstallare quel modulo riportando la app in una situazione probabilmente funzionante. Col comando:
| ▶️ vendor/bin/drush pm:list |
ottieni l'elenco di tutti i moduli installati. Identifica in esso l'esatto nome interno del modulo che vuoi disinstallare e poi digita il comando:
| ▶️ vendor/bin/drush pm:uninstall NOMEMODULO |
dove NOMEMODULO è il nome interno del modulo. che hai scoperto col comando precedente.
SBLOCCARE CRON
Se Cron non funziona più, puoi provare a sbloccarlo eseguendolo da Drush col comando:
| ▶️ vendor/bin/drush cron |
Moduli aggiuntivi? Perché dovrei aver bisogno di altri moduli ?
Drupal è formato da un nucleo principale, detto Core e da moduli, ognuno dei quali aggiunge funzioni a Drupal. Ad esempio, la gestione di immagini e video è svolta dal modulo "Media". Quando installi Drupal, vengono installati il Core ed una ventina di moduli essenziali. Col comando Estendi del menù di Amministratore puoi vedere l'elenco di tutti i moduli presenti ed attivi.
E' molto probabile che la tua app richieda funzionalità non offerte dalla installazione base di Drupal., quali ad esempio la gestione di calendari, mappe, mail ecc. Uno dei punti di forza di Drupal è che la comunità degli sviluppatori mette gratuitamente a disposizione migliaia di moduli aggiuntivi, in grado di soddisfare (quasi) tutte le esigenze. Anzi, talvolta la medesima esigenza è risolta con strategie differenti da moduli diversi e, col tempo, alcuni moduli vengono abbandonati a favore di quelli preferiti dagli utilizzatori di Drupal.
Dove trovo i moduli che mi servono?
Puoi esplorare l'elenco dei moduli disponibili sul sito di Drupal alla pagina:
https://www.drupal.org/project/project_module
Nel seguito di MieApp evidenzierò i moduli di utilizzo più comune per la creazione di app. Qui puoi vedere l'elenco completo dei moduli utilizzati nelle diverse Guide di MieApp. Ogni volta che cito un modulo, viene proposta una pagina con una breve illustrazione di cosa fa, col link alla pagina del sito Drupal che contiene una descrizione completa, i requisiti e le istruzioni per installarlo ed gli eventuali problemi noti.
E confesso che da qualche tempo mi faccio suggerire i moduli dalla intelligenza artificiale di Gemini...suggerimenti spesso imprecisi ma che possono mettere in evidenza moduli che non conoscevo.
Come installo un modulo?
Con l'attuale versione di Drupal (11) non è possibile installare un modulo da web browser ma occorre agire da Terminale. Una volta identificato sul sito di Drupal il modulo che ti serve, per installarlo:
- Sul sito di Drupal vai nella pagina del modulo
- In quella pagina, copia l'istruzione mostrata a fianco di Install. L'istruzione è formata dal comando composer require seguito da nome e versione del modulo. Ad esempio
| ▶️ composer require 'drupal/eva:^3.1' |
- è l'istruzione per installare il modulo EVA versione 3.1. Se la pagina mostra più versioni disponibili, installa la versione più recente compatibile con la versione di Drupal che stai usando (attualmente Drupal 11). Se un modulo non ha una versione compatibile con la tua versione di Drupal, non puoi usarlo e devi cercarne uno diverso che faccia quel che ti serve. Se possibile, non installare moduli in versione "alpha" perché sono instabili.
- Se hai trovato il modulo giusto ed hai copiato l'istruzione di installazione, passa al pannello di controllo del tuo provider cloud o della tua installazione locale, apri il Terminale, posizionati nella cartella dove hai installato Drupal ed incolla l'istruzione nel terminale.
- Al termine dell'installazione, lancia un web browser sulla tua app, entra come Amministratore, seleziona Estendi nel menù ed attiva il modulo appena installato. In alcuni casi, l'installazione di un modulo trascina con sé l'installazione di altri moduli necessari al suo funzionamento.
Ecco un video che mostra i passaggi per l'installazione di un modulo aggiuntivo, esemplificato sul provider Infomaniak:
Quali moduli aggiuntivi mi suggerisci?
La risposta dipende da cosa deve fare la tua app. Però ci sono moduli che, nella mia esperienza, mi ritrovo a installare praticamente sempre. Invece che elencarteli qui senza poter entrare nel merito, te li indicherò a mano a mano che servono nelle Guide che seguono. All'inizio di ogni Guida trovi elencati i moduli richiesti o consigliati in quella Guida. Ogni volta che citerò un modulo, cliccando su di esso potrai consultare una pagina con una breve spiegazione dello scopo del modulo stesso ed il link alla sua pagina nel sito Drupal, ad esempio vedi il modulo Token. Puoi anche consultare l'elenco completo dei moduli citati in MieApp.
Aiuto! Dopo l'installazione di un modulo la app non risponde più
Se dopo l'installazione di un nuovo modulo la tua app non risponde più (caso raro, ma ahimè può succedere), disabilita il modulo con Drush come spiegata qui.
Se sei arrivato qui, hai installato Drupal sul tuo computer o in cloud, sei entrato in Drupal come Amministratore e sai come installare i moduli aggiuntivi che servono alla tua app. Sei quindi pronto per costruire la tua prima app !
Costruire la app = configurare Drupal
La costruzione di una app con Drupal consiste essenzialmente nella configurazione di Drupal attraverso le pagine offerte all'Amministratore da Drupal stesso. In queste pagine, l'Amministratore è guidato a cliccare link, selezionare valori predefiniti e compilare campi testuali, senza necessità di ricordare a memoria comandi o parole chiave.
Una difficoltà che potresti incontrare all'inizio è data dalla numerosità dei comandi disponibili e delle selezioni richieste da Drupal. Lo scopo di MieApp è proprio quello di aiutarti a scoprire passo passo le configurazioni più importanti, senza preoccuparti se sbagli o dimentichi qualcosa: in ogni momento potrai tornare indietro e raffinare la tua opera. Grazie a questa flessibilità offerta da Drupal, non è quindi necessario avere tutto chiaro prima di partire a costruire, anzi la progressiva costruzione della app ti fornirà suggerimenti su come proseguire.
Cosa vuoi dalla tua app?
Prima di partire a costruire la tua app con Drupal, ti suggerisco di provare a descriverla sinteticamente rispondendo a queste domande:
| Scopo | A cosa serve la tua app? Descrivila con poche frasi, come se dovessi convincere i futuri utenti a considerarla. |
| Utenti | Chi utilizza la app? Solo tu o altre persone? Ci sono gruppi di utenti? E' necessario iscriversi alla app o è disponibile anche ai visitatori non iscritti? Chi autorizza gli utenti? Chi gestisce la app? |
| Processi | Cosa fanno gli utenti con la app? Descrivi le principali azioni che gli utenti (o gruppi di utenti) eseguono nella app |
| Informazioni | Quali informazioni gestisce la app? Descrivi i vari tipi di informazioni necessarie ai processi |
| Permessi | Quali permessi hanno gli utenti sulle diverse informazioni? Chi può fare cosa? |
| Percorsi | Come si muovono gli utenti nella app? Di quali comandi dispongono? Descrivi a parole o con un diagramma i percorsi previsti per i diversi tipi di Utenti attraverso le diverse pagine della app |
| Automazioni | Quali attività svolge autonomamente la app senza la necessità di comandi da parte degli utenti? |
Vedremo come tradurre questi aspetti in configurazioni di Drupal, utilizzando come esempio la app "Vicinato"
Una app di esempio
Come esempio per la costruzione delle app con Drupal utilizzo "Vicinato", una app per il prestito di attrezzi tra vicini di casa che puoi vedere in bozza qui:
Le credenziali per accedere alla app sono mostrate nella pagina di login.
Non ti sto invitando a ricostruire sul tuo computer o in cloud proprio questa app: "Vicinato" è solo un esempio di cosa si può fare con Drupal, da cui puoi prendere spunto per costruire l'app di tuo interesse. Anche se la app ha di per sé un obiettivo abbastanza semplice, per motivi didattici cercherò di inserirvi progressivamente una certa complessità. E' probabile che la tua prima app sia molto più semplice di questa.
Per descrivere la app applico il metodo che ti ho suggerito nella Guida precedente.
Scopo
La app facilita il prestito gratuito di attrezzi tra persone che abitano nella stessa zona o città. Lo scambio degli attrezzi avviene direttamente tra le parti oppure, per maggiore tutela, tramite il deposito temporaneo presso luoghi aperti al pubblico, quali le sedi di associazioni o biblioteche.
Utenti
L'utilizzo della app è riservato agli Utenti iscritti. I Visitatori vedono solo le istruzioni per iscriversi. L'iscrizione viene accettata dai Gestori, Utenti scelti dall'Amministratore per la gestione della app. Con l'iscrizione alla app, gli Utenti diventano Partecipanti, che si prestano vicendevolmente gli attrezzi. Lo scambio degli attrezzi avviene direttamente tra le parti o presso sedi aperte al pubblico, in questo caso è intermediato da Operatori abilitati dai Gestori.
Processi
Ecco i processi svolti da ognuno dei ruoli sopra identificati:
- Il Visitatore avanza domanda di iscrizione nella app. Se l'iscrizione viene accettata dai Gestori, facendo login con le credenziali ottenute il Visitatore entra nella app come Partecipante.
- Il Partecipante popola il "magazzino" virtuale della app con gli attrezzi che mette a disposizione, catalogandoli secondo categorie predefinite dai Gestori. Chiede in prestito attrezzi altrui e presta i propri attrezzi in risposta a richieste altrui. Gli attrezzi vengono scambiati tra proprietario e richiedente direttamente oppure presso una sede aperta al pubblico. Quando il prestito è terminato, proprietario e richiedente possono esprimere una valutazione sull'esperienza del prestito.
- L'Operatore gestisce la consegna degli attrezzi presso la sede cui è stato abilitato dai Gestori.
- Il Gestore accetta le richieste di iscrizione dei Visitatori, gestisce gli Utenti e li supporta nell'utilizzo della app. Definisce le sedi di consegna ed vi abilita gli Operatori. Definisce le categorie per classificare gli attrezzi. Interviene su prestiti per risolvere eventuali anomalie.
- Tutti gli Utenti si scambiano messaggi nella app per concordare i dettagli dei prestiti, per risolvere problemi, per chiedere assistenza ai Gestori, senza la necessità di esporre i propri contatti personali al destinatario.
Informazioni
I processi sopra descritti richiedono la gestione delle seguenti informazioni elementari:
| Informazione | Cosa rappresenta |
| Utente | Una persona fisica che usa la app, cui i Gestori hanno rilasciato le credenziali (nome utente, password) personali per accedervi |
| Attrezzo | Un attrezzo fisico, messo a disposizione dal suo Proprietario agli altri Partecipanti |
| Categoria | Una categoria di classificazione degli Attrezzi, predisposta dai Gestori ed applicata all'Attrezzo dal Proprietario, per facilitare la ricerca da parte dei Partecipanti |
| Richiesta | Una richiesta di prestito avanzata da un Partecipante su un Attrezzo altrui |
| Prestito | La concessione del prestito su un Attrezzo da parte del Proprietario in risposta ad una Richiesta |
| Sede | Un luogo fisico dove l'Attrezzo può essere portato per facilitare il passaggio tra Proprietario e Richiedente |
| Operatore | Una persona fisica, abilitata dai Gestori a ricevere e consegnare Attrezzi presso una Sede |
| Abilitazione | L'abilitazione da parte dei Gestori di un Operatore ad agire presso una Sede |
| Consegna | La registrazione del passaggio di un Attrezzo da un Utente (Partecipante o Operatore) ad un altro Utente, registrata dall'Utente che cede l'Attrezzo e accettata dall'Utente che lo riceve. |
| Valutazione | La valutazione dell'esperienza relativa ad un Prestito, espressa dal Proprietario o dal Richiedente |
| Nota | Una nota inviata da un Utente ad un altro Utente della app, relativa ad una Richiesta, un Attrezzo o all'uso della app |
Il motivo per cui "spacchettiamo" il concetto di prestito in diverse informazioni più elementari (Richiesta, Prestito, Consegna e Valutazione) sarà più chiaro quando vedremo in questa Guida come tradurre queste informazioni in Entità gestite nella app.
Permessi
Dall'analisi fin qui svolta, emergono le seguenti considerazioni sulle azioni consentite nel tempo ai diversi Utenti sulle informazioni:
- Utente: è creato da un Gestore che ne definisce il Ruolo, mentre l'Utente può modificare di se stesso solo la password.
- Attrezzo: è creato dal Proprietario, che può variarne la disponibilità al prestito ma non può eliminarlo per evitare perdite di informazioni sui prestiti già avvenuti. E' visibile a tutti gli Utenti.
- Categoria: è creata da un Gestore ed è visibile a tutti gli Utenti
- Richiesta: è creata da un Partecipante ed è visibile solo al Proprietario dell'Attrezzo richiesto e agli Operatori della Sede in cui eventualmente transita l'Attrezzo. La sua eliminazione da parte del Richiedente comporta l'eliminazione dell'eventuale Prestito concesso in risposta dal Proprietario. Non può essere eliminata dopo la creazione della prima Consegna relativa all'Attrezzo. Si conclude con la riconsegna dell'Attrezzo al Proprietario.
- Prestito: è creata dal Proprietario dell'Attrezzo in risposta ad una Richiesta ed è visibile solo al Richiedente e agli Operatori della Sede in cui eventualmente transita l'Attrezzo. La sua eliminazione non comporta l'eliminazione della Richiesta. Non può essere eliminato dopo la creazione della prima Consegna relativa all'Attrezzo. Si conclude con la riconsegna dell'Attrezzo al Proprietario.
- Sede: è creata ed eventualmente disabilitata da un Gestore ed è visibile a tutti gli Utenti
- Abilitazione: è creata ed eventualmente disabilitata da un Gestore ed è visibile a tutti gli Utenti
- Consegna: è creata in bozza dall'Utente che consegna l'Attrezzo ed accettata dall'Utente che lo riceve; dopo l'accettazione, non è più modificabile.
- Valutazione: è creata in bozza dal Proprietario o dal Richiedente e può essere modificata fino a quando l'Utente stesso non la firma; è visibile solo a Proprietario, Richiedente e Gestori.
- Nota: è creata da un Utente e visibile solo al mittente ed al destinatario. Una volta inviata, non è più modificabile.
Più in dettaglio, questi sono i Permessi dei diversi ruoli sulle diverse informazioni:
| Informazione | Partecipante | Operatore | Gestore |
| Dati Utente | Modifica i propri dati personali (password compresa). Vede il nome degli altri Utenti. Non vede i dati personali degli altri Utenti. | Crea gli Utenti. Vede e modifica i dati personali di tutti gli Utenti. Non può togliere il ruolo Gestore agli altri Gestori. | |
| Attrezzo | Crea l'Attrezzo. Modifica i propri Attrezzi. Vede tutti gli Attrezzi | Vede tutti gli Attrezzi | Vede e modifica tutti gli Attrezzi |
| Categoria | Vede tutte le Categorie | Crea e modifica tutte le Categorie | |
| Richiesta | Crea la Richiesta su un Attrezzo altrui. Modifica e elimina le proprie Richieste (1). Vede le Richieste altrui sui propri Attrezzi. Non vede Richieste che non lo coinvolgono. | Vede le Richieste che transitano in una Sede in cui è abilitato | Vede, modifica ed elimina tutte le Richieste |
| Prestito | Crea il Prestito in risposta ad una Richiesta su un proprio Attrezzo. Modifica e elimina i propri Prestiti (1). Vede i Prestiti che rispondono alle sue Richieste. Non vede i Prestiti che non lo coinvolgono. | Vede i Prestiti che transitano in una Sede in cui è abilitato | Vede, modifica ed elimina tutti i Prestiti |
| Sede | Vede tutte le Sedi | Crea, modifica e disattiva tutte le Sedi | |
| Abilitazione | Vede tutte le Abilitazioni | Crea, modifica e disattiva tutte le Abilitazioni | |
| Consegna | Crea la Consegna quando consegna l'Attrezzo. Modifica e elimina le proprie Consegne (2). Accetta la Consegna quando riceve l'Attrezzo. Non vede le Consegne che non lo coinvolgono. | Crea la Consegna quando consegna l'Attrezzo. Modifica e elimina le proprie Consegne (2). Accetta la Consegna quando riceve l'Attrezzo. Vede tutte le Consegne. | Crea, modifica e elimina tutte le Consegne |
| Valutazione | Crea la Valutazione (3) su un Prestito che l'ha coinvolto come Proprietario o Richiedente. Firma le proprie Valutazioni (2). Non vede Valutazioni che non lo coinvolgono. | Vede, modifica e elimina tutte le Valutazioni | |
Note:
(1) Il Partecipante può modificare o eliminare Richieste e Prestiti propri fino a quando non viene creata la prima Consegna relativa al Prestito.
(2) L'Utente non può modificare o eliminare le proprie Consegne e Valutazioni dopo che sono state accettate o firmate.
(3) Il Partecipante può creare Valutazioni solo dopo la riconsegna dell'Attrezzo al Proprietario.
Vedremo in questa Guida come configurare i Permessi in Drupal.
Percorsi
DA RIVEDERE
Essendo una applicazione web, la app si presenta come un insieme di pagine, visitate dagli Utenti secondo uno o più percorsi progettati dall'Amministratore. Nella app di esempio, i percorsi partono dalla pagina "Cruscotto", che mostra all'Utente le informazioni più importanti o urgenti e un insieme di comandi che conducono nei diversi percorsi. In tutte le pagine è presente un comando che riporta immediatamente al Cruscotto. Vedremo da questa Guida in avanti come costruire le pagine e realizzare i percorsi.
Ecco i Percorsi previsti per la app di esempio, le pagine corrispondenti ad ogni percorso e, per ogni pagina, le informazioni presentate e i comandi che portano ad altre pagine.
| Al login→ Cruscotto→ | CRUSCOTTO |
| Utente | Tu Comando "Tuoi dati" |
| La comunità Elenco Messaggi per l'Utente e non ancora letti → Messaggio Comando "Tutti i Messaggi" Comando "Scrivi Messaggio" Comando "Le sedi di consegna" | |
| Partecipante | Gli Attrezzi Comando "Magazzino" Comando "Tuoi Attrezzi" |
| Le tue Richieste Elenco Richieste non concluse dell'Utente→ Richiesta, Attrezzo, Prestito Comando "Tue Richieste concluse" | |
| I tuoi Prestiti Elenco Richieste non concluse su Attrezzi dell'Utente → Richiesta, Attrezzo, Prestito Comando "Tuoi Prestiti conclusi" | |
| Operatore | Consegne nelle tue sedi Elenco Prestiti non conclusi con consegna nelle sedi dell'Utente → Attrezzo, Prestito, Consegne Comando "Archivio Consegne" Comando "Operatori di sede" |
| Gestore | Gestione app Comando "Gestione Utenti" Comando "Gestione Categorie" Comando "Gestione Sedi" Comando "Gestione anomalie" |
PERCORSO UTENTI
| Tuoi dati→ | UTENTE |
| Utente | Solo sui propri dati: Dati dell'Utente |
| Gestore | Dati dell'Utente Solo se l'Utente è Operatore: Elenco Sedi abilitate all'Utente → Sede Comando "Aggiungi Sede a Operatore" |
| Gestione Utenti→ | GESTIONE UTENTI |
| Gestore | Elenco degli Utenti → Utente Comando "Aggiungi Utente" |
| Aggiungi Utente→ | CREA UTENTE |
| Gestore | modulo di creazione Utente → Utente |
PERCORSO MESSAGGI
| Tutti i Messaggi→ | MESSAGGI |
| Utente | Elenco dei Messaggi inviati o ricevuti dall'Utente → Messaggio Comando "Scrivi messaggio" |
| Click su un Messaggio→ | MESSAGGIO |
| Utente (se Mittente del Messaggio) | Dati del Messaggio Comando "Tutti i Messaggi" |
| Utente (se Destinatario del Messaggio) | Dati del Messaggio Comando "Rispondi al messaggio" Comando "Tutti i Messaggi" |
| Scrivi messaggio→ Rispondi al messaggio→ | CREA MESSAGGIO |
| Utente | modulo di creazione di un Messaggio (se da "Rispondi al messaggio" viene precaricato il destinatario) → Messaggio |
PERCORSO ATTREZZI
| Gestione Categorie→ | GESTIONE CATEGORIE |
| Gestore | Elenco delle Categorie → Categoria Comando "Aggiungi Categoria" |
| Click su una Categoria→ | CATEGORIA |
| Gestore | Dati della Categoria Comando "Gestione Categorie" |
| Aggiungi Categoria→ | CREA CATEGORIA |
| Gestore | Modulo di creazione di una Categoria → Categoria |
| Magazzino → | MAGAZZINO (vedi in funzione) (come è costruita) |
| Utente | Elenco Attrezzi disponibili al prestito → Attrezzo |
| Partecipante | Comando "Tuoi Attrezzi" |
| Tuoi Attrezzi→ | TUOI ATTREZZI (vedi in funzione) (come è costruita) |
| Partecipante | Comando "Magazzino Attrezzi" Comando "Aggiungi Attrezzo" Elenco Attrezzi dell'Utente → Attrezzo |
| Click su un Attrezzo→ | ATTREZZO (vedi in funzione) (come è costruita) |
| Utente | Comando "Magazzino" Dati dell'Attrezzo |
| Partecipante (se Proprietario dell'Attrezzo) | Elenco Richieste non concluse sull'Attrezzo → Richiesta, Prestito Comando "Prestiti conclusi su Attrezzo" |
| Partecipante (se diverso dal Proprietario dell'Attrezzo) | Elenco Richieste non concluse sull'Attrezzo → Richiesta Comando "Chiedi Attrezzo in prestito" |
| Aggiungi Attrezzo→ | CREA ATTREZZO |
| Partecipante | Modulo di creazione di un Attrezzo → Attrezzo |
PERCORSO RICHIESTE
| Chiedi Attrezzo in prestito → | CREA RICHIESTA |
| Partecipante (se diverso dal Proprietario dell'Attrezzo) | Modulo di creazione di Richiesta, con precaricato l'Attrezzo → Richiesta |
| Click su una Richiesta→ | RICHIESTA |
| Partecipante (se Richiedente o Proprietario) | Dati della Richiesta → Attrezzo, Dati dell'eventuale Prestito → Prestito Elenco Consegne → Consegna Se esiste Prestito: Comando "Consegna Attrezzo" |
| Partecipante (se Proprietario dell'Attrezzo) | Se non esiste Prestito : Comando "Presta l'Attrezzo" |
| Partecipante (se Richiedente) | Se Richiesta è conclusa: Comando "Valuta il Prestito" |
| Tue Richieste concluse→ | RICHIESTE CONCLUSE |
| Partecipante | Elenco Richieste concluse dell'Utente → Attrezzo, Richiesta, Prestito, Consegna, Valutazioni |
| Gestione anomalie→ | GESTIONE ANOMALIE |
| Gestore | Elenco di tutte Richieste → Attrezzo, Richiesta, Prestito, Consegna, Valutazioni |
PERCORSO PRESTITI
| Presta l'Attrezzo→ | CREA PRESTITO |
| Partecipante (se Proprietario dell'Attrezzo) | Modulo di creazione del Prestito, con precaricato la Richiesta → Prestito |
| Click su un Prestito→ | PRESTITO |
| Partecipante (se Proprietario dell'Attrezzo) | Dati del Prestito→ Attrezzo, Richiesta Comando "Consegna Attrezzo" Se il Prestito è conclusa: Comando "Valuta il Prestito" |
| Operatore (se abilitato alla sede di consegna) | Solo se il Prestito prevede consegna in sede: Dati del Prestito → Attrezzo, Consegne Comando "Consegna Attrezzo" |
| Tuoi Prestiti conclusi → Prestiti sull'Attrezzo conclusi→ | PRESTITI CONCLUSI (vedi in funzione) (icome è costruita) |
| Partecipante | Elenco Richieste concluse dell'Utente come Proprietario → Attrezzo, Richiesta, Prestito (filtrato per Attrezzo se da comando "Prestiti sull'Attrezzo conclusi ") |
| Consegna Attrezzo→ | CREA CONSEGNA |
| Partecipante (se Proprietario dell'Attrezzo) Partecipante (se autore della Richiesta) Operatore (se assegnato alla sede di consegna) | Modulo di creazione di Consegna, con precaricato il Prestito, Sede e Destinatario→ Consegna |
| Click su una Consegna→ | CONSEGNA |
| Partecipante (se Proprietario dell'Attrezzo) Operatore (se assegnato alla sede di consegna) | Dati della Consegna→ Attrezzo, Richiesta, Prestito |
| Partecipante (se autore della Richiesta) | Dati della Consegna → Attrezzo, Richiesta, Prestito |
| Archivio Consegne→ | ARCHIVIO CONSEGNE |
| Operatore | Elenco delle Consegne emesse nelle Sedi dell'Utente: → Attrezzo, Prestito, Consegne |
PERCORSO VALUTAZIONI
| Aggiungi Valutazione→ | CREA VALUTAZIONE |
| Partecipante (se Proprietario dell'Attrezzo) Partecipante (se Autore della Richiesta) | Modulo di creazione di Valutazione con precaricato il Prestito → Valutazione |
| Click su una Valutazione→ | VALUTAZIONE |
| Partecipante (se Proprietario dell'Attrezzo) | Dati della Valutazione del Richiedente e del Proprietario → Prestito |
| Partecipante (se Autore della Richiesta) | Dati della Valutazione del Richiedente e del Proprietario → Richiesta |
PERCORSO SEDI
| Gestione sedi→ Le sedi per le consegne→ | SEDI |
| Utente | Mappa ed elenco delle Sedi: → Sede |
| Gestore | Comando "Aggiungi Sede" |
| Aggiungi Sede→ | CREA SEDE |
| Gestore | Modulo di creazione di Sede → Sede |
| Click su una Sede→ | SEDE |
| Utente | Dati della Sede |
| Gestore | Elenco delle Abilutazioni di Operatori nella sede → Abilitazione, Utente Operatore Comando "Aggiungi Operatore a Sede" |
| Aggiungi Operatore a Sede→ Aggiungi Sede a Operatore→ | CREA ABILITAZIONE |
| Gestore | Modulo di creazione di Abilitazione → Abilitazione Se da comando "Aggiungi Operatore a Sede" con precaricata Sede Se da comando "Aggiungi Sede a Operatore" con precaricata Operatore |
| Click su una Abilitazione→ | ABILITAZIONE |
| Gestore | Dati della Abilitazione → Sede, Utente Operatore |
| Operatori di sede→ | OPERATORI DI SEDE |
| Operatore | Elenco delle Abilitazioni di Operatori nelle Sedi cui è abilitato l'Utente |
Automazioni
La app provvede automaticamente a:
- eliminare kil Prestito di cui è stata eliminata la Richiesta
L'Amministratore e gli altri Utenti della app
Il primo Utente di Drupal
L'Amministratore di Drupal è l'Utente che hai creato durante l'installazione di Drupal. L'Amministratore è il primo Utente di Drupal ed è identificato internamente col numero "1". L'Amministratore ha pieni poteri su Drupal e può cambiarne ogni aspetto, trasformando quindi Drupal nella app che desideri. Di solito sei tu stesso. Se non prevedi che la app sia usata da altre persone, l'Amministratore è l'unico Utente necessario.
Le credenziali dell'Amministratore
L'Amministratore agisce attraverso le pagine esposte da Drupal nel web browser. Come tutti gli altri Utenti, l'Amministratore entra in Drupal cliccando il comando Entra o Login nella prima pagina di Drupal. Se per qualche motivo questo comando non è visibile nella prima pagina, aggiungi "user" all'indirizzo della app per accedere alla pagina di login:
Hai definito le credenziali dell'Amministratore durante l'installazione di Drupal, tipicamente la username è "admin".
Se non ricordi la password di Amministratore, nella pagina di login clicca Reimposta la tua password: se la tua installazione di Drupal è in grado di spedire mail, ti arriverà un messaggio con un link che ti consente di impostare una nuova password. Se non funziona, da Terminale lancia Drush col comando:
| ▶️ vendor/bin/drush user:password admin 'NUOVAPASSWORD' |
al posto di NUOVAPASSWORD digita la nuova password
Cosa può fare l'Amministratore in Drupal?
La risposta breve è: tutto. Più precisamente, tutte le operazioni che possono essere eseguite dalle pagine esposte da Drupal. Sono quindi escluse le operazioni che richiedono comandi nel Terminale, tra cui l'aggiornamento del core di Drupal e l'installazione dei moduli aggiuntivi e la risoluzione di problemi.
Le pagine di Amministrazione
Anche se l'Amministratore agisce attraverso le pagine esposte da Drupal come tutti gli altri Utenti, il modo in cui Drupal si presenta all'Amministratore è molto diverso da come lo vedono gli altri Utenti. Drupal infatti espone al solo Amministratore informazioni e comandi con cui configura come Drupal si presenta agli altri Utenti. Il principale strumento a disposizione dell'Amministratore è il menù di amministrazione:
![]() |
Cliccando Gestisci si accede alle seguenti sezioni, che consentono di configurare Drupal per costruire la app che vogliamo:
| Sezione | A cosa serve | Vedi |
| Contenuto | Aggiungere Contenuti alla app, cercare e modificare quelli inseriti. | I Contenuti |
| Struttura | Modificare la struttura delle informazioni gestite da Drupal e come vengono mostrate agli utenti | |
| Aspetto | Cambiare colori, font, logo ed ogni aspetto grafico della tua app | |
| Estendi | Attivare e disattivare i moduli aggiuntivi di Drupal che hai installato | Core e moduli aggiuntivi |
| Configurazione | Cambiare le impostazione base della app (titolo, fuso orario, formati di data, formati grafici, formati dei testi ecc.). Operazioni di manutenzione. Configurazione di moduli aggiuntivi. Configurazioni di workflow e di procedure. | Protezioni che cambiano nel tempo |
| Utenti | Gestire gli Utenti, attribuire loro permessi | Gli Utenti |
| Resoconti | Verificare il funzionamento di Drupal, aggiornamento dei moduli | |
| Aiuto | Ricevere un primo aiuto sull'uso di Drupal |
L'uso di queste sezioni è illustrato nelle Guide che seguono. I moduli aggiuntivi possono aggiungere ulteriori comandi nelle sezioni.
Chi sono i Visitatori
Se hai installato Drupal in cloud, la tua app sarà potenzialmente visibile da tutte le persone connesse ad internet e che conoscono l'indirizzo della app. I Visitatori- detti anche "Utenti anonimi" o "Utenti non autenticati" - sono le persone che vedono le informazioni pubblicamente esposte dalla tua app senza fare login (e quindi senza dichiarare chi sono). Come Amministratore devi decidere cosa possono vedere e fare i Visitatori, considerando anche la possibilità che alcuni di loro abbiano intenzioni malevoli.
Cosa possono fare i Visitatori
Di default, Drupal concede ai Visitatori il permesso di vedere tutti i Contenuti pubblicati. Se la tua app è semplicemente un distributore di informazioni pubbliche, questa impostazione è adeguata. Ma se la tua app contiene informazioni riservate ad un gruppo specifico di persone, allora devi modificare questa impostazione
| per nascondere ai Visitatori le informazioni della app | in Persone - Permessi, nella riga Visualizza contenuti pubblicati disattiva il Permesso per Utente anonimo. |
Salvo casi molto particolari, ai Visitatori non devono essere concessi i Permessi di creazione, modifica o cancellazione di nuovi contenuti: di default non sono concessi ma puoi verificare la situazione, osservando le caselle attive nella colonna Utente anonimo di Persone - Permessi.
Menù per i Visitatori
Drupal mostra a tutti (compresi i Visitatori) i menù comandi della app. A mano a mano che costruirai la tua app, potresti aggiungere al menù comandi pensati per gli utenti veri e propri e che non vuoi che siano visti ed utilizzati anche dai Visitatori.
Drupal non mette nativamente a disposizione un metodo per proteggere i menù o i singoli comandi esposti nei menù. Per superare questa limitazione sono disponibili diversi moduli aggiuntivi: tra di essi, ti consiglio di installare ed attivare il modulo Menu Item Role Access che consente di definire comando per comando se debbano o meno essere esposti ai Visitatori. Aggiungere istruzioni di utilizzo di questo modulo
Istruzioni ai Visitatori
Se un Visitatore prova ad accedere ad una pagina cui non ha diritto di accedere, viene mostrato un messaggio di errore. Lo stesso accade anche alle persone da te autorizzate che provino ad accedere direttamente ad una pagina senza aver fatto prima login. Invece che mostrare la generica pagina di errore, può risultare più efficace portare il Visitatore (o l'utente autorizzato che non ha ancora fatto login) direttamente alla pagina di login. A questo scopo puoi installare ed attivare il modulo aggiuntivo Require Login.
Se alla pagina di login vuoi aggiungere un testo che spieghi ai Visitatori cosa fa la app invitandoli a iscriversi, puoi utilizzare i Blocchi di Drupal nel seguente modo (non è necessario che tu capisca tutto ora, sarà più chiaro dopo che avrai consultato le Guide relative ai Blocchi):
| crea un Blocco di testo | in Struttura - Layout dei blocchi vai nella sezione Contenuto (Main content), clicca Posiziona il blocco e poi Add content block |
| scrivi il testo che vuoi mostrare | In Descrizione del blocco digita una descrizione utile a te per riconoscere quel Blocco, es. "Istruzioni ai Visitatori". In Corpo digita il testo da mostrare ai Visitatori. Salva. |
| mostra il Blocco nella pagina di login (e solo in essa) | Nella pagina Configura blocco, in Pagine digita "/user/login" e verifica che sia attiva l'opzione Mostra nelle pagine elencate. Salva |
| posiziona il Blocco nella pagina di login | in Struttura - Layout dei blocchi vai nella sezione Main content e sposta il Blocco "Istruzioni ai Visitatori" in fondo alla sezione. |
| prova | Lancia sul pc un web browser diverso da quello che stai usando per configurare Drupal, vai all'indirizzo della tua app e verifica che il testo sia mostrato nella pagina di login |
Chi userà la tua app?
L'unico Utente obbligatorio in Drupal è l'Amministratore. Se sei l'unica persona che utilizzerà la app che vuoi costruire, non ti servono altri Utenti, altrimenti dovrai gestire un Utente per ogni persona che la userà, per evitare che più persone si presentino alla app come se fossero il medesimo Utente, prassi contraria alla privacy ed alla sicurezza informatica.
Persone e Utenti
Non tutte le persone di cui tratterà la tua app sono necessariamente Utenti della app stessa. Ad esempio, se stai costruendo una app per la gestione di una associazione e prevedi che gli associati non abbiano accesso alla app, allora ogni associato sarà gestito come un "dato" ("Contenuto", come vedremo) della app, ma non come un Utente. Se invece prevedi che gli associati possano entrate nella app, ad esempio per caricarvi in autonomia i propri dati personali, allora dovrai creare un Utente per ognuno di loro.
Creare gli Utenti
Per ogni persona cui intendi far usare la tua app devi creare un Utente, assegnandole le credenziali (nome utente e password) con cui fare login nella app. Per creare un Utente:
- seleziona Persone - Aggiungi un Utente
- digita l'indirizzo email della persona (può anche essere fittizia, se non si prevede che la app debba inviare email alla persona)
- attribuisci un nome utente univoco alla persona (definisci fin da subito una regola per la composizione dei nomi utente nella tua app, ad esempio nome.cognome)
- scegli una password per la persona
- metti lo Stato ad attivo (altrimenti la persona non potrà entrare nella app)
- In Ruoli attiva utente autenticato
- Salva
Per consentire ai Visitatori di iscriversi da sé alla tua app:
- seleziona Configurazione - Impostazione profilo
- Sotto Registrazione e cancellazione - Chi può creare nuovi profili utente? seleziona Visitatori
Con questa configurazione, nella pagina di login appare una nuova opzione per registrarsi alla app.
Bloccare un Utente
Se devi estromettere (anche temporaneamente) un Utente dalla tua app, invece che cancellarlo puoi bloccarlo, mantenendo così la possibilità di un suo rientro successivo. Per bloccare un Utente:
- In Persone identifica l'Utente e clicca Modifica
- In Stato seleziona Bloccato
- Salva
Utenti di prova
Se la tua app prevede altri Utenti oltre l'Amministratore, per provarne il corretto funzionamento puoi creare uno o più Utenti di prova, senza comunicare a nessuno le credenziali di questi Utenti. Per connetterti contemporaneamente dallo stesso pc sia come Amministratore sia come Utente di prova, puoi utilizzare due web browser diversi, ad esempio facendo login come Amministratore in Chrome e come Utente di prova in Edge. In questo modo puoi verificare in tempo reale l'effetto sull'Utente di modifiche che apporti alla app come Amministratore.
In alternativa all'utilizzo di due web browser, puoi installare ed attivare il modulo aggiuntivo Masquerade, che ti permette nello stesso web browser di impersonare un altro Utente, senza necessità di entrare ed uscire dalla app.
Anche se prevedi di essere l'unico Utente della tua app, ti suggerisco di creare comunque un Utente non Amministratore per te stesso, con cui entrare nella app per il suo utilizzo quotidiano, entrando come Amministratore solo se devi modificarla: in questo modo ridurrai il rischio di apportare per errore modifiche alla app.
Ruoli degli Utenti
Oltre al Ruolo base di utente autenticato, è possibile assegnare altri Ruoli agli Utenti, che definiscono cosa possono fare. Come Amministratore, puoi definire nuovi Ruoli, cui affidare compiti specifici nella app: ad esempio, il Ruolo "Redattore" potrebbe essere assegnato agli Utenti che preparano le notizie da pubblicare nella app ed il Ruolo "Editore" agli Utenti che controllano le notizie e le pubblicano. Per creare un Ruolo:
- vai in Persone - Ruoli clicca Aggiungi ruolo
- Digita il nome del nuovo Ruolo
- Salva
Di per sé, un Ruolo è una semplice etichetta: cosa può fare un Ruolo è definito dai Permessi assegnati a quel Ruolo.
Ad esempio, nella app "Vicinato" creiamo i Ruoli "Partecipante", "Operatore" e "Gestore".
Assegnare Ruoli agli Utenti
Definito un Ruolo, per assegnarlo ad uno specifico Utente:
- vai in Persone, identifica l'Utente e clicca Modifica
- Sotto Ruoli attiva il Ruolo
- Salva
Per assegnare un Ruolo a più Utenti:
- vai in Persone e seleziona gli Utenti
- In Azione seleziona l'azione di assegnazione del Ruolo agli Utenti selezionati
- Clicca Apply to selected items
Permessi dei Ruoli
Definito un Ruolo, per stabilire cosa possono fare gli Utenti appartenenti al quel Ruolo occorre modificare i Permessi di quel Ruolo:
- vai in Persone - Permessi: ti viene mostrata una tabella, le cui righe sono i Permessi assegnabili e le colonne sono i Ruoli cui assegnarli
- cerca il Permesso desiderato
- attiva o disattiva l'incrocio tra la riga del Permesso e la colonna del Ruolo
Dopo che avremo imparato a modellare le informazioni della app, vedremo nelle Guide relative alla protezione delle informazioni come usare i Permessi assegnati ai Ruoli per regolare cosa possono fare gli Utenti sulle singole informazioni.
Nominare altri Amministratori
L'Amministratore può nominare altri Amministratori, per condividere lo sforzo di costruzione e gestione della app. Sconsiglio caldamente di condividere la password dell'Amministratore, perché non sarebbe più possibile risalire a chi ha modificato la app. Conviene invece creare un nuovo Utente ed assegnargli il Ruolo di Amministratore. Ecco come:
| crea un nuovo Utente | in Persone clicca Aggiungi utente, digita l'email della persona, assegna un nome utente ed una password. Non salvare |
| assegna all'Utente il Ruolo di Amministratore | Nella stessa pagina, sotto Ruoli attiva Amministratore |
| ATTENZIONE: Assegna il Ruolo di Amministratore solo a persone di cui ti fidi completamente, perché potrebbero rovinare la app ed escluderti dall'amministrazione della app. |
Deleghe parziali di Amministrazione
Se la "delega in bianco" sopra descritta ti appare troppo estesa e pericolosa, puoi delegare ad altri Utenti solo alcuni dei tuoi poteri di Amministratore, senza concedere loro il Ruolo di Amministratore. Ci sono infatti diversi moduli aggiuntivi che consentono deleghe parziali di amministrazione agli Utenti non Amministratori. Eccone un paio.
Se installi e attivi il modulo aggiuntivo "Administer Users by Role" puoi delegare la gestione degli Utenti ad uno o più Ruoli, specificando su quali Ruoli a sua volta potrà agire. In questo modo, gli Utenti cui ha delegato la gestione degli Utenti non potranno escluderti e, se opportunamente configurato, evitare che possano escludere altri Utenti di pari potere.
Ad esempio, nella app "Vicinato" deleghiamo la gestione degli Utenti al Ruolo Gestore, escludendo che un Gestore possa intervenire sugli altri Gestori. Per le istruzioni vedi la documentazione del modulo.
Se installi ed attivi il modulo aggiuntivo "Delegate Permission" consente di delegare singole funzioni di Amministratore.
Le informazioni che la tua app deve gestire sono rappresentate in Drupal dalle Entità e dalle loro specializzazioni, in particolare dai Contenuti.
Cos'è una Entità
Una Entità è un insieme strutturato di dati che viene creato, modificato o eliminato come un tutt'uno: ad esempio, se una Entità viene eliminata, vengono cancellate tutte le informazioni in essa contenute; se un Utente ha il permesso di modificare una Entità, può modificarne tutte le informazioni.
Tipi di Entità
Nelle Guide precedenti abbiamo già incontrato Entità: ogni Utente è infatti gestito in Drupal come una Entità. Drupal gestisce diversi tipi di Entità: Contenuti, Utenti, Termini di Tassonomia, File, Media, Commenti ecc. I moduli aggiuntivi di Drupal possono aggiungere altri tipi di Entità, ad esempio i Gruppi. Per ogni tipo di Entità, Drupal mette a disposizione specifiche funzioni: ad esempio, solo le Entità di tipo Utente possono fare login, solo le Entità di tipo File hanno una dimensione, espressa in KB. Alcuni tipi di Entità prevedono una ulteriore specializzazione, chiamata Bundle. I tipi di Entità predefiniti in Drupal e i corrispondenti Bundle sono:
| Tipo di Entità | Sottotipo (bundle) | A cosa serve |
| Contenuto (content, detto anche node) | Tipo di Contenuto (content type) | I Contenuti sono il tipo di Entità più utilizzato nelle app. Per ogni tipologia di informazione si crea un Tipo di Contenuto differente. |
| Termine di tassonomia (taxonomy term, term) | Tassonomia (taxonomy, vocabulary) | Le Tassonomie sono usate come "vocabolari" di termini con cui etichettare i Contenuti |
| Utente (user) | Sono gli Utenti della app | |
| Media (media) | Tipo di Media (media type) | File, immagini, audio, video |
| Commento (comment) | Tipo di Contenuto del Commento | Commenti degli Utenti sulle altre Entità |
Entità di configurazione
Oltre alle Entità che contengono informazioni (Utenti, Contenuti, File ecc.), in Drupal ci sono altri tipi di Entità che contengono la configurazione della app. Ad esempio, ogni Vista è una Entità (di tipo Vista), così come i Menù, i Formati di testo ecc. Nel seguito di MieApp con "Entità" intenderò sempre Entità che contengono informazioni, salvo che dica espressamente il contrario.
L'identificativo di Entità
Ad ogni Entità (comprese quelle di configurazione) è associato un numero intero che lo identifica univocamente rispetto alle altre Entità dello stesso tipo. Ad esempio, l'Amministratore è l'Utente identificato dal numero "1" ed è l'unico Utente ad avere quel numero, mentre nulla vieta che vi sia un Contenuto o un File identificati da "1". Il numero univoco è assegnato automaticamente da Drupal all'Entità nel momento in cui viene creata e non può essere modificato, neppure dall'Amministratore. Se l'Entità viene eliminata, il suo identificativo non viene riciclato.
L'identificativo è memorizzato in un apposito Campo dell'Entità. Il nome di quel Campo varia leggermente col tipo di Entità: ID per i Contenuti, UID per gli Utenti, TID per i Termini di Tassonomia ecc.
La pagina dell'Entità
Ad ogni Entità è associata una pagina che ne mostra le informazioni. L'indirizzo di questa pagina differisce in base al tipo di Entità. Ad esempio, per i Contenuti è
/node/ID
dove ID è l'identificativo del Contenuto, mentre per gli Utenti è:
/user/UID
e per i Gruppi é
/group/GID
Campi delle Entità
Le informazioni associate ad una Entità sono memorizzate nei suoi Campi. Usando una metafora, l'Entità è una cassettiera ed ogni suo Campo è un "cassetto" in grado di memorizzare uno specifico tipo di informazione (testo, numeri, immagini, file, riferimenti ad altre Entità eccetera).
L'Amministratore può aggiungere Campi a tipi e sottotipi di Entità. Ad esempio, è possibile aggiungere all'Utente Campi testuali per memorizzare nome e cognome della persona ed un Campo a lista di selezione per il sesso. La possibilità di aggiungere Campi ai tipi di Entità è fondamentale per la costruzione delle app con Drupal, perché permette di adattare le Entità alle specifiche esigenze della app, senza lavorare direttamente sulle tabelle del database di Drupal.
I concetti di questa Guida valgono per tutti i tipi di Entità. Li esemplificheremo operativamente parlando dei Contenuti.
Nome interno ed nome esterno (etichetta) del Campo
Ogni Campo ha un nome esterno ed un nome interno. Il nome esterno è l'etichetta che l'Amministratore assegna al Campo e col quale il Campo viene mostrato agli Utenti. Il nome interno è quello con cui Drupal identifica il Campo ed è composto automaticamente da field_ seguito dall'etichetta in caratteri minuscoli; ad esempio, il Campo con nome esterno "Cognome" è identificato in Drupal col nome interno field_cognome.
Mentre il nome esterno può essere il medesimo per più Campi, il nome interno deve essere univoco e non ci possono essere due Campi con lo stesso nome interno: se ciò accade, Drupal segnala un errore, invitando a modificare il nome interno del nuovo Campo:
![]() |
Anche se non ci sono regole per la scelta del nome interno dei Campi. suggerisco di aggiungervi il nome dell'Entità cui appartiene. Ad esempio, per il Campo "Stato" del tipo di Entità "Prestito" potresti digitare come nome interno "field_stato_prestito": ciò ti semplificherà il successivo riconoscimento del Campo.
Una volta assegnato, il nome interno non può più essere modificato, mentre il nome esterno può essere cambiato in qualunque momento. L'importanza dei nomi interni dei Campi sarà evidente nella costruzione delle Viste.
Tipi di Campi
Drupal mette a disposizione nativamente molto tipi di Campi, elencati quando si aggiunge un Campi ad un tipo di Entità:

Alcuni moduli aggiuntivi aggiungono ulteriori tipi di Campi, ad esempio coordinate geografiche.
Ogni tipo di Campo ha una propria configurazione specifica. Ad esempio: il Campo di tipo Data e ora (che per semplicità chiamerò "data") può essere configurato perché accetti solo la data senza orario o per accogliere un periodo anziché una sola data; il Campo di tipo Selection List deve essere configurato specificando quali valori elencare; il Campo di tipo Caricamento File (nel seguito "File") prevede due sottotipi: Immagine e File, per ognuno dei quali sono configurabili i tipi di file caricabili.
Formato dei Campi testuali
In particolare, per i Campi che devono contenere testo esistono due tipi: Testo semplice e Testo formattato. Nella configurazione dei Campi di tipo Testo formattato occorre specificare quale formato può accettare, Un Formato è una configurazione predefinita, che elenca quali formattazioni (es. grassetto, sottolineato, font) sono ammesse e quali trasformazioni verranno effettuate sul testo (es. trasformazione di indirizzi internet in link cliccabili, sostituzione di Token coi corrispondenti valori). I Formati disponibili sono elencati e modificabili in Configurazione - Formati testo e editor.

Per ogni Formato l'Amministratore può configurare quali Ruoli di Utente possono utilizzarlo, se attivare o meno l'editor visuale, quali comandi dell'editor visuale mettere a disposizione, quali trasformazioni attivare ecc. Per motivi di sicurezza, di solito si assegnano Formati più completi e potenti agli Utenti con maggiori privilegi nella app, assegnando agli Utenti "base" un formato con meno capacità.
Quando si aggiunge un Campo testuale ad una Entità, si possono specificare uno o più Formati per quel Campo: quando compila quel Campo, l'Utente può scegliere uno dei Formati ammessi per quel Campo e autorizzati per i suoi Ruoli.
| ATTENZIONE: Se un Utente non è autorizzato ad usare nessuno dei Formati ammessi per un Campo testuale, l'Utente non potrà scrivere in quel Campo. |
Riferimenti tra Entità
Tra i vari tipi di Campi, riveste una particolare importanza il tipo Riferimento (reference), perché consente di costruire una relazione tra due p più Entità. Ad esempio, se nella app definiamo il tipo di Contenuto "Album" ed il tipo di Contenuto "Canzone" ed aggiungiamo al tipo di Contenuto "Canzone" un Campo Riferimento che rimanda al tipo di Contenuto "Album", possiamo gestire la presenza di una Canzone in un Album. Possiamo rappresentare questa relazione come "Canzone → Album" perché, conoscendo la Canzone, possiamo arrivare all'Album in cui è inserita. Quando si compila il Campo Riferimento "Album" di una Canzone, Drupal obbliga l'Utente a selezionare uno degli Album già memorizzati nella app.
Campi predefiniti
Ogni tipo di Entità ha Campi predefiniti. Ad esempio, gli Utenti hanno i Campi predefiniti Nome utente, Password, Email. I Termini di Tassonomia hanno Campi che servono a collocare il Termine nella gerarchia della Tassonomia (Genitore, Profondità e Peso). I Contenuti hanno sempre un Campo Titolo (compilato dall'Utente), un Campo Pubblicato (che indica se il Contenuto è visibile o nascosto) ed i seguenti Campi predefiniti compilati automaticamente da Drupal ma modificabili dall'Amministratore:
| Autore | Riferimento all'Utente che ha creato il Contenuto |
| Creato il | Data e ora di creazione del Contenuto |
| Modificato | Data e ora di ultima modifica del Contenuto |
Di default, I Campi predefiniti non sono mostrati agli Utenti, ma vedremo come esporli con le Viste.
Cosa sono i Token
Le informazioni contenute nei Campi delle Entità e molte altre informazioni di sistema (es. la data e ora del computer che ospita Drupal) sono accessibili e riusabili attraverso i Token. Un Token è una parola speciale che identifica una informazione della app e viene sostituita da Drupal col valore di quella informazione; è quindi un concetto molto simile alla "variabile" nei linguaggi di programmazione o alla "incognita" in matematica. Ad esempio, il Token [node:title] viene sostituito dal titolo di un Contenuto (node è un altro modo con cui sono chiamati i Contenuti in Drupal).
A cosa servono i Token
I Token si usano in molti punti della costruzione della app. Vedremo nelle Guide seguenti come usare i Token per:
- creare titoli automatici dei Contenuti
- precaricare i valori di Campi nella creazione di nuovi Contenuti
- conoscere chi è l'Utente corrente che sta usando una Vista
- riusare il valore di Campi in altri Campi in una Vista
- costruire comandi che passano valori da una pagina ad un'altra pagina della app
- fare calcoli nelle Viste
- richiamare Viste in Campi testuali
- costruire procedure automatizzate
- ed altro ancora.
Quali Token sono disponibili
Drupal mette a disposizione moltissimi Token. L'elenco dei Token messi a disposizione dal Core di Drupal sono elencati sul sito di Drupal. I moduli aggiuntivi possono aggiungere altri Token. Inoltre ad ogni Campo aggiunto ad una Entità corrisponde un ulteriore Token. Raccomando fortemente di installare il modulo aggiuntivo Token perché facilita la scoperta dei Token disponibili. Dopo la sua attivazione, in Estendi cerca "Token" e clicca Help per vedere tutti i Token disponibili. I Token sono raggruppati in una gerarchia, che consente di "scendere" da una Entità ai suoi Campi. Ad esempio sotto la voce "Nodi" si trovano tutti i Campi relativi ai Contenuti.

Non è necessario ricordare a memoria i Token e neppure tornare ogni volta a questa pagina perché, in ogni punto in cui Drupal accetta Token, viene mostrato un pulsante "Token" che richiama la gerarchia dei Token (ad esempio ciò accade nella pagina di configurazione dei titoli automatici delle Entità o nella configurazione delle procedure automatiche), oppure viene mostrato un elenco ridotto ai soli Token disponibili in quel punto (ad esempio, ciò accade nella costruzione delle Viste, sotto Sfoglia i Token disponibili o Replacement patterns).
Se installi ed attivi il modulo aggiuntivo "Twig Tweak", potrai anche accedere ad ulteriori Token di sistema.
Come si usano i Token
In base al contesto in cui vengono utilizzati, i Token si presentano tra parentesi quadre es: [node:title] oppure tra parentesi graffe es: {{ node.title.value }}. Non è necessario comprendere in dettaglio questa differenza, perché Drupal provvede a mostrare i Token nella forma utile al contesto.
Una volta trovato il Token desiderato, se ne copia il nome (selezionandolo e cliccando col pulsante destro il comando "Copia" oppure con la combinazione CTRL C) e lo si incolla nella casella dove serve (comando "Incolla" o CTRL V).
Cosa sono i Contenuti
I Contenuti sono il tipo di Entità più generico e quindi più utilizzato per gestire informazioni nelle app. Prima di poter gestire in Drupal un qualsiasi Contenuto, è necessario definirne il tipo: il Tipo di Contenuto fa da modello o "stampo" per la creazione di Contenuti di quel tipo. Il Tipo di Contenuto elenca i Campi che formano il Contenuto, stabilisce come mostrarli, quali Utenti possono inserire Contenuti di quel tipo ecc.
Appena installato, Drupal offre di default un paio di Tipi di contenuto molto semplici - la "pagina" e l'"articolo" - pensati più per i siti informativi che per una app.
Quali Tipi di Contenuti servono
La costruzione di una app in Drupal parte proprio dalla identificazione dei Tipi di Contenuto che servono alla app. Per scoprire i Tipi di Contenuto che ci servono, occorre esaminare non solo gli oggetti fisici (documenti, luoghi ecc.) che la app deve gestire, ma considerare anche "oggetti" più astratti, come procedure, progetti, gruppi di lavoro ecc. Ecco alcuni criteri di massima e di buono senso che possono aiutare nella identificazione dei Tipi di Contenuto utili alla nostra app.
Criterio della semplicità. Più Tipi di Contenuto definiamo, più la costruzione della app si complica. Se ci accorgiamo che due Tipi di Contenuti apparentemente distinti hanno in realtà gli stessi Campi o quasi, conviene fare un supplemento di analisi per capire se possiamo gestire entrambi con un solo Tipo di Contenuto, eventualmente prevedendo che uno o più Campi non siano sempre utilizzati.
Criterio dell'unità. Come le Entità (di cui sono un caso particolare), anche un Contenuto è gestito come un'unità, pertanto i Permessi assegnati ad un Utente valgono per tutti i Campi del Contenuto. Se per un Tipo di Contenuto ci accorgiamo che alcuni Campi sono gestiti da un gruppo di Utenti e gli altri Campi da altri, per consentire ad ognuno di intervenire autonomamente sui Campi di propria pertinenza, la soluzione più semplice è quella di creare un Tipo di Contenuto distinto per ogni gruppo di Utenti e di collegare questi Tipi di Contenuto tra loro mediante Campi Riferimento.
Criterio del tempo. Per lo stesso motivo, mentre è possibile (con qualche sforzo, come vedremo) modificare nel tempo i Permessi degli Utenti su un Tipo di Contenuto, non è possibile modificare nel tempo i Permessi sui singoli Campi. Quindi se alcuni Campi di un Tipo Contenuto sono sempre modificabili ed altri non devono essere modificabili prima di una certa data o di un certo evento, la soluzione più semplice è spostare questi ultimi in un Tipo di Contenuto a parte, per il quale i Permessi cambiano nel tempo.
Ad esempio, nella app "Vicinato" per rappresentare l'Attrezzo, la Categoria, la Sede, l'Abilitazione e la Nota creiamo gli omonimi Tipi di Contenuto. La rappresentazione del concetto di "prestito" è più complessa, perché le informazioni relative ad un prestito sono gestite da diversi Utenti (il richiedente, il proprietario, l'operatore) e i Permessi variano nel tempo. Applicando i criteri sopra suggeriti, spacchettiamo il "prestito" nei Tipi di Contenuto "Richiesta" (a cura del Richiedente), "Prestito" (a cura del Proprietario), "Consegna" (a cura di Proprietario, Richiedente ed Operatore) e "Valutazione" (a cura di Proprietario e Richiedente, ma solo dopo il ritorno dell'Attrezzo al Proprietario).
Come costruire un nuovo Tipo di Contenuto
Ecco come Amministratore puoi costruire un nuovo Tipo di Contenuto:
| crea il nuovo tipo di Contenuto | Vai in Struttura - Tipi di contenuto - Aggiungi un tipo di contenuto, digita il nome per il nuovo Tipo (es. "Attrezzo") ed una breve descrizione |
| configura i Campi predefiniti del nuovo tipo di Contenuto | Digita il Titolo, cioè il nome del Campo testo che lo identifica visivamente. Disattiva Promosso alla prima pagina, opzione che lo colloca nella prima pagina del sito (poco utile nella costruzione di una app). Disattiva Sempre in cima agli elenchi, opzione che lo colloca in cima agli elenchi (come sopra). Disattiva Crea una nuova revisione, opzione che genera diverse Versioni del Contenuto (salvo che la app abbia una specifica necessità di tener traccia delle modifiche apportate ad un Contenuto). Disattiva Visualizzare informazioni sull'autore e sulla data, opzione che mostra Autore e data di pubblicazione del Contenuto (da valutare se serve per la app). |
| aggiungi un Campo al nuovo tipo di Contenuto | Vai in Struttura - Tipi di contenuto e clicchiamo Gestione campi a fianco del Tipo di Contenuto. Clicca Create new field. Seleziona uno dei tipi di Campo tra quelli proposti: ![]() |
| configura il Campo | nella pagina seguente, digita l'etichetta con cui il Campo deve essere mostrato all'Utente, specifica se la compilazione del Campo è obbligatoria e quanti valori il Campo può accettare; ad esempio, un singolo Campo "Allegati" di tipo File può accettare più documenti, senza necessità di definire più campi "Allegato 1", "Allegato 2" ecc. |
Riusare i Campi
In una app di media complessità, servono normalmente decine di Campi. Per ridurne la proliferazione, è possibile "riciclare" un Campo su più Tipi di Contenuto (e anche su altri tipi di Entità). Definito il Campo la prima volta in un Tipo di Contenuto, per riusarlo in un altro Tipo di Contenuto non cliccare Create new field ma clicca Riutilizzare un campo esistente e seleziona il Campo che intendi riusare.
| ATTENZIONE: Il riuso di Campi è raccomandabile solo se è probabile che non eliminerai quel Campo in una futura revisione della app, perché l'eliminazione di un Campo da un tipo di Entità ha conseguenze anche sulle altre Entità che lo usano. |
Titoli automatici
Il Campo Titolo è presente ed obbligatorio per tutti i Contenuti, ma in alcuni caso non è molto significativo. Nella app di esempio, mentre il Campo Titolo di Attrezzi, Categoria, Sede è utile per identificare l'attrezzo stesso, per Richieste, Prestiti, Consegne, Valutazioni e Messaggi il Titolo non corrisponde ad una informazione significativa e ho scelto quindi di lasciarlo costruirei automaticamente da Drupal come il nome del Tipo di Contenuto seguito da un codice univoco, es. "Richiesta 253", Oltre a evitare all'Utente di doversi inventare un titolo non significativo, ciò consente all'Utente di identificare senza ambiguità il Contenuto, ad esempio nei Messaggi scambiati con gli altri Utenti.
Per automatizzare la compilazione del titolo usiamo i moduli aggiuntivi "Automatic Entity Label, "Token" e "Serial". Installati ed attivati questi moduli:
| aggiungi al Tipo di Contenuto un Campo di tipo "Numero Seriale" | in Struttura - Tipi di Contenuto seleziona Gestisci campi a fianco del Tipo di Contenuto di cui vuoi automatizzare i titoli ed aggiungi un Campo di tipo Numero Seriale |
| attiva la compilazione automatica del Titolo | in Struttura - Tipi di Contenuto seleziona Modifica a fianco del Tipo di Contenuto e clicca Automatic label |
| nascondi il titolo all'Utente quando modifica l'Entità | seleziona Automatically generate the label and hide the label field |
| definisci come comporre il Titolo | in Pattern for the label componi lo schema per la generazione dei titoli, utilizzando sia testo fisso (es. "Richiesta n.") sia i Token che recuperano i valori degli altri Campi del Contenuto: per vedere i Token disponibili, clicca Sfoglia i token disponibili e ti appare la gerarchia dei Token; in essa naviga in Nodi fino a trovare il Campo che vuoi sia riprodotto nel Titolo. |
Questo è solo un esempio di titolo automatico, perché con la stessa modalità si possono creare titoli più ricchi di significato, ad esempio "Richiesta su NOMEATTREZZO di PROPRIETARIO". Per semplificare l'identificazione del Contenuto, conviene comporre titoli automatici diversi per ogni Contenuto. Poiché il Titolo di un Contenuto è di default mostrato nella pagina del Contenuto con un carattere più grande, suggerisco di non comporre titoli troppo lunghi.
| ATTENZIONE: Nella composizione di un titolo automatico non è possibile utilizzare l'identificativo del Contenuto (Token [node:nid]) perché, nel momento in cui si sta creando il nuovo Contenuto, quel valore non è stato ancora assegnato da Drupal. Ecco perché negli esempi precedenti ho preferito basare il titolo su un Campo Numero Seriale. I Campi di questo tipo non devono essere riusati né devono essere "nascosti" trascinandoli sotto Disattivati, perché altrimenti cessano di funzionare: il Campo non viene comunque mostrato all'Utente. |
Eliminare un Campo
Se ci ripensi e decidi che un Campo non ti serve più, puoi eliminarlo. Drupal potrebbe avvisarti che l'eliminazione di quel Campo pregiudica il funzionamento di qualche parte della tua app, ad esempio potrebbe pregiudicare una Vista o un'altra configurazione in cui è utilizzato. Se decidi di procedere lo stesso, la Vista o il Workflow non vengono cancellati ma vengono disabilitati, per consentirti di modificarle e rimetterle in linea senza quel Campo.
L'eliminazione di un Campo riusato ne comporta la scomparsa in tutti i tipi di Entità in cui è stata usato.
Se l'eliminazione di un Campo comporta troppo lavoro di sistemazione, potresti decidere di mantenerlo, limitandoti a nascondendolo nelle pagine di inserimento, modifica e visualizzazione dell'Entità cui appartiene.
Cambiare il tipo di un Campo
Se hai scoperto che un Campo numerico intero ti serve invece con numerico con la virgola, oppure che ti risulta più semplice gestire un Campo di tipo data come un Campo testo, sappi che in Drupal non c'è un meccanismo per cambiarne il tipo salvando i dati già inseriti. Ci sono moduli sperimentali che promettono di farlo, ma contengono sempre avvertenze. I più esperti propongono interventi diretti sul database, che richiedono competenze e molta attenzione. Quando mi è capitato di doverlo fare, ho scelto la strada più lunga ma più sicura:
- esportare in un file l'identificativo dell'Entità ed il valore del Campo, utilizzando il modulo Views Data Export
- aggiungere alle Entità un nuovo Campo del tipo desiderato
- importare dal file i valori nel nuovo Campo, utilizzando il modulo Feeds
- eliminare il Campo iniziale
Esamineremo qualche dettaglio di questa tecnica quando parleremo di importazione ed esportazione di informazioni.
I Contenuti della app "Vicinato"
Utilizziamo quanto descritto in questa Guida per costruire i Tipi di Contenuto per la app di esempio "Vicinato". Non è necessario creare un Tipo di Contenuto per rappresentare gli Utenti, perché ognuno di essi sarà realizzato come un Utente Drupal.
ATTREZZO
Ogni attrezzo fisico che può essere prestato è rappresentato da un Contenuto di tipo "Attrezzo". L'Attrezzo è aggiunto alla app dal suo Proprietario, che quindi è memorizzato come Autore dell'Attrezzo. I Campi dell'Attrezzo sono:
| Campo | Tipo | Descrizione |
| Titolo | testo | Descrizione breve dell'Attrezzo |
| Descrizione | testo formattato | Descrizione lunga dell'Attrezzo |
| Categoria | Riferimento a Categoria | Categoria cui appartiene l'Attrezzo (Attrezzo → Categoria) |
| Immagine | immagine | Immagine che raffigura l'Attrezzo |
| Allegati | File (più valori) | Documenti che descrivono l'Attrezzo |
| Stato | Elenco di testi | Prestabile | Ritirato |
| Dove | Riferimento a Sede | Dove si trova in questo momento l'Attrezzo (Attrezzo → Sede). Sono comprese le due Sedi nominali "*Richiedente" e "*Proprietario" che indicano che l'Attrezzo è rispettivamente presso il Proprietario o presso il Richiedente attuale. |
CATEGORIA
Solitamente in Drupal per categorizzare le altre Entità si utilizzando le Tassonomie. Per motivi didattici, nella app di esempio rappresentiamo le Categorie come un Tipo di Contenuto. Una categoria è quindi rappresentata nella app da un Contenuto di tipo "Categoria", formato dai seguenti Campi:
| Campo | Tipo | Descrizione |
| Nome (titolo) | testo | Nome della Categoria. Es. "Falciatrice" |
| Sinonimi | testo | Altri termini che identificano la Categoria. Es. "tagliabordi estirpatore" |
SEDE
Ogni sede in cui può avvenire la consegna e la restituzione degli Attrezzi prestati è rappresentata da un Contenuto di tipo "Sede", formato dai seguenti Campi:
| Campo | Tipo | Descrizione |
| Titolo | testo | Nome della Sede |
| Indirizzo | testo formattato | Indirizzo completo della Sede |
| Contatti | testo formattato | Modalità di contatto e orari di apertura al pubblico per la consegna degli Attrezzi |
| Stato | elenco di selezione | Attiva | Inattiva |
| Tipo | elenco di selezione | Reale | Nominale (serve per distinguere tra Sedi reali e le due "sedi" corrispondenti al Proprietario e al Richiedente) |
| Coordinate | coordinate geografiche | Vedi Mappe |
ABILITAZIONE
L'abilitazione di un Operatore ad una Sede è rappresentata da un Contenuto di tipo "Abilitazione", formato dai seguenti Campi:
| Campo | Tipo | Descrizione |
| Titolo | testo | Generato automaticamente come "Abilitazione n. CODICE" |
| Codice | Seriale | Codice univoco generato automaticamente |
| Sede | Riferimento a Sede | Sede di abilitazione (Abilitazione → Sede) |
| Operatore | Riferimento a Utente | Operatore abilitato (Abilitazione→ Utente) |
| Nota | testo formattato | Nota relativa alla abilitazione dell'Operatore alla Sede |
| Stato | elenco di selezione | Attiva | Inattiva |
RICHIESTA
Ogni Richiesta di prestito è rappresentata da un Contenuto di tipo "Richiesta". La Richiesta è aggiunta alla app dall'Utente Richiedente, che quindi è memorizzato come Autore del Contenuto. I Campi della Richiesta sono:
| Campo | Tipo | Descrizione |
| Titolo | testo | Generato automaticamente come "Richiesta n. CODICE" |
| Codice | Seriale | Codice univoco generato automaticamente |
| Attrezzo | Riferimento ad Attrezzo | Attrezzo chiesto in prestito (Richiesta → Attrezzo) |
| Nota | testo formattato | Descrizione della Richiesta |
| Stato | Workflow | Vedi Workflow |
PRESTITO
Ogni Prestito concesso in risposta ad una Richiesta è rappresentato da un Contenuto di tipo "Prestito". il Prestito è aggiunta alla app dall'Utente Proprietario dell'Attrezzo richiesto, che quindi è memorizzato come Autore del Contenuto. l Campi del Prestito sono:
| Campo | Tipo | Descrizione |
| Titolo | testo | Generato automaticamente dalla app come "Prestito n. CODICE" |
| Codice | Seriale | Codice univoco generato automaticamente |
| Richiesta | Riferimento a Richiesta | Richiesta cui il Prestito risponde (Prestito → Richiesta) |
| Nota | testo formattato | Descrizione del Prestito (es. condizioni di utilizzo, periodo ecc.) |
| Periodo | Data (intervallo) | Periodo indicativo di prestito |
| Stato | Workflow | Vedi Workflow |
CONSEGNA
Ogni Consegna traccia il passaggio dell'Attrezzo tra i diversi Utenti della app ed è rappresentata da un Contenuto di tipo "Consegna". La Consegna è aggiunta alla app dall'Utente che consegna l'Attrezzo, che quindi è memorizzato come Autore della Consegna. I Campi della Consegna sono:
| Campo | Tipo | Descrizione |
| Titolo | Testo | Generato automaticamente come "Consegna n. CODICE" |
| Codice | Seriale | Intero univoco generato automaticamente |
| Prestito | Riferimento a Prestito | Prestito cui si riferisce la Consegna (Consegna → Prestito) |
| Sede | Riferimento a Sede | Dove viene consegnato l'Attrezzo (Consegna → Sede). Sono previste anche due Sedi nominali * Proprietario e *Richiedente. |
| Accettazione | Riferimento a Utente | Utente che ha accettato la consegna (Consegna → Utente) |
| Nota | Testo formattato | Nota per situazioni particolari (es. consegna incompleta, delega) |
| Stato | Workflow | Vedi Workflow |
VALUTAZIONE
Ogni valutazione espressa su un Prestito è rappresentata da un Contenuto di tipo "Valutazione". La Valutazione è aggiunta alla app dal Proprietario o dal Richiedente, che quindi è memorizzato come Autore della Valutazione. I Campi della Valutazione sono:
| Campo | Tipo | Descrizione |
| Titolo | Testo | Generato automaticamente come "Valutazione n. CODICE" |
| Codice | Seriale | Intero univoco generato automaticamente |
| Prestito | Riferimento a Prestito | Prestito cui si riferisce la Valutazione (Valutazione → Prestito) |
| Valore | Elenco di selezione di interi | Valore della Valutazione (-1=negativa, 0=neutra, 1=positiva, 2=ottima) |
| Nota | Testo formattato | Nota che spiega la Valutazione |
| Stato | Workflow | Vedi Workflow |
NOTA
Ogni Nota inviata da un Utente ad un altro Utente è rappresentata da un Contenuto di tipo "Nota". La Nota è aggiunta alla app dall'Utente mittente, che quindi è memorizzato come Autore della Nota. I Campi della Nota sono:
| Campo | Tipo | Descrizione |
| Titolo | Testo | Generato automaticamente come "Nota n. CODICE" |
| Codice | Seriale | Intero univoco generato automaticamente |
| Riferimento | Riferimento al Contenuto | Contenuto cui si riferisce la Nota (Nota→ Richiesta) (Nota→ Attrezzo) (Nota→ Sede) (Nota→ Abilitazione) (Nota→ Categoria) (Nota→ "App)" |
| Destinatario | Riferimento a Utente | Destinatario della Nota |
| Allegati | File | Allegati alla Nota |
Con la Guida precedente hai creato uno o più Tipi di Contenuto dove memorizzare le informazioni della tua app. Vediamo ora i comandi base disponibili all'Amministratore per iniziare a popolare la app di Contenuti. Nelle Guide successive vedremo come preparare e mettere a disposizione degli Utenti funzioni di gestione dei Contenuti più comode ed evolute.
Creare nuovi Contenuti
Appena costruisci un nuovo Tipo di Contenuto, Drupal ti mette subito a disposizione una pagina attraverso cui puoi inserire Contenuti di quel tipo. Come Amministratore, puoi richiamare la pagina di inserimento con Contenuto - Aggiungi contenuto e selezionando il Tipo di Contenuto. Tutti gli altri Utenti possono richiamare la pagina di inserimento al link:
/node/add/tipo_contenuto
dove tipo_contenuto è il nome del Tipo di Contenuto che stai creando, es:
/node/add/attrezzo
| APPROFONDIMENTO: La parola "node" (nodo) nell'indirizzo di richiamo di un Contenuto è un residuo delle prime versioni di Drupal, in cui i Contenuti erano appunto chiamati nodi. Essendo profondamente maturato negli anni, in Drupal si ritrovano spesso vestigia del passato. A mio avviso sono considerabili tali le Tassonomie (e quindi i Termini di Tassonomia, oggi sostituibili con gerarchie di Entità) e i File (oggi inclusi nel concetto di Media), anche se se ne continua a farne un ampio utilizzo ed escono tuttora nuovi moduli che arricchiscono questi tipi di Entità. |
Se l'ordine con cui i Campi sono mostrati nella pagina di inserimento non ti soddisfa, vai in Struttura - Tipi di contenuto e seleziona Gestione visualizzazione form a fianco del Tipo di Contenuto: ti viene mostrata una pagina in cui riordinare i Campi trascinandoli. Nella medesima pagina, per alcuni tipi di Campi puoi anche cambiare la modalità (Widget) con cui compilarli. I Widget disponibili dipendono dal tipo di Campo e dai moduli installati.
Precaricare i Campi di un nuovo Contenuto
In molte situazioni può risultare utile precaricare il valore di uno o più Campi di un nuovo Contenuto, per evitare all'Utente digitazione inutili ed errori. Il Campo può essere precaricato con un valore fisso (scritto nella configurazione del Campo) oppure con un valore dinamico (scritto nel link di lancio della pagina di creazione del Contenuto).
PRECARICARE UN VALORE FISSO
In Struttura - Tipi di Contenuto seleziona Gestione Campi del tipo di Contenuto, clicca Modifica sul Campo, attiva Set default value e digita o seleziona il valore di default: nella pagina di creazione di un nuovo Contenuto di quel tipo il Campo apparirà precaricato con quel valore, che l'Utente potrà modificare. Se il Campo è di tipo Riferimento, per poter selezionare come default una specifica Entità richiamata in quel Campo devi averla già caricata nella app.
PRECARICARE UN VALORE DINAMICO
Questa soluzione consente di precaricare un Campo di un nuovo Contenuto tenendo conto del contesto in cui avviene la creazione. Ad esempio, nella app "Vicinato" il tipo di Contenuto "Richiesta" ha un Campo Riferimento "Attrezzo" che contiene l'Attrezzo chiesto in prestito; volendo presentare all'Utente un comando "Chiedi in prestito" mentre sta guardando uno specifico Attrezzo, precaricheremo nel Campo "Attrezzo" della nuova Richiesta l'identificativo di quell'Attrezzo, evitando così che l'Utente debba riselezionarlo.
Per ottenere questo risultato ci serve il modulo aggiuntivo Entity Prepopulate. Installato ed attivato il modulo, dobbiamo (1) configurare il Campo "Attrezzo" della Richiesta a ricevere via link l'identificativo dell'Attrezzo e (2) scrivere l'identificativo dell'Attrezzo nel link di richiamo della pagina di creazione della Richiesta.
Configurare il Campo a ricevere un valore via link
Per predisporre il Campo "Attrezzo" della Richiesta a ricevere via link l'identificativo dell'Attrezzo:
- vai in Struttura - Tipi di contenuto - Richiesta - Gestisci Campi - Attrezzo - Modifica
- nella sezione Entity Prepopulate digita il Token [current-page:query:attrezzo]
Il Token [current-page:query:attrezzo] (messo a disposizione dal modulo "Entity Prepopulate") consente di recuperare dal link della pagina corrente il valore associato all'argomento "attrezzo". Come sempre, non è necessario ricordare il Token a memoria, perché è tra quelli elencati nella pagina di configurazione del Campo. Non è necessario che l'argomento si chiami proprio come il Campo, funzionerebbe lo stesso se al posto di "attrezzo" scrivessimo "id" o una qualunque altra parola.
Scrivere nel link il valore del Campo
Abbiamo già visto che il link per richiamare la pagina di creazione di una Richiesta è:
/node/add/richiesta
Per precaricare nel Campo "Attrezzo" della nuova Richiesta uno specifico Attrezzo, scriviamo il suo identificativo (es. 371) nel link nel seguente modo:
/node/add/richiesta?attrezzo=371
Vedremo come costruire questi link, deducendo automaticamente dal contesto il valore da scrivere.
Precaricare dinamicamente più campi
Con la stessa tecnica, possiamo precaricare dinamicamente più Campi, concatenandoli in questo modo:
/node/add/richiesta?argomento1=valore1&argomento2=valore2&argomento3=valore3
Il carattere ? inizia l'elenco delle coppie argomento=valore ed il carattere & separa le diverse coppie tra loro.
Ritrovare i Contenuti
Come Amministratore, nella sezione Contenuto trovi un semplice modulo per la ricerca dei Contenuti inseriti. Gli altri Utenti useranno il motore di ricerca di Drupal o - meglio - le Viste che tu metterai a loro disposizione.
Come viene mostrato un Contenuto
Ogni Contenuto inserito è visibile alla pagina:
/node/ID
dove ID è l'identificativo del Contenuto.
Se l'ordine con cui i Campi sono mostrati nella pagina di visualizzazione non ti soddisfa, vai in Struttura - Tipi di contenuto e seleziona Gestione visualizzazione a fianco del Tipo di Contenuto: oltre a modificare l'ordine, puoi anche nascondere Campi o le loro etichette e, per alcuni tipi di Campi, modificare la modalità (Widget) con cui è mostrato il valore. Per nascondere un Campo basta trascinarlo sotto Disattivati.
Vedremo più avanti come migliorare ed arricchire la pagina di visualizzazione dei Contenuti.
Modificare un Contenuto
Per modificare un Contenuto, vai nella sua pagina di visualizzazione e clicca Modifica. Puoi anche andare direttamente alla pagina di modifica con questo link:
/node/ID/edit
Eliminare un Contenuto
Per eliminare un Contenuto, vai alla sua pagina di visualizzazione e clicca Elimina. Puoi anche andare direttamente alla pagina di eliminazione con questo link:
/node/ID/delete
Un Contenuto eliminato non è più recuperabile.
Nascondere un Contenuto
Se vuoi rendere invisibile un Contenuto senza eliminarlo (ad esempio per ripresentarlo più avanti), vai in Modifica del Contenuto e disattiva il Campo Pubblicato.
In questo gruppo di Guide vediamo come proteggere Entità e Contenuti, assegnando e togliendo Permessi agli Utenti.
Permessi assegnati ai Ruoli
La protezione base offerta da Drupal utilizza i Permessi per concedere o negare ad un Ruolo (e quindi agli Utenti che hanno quel Ruolo) le operazioni CRUD (C=Create R=Read U=Update D=Delete), cioè la possibilità di creare, vedere, modificare ed eliminare i Contenuti di un certo tipo. Abbiamo già visto come creare i Ruoli e come assegnarli agli Utenti; vediamo ora come assegnare i Permessi ai Ruoli (e quindi agli Utenti che hanno quei Ruoli).
Per quanto riguarda la visualizzazione (R), in Drupal è possibile assegnare un solo Permesso che vale per tutti i tipi di Contenuto. Negando questo Permesso agli Utenti anonimi si impedisce ai Visitatori di vedere tutti i Contenuti.
| assegna al Ruolo la possibilità di vedere tutti i Contenuti (C) | In Persone - Permessi cerca la riga col Permesso Visualizza contenuti pubblicati e attiva la casella corrispondente alla colonna del Ruolo |
Si può rendere più flessibile la visualizzazione con alcuni moduli aggiuntivi oppure, come vedremo, agendo sui Permessi delle Viste che mostrano i Contenuti ai diversi Utenti.
Se sei l'unico utilizzatore della app che stai costruendo, puoi saltare il resto di questa Guida e le altre Guide sulla protezione delle informazioni, perché come Amministratore hai sempre tutti i Permessi su tutte le informazioni contenute nella app. Se invece prevedi che la tua app sia utilizzata anche da altri, allora ti invito a proseguire nella lettura.
Per quanto riguarda la creazione (C), è possibile assegnare Permessi per singoli Tipi di Contenuto ai diversi Ruoli:
| assegna al Ruolo la possibilità di creare Contenuti di un tipo (C) | In Persone - Permessi cerca la riga col Permesso TIPOCONTENUTO: Crea nuovo contenuto e attiva la casella corrispondente alla colonna del Ruolo |
Per quanto riguarda la modifica (U) e l'eliminazione (D), è possibile assegnare Permessi per singoli Tipi di Contenuto ai diversi Ruoli, distinguendo tra Contenuti creati dall'Utente e Contenuti creati da altri Utenti:
| assegna al Ruolo la possibilità di modificare (U) o eliminare (D) i Contenuti di quel tipo creati dall'Utente stesso | In Persone - Permessi cerca la riga col Permesso TIPOCONTENUTO: Modifica i propri contenuti o TIPOCONTENUTO: Elimina i propri contenuti e attiva la casella corrispondente alla colonna del Ruolo |
| assegna al Ruolo la possibilità di modificare (U) o cancellare (D) tutti i Contenuti di quel tipo | In Persone - Permessi cerca la riga col Permesso TIPOCONTENUTO: Modifica tutti i contenuti o TIPOCONTENUTO: Elimina tutti i contenuti e attiva la casella corrispondente alla colonna del Ruolo |
Per togliere un Permesso è sufficiente disattivare la casella corrispondente. Analoghi Permessi sono disponibili per gli altri tipi di Entità.
Limiti di Ruoli e Permessi
La protezione base offerta da Ruoli e Permessi può risultare insufficiente alla app che stai costruendo, perché:
- esiste un solo Permesso di visualizzazione per tutti i Contenuti, quindi non è possibile nascondere uno specifico tipo di Contenuto ad uno specifico Ruolo
- i Permessi assegnati ad un Ruolo su un tipo di Entità o Contenuto valgono per tutti Contenuti di quel tipo e per tutti gli Utenti che hanno quel Ruolo; non è possibile diversificare i Permessi per singolo Contenuto o singolo Utente
- I Permessi sono staticamente assegnati dall'Amministratore e non possono essere modificati né dagli Utenti né dagli eventi che occorrono nella app
- Ruoli e Permessi non consentono di suddividere gli Utenti in gruppi che condividono un insieme di Contenuti, nascondendole agli altri Utenti con gli stessi Ruoli; perciò non consentono di usare la medesima installazione di una app per diversi comunità o clienti (app multitenant).
Se per la app che stai costruendo questi limiti possono costituire un problema (lo sono per la costruzione della app di esempio "Vicinato"), nelle prossime Guide troverai alcuni metodi aggiuntivi per proteggere i Contenuti in modo più flessibile.
Prima di illustrare metodi di protezione dei dati più flessibili di quelli offerti dalla protezione base, vediamo come evitare che l'eliminazione di Contenuti metta in discussione l'integrità delle informazioni gestite da una app. Ad esempio, nella app "Vicinato" se viene eliminata la Richiesta in risposta alla quale era stata concessa una Assegnazione, non sappiamo più chi e per cosa è stata concessa. In generale: se una Entità A richiama in un proprio Campo Riferimento una Entità B e l'Entità B viene eliminata, questa eliminazione rende "incompleta" l'Entità A.
La protezione base offerta da Ruoli e Permessi non impedisce questa situazione, a meno di togliere a tutti gli Utenti i Permessi di eliminazione su tutte le Entità. Per superare questo limite, si può installare ed attivare il modulo aggiuntivo Entity Reference Integrity. Attivata in Configurazione - Entity Reference Integrity la protezione sui Contenuti, se un Utente prova a eliminare un Contenuto richiamato da altri Contenuti l'eliminazione viene impedita, mostrando all'Utente l'elenco dei Contenuti che lo richiamano e che ne impediscono l'eliminazione. Questo metodo è molto robusto, perché incarica Drupal di impedire ogni eliminazione che distrugga relazioni tra Contenuti.
Di contro, questo metodo è molto rigido, perché:
- si applica a tutti i Contenuti, indipendentemente dal tipo di Contenuto dal Ruolo dell'Utente
- l'eliminazione di un Contenuto può richiedere una lunga sequenza di eliminazioni, magari a cura di Utenti diversi
- può portare a situazioni di stallo, in caso di catene circolari di richiami tra Entità, es. A → B → C → A.
Se nella tua app i Permessi sulle informazioni cambiano nel tempo, ad esempio a fronte di nuove informazioni caricate dagli Utenti o di eventi identificati autonomamente da Drupal (es. "dopo X giorni dalla creazione di un Contenuto"), potresti usare i Workflow per gestire le variazioni dei Permessi.
Ad esempio, nella app "Vicinato" abbiamo visto che Richieste e Prestiti non devono essere eliminate dopo la prima Consegna dell'Attrezzo e Consegne e Valutazioni non devono essere modificate dopo la loro accettazione o firma.
Cos'è un Workflow
Un Workflow è un tipo di Entità, messo a disposizione dal modulo aggiuntivo Workflow, che quindi deve essere installato ed attivato per poter usare i Workflow nella tua app.
| ATTENZIONE: tra i moduli base installati con Drupal c'è un modulo di nome "Workflows" (con la "s" finale), che però ha funzionalità molto limitate. In questa Guida e nelle successive non utilizzeremo quel modulo, ma il modulo aggiuntivo quasi omonimo "Workflow" (senza la "s" finale), da deve essere installato. |
Un Workflow è uno strumento utile per rappresentare il "ciclo di vita" di un Contenuto, inteso come una sequenza di "stati" attraverso cui il Contenuto passa dalla sua creazione alla sua eliminazione. Il passaggio da uno stato al successivo è provocato da eventi, ad esempio da un comando dato da un Utente. In ogni "stato", i Permessi dei diversi Utenti sul Contenuto possono essere differenti e ciò consente di realizzare Permessi che variano nel tempo. I Workflow assegnano i Permessi RUD (Read, Update, Delete), ma non il Permesso di creazione (Create) che quindi deve essere assegnato coi Permessi base.

Quali Workflow servono
Per identificare quali Workflow servono alla tua app, occorre anzitutto identificare quali tipi di Contenuto hanno Permessi che variano nel tempo: se i Permessi su un tipo di Contenuto non variano nel tempo è molto probabile che non serva un Workflow. Probabilmente ti serve un Workflow per ogni tipo di Contenuto i cui Permessi cambiano nel tempo. Se per due tipi di Contenuto i Permessi variano nello stesso modo, verifica se puoi applicare lo stesso Workflow ad entrambi.
Nella app di esempio "Vicinato" per i Contenuti che rappresentano informazioni sostanzialmente "statiche" - Attrezzi, Categorie, Sedi, Abilitazioni e Note- sono sufficienti le protezione base offerte da Permessi e Ruoli, mentre per i Contenuti che rappresentano il prestito e che evolvono nel tempo - Richieste, Prestiti, Consegne e Valutazioni - utilizzeremo i seguenti Workflow:
- un Workflow per le Richieste, per impedirne la modifica e l'eliminazione dopo la consegna dell'Attrezzo al Richiedente
- un Workflow per i Prestiti, del tutto simile a quello delle Richieste (distinto solo per il nome assegnato agli stati)
- un Workflow per Consegne e Valutazioni, per impedirne la modifica e l'eliminazione dopo che sono state "firmate" (passaggio necessario per consentire la correzione di errori di digitazione)
Come creare e usare i Workflow
Per creare ed usare un Workflow occorrono i seguenti passaggi:
in Configurazione - Workflow disegnare il Workflow definendone gli stati, i passaggi tra gli stati ed i Permessi assegnati agli Utenti in ogni stato
In Persone - Permessi regolare i Permessi base per coordinarli coi Permessi gestiti dal Workflow ed autorizzare gli Utenti a usare i Workflow
In Struttura - Tipo di Contenuto applicare il Workflow ad uno o più tipi di Entità o Contenuto
Disegnare il Workflow
Per disegnare un Workflow, in Configurazione - Workflow dobbiamo fornire le informazioni relative agli stati, ai passaggi tra gli stati ed ai Permessi dei diversi Utenti in ogni stato:
| crea il Workflow | In Configurazione - Workflow seleziona Aggiungi Workflow e digita il nome del nuovo Workflow |
| definisci gli stati | In Stati aggiungi gli stati previsti per il Workflow. Di default c'è sempre lo stato fittizio Creation in cui si trova l'Entità mentre viene creata |
| definisci i passaggi tra gli stati | In Transizioni attiva le caselle corrispondenti al Ruolo che fa passare l'Entità dallo stato indicato nella riga allo stato indicato in colonna. |
| dai un nome ai comandi per passare da uno stato all'altro | In Transition labels digita in Etichetta i nome dei comandi che fanno transitare tra gli stati indicati. Questa configurazione non è strettamente necessaria, perché i nomi dei comandi possono essere successivamente definiti nelle Viste che utilizzano il Workflow. |
| assegna i Permessi nei diversi stati | In Accesso attiva le caselle corrispondenti ai Ruoli cui, nello stato indicato nella riga, vogliamo concedere il Permesso indicato in colonna (View, Edit, Delete). |
Come esempio, disegniamo il Workflow delle Richieste per la app "Vicinato":
| crea il Workflow | In Configurazione - Workflow seleziona Aggiungi Workflow e nominalo "Richiesta" |
| definisci gli stati | I momenti salienti nel ciclo di vita della Richiesta sono tre: la concessione del Prestito da parte del Proprietario, la prima consegna dell'Attrezzo (dal Proprietario al Richiedente o ad un Operatore) e la riconsegna finale al Proprietario (da parte del Richiedente o di un Operatore). I tre momenti definiscono quattro stati: "Emessa" (prima dell'accettazione da parte del Proprietario), "Accettata" (dopo la concessione del Prestito e prima della prima consegna), "In corso" (tra la prima consegna e la consegna finale) e "Conclusa" (dopo la consegna finale). In Stati aggiungi quindi gli stati "Emessa", "Accettata", "In corso" e "Conclusa" |
| definisci i passaggi tra gli stati | In Transizioni attiva il passaggio Creation → Aperta per il solo Autore. Non attiviamo gli altri passaggi perché non vengono eseguiti su comando degli Utenti ma vengono eseguiti da Drupal con apposite procedure, rispettivamente dopo la creazione del Prestito, l'accettazione della prima Consegna e dopo la Consegna al Proprietario (vedi sotto). Per i Gestori attiviamo invece tutti i passaggi, perché devono poter intervenire in ogni momento per risolvere situazioni anomale. |
| assegna i Permessi nei vari stati | In Accesso, attiva il Permesso View in tutti gli stati per tutti gli Utenti (ci penseranno poi le Viste a nascondere le informazioni agli Utenti non coinvolti nel prestito); attiva Update e Delete nel solo stato Aperta per l'Autore. Disattiva tutti i Permessi dei Visitatori. Attiva tutti i Permessi per i Gestori. Nota: i Permessi negli stati "Accettata", "In corso" e "Conclusa" sono i medesimi e quindi potremmo ridurre il Workflow a due soli stati; poiché però dal punto di vista dell'Utente è utile distinguere queste situazioni manteniamo i tre stati. I Workflow servono infatti non solo per regolare i Permessi, ma anche per tracciare il ciclo di vista dei Contenuti. |
Il Workflow dei Prestiti è simile, ma bastano i tre stati "Concesso", "In corso" e "Concluso".
Il Workflow delle Consegne ha come momento saliente l'accettazione dell'Attrezzo da parte dell'Utente che lo riceve. L'evento divide il ciclo di vita della Consegna in due stati: "in corso di accettazione" e "accettata". Finché non è accettata, la Consegna può essere modificata e eliminata dall'Autore. L'accettazione non è una transizione prevista nel Workflow, perché è realizzata con un comando esterno al Workflow da parte dell'Utente che riceve l'Attrezzo. I Gestori sono invece autorizzati dal Workflow a tutti i passaggi.
Il Workflow delle Valutazioni ha come momento saliente la "firma" da parte dell'Autore stesso della Valutazione, generando quindi i due stati "da firmare" e "firmata". La transizione è previsto nel Workflow come comando "Firma" dato dall'Autore.
Da questo esempio possiamo dedurre una osservazione generale sulle transizioni in un Workflow:
- se la transizione è comandata da un Utente che può modificare l'Entità, aggiungiamo al Workflow la transizione e Drupal mostrerà all'Utente il comando di cambio di stato nella pagina di modifica dell'Entità (es. il comando "firma" sulla Valutazione, che la fa passare da "bozza" a "firmata".
- se la transizione è comandata da un Utente che NON può modificare l'Entità, non aggiungiamo al Workflow la transizione e costruiamo una procedura ECA che espone all'Utente un link che, cliccato, esegue il cambio di stato (es. il comando "Accetta" sulla Consegna, che la fa passare da "in corso di accettazione" ad "accettata")
- se la transizione è comandata da un evento che accadde nella app, non aggiungiamo al Workflow la transizione e costruiamo una procedura ECA che esegue la transizione quando occorre quell'evento (es. l'evento di creazione di una Consegna fa passare la Richiesta dallo stato "aperta" allo stato "in corso".
| SUGGERIMENTO: Il modulo Workflow non prevede la possibilità di associare una immagine agli Stati, ma solo di descriverli con un testo. Per migliorare visivamente la presentazione degli Stati, è possibile inserire nel testo che li descrive un simbolo tra quelli previsti dallo standard HTML. Ad esempio, nella app Vicinato, abbiamo aggiunto simboli colorati davanti ai nomi degli stati del Workflow che protegge le Richieste, che sono così mostrati come 🟥Emessa 🟨Accettata 🟩In corso 🟦Conclusa |
Regolare i Permessi base
L'attivazione del modulo Workflow aggiunge uno strumento di controllo dei Permessi, che deve essere coordinato coi Permessi base concessi in Persone - Permessi tenendo conto che:
| I Workflow non possono assegnare i Permessi di creazione di nuovi Contenuti. | Occorre attivare i Permessi di creazione in Persone - Permessi. Nella app di esempio "Vicinato", in Persone - Permessi attiviamo il Permesso di creazione di Richieste, Prestiti e Valutazioni per i ruoli Partecipante e Gestore ed il Permesso di creazione di Consegne per i ruoli Partecipante, Operatore e Gestore. |
| I Workflow possono assegnare ma non togliere i Permessi di modifica ed eliminazione. | Occorre togliere i Permessi di modifica e eliminazione (anche sui propri Contenuti) in Persone - Permessi, per poi concederli tramite Accesso del Workflow. Nella app di esempio "Vicinato", disattiviamo in Persone - Permessi i Permessi di modifica ed eliminazione su Richieste, Prestiti, Consegne e Valutazioni per i ruoli Partecipanti ed Operatori. |
| Ai Workflow possono partecipare solo gli Utenti autorizzati ai singoli Workflow | Occorre autorizzare la partecipazione ai singoli Workflow per i diversi Ruoli in Persone - Permessi, attivando il Permesso NOMEWORKFLOW: Participate in workflow. Nella app di esempio "Vicinato", attiviamo i Permessi "Richiesta: Participate in workflow" e "Prestito: Participate in workflow" per i Ruoli Partecipante e Gestore, il Permesso "Consegna: Participate in workflow" per Partecipante, Operatore e Gestore ed il Permesso "Valutazione: Participate in workflow" per Partecipante e Gestore. |
| APPROFONDIMENTO: Il modulo Workflow è solo uno dei numerosi moduli aggiuntivi che modificano i Permessi degli Utenti sui Contenuti. Quasi tutti questi moduli lavorano come il modulo Workflow e quindi aggiungono Permessi ma non li tolgono. Se si attiva più di un modulo aggiuntivo di gestione dei Permessi, il risultato può cambiare in base all'ordine temporale con cui i diversi moduli vengono eseguiti da Drupal: se il risultato non è quello atteso, si può cambiare l'ordine di esecuzione dei diversi moduli modificando un apposito parametro numerico nella configurazione dei moduli. Per il modulo Workflow questo parametro è modificabile in Configurazione - Workflow - Access settings - Workflow Access Priority. In generale, non è consigliabile attivare più di un paio di moduli di gestione di Permessi nella stessa installazione di Drupal. |
Applicare il Workflow
Per applicare un Workflow ad un tipo di Contenuto, basta aggiungervi un Campo di tipo Workflow State, specificando il Workflow che si intende applicare.
Nella app di esempio "Vicinato", aggiungiamo al Tipo di Contenuto "Richiesta" uno Campo Workflow di nome "Stato", specificando il Workflow "Richiesta". Analogamente aggiungiamo un Campo Workflow a Prestito, Consegna e Valutazione, sempre di nome "Stato" e specificando per ognuno il Workflow corrispondente.
Dopo l'applicazione di un Workflow (e talvolta anche dopo aver cambiato la configurazione di un Workflow) può rendersi necessaria la ricostruzione dei Permessi sulle Entità: in questo caso, Drupal mostra un messaggio all'Amministratore, che contiene il link da cliccare per ricostruire i Permessi su tutti i Contenuti. In caso di dubbi, puoi sempre lanciare la ricostruzione col comando Resoconti - Resoconto sullo Stato - Rebuild permissions.
| ATTENZIONE: le protezioni del Workflow valgono per i Contenuti aggiunti successivamente all'applicazione del Workflow al loro Tipo. Per gli eventuali Contenuti preesistenti all'applicazione del Workflow occorre inizializzare lo stato: a questo scopo conviene creare una Vista di tipo VBO (riservata all'Amministratore) in cui selezionare tutte le Entità esistenti e definirne massivamente il valore iniziale del Campo Workflow. |
Cambiare lo stato di un Contenuto
Per cambiare lo stato di un Contenuto, l'Utente modifica il valore del Campo Workflow: Drupal presenta all'Utente solo gli stati per cui è prevista nel Workflow una transizione dallo stato corrente del Contenuto. Per cambiare il valore del Campo Workflow, l'Utente deve avere il Permesso di modifica del Contenuto. Se nel nuovo stato in cui l'Utente porta il Contenuto l'Utente stesso non ha più il Permesso di modifica, non potrà più neppure cambiarne lo stato. Ad esempio, nella app "Vicinato" un Partecipante può modificare una propria Valutazione fintanto che il Campo Stato vale "Bozza"; dopo che il Campo Stato è passato a "Firmata", la Valutazione diventa immodificabile anche per lui.
Lo stato di può essere modificato anche da Drupal, mediante procedure automatiche che modificano il valore del Campo Workflow. Vedremo ad esempio come costruire la procedura che cambia automaticamente lo Stato di Richieste e Prestiti quando vengono firmate le Consegne di inizio e fine prestito. Le procedure automatiche possono essere costruire in modo da superare i Permessi e quindi forzare un cambio di stato non (più) possibile agli Utenti.
GUIDA CHE TRATTA Taxonomy Access Control Lite e su Content Access
Content Access: una volta installato ed attivato, consente di definire per ogni tipo di Contenuto (ed eventualmente per ogni singola Contenuto) i permessi di visualizzazione, modifica e cancellazione di ogni Ruolo Utente, considerando l'Autore come un Ruolo a se stante. Utilizzato insieme al modulo ACL, dovrebbe consentire di assegnare i permessi al singolo Utente e non solo per Ruoli. E' infine possibile automatizzare l'assegnazione dei permessi mediante procedure ECA, grazie al modulo ECA Content Access. Ad esempio. possiamo costruire una procedura ECA che renda non più modificabile da nessuno (neppure da parte del Proprietario e del Richiedente) una Richiesta ed un Prestito conclusi, dopo un certo periodo di tempo dalla data di restituzione.
GUIDA CHE TRATTA I GRUPPI
Modellate le informazioni che la app deve gestire e caricati i primi Contenuti, vediamo ora come presentarli agli utenti della app con le Viste di Drupal.
Cosa sono le Viste
Le informazioni che abbiamo memorizzato in Drupal possono essere mostrate agli Utenti con "viste" differenti sulle Entità, da mostrare in base alle esigenze specifiche dell'Utente che sta usando la app ed allo scopo per cui le sta guardando. Lo strumento con cui ottenerle da Drupal si chiama (non a caso) Viste (Views). Le Viste sono costruite dall'Amministratore specificando:
- quali Entità estrarre dal database di Drupal, senza necessità di conoscere il linguaggio di interrogazione del database (SQL)
- come presentarle all'Utente, senza necessità di conoscere il linguaggio di costruzione delle pagine web (HTML)
Le Viste sono fornite dal modulo Views installato di default in Drupal.
A cosa servono le Viste
Le Viste sono utilizzate non solo per presentare le Entità all'Utente, ma anche per aggiungere comandi personalizzati sulle Entità, mostrare informazioni correlate all'Entità mostrata, cercare nelle Entità, fornire i dati per le operazioni automatiche sulle Entità ecc. In pratica, gran parte dello sforzo di costruzione di una app consiste nella costruzione di Viste. Imparare a preparare le Viste è quindi fondamentale per costruire le app con Drupal. Personalmente, ho un approccio molto "Vista-centrico" alla costruzione delle app e tendo ad usare le Viste un po' per tutto. Dedicherò quindi un buon numero di Guide, partendo dalle più semplici ad alcune più complesse, seguendo come esempio didattico i percorsi previsti per la app Vicinato. E' molto probabile che la tua prima app necessiti di Viste abbastanza semplici, ma ritengo utile presentarti un insieme di tecniche di utilizzo delle Viste che potrebbero esserti utili in futuro.
Come primo esempio, costruiamo una Vista che semplicemente elenchi un tipo di Entità che hai disegnato e caricato nella tua app. Esemplifico il caso costruendo la Vista "Magazzino" della app Vicinato, che elenca gli Attrezzi messi a disposizione per il prestito.
Creare una nuova Vista
Ecco come creare una nuova Vista:
| crea la Vista | In Struttura - Viste clicca Aggiungi nuova vista e digita il nome della nuova vista (es. "Magazzino") |
| seleziona cosa mostrare | In Mostra seleziona che tipo di Entità mostrare nella Vista (es. contenuto di tipo "Attrezzo") |
| descrivi la Vista | Attiva Descrizione e descrivi a tua memoria futura cosa fa la Vista (es. "Elenco degli Attrezzi disponibili al prestito") |
| definisci il link di richiamo della Vista | In Percorso digita il link con cui sarà richiamata la Vista (es. "/magazzino") |
| scegli come mostrare | Attiva la creazione di una Pagina, mostra il risultato come Tabella o Responsive Grid. In Elementi da visualizzare scegli quanti elementi mostrare per pagina (es. 20) e attiva Usare un paginatore. Salva. |
La tua prima Vista è già pronta al link da te indicato per mostrare le Entità da te scelte.
Le sezioni della Vista
Salvata la Vista, si apre automaticamente l'editor della Vista (Views UI), composto da diverse sezioni, ognuna delle quali configura un aspetto della Vista. Imparare a costruire le Viste consiste essenzialmente nell'imparare cosa scrivere nelle diverse sezioni. Le spiegherò a mano a mano che ci serviranno per costruire le Viste di esempio.
| Visualizzazioni elenca le Visualizzazioni della Vista | Comandi di gestione della Vista | |||
| Nome della Visualizzazione che si sta modificando | Comandi di gestione della Visualizzazione | |||
| Formato definisce come mostrare le Entità (tabella, griglia, elenco, mappa, grafico ecc.) | Impostazioni pagina definisce il link della pagina e la voce di menù con cui richiamarla (*) | Relazioni elenca le relazioni tra Entità che consentono di mostrare nella Vista altre Entità | ||
Accesso | ||||
| Campi elenca quali Campi delle Entità considerare | Intestazione elenca cosa mostrare sopra l'elenco delle Entità | Filtri contestuali elenca i Filtri che prelevano i loro valori dal link di richiamo della Vista | ||
| Criteri del filtro elenca i filtri che selezionano le Entità da elencare | Piè di pagina elenca cosa mostrare sotto l'elenco delle Entità | Form esposto definisce come mostrare i Filtri esposti all'Utente | ||
| Criteri di ordinamento elenca i Campi su cui ordinare le Entità | Comportamento se non ci sono risultati elenca cosa mostrare se non ci sono Entità da mostrare | Altro contiene altre configurazioni Vista | ||
| Paginazione definisce quante Entità per volta mostrare | ||||
| Anteprima mostra come viene mostrata la Vista agli Utenti, in base ai valori digitati in Anteprima con i filtri contestuali | ||||
(*) Questa sezione cambia nome e contenuto in base al tipo di Visualizzazione: si chiama Impostazione pagina se si è scelto di creare una pagina.
Nell'editor troviamo precaricate le scelte già effettuate al momento della creazione della Vista; per l'esempio sopra riportato:
- nella sezione Visualizzazioni compare una Visualizzazione di tipo Pagina e, come Formato ritroviamo Tabella o Responsive Grid
- nella sezione Impostazioni pagina - Percorso compare il link di richiamo della Vista ("/magazzino")
- nella sezione Criteri del filtro compare un Filtro che limita la Vista ai soli Contenuti di tipo "Attrezzo"
- nella sezione Campi compare il Campo "Titolo" degli Attrezzi
- nella sezione Paginazione compare l'esistenza di un paginatore ogni 20 elementi
Se abbiamo caricato nella app qualche Attrezzo di prova, sotto Anteprima possiamo già vedere come si presenterà il Magazzino: una tabella che elenca 20 Attrezzi per pagina, con i comandi per cambiare pagina sotto di essa. Vediamo ora come migliorare questo primo risultato, mostrando altre informazioni sugli Attrezzi e riordinando i contenuti.
Come elencare le Entità (sezione Formato)
la sezione Formato della Vista definisce come mostrare l'elenco delle Entità. I Formati disponibili nativamente sono Tabella (una riga per ogni Entità, una colonna per ogni Campo mostrato), Responsive grid (matrice di Entità), Elenco non formattato (una riga per ogni Campo di ogni Entità) ecc. I moduli aggiuntivi possono introdurre nuovi formati, ad esempio vedremo più avanti come presentare su una mappa interattiva Entità georeferenziate.
Nella stessa app è possibile scegliere diversi formati di presentazione delle stesse informazioni, in base alle caratteristiche dell'Utente. Ad esempio, per gli Utenti che utilizzano la app prevalentemente da smartphone, è opportuno scegliere un formato che si adatta alle piccole dimensioni delle schermo del dispositivo (es. Responsive grid), mentre per gli Utenti che usano il computer, il formato più comodo potrebbe essere la Tabella. In realtà, anche il formato Tabella può adattarsi al piccolo schermo: nelle Impostazioni del formato Tabella è possibile classificare i Campi mostrati per "priorità": i Campi con priorità "alta" saranno mostrati sempre, mentre quelli di priorità "media" e "bassa" saranno mostrati solo se le dimensioni dello schermo lo consentono.
Aggiungere Campi nelle diverse sezioni
La configurazione di molte sezioni della Vista consiste nell'aggiunta e configurazione di Campi nella sezione. Indipendentemente dalla sezione, le modalità di identificazione, selezione e configurazione di un Campo sono sempre le stesse e quindi le spiego qui, una volta per tutte:
| per aggiungere un Campo in una sezione della Vista | Clicca Aggiungi a fianco della sezione. Appare una finestra Aggiungi Campi, che elenca tutti i Campi disponibili per quella sezione. |
| cerca il Campo da aggiungere | Nella finestra Aggiungi Campi seleziona in Categoria il tipo di Entità cui appartiene il Campo (es. se stai cercando il nome utente degli Utenti, in Categoria seleziona Utente). In Cerca digita una parte del nome del Campo (es: "nome"); se ci sono più Campi con lo stesso nome, verifica nella colonna Descrizione che il Campo sia quello desiderato. |
| seleziona il Campo | Identificato il Campo, per selezionarlo attiva la casella a fianco del Campo e clicca Aggiungi e configura campi. Appare la finestra di configurazione del Campo. |
| seleziona l'eventuale relazione tra Entità che consente di raggiungere il Campo | Nella finestra di configurazione del Campo, seleziona la Relazione che permette di raggiungere il Campo. Se il Campo è uno dei Campi dell'Entità principale su cui stai costruendo la Vista, non selezionare nulla. Sul concetto di Relazione tornerò in una prossima Guida, quindi per ora non preoccuparti se non è chiaro. |
| completa la configurazione del Campo | In base alla sezione in cui stai lavorando ed al Campo selezionato, la finestra di configurazione può chiedere altre informazioni, che spiegherò caso per caso; alla fine clicca Salva |
Quali Campi mostrare (sezione Campi)
La sezione Campi elenca i Campi da mostrare o comunque considerare per ogni Entità elencata. A titolo di esempio, vediamo come aggiungere alla Vista "Magazzino" il Campo "Immagine" dell'Attrezzo:
| per aggiungere il Campo | nella sezione Campi clicca Aggiungi |
| cerca il Campo da aggiungere | Nella finestra Aggiungi Campi, in Categoria seleziona Contenuto (perché l'Attrezzo è un Contenuto). In Cerca digita i primi carattere di "immagine"; se ci sono più Campi con lo stesso nome, verifica nella colonna Descrizione che il Campo appartenga all'Attrezzo ![]() |
| seleziona il Campo | attiva la casella a fianco del Campo e clicca Aggiungi e configura campi. Appare la finestra di configurazione del Campo |
| seleziona l'eventuale Relazione che consente di raggiungere il Campo | Il Campo "Immagine" fa parte dell'Entità principale della Vista (l'Attrezzo) quindi in Relazione non selezionare nulla. |
| completa la configurazione del Campo | Nella finestra di configurazione, come Stile immagine del Campo seleziona Miniatura per uniformare le dimensioni delle immagini, indipendentemente dalle dimensioni con cui sono state caricate dagli Utenti |
Nello stesso modo, aggiungiamo il Campo "Descrizione" dell'Attrezzo e, nella sua configurazione, attiviamo Escludi dalla visualizzazione per non mostrarlo all'Utente, perché ci servirà tra poco per eseguire ricerche nel Magazzino ma non vogliamo appesantire la visualizzazione. In questa Guida vedremo diversi metodi per modificare la visualizzazione del valore di un Campo.
Modificare l'ordine dei Campi (sezione Campi)
Se l'ordine con cui i Campi sono mostrati non ti soddisfa, nella sezione Campi clicca Rearrange e riordinali.
Modificare l'ordine delle Entità (sezione Criteri di ordinamento)
La sezione Criteri di ordinamento elenca i Campi secondo cui le Entità devono essere ordinate nella Vista. Ad esempio, volendo ordinare il Magazzino per titolo dell'Attrezzo:
| aggiungi il Campo su cui ordinare le Entità | nella sezione Criteri di ordinamento clicca Aggiungi e seleziona il Campo Contenuto - Titolo |
| scegli l'ordinamento | nella configurazione del Campo, seleziona l'ordinamento ascendente |
Se si aggiungono più Campi nella sezione Criteri di ordinamento, essi vengono considerati nell'ordine in cui sono mostrati, dall'alto verso il basso.
Filtrare le Entità (sezione Criteri del filtro)
La sezione Criteri del filtro elenca i Filtri che definiscono quali Entità elencare nella Vista. Un Filtro è formato di tre parti:
- il Campo su cui agisce il Filtro (es. "Stato")
- l'operatore con cui svolgere il confronto (es. è uguale a)
- il valore da confrontare col contenuto del Campo (es. "Prestabile")
Di default c'è sempre il Filtro "Contenuto pubblicato = Si", che evita di mostrare Contenuti nascosti. Nella Vista "Magazzino" troviamo anche il Filtro Tipo di Contenuto = Attrezzo che avevamo impostato nel momento della creazione della Vista. Per limitare la Vista ai soli Attrezzi attualmente prestabili, aggiungiamo un Filtro sul Campo "Stato" dell'Attrezzo, imponendo che sia uguale a "Prestabile".
Filtri Esposti (sezione Criteri del filtro)
I Filtri impostati nella sezione Criteri del filtro sono per default nascosti all'Utente. Se si attiva Esponi questo filtro, per permettere ai visitatori di modificarlo, il Filtro viene mostrato all'Utente, perché possa modificarne il valore ed eventualmente anche l'operatore (ma non il Campo su cui agisce). Ad esempio, potremmo esporre il Filtro che limita la Vista ai soli Attrezzi con Stato = Prestabile, per consentire all'Utente di scegliere se vedere anche gli Attrezzi ritirati dal prestito.
Cercare nella Vista (sezione Criteri del filtro)
Il Campo speciale Globale - Combina filtri dei campi disponibile nella sezione Criteri del filtro aggiunge all'Utente la funzione di ricerca nella Vista. Ecco come:
| aggiungi il Campo speciale ed esponilo | Nella sezione Criteri del filtro aggiungi il Campo Globale - Combina filtri dei campi ed attiva Esponi questo filtro, per permettere ai visitatori di modificarlo: all'Utente viene mostrata una caselle in cui digitare le parole da cercare |
| regola la ricerca | come operatore seleziona Contiene ogni parola, in modo da poter stringere la ricerca digitando più parole |
| definisci dove cercare | in Scegli i campi da combinare per il filtraggio seleziona i Campi in cui cercare. La ricerca è limitata ai soli Campi testuali (nella Vista "Magazzino" al "titolo" ed alla "descrizione") |
Paginare la Vista (sezione Paginazione)
Se l'elenco delle Entità mostrato dalla Vista è lungo, conviene presentarlo in pagine, configurando la sezione Paginazione
| attiva la paginazione | Nella sezione Paginazione seleziona Risultati paginati, paginatore ridotto oppure Risultati paginati, paginatore completo |
| regola la paginazione | Indica quante Entità mostrare in ogni pagina (es. "20") |
Proteggere la Vista (sezione Accesso)
Nella sezione Accesso possiamo proteggere la Vista, limitandone la visibilità a specifici insiemi di Utenti. Le protezioni offerte nella sezione Accesso sono:
| Permesso | la Vista elenca le Entità tenendo conto dei Permessi degli Utenti sulle Entità |
| Ruolo | la Vista elenca le Entità solo agli Utenti che hanno uno o più Ruoli specificati |
| Senza restrizioni | la Vista elenca le Entità a qualunque Utente, compresi i Visitatori |
Il risultato reale dipende dalla combinazione tra l'impostazione di questa sezione, i Permessi attribuiti ai diversi Ruoli ed alla presenza di eventuali ulteriori moduli di protezione dei contenuti e può quindi portare a dinieghi o visualizzazioni non previste. Salvo necessità più complesse, la soluzione più semplice è selezionare qui la protezione per Ruolo. Proteggiamo la Vista "Magazzino" selezionando Ruolo - Utente autenticato.
Aggiungere informazioni per l'Utente (sezione Intestazione o Piè di pagina)
Nella sezione Intestazione possiamo aggiungere Campi che mostrano informazioni all'Utente sopra l'elenco delle Entità, quindi non riferite ad una specifica Entità ma al loro insieme. Ad esempio, per mostrare il numero di Attrezzi elencati dalla Vista:
| aggiungi la funzione di conteggio delle Entità elencate | Nella sezione Intestazione aggiungi il Campo speciale Globale - Riassunto del risultato - Mostra il riassunto del risultato, per esempio gli elementi per pagina |
| configura il testo da mostrare | in Visualizzazione digita "@total Attrezzi disponibili al prestito. Clicca su un Attrezzo per vederne le caratteristiche e chiederlo in prestito" dove @total viene sostituito dal numero di Attrezzi elencati. |
Per mostrare le informazioni sotto l'elenco, inserisci il Campo nella sezione Piè di pagina.
Relazioni tra Entità
Nella Guida precedente abbiamo visto come creare una Vista che elenca un tipo di Entità (es. gli Attrezzi della app Vicinato) con i loro Campi. Vediamo ora come mostrate nella stessa Vista informazioni prese dai Campi di altre Entità collegate alle Entità principali della Vista da relazioni.
Una Entità A è in relazione con una Entità B se l'Entità A ha un Campo Riferimento che richiama l'Entità B. Rappresentiamo questa relazione come A → B perché, conoscendo l'Entità A, possiamo arrivare all'Entità B leggendo il contenuto del Campo di A.
Aggiungere relazioni nella Vista (sezione Relazioni)
Utilizzeremo la relazione A→B per aggiungere ad una Vista che elenca le Entità di tipo A anche le informazioni contenute nei Campi delle Entità di tipo B. Per utilizzare una relazione in una Vista occorre aggiungere nella sezione Relazioni della Vista il Campo di A che regge la relazione. Ad esempio, nella Vista "Magazzino" della app "Vicinato" che abbiamo creato nella Guida precedente e che elenca gli Attrezzi, possiamo utilizzare la relazione Attrezzo → Autore (retta dal Campo predefinito "Autore" dell'Attrezzo) per aggiungere informazioni sul Proprietario dell'Attrezzo. Ecco come:
| aggiungi la relazione | Nella sezione Relazioni clicca Aggiungi. Cerca "autore" e seleziona Contenuto - Utente - Nome utente dell'autore del contenuto.
|
| configura la relazione | Nella finestra di configurazione del Campo, come titolo amministrativo della relazione puoi digitare "Proprietario", per ricordarti che l'Utente così selezionato è il Proprietario dell'Attrezzo. |
Usare le relazioni nella Vista
Aggiunta una relazione A→B nella sezione Relazioni, per usare nelle altre sezioni della Vista i Campi dell'Entità B basta selezionare la relazione nella finestra di configurazione del Campo. Ad esempio, per aggiungere nella sezione Campi della Vista "Magazzino" il nome del Proprietario a fianco di ogni Attrezzo:
| aggiungi il nome del proprietario dell'Attrezzo | Nella sezione Campi clicca Aggiungi. Seleziona il Campo Utente - Nome - Il nome dell'utente o dell'autore e come Relazione seleziona "Proprietario". Come Etichetta digita "Proprietario" |
Relazioni concatenate
Nella sezione Relazioni è possibile aggiungere un numero qualunque di Relazioni, ognuna corrispondente ad un Campo riferimento dell'Entità principale della Vista. E' anche possibile costruire relazioni concatenate tra loro, cioè relazioni che consentono di passare da una Entità A all'Entità B e da questa ad una Entità C e così via.
Ad esempio, nella app "Vicinato" un Prestito ha un campo riferimento "Richiesta" che specifica a quale Richiesta il Prestito risponde (Prestito → Richiesta). A sua volta, la Richiesta ha un campo riferimento "Attrezzo" che rimanda all'Attrezzo richiesto (Richiesta → Attrezzo). Quindi, percorrendo la catena di relazioni Prestito → Richiesta, Richiesta → Attrezzo possiamo conoscere l'Attrezzo oggetto del Prestito senza duplicare questa informazione nell'Entità Prestito.
Se stiamo costruendo una Vista che elenca i Prestiti e vogliamo mostrare per ciascuno di essi la Richiesta cui risponde e l'Attrezzo prestato, nella sezione Relazioni aggiungeremo prima la relazione Prestito → Richiesta e dopo la relazione Richiesta → Attrezzo, indicando che quest'ultima è basata sulla relazione che la precede. L'ordine in cui sono elencate le relazioni nella sezione Relazioni è quindi importante.
Vediamo come si fa:
| crea la Vista | In Struttura - Viste clicca Aggiungi nuova vista e digita il nome della nuova vista (es. "Prestiti"). In Mostra seleziona il tipo di Entità da elencare (es. contenuto di tipo "Prestito"). Attiva la creazione di una Pagina, mostra il risultato come Tabella o Responsive Grid. In Elementi da visualizzare scegli quanti elementi mostrare per pagina (es. 20) e attiva Usare un paginatore. Salva. |
| aggiungi la relazione Prestito → Richiesta | Nella sezione Relazioni aggiungi il Campo riferimento di Prestito che richiama la sua Richiesta: Contenuto - Contenuto referenziato da field_richiesta_prestito - Appare in: prestito. Rinomina questa relazione come "richiesta" perché, attraverso di essa, si arriva alla Richiesta associata al Prestito. |
| aggiungi la relazione Richiesta → Attrezzo | Nella sezione Relazioni aggiungi il Campo riferimento di Richiesta che richiama l'Attrezzo: Contenuto - Contenuto referenziato da field_attrezzo_richiesta - Appare in: richiesta. Nella configurazione del Campo come Relazione seleziona "richiesta": è questo passaggio che concatena questa relazione alla precedente. Rinomina la nuova relazione come "attrezzo" perché permette di arrivare all'Attrezzo prestato. ![]() |
| utilizza le informazioni di tutte le Entità relazionate | Nella sezioni Campi aggiungi il Campo Titolo ed etichettalo "Prestito". Aggiungi un altro Campo Titolo, nella sua configurazione come Relazione seleziona "richiesta" ed etichettalo "Richiesta". Aggiungi un altro Campo Titolo, nella sua configurazione come Relazione seleziona "attrezzo" ed etichettalo "Attrezzo". |
| cerca i Prestiti su uno specifico Attrezzo | Nella sezione Criteri del filtro aggiungi il Campo Titolo, come Relazione seleziona Attrezzo, esponi il Filtro, come Operatore seleziona contiene ogni parola: nella Vista appare una finestra di ricerca in cui, digitando parte del nome dell'Attrezzo, vengono mostrati solo i Prestiti relativi a quell'Attrezzo. |
Relazioni inverse
Data una relazione A→ B, è anche possibile utilizzarla in senso inverso per risalire da B ad A. Ad esempio, nella app Vicinato vogliamo una Vista che elenca le Richieste e, a fianco di ciascuna di esse, l'eventuale Prestito concesso: poiché la relazione disponibile è Prestito → Richiesta, dovremo usare questa relazione in senso inverso per passare dalla Richiesta al Prestito. Per usare la relazione in senso inverso, nella sezione Relazioni anziché aggiungere il Campo:
Contenuto - Contenuto referenziato da field_richiesta_prestito - Appare in: prestito.
aggiungiamo il Campo:
Contenuto - Contenuto che usa field_attrezzo_richiesta - Relate each Contenuto with a field_attrezzo_richiesta set to the content item.
| ATTENZIONE : Usando la relazione A → B in senso diretto, data l'Entità A si trova una sola Entità B (a meno che il Campo Riferimento di A ammetta più valori di B). Usandola in senso inverso, potrebbe capitare che identifichi più Entità A. Ad esempio, se l'Entità "Disco" ha un Campo "Cantante" che ammette un solo valore, la relazione Disco → Cantante restituisce un solo Cantante; ma se usiamo la relazione in senso inverso potrebbe restituire più di un Disco, cioè tutti i Dischi di quel Cantante. |
Campi speciali
Oltre ai Campi che fanno parte delle Entità, nelle Viste sono disponibili Campi speciali che mettono a disposizione informazioni di sistema o svolgono funzioni particolari. Questi Campi sono solitamente elencati sotto la Categoria Globale. Ecco alcuni dei Campi speciali disponibili nativamente o installando moduli aggiuntivi:
| nella sezione | Campo speciale | a cosa serve | richiede il modulo |
| Campi | Globale - Testo personalizzato | mostra un testo fisso o dipendente da altri Campi (attraverso i Token, vedi sotto) | |
| Globale - Visualizza | richiama un'altra Vista dentro la Vista | Views Field View | |
| Viste - Views Conditional | mostra un valore A o un valore B in base al valore di un altro Campo | Views Conditional | |
| Globale - Simple Math Field | mostra il risultato di un calcolo basato sui valori di altri Campi | Views Simple Math | |
| Intestazione o Piè di pagina | Globale - Area di testo | mostra un testo fisso o dipendente da altri Campi (attraverso i Token, vedi sotto) | |
| Globale - Riassunto del risultato | mostra il numero di entità elencate dalla Vista, accompagnato da un testo a piacere | ||
| Globale - Area della Vista | richiama un'altra Vista dentro la Vista | ||
| Globale - Link | aggiunge un link | Views Link Area |
Campi e Token
Ogni Campo elencato nella sezione Campi di una Vista (compresi quelli speciali) mette a disposizione del resto della Vista un Token, che contiene il valore di quel Campo. Il Token può essere utilizzato per riciclare il valore in altri Campi, per costruire comandi sulle Entità, per attivare logiche "se allora" ecc.
Ogni Campo nella sezione Campi "vede" i Token dei Campi che lo precedono ma non "vede" i Token dei Campi che lo seguono, quindi è importante l'ordine con cui i Campi sono elencati. I Token "visibili" in un Campo sono elencati sotto Replacement patterns del Campo stesso e da lì possono essere copiati ed incollati dove servono. Per capire a quale Campo corrisponde un Token, basta ricordare che i Token sono elencati nello stesso ordine dei Campi cui si riferiscono; anche la forma del Token aiuta a comprendere a quale Campo corrisponde. Anche i Campi elencati nella sezione Filtri contestuali generano Token e sono riconoscibili dalla loro specifica forma. Ecco una piccola guida al riconoscimento dei Token:
| Al Campo | corrisponde il Token |
| Campo predefinito dell'Entità | {{ title }} {{ created }} ecc. |
| Campo dell'Entità elencato nella sezione Campi | {{ field_NOMEINTERNODELCAMPO}} es. {{ field_stato_richiesta }} |
| Campo speciale Globale - Testo personalizzato | {{ nothing }} |
| Campo elencato nella sezione Filtri contestuali | {{ raw_arguments.NOMEINTERNODELCAMPO }} es. {{ raw_arguments.nid }} |
| Campo condizionato Viste - Views Conditional | {{ views_conditional_field }} |
| Campo speciale di calcolo Globale- Simple Math | {{ fields.field_views_simple_math_field }} |
| Campo che appare più volte nella sezione | come sopra ma con aggiunto _1, _2 ecc. Ad esempio il primo Campo Titolo presente nella sezione Campi ha Token {{ title }}, il secondo {{ title_1 }}, il terzo {{ title_2 }} ecc. |
Token globali
Nelle sezioni Intestazione e Piè di pagina sono disponibili intere famiglie di Token che forniscono informazioni "globali" (cioè non dipendenti dalle Entità elencate dalla Vista), utilizzabili nel Campo Globale - Area di testo ed elencati sotto Token globali disponibili per la sostituzione:
| [site:ATTRIBUTO] | Informazione relativa al sito, es. [site:name] restituisce il nome del sito |
| [view:ATTRIBUTO] | Informazione relativa alla Vista stessa, es. [view:total-rows] restituisce il numero di righe della Vista |
| [current-user:CAMPO] | Informazione relativa all'Utente corrente, es. [current-user:name] restituisce il nome dell'Utente corrente- Questa famiglia di Token non è elencata sotto Token globali disponibili per la sostituzione |
Creare una nuova Vista come variazione di una Vista esistente
A mano a mano che costruisci le diverse Viste che compongono la tua app, è probabile che ti accorga che una nuova Vista che ti serve è uguale ad un'altra, salvo per qualche dettaglio. Ad esempio, nella app "Vicinato" vogliamo avere due Viste sugli Attrezzi molto simili tra loro: la Vista "Magazzino", che elenca tutti gli Attrezzi prestabili e la Vista "Tuoi Attrezzi", che elenca tutti gli Attrezzi dell'Utente corrente inclusi quelli ritirati dal prestito. Sempre nella app "Vicinato", vogliamo diverse Viste sulle Richieste, simili tra loro sulla modalità di elencazione delle Richieste ma con diversi filtri (Richieste inviate dall'utente corrente, Richieste ricevute dall'utente corrente, Richieste su un Attrezzo ecc.).
In tutti questi casi, invece che ripartire da zero, può risultare conveniente creare la nuova Vista partendo da quella esistente, modificandone poi il comportamento. Ci sono due modalità per creare una nuova Vista come variazione di una esistente:
- fare una copia della Vista di partenza
- aggiungere una nuova Visualizzazione nella Vista di partenza
Spieghiamo entrambi i metodi, evidenziandone pro e contro.
Copiare una Vista
Per creare una nuova Vista come copia di una Vista esistente:
| duplica la Vista di partenza | In Struttura - Viste seleziona Duplica a fianco della Vista da cui vuoi partire. Dai un nome differente alla nuova Vista (es. "Tuoi Attrezzi") e modifica anche il nome interno (es. "tuoi-attrezzi"), che altrimenti Drupal costruisce come variazione poco significativa del nome interno della Vista di partenza. |
| differenzia il link delle due Viste | Nella sezione Impostazioni pagina della nuova Vista modifica il Percorso (es. "tuoi-attrezzi") per evitare che Drupal si confonda nel richiamare le due Viste. |
| differenzia il comportamento delle due Viste | Nelle altre sezioni della nuova Vista apporta le modifiche necessarie a differenziarla dalla Vista di partenza, ad esempio cambia i filtri applicati alle Entità dalla sezione Criteri del filtro e i Campi mostrati dalla sezione Campi. |
| se la nuova Vista non appare | Se richiamando il link della nuova Vista viene mostrato un errore di "Pagina non trovata", vai in Configurazione - Sviluppo - Prestazioni e clicca Svuota la cache per forzare l'aggiornamento dei link riconosciuti da Drupal. |
PRO: è semplice e ed azzera la possibilità di rovinare la Vista di partenza. CONTRO: ogni miglioramento apportato nella Vista di partenza o nella Vista derivata non si propaga automaticamente all'altra Vista.
Aggiungere una Visualizzazione alla Vista
Invece che creare la nuova Vista come copia autonoma della Vista di partenza, possiamo creare una nuova Visualizzazione dentro la Vista di partenza:
| crea la nuova Visualizzazione nella Vista di partenza | Dentro la Vista di partenza, nella sezione Comandi di gestione della Visualizzazione seleziona Duplica page. Nella sezione Visualizzazioni appare una seconda Visualizzazione di nome "page". Da qui in poi, prima di effettuare una qualunque modifica, assicurati di agire sulla Visualizzazione desiderata (originale o nuova) cliccandovi sopra. |
| distingui la nuova Visualizzazione dalla Visualizzazione originale | Clicca su Nome visualizzato della nuova Visualizzazione e rinominala (es. "Tuoi Attrezzi") per distinguerla facilmente da quella di partenza. |
| Differenzia il link delle due Visualizzazioni | Nella sezione Impostazioni pagina della nuova Visualizzazione modifica il Percorso differenziandolo da quello della Visualizzazione originale (es. "tuoi-attrezzi") |
| differenzia il comportamento delle due Visualizzazioni | Nelle altre sezioni della nuova Visualizzazione apporta le modifiche necessarie a differenziarla dalla Visualizzazione di partenza, ad esempio cambia i filtri applicati alle Entità dalla sezione Criteri del filtro e i Campi mostrati dalla sezione Campi. Quando apporti una modifica in una delle due Visualizzazioni, nella casella Per di selezione del Campo puoi decidere se applicarla a tutte le Visualizzazioni della Vista oppure solo alla Visualizzazione selezionata in quel momento. Il pulsante in fondo conferma tale scelta: |
| se la nuova Visualizzazione non appare | Se richiamando il link della nuova Vista viene mostrato un errore di "Pagina non trovata", vai in Configurazione - Sviluppo - Prestazioni e clicca Svuota la cache per forzare l'aggiornamento dei link riconosciuti da Drupal. |
PRO: ogni miglioramento apportato in una Visualizzazione può essere facilmente propagato automaticamente alle altre Visualizzazioni. E' il metodo standard con cui tra poche Guide costruiremo le EVA. CONTRO: una variazione pensata per una Visualizzazione rischia di essere applicata anche alle altre rovinandone il comportamento, se non si sta attenti alla selezione della casella Per.
| ATTENZIONE: Anche se formalmente è possibile attribuire protezione diverse nelle sezioni Accesso delle diverse Visualizzazioni di una medesima Vista, nella mia esperienza sembra che l'ultima variazione scritta nella sezione Accesso di una Visualizzazione si propaghi automaticamente a tutte le altre. Quindi se si intende avere due Viste con protezioni diverse (es. una per gli Utenti e un'altra riservata all'Amministratore) conviene creare due copie distinte e non due Visualizzazioni della stessa Vista. |
Chi è l'Utente corrente
Se la tua app è utilizzata da altri Utenti oltre all'Amministratore, in ogni momento ci potrebbero essere più Utenti che contemporaneamente richiamano le medesime Viste. Alcune di essere mostrano le medesime informazioni a tutti gli Utenti, ad esempio la Vista "Magazzino" della app "Vicinato" elenca tutti gli Attrezzi prestabili a tutti i Partecipanti. Altre Viste devono mostrare informazioni differenti (o non mostrarne affatto) ai diversi Utenti, ad esempio la Vista "Tuoi Attrezzi" deve mostrare all'Utente solo gli Attrezzi di sua proprietà, compresi quelli ritirati dal prestito. In questi casi, nella costruzione della Vista dobbiamo considerare non solo le informazioni delle Entità elencate (gli Attrezzi), ma anche le informazioni della Entità Utente corrente, cioè dell'Utente che sta usando la Vista.
Filtrare le Entità sull'Utente corrente
La modalità più frequente per considerare l'Utente corrente in una Vista è filtrare le Entità elencate dalla Vista usando una relazione che le lega all'Utente corrente. Andiamo quindi alla ricerca di una o più relazioni che collegano le Entità elencate con Entità di tipo Utente. Ad esempio, abbiamo già visto come risalire da una Entità al suo Autore (Entità → Autore); se l'Entità su cui è costruita la Vista ha altri Campi riferimento che richiamano Utenti, possiamo utilizzare anche queste altre relazioni.
Prendiamo come esempio la Vista "Tuoi Attrezzi" della app "Vicinato", che vogliamo elenchi gli Attrezzi di proprietà dell'Utente corrente. La costruiamo come variazione della Vista "Magazzino, aggiungendo la relazione Attrezzo → Autore (l'Autore dell'Attrezzo è il suo Proprietario) e modificando i Filtri.
| identifica il Proprietario (=Autore) dell'Attrezzo | Nella sezione Relazioni aggiungi Contenuto - Utente - Nome utente dell'autore del contenuto e rinomina come "Proprietario" |
| limita l'elenco agli Attrezzi di cui è Proprietario l'Utente corrente | Nella sezione Criteri del filtro aggiungi Utente - Corrente - Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "Proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si |
| includi gli Attrezzi non disponibili al prestito | Nella sezione Criteri del filtro elimina il Filtro presente in "Magazzino" Contenuto - Stato - Prestabile |
Se l'Utente corrente non ha relazioni con le Entità della Vista
Il metodo sopra descritto non funziona se le Entità elencate nella Vista non hanno alcuna relazione con Entità di tipo Utente. Anche in questi casi Drupal "sa" chi è l'Utente corrente e ne rende disponibili le informazioni attraverso appositi Token.
Nelle sezioni Intestazione e Piè di pagina sono disponibili i Token [current-user:CAMPO], dove CAMPO è il nome interno di un Campo dell'Entità Utente. I Token più utili sono [current-user:name] che restituisce il nome dell'Utente corrente e [current-user:uid] che restituisce il suo identificativo.
Questi Token non sono purtroppo elencati sotto Replacement Patterns né sono disponibili nelle altre sezioni della Vista. Per disporre delle informazioni relative all'Utente corrente anche nella sezione Campi, occorre installare ed attivare il modulo aggiuntivo Twig Tweaks. Questo modulo aggiunge alle Viste alcuni Token "di sistema", cioè non dipendenti dalle Entità elencate dalla Vista. In particolare, mette a disposizione i Token {{ drupal_token('current-user:CAMPO') }} ad esempio {{ drupal_token('current-user:uid') }}.
Filtri in AND logico tra loro
Nelle Guide precedenti abbiamo visto come selezionare le Entità da elencare in una Vista con i Filtri della sezione Criteri del filtro. Ad esempio, abbiamo visto che nella Vista "Tuoi Attrezzi" della app "Vicinato" sono necessari i seguenti Filtri:
| elenca Attrezzi | aggiungi Contenuto - Tipo di contenuto e seleziona "Attrezzo" |
| elenca Attrezzi prestabili | aggiungi Contenuto - Stato (field_stato_attrezzo) - Appare in: attrezzo. |
| elenca Attrezzi di proprietà dell'Utente corrente | aggiungi Utente - Corrente - Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "Proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si |
I Filtri elencati nella sezione Criteri del filtro sono considerati in AND logico tra loro: una Entità è mostrata solo se soddisfa tutti i Filtri. Quindi i Filtri sopra elencati corrispondo a questa logica:
(Tipo di contenuto=Attrezzo) AND (Stato dell'Attrezzo=Prestabile) AND (Utente corrente = Proprietario dell'Attrezzo)
APPROFONDIMENTO: Dati due Filtri A e B, la loro combinazione A AND B è soddisfatta solo se entrambi sono soddisfatti. Quindi:
|
Filtri in OR logico tra loro
Nella costruzione di alcune Viste potremmo invece la necessità di mostrare Entità che soddisfano un Filtro oppure un altro Filtro. Ad esempio, nella app "Vicinato" ci potrebbe servire una Vista che mostri l'elenco delle Richieste all'Utente che chiede l'Attrezzo (Utente Richiedente) e all'Utente che presta l'Attrezzo (Utente Proprietario) ma a nessun altro Utente. Se in questa Vista aggiungiamo alla sezione Criteri del filtro un Filtro che impone che l'Utente corrente è il Richiedente e un Filtro che impone che l'Utente corrente è il Proprietario, non vedremo nessuna Richiesta, perché Richiedente e Proprietario non sono mai lo stesso Utente e quindi per nessun Utente saranno contemporaneamente soddisfatti i due Filtri.
In un caso come questo, avremmo invece bisogno che i due Filtri siano in OR logico tra loro: una Entità è mostrata se soddisfa almeno uno dei Filtri, cioè:
(Utente corrente=Richiedente) OR (Utente corrente=Proprietario)
APPROFONDIMENTO: Dati due Filtri A e B, la loro combinazione A OR B è soddisfatta se almeno uno è soddisfatto. Quindi:
|
Come comporre nella Vista i Filtri in AND / OR logico tra loro
Le Viste supportano sia Filtri in AND logico tra loro (è il default) sia in OR logico tra loro, sia in combinazione più complesse. Torniamo all'esempio di cui sopra, cioè una Vista che elenchi le Richieste al Richiedente e al Proprietario ma non agli altri Utenti. Per ottenere questo effetto occorre combinare i Filtri in questo modo:
(Tipo di contenuto=Richiesta) AND ((Utente corrente = Richiedente) OR (Utente corrente = Proprietario))
Infatti la combinazione ((Utente corrente = Richiedente) OR (Utente corrente = Proprietario)) è soddisfatta se l'Utente corrente è il Richiedente oppure è il Proprietario, ma non è soddisfatta se l'Utente corrente non è né Richiedente né Proprietario. Vediamo come descrivere questo caso (il passaggio specifico è quello in grassetto):
| mostra solo Richieste | nella sezione Criteri del filtro aggiungi il Filtro Contenuto - Tipo di contenuto e seleziona "Richiesta" |
| identifica il Richiedente tramite la relazione (Richiesta → Autore) e il Proprietario tramite la catena di relazioni (Richiesta → Attrezzo) e (Attrezzo → Autore) | nella sezione Relazioni:
|
| mostra le Richieste che hanno come Richiedente l'Utente corrente | Nella sezione Criteri del filtro aggiungi Utente - Corrente - Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "Richiedente", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si |
| mostra le Richieste che hanno come Proprietario l'Utente corrente | Nella sezione Criteri del filtro aggiungi Utente - Corrente - Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "Proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si |
| metti i Filtri sull'Utente corrente in OR logico tra loro e in AND logico con gli altri Filtri | Nella sezione Criteri del filtro clicca And/or Arrange Clicca Crea un nuovo gruppo di filtri Per il nuovo gruppo di filtri seleziona come operatore O (=OR) Trascina i due Filtri nel nuovo gruppo Clicca Applica. Controlla che i due Filtri siano raggruppati a parte, in OR tra loro ed in AND con gli altri Filtri:
|
In questa Guida vediamo come filtrare il risultato di una Vista agendo sul link con cui la Vista viene richiamata.
Filtri della sezione Filtri contestuali
Nelle Guide precedenti abbiamo visto come filtrare le Entità elencate da una Vista grazie ai Filtri elencati nella sezione Criteri del Filtro. Abbiamo anche visto che un Filtro è formato da tre parti:
- il Campo su cui agisce il Filtro (es. "Stato")
- l'operatore con cui svolgere il confronto (es. è uguale a)
- il valore da confrontare col contenuto del Campo (es. "Prestabile")
E' possibile aggiungere alla Vista Filtri anche nella sezione Filtri contestuali. Questi ulteriori Filtri (che chiameremo Filtri contestuali) agiscono in AND logico coi Filtri elencati nella sezione Criteri del filtro: per essere elencata dalla Vista, una Entità deve soddisfare sia i Filtri della sezione Criteri del filtro sia i Filtri contestuali.
Mentre un Filtro della sezione Criteri del filtro prende il valore da confrontare col Campo dalla configurazione stessa della Vista (se è un Filtro "nascosto") oppure dalla scelta effettuata dall'Utente (se è un Filtro "esposto"), un Filtro contestuale prende il valore dal link con cui viene richiamata la Vista. Diversamente dai Filtri della sezione Criteri del filtro, quindi, un Filtro contestuale consente di cambiare il risultato della Vista agendo esternamente su di essa, passandole uno o più valori di confronto attraverso il link di richiamo.
Vediamo come esempio come modificare la Vista "Tuoi Attrezzi" della app "Vicinato" che abbiamo costruito nelle Guide precedenti, perché filtri gli Attrezzi non in base all'Utente corrente ma in base ad un Utente che specifichiamo nel link di richiamo della Vista. A questo scopo togliamo dalla sezione Criteri del filtro il Filtro che limita la Vista ai soli Attrezzi il cui Proprietario coincide con l'Utente corrente ed aggiungiamo nella sezione Filtri contestuali il Campo Utente - ID Utente con Relazione "Proprietario". Richiamando la Vista col link
/tuoi-attrezzi/316
il Filtro della sezione Filtri contestuali limiterà la Vista ai soli Attrezzi di proprietà dell'Utente con identificativo 316.
Se nella sezione Filtri contestuali sono elencati più Campi, i corrispondenti valori devono essere scritti nel link nello stesso ordine con cui sono elencati nella sezione e separati da /. Ad esempio, se nella Vista sopra descritta aggiungiamo il Filtro contestuale Contenuto - ID Contenuto con Relazione "Categoria" (che corrisponde al numero che identifica univocamente una Categoria) e la richiamiamo col link:
/tuoi-attrezzi/316/12
la Vista elencherà solo gli Attrezzi dell'Utente con identificativo 316 e classificati con la Categoria con identificativo 12.
Nella terminologia Drupal, i valori trasmessi ai Filtri contestuali attraverso il link sono chiamati argomenti (arguments) e talvolta sono chiamati argomenti i Filtri stessi: quando nelle spiegazioni di Drupal si legge "argomento" è molto probabile che si stia parlando di Filtri contestuali.
I valori letti nel link e usati nei Filtri contestuali sono disponibili nella Vista grazie ai Token {{ raw_arguments.NOMEINTERNODELCAMPO }} es. {{ raw_arguments.nid }}. Questi Token sono elencati nella configurazione degli altri Campi della Vista sotto Replacement patterns.
Non solo numeri
Anche se è il caso più comune, non è necessario usare come argomenti gli identificativi numerici delle Entità: in realtà si possono usare come Filtri contestuali anche gli altri Campi delle Entità. Se, nell'ultimo esempio, al posto del Filtro contestuale Contenuto - ID Contenuto con Relazione "Categoria" scriviamo il Filtro contestuale Contenuto - Title con Relazione "Categoria" (che corrisponde al nome della Categoria), possiamo richiamare la Vista specificando nel link il nome della Categoria, es:
/tuoi-attrezzi/316/Giardino
Valori di default per i Filtri contestuali
Se una Vista ha uno più Filtri nella sezione Filtri contestuali e la Vista viene richiamata con un un link che contiene un numero di argomenti inferiore al numero dei Filtri, l'elenco mostrato dalla Vista può essere diverso da quello atteso: i Filtri contestuali sono in AND logico tra loro e quindi l'assenza di un argomento può far fallire uno dei Filtri e quindi la Vista potrebbe non mostrare nessuna Entità. Inoltre il link non contiene il nome del Campo cui applicare l'argomento, quindi non è neppure possibile "saltare" un argomento, ma occorre sempre passare un numero di argomenti pari al numero di Filtri contestuali.
Se un argomento manca nel link, nella configurazione del filtro contestuale possiamo decidere come deve comportarsi la Vista scegliendo una delle opzioni elencate in Quando il valore del filtro NON è nell'URL:

Se scegli Mostra tutti i risultati per il campo specifico il Filtro viene ignorato. Se scegli Fornire il valore di default devi specificare dove prendere il valore mancante; tra le opzioni più comunemente usate: ID del contenuto dell'URL (utile per i Blocchi, lo vedremo a suo tempo), Fisso (un valore fisso), Parametro query (es. se costruiamo il link come /tuoi-attrezzi?categoria=12 e indichiamo qui "categoria" come parametro, il valore viene preso dal nome del parametro e non dalla sua posizione), ID Utente degli utenti autenticati (ID dell'Utente corrente).
Filtrare per intervalli di valori
Diversamente dai Filtri della sezione Criteri del filtro, per i Filtri contestuali non è possibile scegliere l'operatore con cui eseguire il confronto: il valore ricevuto dal link deve essere uguale al valore del Campo utilizzato come Filtro nella sezione Filtri contestuali. Questa rigidità può essere parzialmente risolta installando ed attivando il modulo aggiuntivo "Views Contextual Range Filter", che aggiunge la possibilità di passare ad un Filtro contestuale un intervallo di valori anziché un unico valore. Ad esempio, se volessimo una Vista che elenca i Prestiti erogati nell'anno 2025 da tutti gli Utenti della app "Vicinato", potremmo mettere nella sezione Filtri contestuali il Campo "Data" del Prestito e poi richiamare la Vista col link:
/prestiti-conclusi/2025-01-01--2025-12-31
dove il doppio trattino -- separa il valore minimo e massimo dell'intervallo, realizzando così l'operatore "tra" E' anche possibile passare alla Vista un intervallo aperto, ad esempio per elencare i Prestiti dal 1 gennaio del 2026:
/prestiti-conclusi/2026-01-01--
realizzando così l'operatore "maggiore di" (e ovviamente anche "minore di").
| ATTENZIONE: Affinché l'intervallo passato ad un Filtro contestuale sia correttamente interpretato, è necessario dichiarare che quel Filtro può ricevere un intervallo di valori: in Configurazione - Contextual Range Filter devi trovare il Filtro e attivare la sua casellina. Per sicurezza, consiglio dopo di questa attivazione di svuotare la cache di Drupal con Configurazione - Prestazioni - Svuota la cache. |
Vedremo più avanti un uso particolare degli intervalli di valore sui Filtri contestuali per costruire comandi di navigazione "Precedente" "Successivo" su un insieme di Entità definito da una Vista.
Filtri contestuali e costruzione della app
I Filtri contestuali sono molto utili nella costruzione di una app, perché consentono di creare Viste "flessibili", che forniscono elenchi diversi in base agli argomenti ricevuti nel link, evitando così di dover costruire più Viste molto simili tra loro. Ad esempio, nella app "Vicinato" possiamo costruire una Vista che, in base all'argomento che riceve dal link, mostra i Prestiti conclusi su tutti gli Attrezzi dell'Utente corrente oppure i Prestiti conclusi su uno specifico Attrezzo dell'Utente corrente: per ottenere questa flessibilità è sufficiente aggiungere nella sezione Filtri contestuali il Campo Contenuto - ID Contenuto con Relazione "Attrezzo" e, nella sua configurazione, in Quando il valore del filtro NON è nell'URL selezionare l'opzione Mostra tutti i risultati per il campo specifico.
La vera potenza dei Filtri contestuali nella costruzione della app emergerà nelle prossime Guide, quando vedremo come costruire comandi cliccabili dall'Utente che richiamano una Vista passandole l'argomento. Anche il comando verrà costruito con una Vista e quindi avremo costruito in questo modo una catena di Viste attivata dall'Utente: la prima Vista espone all'Utente un comando che contiene il link di richiamo della seconda Vista con gli argomenti necessari, la seconda Vista viene richiamata dal click dell'Utente sul comando esposto dalla prima.
Un'altra applicazione molto importante dei Filtri contestuali nella costruzione della app sono le Viste EVA, cioè Viste che vengono richiamate dentro la pagina di una Entità: in questo caso, è Drupal che richiama implicitamente la Vista, passandole come argomento l'identificativo dell'Entità.
Avevamo visto in questa Guida che, ad ogni Entità, è associata una pagina di presentazione che ne mostra i Campi. Ad esempio, la pagina
/node/12
mostra il Contenuto con identificativo ID=12, mentre la pagina
/user/23
mostra l'Utente con identificativo UID=23. In questa Guida vediamo come aggiungere alla pagina di presentazione di una Entità anche informazioni prelevate da altre Entità, come variare le informazioni in base all'Utente che la sta guardando e come aggiungervi comandi, grazie alle Viste EVA.
EVA: una Vista dentro la pagina di una Entità
Una EVA (Entity Views Attachment) è una Vista che viene richiamata dentro la pagina di una Entità. Installato ed attivato il modulo aggiuntivo EVA: Entity Views Attachment, nell'editor delle Viste si rende disponibile il nuovo tipo di Visualizzazione "EVA" che consente appunto di creare una EVA.
Nella costruzione della EVA occorre (1) specificare nella sezione Entity content settings il tipo di Entità in cui deve essere richiamata e (2) predisporre nella sezione Filtri contestuali il Campo che riceve l'identificativo dell'Entità dalla pagina dell'Entità. Campo e tipo di Entità devono essere coerenti: ad esempio, se in Entity content settings la Vista è associata ad un Contenuto, nella sezione Filtri contestuali il Campo deve essere l'identificativo ID di Contenuto; se la Vista è invece associata ad Utenti, il Campo deve essere l'identificativo UID.
Ecco quindi i passi salienti per creare una EVA:
| crea la EVA | In Struttura - Viste crea una nuova Vista oppure modifica una Vista esistente. Nella sezione Visualizzazioni clicca Aggiungi - EVA. Appare una nuova Visualizzazione EVA. Clicca su di essa. |
| associa la EVA al tipo di Entità in cui mostrarla | Nella nuova sezione Entity content settings (che sostituisce la sezione Impostazioni pagina) della Visualizzazione EVA, seleziona il tipo di Entità ed il Bundle cui la Vista deve essere allegata (es. Contenuto - "Attrezzo") |
| specifica l'identificativo dell'Entità in cui mostrarla | Nella sezione Filtri contestuali aggiungi il Campo identificativo dell'Entità, es. ID - Contenuto |
Per il resto, la costruzione di una EVA è del tutto simile alla costruzione delle altre Viste.
Personalizzare e proteggere la presentazione dei Campi di una Entità
Un primo utilizzo delle EVA è la personalizzazione della presentazione dei Campi dell'Entità, per aggiungervi informazioni prelevate da altre Entità e decidere cosa mostrare ai diversi Utenti.
Come esempio, vediamo la personalizzazione della pagina della Richiesta della app "Vicinato". Se non interveniamo con le EVA, la pagina standard mostra tutti i Campi della Richiesta a tutti i Partecipanti. Vogliamo invece mostrare i Campi solo al Proprietario dell'Attrezzo richiesto e all'Utente Richiedente l'Attrezzo, nascondendoli a tutti gli altri Utenti. Vogliamo inoltre aggiungere alla Richiesta alcune informazioni sull'Attrezzo prestato e sull'eventuale Prestito concesso in risposta alla Richiesta. In questo modo non solo arricchiamo la pagina, ma la proteggiamo anche da sguardi indiscreti.
Come primo passaggio nascondiamo i Campi della Richiesta a tutti gli Utenti e poi affidiamo ad una EVA il compito di mostrarli solo a quei due Utenti. Al di là del caso specifico, questo metodo è di utilità generale, quando appunto si voglia controllare la visualizzazione dei Campi di una Entità in base alle caratteristiche dell'Utente.
| nascondi i Campi della Entità | In Struttura - Tipi di contenuto - Richiesta - Gestione visualizzazione trascina tutti i Campi sotto Disattivati. |
Creiamo ora la EVA che mostra i Campi della Richiesta, dell'Attrezzo prestato e del Prestito, riservandola ai soli Richiedente ('Autore della Richiesta) e Proprietario (Autore dell'Attrezzo):
| crea la EVA | In Struttura - Viste crea la Vista "Mostra Richiesta". in Mostra scegli contenuto di tipo "Richiesta". Attiva la creazione di una Pagina, mostra il risultato come Elenco non formattato di Campi In Elementi da visualizzare scegli 1, perché mostreremo una sola Richiesta. Disattiva il paginatore. Salva. Nella sezione Visualizzazioni della Vista clicca Aggiungi - EVA. Appare una nuova Visualizzazione EVA. |
| associa la EVA al tipo di Entità | Nella sezione Entity content settings, come Tipo di Entità seleziona Contenuto e come Bundle seleziona "Richiesta" |
| specifica l'identificativo dell'Entità in cui mostrarla | Nella sezione Filtri contestuali aggiungi ID - Contenuto |
| identifica il Richiedente, grazie alla relazione Attrezzo → Autore | Nella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto e rinomina come "Richiedente" |
| identifica l'Attrezzo, grazie alla relazione Richiesta → Attrezzo | Nella sezione Relazioni aggiungi Contenuto referenziato da field_attrezzo_richiesta - Contenuto - Appare in: richiesta e rinominalo "Attrezzo" |
| identifica il Proprietario, grazie alla relazione Attrezzo → Autore | Nella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto, come Relazione seleziona "Attrezzo" e rinomina come "Proprietario" |
| identifica l'eventuale Prestito, grazie alla relazione Prestito→ Richiesta usata in senso inverso | Nella sezione Relazioni aggiungi Contenuto - Contenuto referenziato da field_richiesta_prestito - Appare in: prestito e rinomina come "Prestito" |
| limita la Vista ai soli Richiedente e Proprietario | Come abbiamo già visto, nella sezione Criteri del filtro:
|
| mostra le informazioni relativa alla Richiesta ed all'Attrezzo | nella sezione Campi:
|
Aggiungiamo alla pagina della Richiesta una seconda EVA, che elenca (sempre solo al Richiedente ed al Proprietario) le Consegne dell'Attrezzo effettuate. Mentre nella precedente EVA l'Entità nella cui pagina viene richiamata la Vista (la Richiesta) coincide con l'Entità elencata dalla Vista, in questa seconda EVA l'Entità nella cui pagina viene richiamata la Vista (sempre la Richiesta) non coincide con le Entità elencate dalla Vista (le Consegne associate alla Richiesta). Questa differenza è evidenziata dal Filtro contestuale della EVA: nella prima EVA è semplicemente l'identificativo della Richiesta Contenuto - ID, nella seconda l'identificativo della Richiesta deve essere messo in Relazione con le Consegne. Ecco come:
| crea la EVA | In Struttura - Viste crea la Vista "Consegne della Richiesta". in Mostra scegli contenuto di tipo "Consegna". Attiva la creazione di una Pagina, mostra il risultato come Tabella o Responsive grid di Campi. In Elementi da visualizzare scegli 0, per mostrare tutte le Consegne associate alla Richiesta. Disattiva il paginatore. Salva. Nella sezione Visualizzazioni della Vista clicca Aggiungi - EVA. Appare una nuova Visualizzazione EVA. |
| associa la EVA al tipo di Entità | Nella sezione Entity content settings, come Tipo di Entità seleziona Contenuto e come Bundle seleziona "Richiesta" |
| identifica le Consegne associate alla Richiesta, grazie alla catena di relazioni Consegna → Prestito e Prestito → Richiesta | Nella sezione Relazioni aggiungi Contenuto referenziato da field_prestito_consegna - Contenuto - Appare in: consegna e rinominalo "Prestito". Aggiungi Contenuto referenziato da field_richiesta_prestito - Contenuto - Appare in: prestito, come Relazione seleziona "Prestito" e rinominalo "Richiesta". |
| specifica l'identificativo dell'Entità in cui mostrarla, che è la Richiesta richiamata dal Prestito, a sua volta richiamato dalle Consegne. | Nella sezione Filtri contestuali aggiungi ID - Contenuto, come Relazione seleziona "Richiesta" |
| limita la Vista ai soli Richiedente e Proprietario | Come abbiamo già visto, nella sezione Criteri del filtro:
|
| mostra le informazioni relativa alle Consegne | nella sezione Campi aggiungi i Campi della Consegna |
Posizionare le EVA nella pagina
Nella visualizzazione della pagina dell'Entità, ogni EVA è trattata come se fosse un Campo aggiuntivo dell'Entità stessa e può quindi essere posizionato a piacere rispetto ai Campi non nascosti ed alle eventuali altre EVA. Come abbiamo già visto per i Campi veri e propri, per ordinare le EVA tra loro e rispetto ai Campi non nascosti dell'Entità:
| riordina Campi e EVA dell'Entità | In Struttura - Tipo di Contenuto - TIPO DEL CONTENUTO- Gestione visualizzazione trascina i "campi" di nome EVA nell'ordine desiderato e salva. |
Cosa sono i comandi
Una app costruita con Drupal si presente è come un insieme di pagine, che mostrano informazioni e comandi. Un comando è semplicemente un testo che, cliccato dall'Utente, lancia un link. Il link può essere l'indirizzo di visualizzazione, creazione, modifica o eliminazione di un Entità, di esecuzione di una Vista o di una procedura. In base al particolare tema grafico utilizzato, il comando può presentarsi come un semplice link o come un pulsante. In questa Guida vediamo come aggiungere comandi nella pagina di una Entità o all'interno di una Vista.
| APPROFONDIMENTO SUI LINK: un comando può essere aggiunto in un qualunque Campo testuale di Drupal scrivendo il codice nel linguaggio HTML <a href="LINK">TESTO</a>, dove LINK è il link che viene richiamato quando si clicca il comando e TESTO è il testo che viene presentato all'Utente. Poiché in MieApp cerchiamo di costruire la app senza scrivere codice, utilizzeremo Campi speciali che ci evitano di scrivere il codice HTML. |
APPROFONDIMENTO SUI PULSANTI: di default, un comando viene mostrato come un semplice link, ad esempio Per mostrarlo come un pulsante, ci serve conoscere il nome della "classe" che trasforma i link in pulsanti nel particolare tema grafico che stiamo usando. La "classe" è un pezzo di codice scritto nel linguaggio CSS ma, per gli scopi di MieApp, non ci serve conoscere quel linguaggio, ma solo sapere il nome della classe che genera il pulsante. Per scoprirlo puoi provare così:
Ed ecco come viene mostrato il link: Tuoi Attrezzi |
Aggiungere comandi alla pagina di una Entità
Nella pagina che mostra una Entità, Drupal mostra nativamente i comandi per modificarla ed eliminarla agli Utenti che hanno i Permessi per queste operazioni. Per aggiungere ulteriori comandi utili alla nostra app possiamo utilizzare le Viste EVA che, come abbiamo visto, consentono appunto di mostrare informazioni aggiuntive alle pagine delle Entità.
Come esempio, vediamo come aggiungere il comando "Chiedi in prestito" sulla pagina di un Attrezzo nella app "Vicinato". Il comando deve essere mostrato ai Partecipanti diversi dal Proprietario dell'Attrezzo e solo se l'Utente non ha già una Richiesta aperta sullo stesso Attrezzo. Per realizzare questa logica creiamo due Viste:
- una Vista che mostra il comando "Chiedi il prestito" precaricando l'identificativo dell'Attrezzo
- una EVA che, richiamata nella pagina dell'Attrezzo, cerca l'eventuale Richiesta già aperta dell'Utente corrente sull'Attrezzo e, se non esiste, richiama la Vista che mostra il comando
La catena di richiamo è quindi questa:
- L'Utente richiama la pagina di un Attrezzo
- La pagina dell'Attrezzo richiama automaticamente la EVA 2, che cerca una Richiesta aperta dall'Utente sull'Attrezzo
- se la Richiesta esiste, la EVA la mostra all'Utente
- se la Richiesta non esiste, la EVA richiama automaticamente la Vista 1, che mostra all'Utente il comando "Chiedi in prestito"
- Se l'Utente clicca il comando, viene richiamata la pagina di creazione di nuova Richiesta
Vediamo come costruire le due Viste. La Vista 1 che mostra il comando riceve come nella sezione Filtri contestuali l'identificativo dell'Attrezzo e nella sezione Campi mostra il comando:
| crea la Vista | In Struttura - Viste crea la Vista "Comando Chiedi in Prestito". in Mostra scegli contenuto di tipo "Attrezzo". Attiva la creazione di una Pagina, mostra il risultato come Elenco non formattato di Campi In Elementi da visualizzare scegli 1, perché elenchiamo solo l'Attrezzo selezionato dal Filtro contestuale. Disattiva il paginatore. Salva. |
| ricevi come Filtro contestuale l'identificativo dell'Attrezzo | Nella sezione Filtri contestuali aggiungi ID - Contenuto. Come abbiamo visto, l'identificativo viene memorizzato nel Token {{ raw_arguments.nid }} per poter essere usato nel resto della Vista |
| identifica il Proprietario dell'Attrezzo, grazie alla relazione Attrezzo → Autore | Nella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto e rinomina come "Proprietario" |
| non mostrare la Vista al Proprietario | Nella sezione Criteri del filtro aggiungi Utente - Corrente - Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "Proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona no |
| mostra il comando | nella sezione Campi aggiungi il Campo Globale - Testo personalizzato. In Testo digita "Chiedi l'Attrezzo in prestito". In Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato. In Percorso del link digita il link che richiama la pagina di creazione di una Richiesta precaricando nel suo Campo "Attrezzo" l'identificativo dell'Attrezzo: "/node/add/richiesta?attrezzo={{ raw_arguments.nid }}" |
La Vista 2 è una EVA richiamata dalla pagina dell'Attrezzo. In essa sfruttiamo la sezione Comportamento se non ci sono risultati che viene attivata quando la Vista non ha Richieste da mostrare; in questa sezione aggiungiamo il Campo speciale Globale - Area della vista - Inserisce una vista all'interno di un area, che permette di richiamare la Vista "Comando Chiedi in Prestito":
| crea la EVA | In Struttura - Viste crea la Vista "Richiesta aperta su Attrezzo". in Mostra scegli contenuto di tipo "Richiesta". Attiva la creazione di una Pagina, mostra il risultato come Elenco non formattato di Campi In Elementi da visualizzare scegli 1, perché mostreremo una sola Richiesta. Disattiva il paginatore. Salva. Nella sezione Visualizzazioni della Vista clicca Aggiungi - EVA. Appare una nuova Visualizzazione EVA. |
| associa all'Attrezzo le Richieste che si riferiscono ad esso, grazie alla relazione Richiesta → Attrezzo | Nella sezione Relazioni aggiungi Contenuto referenziato da field_attrezzo_richiesta - Contenuto - Appare in: richiesta e rinominalo "Attrezzo" |
| mostra la EVA nella pagina dell'Attrezzo | Nella sezione Entity content settings, come Tipo di Entità seleziona Contenuto e come Bundle seleziona "Attrezzo" |
| riceve l'identificativo dell'Attrezzo dalla pagina che la richiama | Nella sezione Filtri contestuali aggiungi ID - Contenuto, come Relazione seleziona "Attrezzo" |
| identifica il Richiedente, grazie alla relazione Richiesta → Autore | Nella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto e rinomina come "Richiedente" |
| identifica il Proprietario dell'Attrezzo, grazie alla relazione Attrezzo → Autore | Nella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto, come Relazione seleziona "Attrezzo" e rinomina come "Proprietario" |
| non mostrare la Vista al Proprietario | Nella sezione Criteri del filtro aggiungi Utente - Corrente - Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "Proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona no |
| cerca l'eventuale Richiesta aperta già espressa dall'Utente corrente | Nella sezione Criteri del filtro aggiungi Utente - Corrente - Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "Richiedente", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si. Aggiungi Contenuto - Stato - Appare in Richiesta e seleziona tutti gli stati tranne "conclusa". |
| se la Richiesta esiste, avvisa l'Utente mostrando il link alla Richiesta | nella sezione Campi aggiungi il Campo "titolo", in Risultati di riscrittura attiva Sovrascrivere l'output di questo campo con testo personalizzato e come Testo digita "Hai già chiesto questo Attrezzo con {{ title__value }}", dove {{ title__value }} è il Token che contiene il titolo della Richiesta prima della sovrascrittura, cioè il titolo originale della Richiesta. |
| se la Richiesta non esiste, esegue la Vista che mostra il comando "Chiedi in prestito" | nella sezione Comportamento se non ci sono risultati aggiungi Globale - Area della vista - Inserisce una vista all'interno di un area, seleziona la Vista "Comando Chiedi in prestito" e attiva Eredita filtri contestuali per passarle l'identificativo dell'Attrezzo. |
Aggiungere comandi in una Vista
Nella costruzione di una app risulta spesso utile aggiungere comandi in una Vista. Il comando può essere aggiunto sopra o sotto l'elenco delle Entità mostrato in una Vista oppure a fianco delle singole Entità elencate nella Vista. Vediamo esempi concreti e come realizzarli per entrambi i casi.
COMANDI SOPRA O SOTTO L'ELENCO DELLE ENTITA'
Un comando collocato fuori (sopra o sotto) l'elenco delle Entità mostrato da una Vista è tipicamente utilizzato per aggiungere una nuova Entità all'elenco o per passare ad un altra pagina della app. Ad esempio, vediamo come aggiungere i comandi "Aggiungi Attrezzo" e "Magazzino" alla Vista "Tuoi Attrezzi", che elenca gli Attrezzi di proprietà dell'Utente corrente nella app "Vicinato".
Per aggiungere alla Vista un comando senza scrivere codice HTML, raccomando di installare ed attivare il modulo aggiuntivo Views Linkarea, che mette a disposizione un nuovo Campo speciale Globale - Link - Provide an internal or external link, che può essere aggiunto nella sezione Intestazione per mostrare un comando sopra l'elenco delle Entità, oppure nella sezione Piè di pagina per mostrarlo sotto l'elenco.
Come esempio, aggiungiamo alle Vista "Magazzino" e "Tuoi Attrezzi" della app "Vicinato" costruite nelle Guide precedenti i comandi per passare da una Vista all'altra e per andare al Cruscotto della app. In "Tuoi Attrezzi" vogliamo aggiungere anche il comando "Aggiungi Attrezzo" per consentire all'Utente di caricare un nuovo Attrezzo nella app.
Per aggiungere alla Vista "Tuoi Attrezzi" il comando "Aggiungi Attrezzo":
| aggiungi il comando sopra l'elenco | nella sezione Intestazione della Vista "Tuoi Attrezzi" aggiungi il Campo Globale - Link - Provide an internal or external link |
| mostra il comando anche se non ci sono ancora Attrezzi | nella configurazione del Campo attiva l'opzione Visualizza anche se la vista non da risultati |
| scegli il testo con cui il comando si mostra | in Testo del collegamento digita "Aggiungi Attrezzo" |
| definisci cosa esegue il comando | in Percorso del link digita il link che richiama la pagina di creazione di un Attrezzo "/node/add/attrezzo" |
Per aggiungere il comando "Magazzino" si procede allo stesso modo, aggiungendo nella sezione Intestazione un secondo Campo Globale - Link - Provide an internal or external link configurato così: Testo del collegamento: "Magazzino"; Percorso del link: "/magazzino").
COMANDI SULLA SINGOLA ENTITA' ELENCATA
Per aggiungere su ogni singola Entità elencata nella Vista un comando che agisce su quella Entità, puoi aggiungere nella sezione Campi un Campo Globale - Testo personalizzato - Fornisce testo o link personalizzato e configurarlo perché richiami un'altra Vista o una procedura, passandole l'identificativo dell'Entità. Ad esempio, se volessimo mostrare a fianco degli Attrezzi elencati nella Vista "Tuoi attrezzi" della app "Vicinato" un comando "Richieste aperte" che, cliccato, elenca le Richieste aperte sull'Attrezzo:
| trova l'identificativo dell'Attrezzo e nascondilo | nella sezione Campi della Vista aggiungi ID - Contenuto e attiva Escludi dalla visualizzazione |
| aggiungi il Campo che conterrà il comando | nella sezione Campi aggiungi Globale - Testo personalizzato |
| definisci come si presenta il comando all'utente | come Testo del Campo digita "Richieste aperte", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato. |
| definisci cosa succede quando l'utente clicca il comando | come Percorso del link digita l'indirizzo della Vista che elenca le Richieste aperte sull'Attrezzo (es. "/richieste-aperte-attrezzo") passandole l'identificativo dell'Attrezzo stesso, che è contenuto nel Token {{ nid }} corrispondente al Campo nascosto e che trovi elencato sotto Replacement patterns, es. "/richieste-aperte/{{ nid }}". |
In questa Guida aggrego per motivi didattici diversi metodi che consentono di personalizzare la visualizzazione del valore di un Campo in una Vista. Tutti questi metodi agiscono sui Campi elencati nella sezione Campi della Vista e non alterano il valore del Campo, ma solo la sua visualizzazione.
Mostrare un valore di default
Se un Campo non contiene un valore, non viene mostrato nulla. Se invece vuoi mostrare un valore di default, nella configurazione del Campo, sotto Comportamento se non ci sono risultati digita il valore in Testo per Nessun risultato
Accorciare e semplificare il valore mostrato
Se un Campo contiene un valore molto lungo, si può accorciarlo, evitando comunque di troncare a metà una parola: nella configurazione del Campo, sotto Risultati di riscrittura attiva Troncare questo campo a un numero massimo di caratteri, scegli in Massimo numero di caratteri il numero massimo di caratteri da mostrare e attiva Taglia solo ai limiti delle parole per non troncare le parole. Se vuoi semplificare il valore mostrato eliminando le formattazioni (es, grassetto), attiva anche Rimuovi i tag HTML
Comporre più Campi in un solo Campo
Per comporre il valore di più Campi in un solo Campo possiamo usare i Token associati ai Campi da comporre. Ad esempio, se le Entità elencate dalla Vista hanno un Campo "Nome" ed un Campo "Cognome" e vogliamo mostrarli concatenati come "Nome Cognome" in un solo Campo "Identità":
| nascondi i Campi | Nella configurazione dei Campi "Nome" e "Cognome" attiva l'opzione Escludi dalla visualizzazione |
| crea il Campo che li aggrega | Aggiungi il Campo speciale Globale - Testo personalizzato - Fornisce testo o link personalizzato e come Etichetta digita "Identità" |
| inserisci nel Campo i valori del Campi nascosti | Nella configurazione del Campo speciale sotto Schemi di sostituzione trova i Token corrispondenti ai Campi nascosti, copiali ed incollali in Testo, es. "{{ field_nome }} {{ field_nome }}" |
Campi condizionati
Se installiamo ed attiviamo il modulo aggiuntivo "Views Conditional", si rende disponibile nelle Viste il Campo speciale Views Conditional - Viste - Output data based off of certain criteria che mostra un valore tra due possibili alternative, in base al valore di un Campo. Ad esempio, vogliamo anteporre alla concatenazione nome + cognome dell'esempio precedente il titolo "sig." o "sig.ra" in base al Campo Sesso dell'Entità.
La configurazione di questo Campo speciale (che chiamerò per brevità Campo condizionato) prevede questi parametri:
| if this field | Seleziona il Campo "condizionante" cioè il Campo il cui valore stabilisce cosa mostrare nel Campo condizionato. Sono selezionabili tutti i Campi che precedono il Campo condizionato nell'elenco dei Campi. Nell'esempio, selezioniamo il Campo "Sesso" |
| Is... | Seleziona l'Operatore da applicare al valore del Campo condizionante: "vuoto", "non vuoto", "maggiore di", "inizia per" ecc. (es. "contiene") |
| This value | Digita il Valore da confrontare col valore del Campo condizionante. Puoi digitare un valore fisso (es. "M") oppure un Token corrispondente ad uno dei Campi che precedono il Campo condizionato. I Token disponibili sono elencati sotto Replacement Variables |
| Then output this | Digita il valore assegnato al Campo condizionato se la condizione formata dal valore del Campo condizionante + Operatore + valore da confrontare è VERA. (es. "Sig. {{ field_nome }} {{ field_nome }}" |
| Otherwise output this | Digita il valore assegnato al Campo condizionato se la condizione formata dal valore del Campo condizionante + Operatore + valore da confrontare è FALSA, (es. "Sig.ra {{ field_nome }} {{ field_nome }}" |
Un tipico utilizzo dei Campi condizionati è quello di oscurare informazioni in base all'Utente corrente. Ad esempio, se nella app "Vicinato" vogliamo una Vista che elenchi tutte le Richieste aperte su un Attrezzo, mostrando i dettagli solo per quelle dell'Utente corrente:
| Data | Richiesta | Richiedente | Stato |
| 10 Gen 2026 | --- | --- | In corso |
| 12 Gen 2026 | Richiesta n.324 | TU | Aperta |
| 14 Gen 2026 | --- | --- | Aperta |
possiamo oscurare i Campi usando Campi condizionati dal confronto tra l'Utente corrente e l'Utente Richiedente della singola Richiesta:
| identifica il Richiedente della Richiesta | nella sezione Relazioni aggiungi il Campo Contenuto - Utente - Nome utente dell'autore del contenuto e rinomina "Richiedente" |
| memorizza l'identificativo del Richiedente | nella sezione Campi aggiungi il Campo Utente - ID utente - ID dell'utente, come Relazione seleziona "Richiedente" e nascondilo. |
| memorizza l'identificativo dell'Utente corrente | nella sezione Campi aggiungi il Campo Globale - Testo personalizzato - Fornisce testo o link personalizzato e come Testo scrivici il Token {{ drupal_token('current-user:uid') }} che, come abbiamo visto, contiene l'identificativo dell'Utente corrente. A questo Campo corrisponde il Token {{ nothing }} |
| se il Richiedente coincide con l'Utente corrente mostra i dettagli della Richiesta, altrimenti oscurali | nella sezione Campi aggiungi il Campo "Creato il" con Etichetta "Data". Aggiungi il Campo "Titolo" e nascondilo. Aggiungi il Campo condizionato Viste - Views Conditional - Output data based off of certain criteria. Come Etichetta digita "Richiedente". Configura il Campo in questo modo:
Allo stesso modo procedi per mostrare o nascondere il Campo "Richiesta" |
Concatenazione di Campi condizionati
Un limite del Campo condizionato è che permette di scegliere solo tra due valori. Questo limite può essere superato concatenando più Campi condizionati. Come tutti gli altri Campi di Drupal, anche al Campo condizionato corrispondente un Token, di nome {{ views_conditional_field }} che può essere utilizzato come parametro nella impostazione di un successivo Campo condizionato, il cui valore dipenderà quindi dal valore del primo Campo condizionato. La concatenazione può estendersi a tre o più Campi condizionati, i cui Token saranno {{ views_conditional_field }}, {{ views_conditional_field_1 }}, {{ views_conditional_field_2 }} ecc.
Nelle Guide precedenti abbiamo visto come richiamare una o più Viste nella pagina di una Entità. Abbiamo anche visto come richiamare una Vista alternativa quando una Vista non dà alcun risultato. In questa Guida generalizziamo la costruzione di Viste complesse che richiamano altre Viste e vediamo anche come richiamare Viste dentro Campi testuali di una Entità.
Richiamare una Vista sopra o sotto l'elenco di una Vista
Data una Vista che elenca Entità di un certo tipo (Vista "primaria"), è possibile arricchirla richiamando sopra o sotto l'elenco una o più Viste "secondarie", anche basate su Entità differenti.
Ad esempio, nella app "Vicinato" abbiamo una Vista "Prestiti conclusi" che, se richiamata col link
/prestiti-conclusi/ID
elenca i Prestiti conclusi sull'Attrezzo con identificativo ID. Per mostrare in testa a questa Vista primaria alcuni dettagli dell'Attrezzo (es. il suo nome e la sua immagine), creiamo una Vista secondaria "Dettagli di Attrezzo" che, come la primaria, accetta come Filtro contestuale l'identificativo dell'Attrezzo. Ecco come richiamare la Vista secondaria "Dettagli di Attrezzo" in testa all'elenco dei prestiti mostrato dalla Vista primaria "Prestiti conclusi":
| posiziona la Vista secondaria nella intestazione della Vista primaria | Nella sezione Intestazione della Vista "Prestiti conclusi" aggiungi il Campo speciale Globale - Area della vista - Inserisce una vista all'interno di un area e seleziona la Vista "Dettagli di Attrezzo" |
| passa alla Vista secondaria l'identificativo dell'Attrezzo ricevuto dalla Vista primaria | Attiva l'opzione Eredita filtri contestuali |
Per richiamare una Vista secondaria sotto l'elenco delle Entità della Vista primaria, il Campo Globale - Area della vista va aggiunto nella sezione Piè di pagina anziché nella Intestazione.
| ATTENZIONE: un limite di questo metodo è che i Filtri contestuali delle due Viste devono essere gli stessi, perché non è possibile selezionare quali Filtri passare dalla primaria alla secondaria, ma solo attivare o meno l'opzione Eredita filtri contestuali, che passa tutti i valori dei Filtri contestuali della Vista primaria all'altra. |
Richiamare più Viste dentro una Vista
Un metodo più generale per presentare più Viste in una sola pagina della app consiste nel creare una Vista (primaria) che funge da contenitore di altre Viste (secondarie), richiamate nella sezione Campi della Vista primaria. Come esempio, vediamo la costruzione della pagina "Cruscotto" della app "Vicinato". Questa pagina mostra all'Utente corrente un insieme di informazioni di diverso tipo che lo riguardano. Il contenuto del Cruscotto cambia radicalmente se l'Utente corrente è un Operatore di sede o un Gestore, per semplicità didattica vediamo solo il caso del Partecipante ai prestiti:
- DATI PERSONALI: il suo nome ed un link alla pagina dei suoi dati personali
- I TUOI PRESTITI: i suoi prestiti aperti, il link ai suoi Attrezzi e un link ai suoi prestiti conclusi
- LE TUE RICHIESTE: le sue richieste aperte, il link al Magazzino e un link alle sue richieste concluse
Poiché il punto di vista del Cruscotto è l'Utente corrente, conviene costruire la Vista "Cruscotto" come una Vista basata sull'Entità Utente e filtrata sull'Utente corrente. Nella sezione Campi della Vista aggiungeremo sia Campi dell'Utente (il suo nome, il link che punta alla pagina del suoi dati), sia Campi che richiamano altre Viste che elencano altri tipi di Entità (Prestiti, Richieste).
Quest'ultima possibilità è offerta dal modulo aggiuntivo "Views Field View". Installato ed attivato questo modulo, per richiamare una Vista secondaria dentro la Vista primaria basta aggiungere nella sezione Campi della Vista primaria il nuovo tipo di Campo Globale - Visualizza - Embed a view as a field. This can cause slow performance, so enable some caching. Nella configurazione di questo Campo si specifica la Vista secondaria da richiamare, quale Visualizzazione e gli eventuali argomenti da passare.
Esemplifichiamo questo metodo costruendo il Cruscotto sopra descritto. Anzitutto dobbiamo costruire le Viste secondarie che elencano prestiti e richieste aperti e conclusi di cui è Autore l'Utente corrente. Queste Viste possono essere agevolmente costruite sulla base di quanto già descritto nelle Guide precedenti come Variazioni di una Vista "Richieste", che elenca le Richieste e alcune informazioni degli eventuali Prestiti ad esse associate, filtrate sullo Stato della Richiesta e sull'Utente corrente nel seguente modo:
| Visualizzazione | Indirizzo | Stato della Richiesta | Utente corrente |
| Tue Richieste aperte | /richieste-aperte | diverso da Conclusa | Richiedente |
| Tue Richieste concluse | /richieste-concluse | Conclusa | Richiedente |
| Tuoi Prestiti aperti | /prestiti-aperti | diverso da Conclusa | Proprietario |
| Tuoi Prestiti conclusi | /prestiti-conclusi | Conclusa | Proprietario |
Costruite queste Visualizzazioni, la Vista "Cruscotto" è costruita come una semplice Vista basata sull'Utente corrente e che richiama una dopo l'altra le quattro Visualizzazioni nella propria sezione Campi, quindi come se fossero quattro Campi dell'Utente:
| crea la Vista primaria "Cruscotto" | In Struttura - Viste crea la Vista "Cruscotto". In Mostra seleziona Utente. Attiva la creazione di una Pagina, mostra il risultato come Elenco non formattato di Campi. In Elementi da visualizzare seleziona 1, perché mostreremo un solo Utente (quello corrente). Disattiva il paginatore. Salva. |
| limita la Vista agli Utenti Partecipanti | Nella sezione Impostazione pagina - Accesso seleziona Ruolo e seleziona "Partecipante" |
| filtra la Vista sull'Utente corrente | Nella sezione Criteri del filtro aggiungi il Campo Utente - Corrente, come operatore seleziona è uguale a e come è l'utente autenticato seleziona si |
| mostra il nome dell'Utente | Nella sezione Campi aggiungi il Campo Utente - Nome con Etichetta "I tuoi dati:" e attiva Link all'utente per trasformare il nome in un link alla pagina coi dati personale dell'Utente |
| elenca i prestiti aperti concessi dall'Utente richiamando la Vista "Richieste" - Visualizzazione "Tuoi Prestiti aperti" | Nella sezione Campi aggiungi il Campo speciale Globale - Visualizza, in Visualizza seleziona la Vista "Richieste" e in Visualizzazione seleziona "Tuoi prestiti aperti". Non è necessario specificare i Filtri contestuali da passare, perché la Vista "Richieste" identifica l'Utente corrente da sé. ATTENZIONE: Per un difetto attualmente presente in Drupal, può capitare che la sezione della Vista e/o della Visualizzazione fallisca e venga selezionata la prima Vista elencata. Se accade, per rimediare è sufficiente aprire nuovamente la configurazione del Campo e riselezionare. |
| mostra i comandi "Tuoi Attrezzi" e "Tuoi Prestiti conclusi" | Come abbiamo già visto nella sezione Campi aggiungi il Campo speciale Globale - Testo personalizzato, come Testo digita "Tuoi Attrezzi", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato e come Percorso del link digita "/tuoi-attrezzi". Aggiungi un altro Campo Globale - Testo personalizzato, come Testo digita "Tuoi Prestiti conclusi", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato e come Percorso del link digita "/prestiti-conclusi". |
| elenca le richieste aperte avanzate dall'Utente richiamando la Vista "Richieste" - Visualizzazione "Tue Richieste aperte" | Nella sezione Campi aggiungi un altro Campo Globale - Visualizza, in Visualizza seleziona la Vista "Richieste" e in Visualizzazione seleziona "Tue Richieste aperte". |
| mostra i comandi "Magazzino" e "Tue Richieste concluse" | Nella sezione Campi aggiungi un altro Campo Globale - Testo personalizzato, come Testo digita "Magazzino", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato e come Percorso del link digita "/magazzino". Aggiungi un altro Campo Globale - Testo personalizzato, come Testo digita "Tue Richieste concluse", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato e come Percorso del link digita "/richieste-concluse". |
Catene di Viste e loro limitazioni
A loro volta, le Viste secondarie richiamate dalla Vista primaria potrebbero richiamare ulteriori Viste, creando così una catena di Viste. Anche se Drupal non pone limiti alla lunghezza di questa catena, è necessario considerare tre potenziali problemi, che inducono a limitare la catena a due o tre richiami:
- la Vista primaria non viene presentata fino a quando non sono state completate le operazioni che preparano le Viste sottostanti, quindi la app potrebbe rallentare significativamente
- Per lo stesso motivo, potrebbe capitare che la complessità delle interrogazioni del database mandino in errore la app
- occorre evitare richiami "ricorsivi", cioè una Vista A che richiama una Vista B che a sua volta richiama la Vista A
Il primo problema è teoricamente risolvibile abilitando la Cache della Vista (vedi Guida) ed evitando così che Drupal debba ogni volta ricostruire tutte le Viste richiamate. Questa soluzione però rischia di presentare all'Utente informazioni non aggiornate e quindi è attuabile solo se la Vista contiene informazioni che cambiano poco nel tempo.
Richiamare Viste in un testo
Se installiamo ed attiviamo il modulo aggiuntivo "Insert View", possiamo richiamare una o più Viste in un qualunque Campo testuale di una qualunque Entità. Il modulo mette infatti a disposizione il Token:
[view:NAME=DISPLAY=ARGS]
in cui:
- NAME è il nome ad uso interno della Vista, nome elencato in Struttura - Viste; è l'unico parametro obbligatorio per questo Token.
- DISPLAY è il nome della Visualizzazione della Vista, nome mostrato nella sezione Altro della Vista come Nome ad uso interno. Se la Vista ha una sola Visualizzazione, si può omettere questo parametro
- ARGS sono gli eventuali valori passati ai Filtri contestuali della Vista, separati da /. Se la Vista non prevede Filtri contestuali, su può omettere questo parametro dal Token
Se scriviamo questo Token nel testo di un Campo testuale, quando l'Entità viene visualizzata il Token viene sostituito dal contenuto della Vista.
Questo metodo consente di costruire agevolmente pagine in cui sono mescolati testi fissi, immagini e informazioni elencate da Viste, per formare ad esempio un documento complesso basato sulle informazioni contenute nelle Entità della app. Per funzionare, il Campo testuale deve essere configurato con un Formato che accetti il Token [view].
La cache della Vista
Può capitare che una Vista mostri un elenco non aggiornato delle Entità in essa richiamate. Supponendo di non aver commesso errori nella costruzione della Vista, il problema può nascere dal fatto che, per motivi di maggiore efficienza, Drupal presenti una "fotografia" datata delle informazioni, prelevandola dalla propria "cache" (memoria temporanea), anziché andarle a pescare in tempo reale nel database. Ciò può più facilmente accadere quando la Vista è particolarmente complessa, come ad esempio in Viste che richiamano altre Viste. Se la nostra app gestisce informazioni quasi statiche, questo non è un problema, ma può diventarlo in app (come quella di esempio) in cui invece le informazioni variano da un momento all'altro e vogliamo che gli Utenti abbiano sempre una visione aggiornata su quanto accade nella app.
Per evitare che una Vista presenti informazioni non aggiornate occorre modificare nella sua configurazione il meccanismo di caching: nella sezione Altro - Caching della Vista seleziona una delle modalità previste:
- Basato su tag: la Vista viene aggiornata ogni volta che cambiano le informazioni su cui è basata; questa modalità è teoricamente la migliore, ma in alcune situazioni può comunque non aggiornare la Vista al variare delle informazioni.
- Basata sul tempo: la Vista viene aggiornata ad intervalli temporali predefiniti; questa modalità non è adeguata se la app deve sempre presentare informazioni senza ritardi
- Nessuna: la Vista viene aggiornata ogni volta che l'Utente la richiama; questa modalità garantisce che le informazioni siano sempre aggiornate, ma può rallentare il funzionamento della app
La cache di Drupal
In base a come Drupal è stato installato, può capitare che una nuova Vista (o più facilmente una nuova Visualizzazione di una Vista) non venga mostrata all'Utente, nonostante sia stata correttamente costruita e nonostante sia visibile nella sezione Anteprima della Vista stessa. In questi casi, prima di disperarsi si può provare a svuotare la cache di Drupal, forzandolo così ad aggiornare tutte le pagine della app: basta dare il comando Configurazione - Prestazioni - Svuota tutta la cache.
da scrivere
Quando l'Utente compila un Campo Riferimento, gli viene normalmente mostrata una casella in cui digitare il titolo delle Entità. A mano a mano che l'Utente digita caratteri nella casella, Drupal gli presenta un elenco di Entità il cui titolo contiene i caratteri digitati. Questa modalità di compilazione di un Campo Riferimento è utile se le Entità richiamabili nel Campo sono molto numerose e se è ragionevole supporre che l'Utente conosca - almeno parzialmente - i loro titolo.
Se invece il numero di Entità richiamabili è piccolo, può essere più comodo per l'Utente presentargli un elenco in cui selezionare direttamente l'Entità, cioè senza che ne debba conoscere a priori il titolo e digitarne i caratteri. A questo scopo risulta utile una particolare Visualizzazione delle Viste, chiamata Entity Reference, (dalla versione 11 di Drupal questa Visualizzazione è stata aggiunta al Core e quindi non serve più installare un modulo aggiuntivo, segnale del successo di questa funzione). Il metodo prevede due passaggi:
- Creare una Vista con Visualizzazione Entity Reference
- Applicare la Vista al Campo Riferimento
Come semplice esempio, vediamo nella app "Vicinato" come elencare le Categorie nel Campo Riferimento "Categoria" dell'Entità di tipo "Attrezzo".
Creare una Vista con Visualizzazione Entity Reference
Per creare questa Vista, prima creiamo una Visualizzazione "normale" (tipicamente Elenco non formattato) e poi aggiungiamo alla Vista una Visualizzazione di tipo Entity Reference. Questo doppio passaggio si rende necessario perché la Visualizzazione Entity Reference non viene proposta all'atto della creazione della Vista. Una volta creata la Visualizzazione Entity Reference, dovremo specificare su quale campo eseguire la selezione. Ecco come:
| crea una Vista che elenca le Categorie | in Struttura - Viste crea una nuova Vista di nome "Selezione Categoria", formata da Contenuti di tipo Categoria, mostrati come elenco non formattato |
| elenca tutte le Categorie, ordinate per titolo | Nella sezione Campi aggiungi il Campo Titolo. Nella sezione Criteri di ordinamento aggiungi il Campo Titolo |
| aggiungi alla Vista una Visualizzazione Entity Reference | seleziona Duplica come Entity Reference: in Visualizzazioni appare una seconda Visualizzazione di nome "Entity Reference". Clicca su di essa. |
| configura la Visualizzazione | Nella sezione Formato - Elenco di riferimenti a entità - Impostazioni seleziona il Campo Titolo Nella sezione Paginazione - Elementi da visualizzare seleziona Visualizza tutti gli elementi (per motivi i di efficienza le Visualizzazioni Enitty Reference vengono di default limitate a 10 elementi ma in realtà funzionano bene anche con molti più elementi). |
Applicare la Visualizzazione al Campo Riferimento
Creata la Visualizzazione Entity Reference che elenca le Categorie, possiamo usarla come strumento per selezionare la Categoria nel Campo "Categoria" dell'Attrezzo:
| vai sul Campo Riferimento che deve usare la Visualizzazione | vai in Struttura - Tipi di Contenuto - Attrezzo - Gestisci Campi - Categoria - Modifica |
| predisponi il Campo ad usare una Visualizzazione Entity Reference | Come Metodo di riferimento seleziona Views filter by an entity reference view |
| applica al Campo la Visualizzazione Entity Reference | come Vista utilizzata per selezionare le entità seleziona la Visualizzazione Entity Reference che hai predisposto es. "Seleziona Categoria". |
| scegli di mostrare le Entità della Vista come un elenco da cui selezionare | In Struttura - Tipi di Contenuto - Attrezzo - Gestione visualizzazione form - Categoria, come Widget seleziona Elenco di selezione |
In questa Guida vediamo come svolgere calcoli nella tua app, in tre modi diversi:
- mostrare in una Vista un valore calcolato sulla base degli altri Campi della Vista
- mostrare in una Vista un valore calcolato su un Campo di tutte le Entità elencate nella Vista
- memorizzare nel Campo di una Entità un valore calcolato sulla base di Campi dell'Entità stessa o di altre Entità correlate all'Entità
Calcolare un Campo sulla base di altri Campi
Per questa esigenza possiamo installare e attivare il modulo aggiuntivo "Views Simple Math Field", che aggiunge alle Viste il Campo speciale Globale - Simple Math Field - Views field that performs simple math expressions. Nella configurazione del Campo è possibile scrivere una formula, che calcola un valore sulla base del valore degli altri Campi presenti nella Vista. Nella formula si possono inserire operatori matematici, logici e di confronto ed altre operazioni complesse.
Ad esempio, se una Entità "Prestito" ha un Campo data "Inizio" ed un Campo data "Fine", in una Vista possiamo elencare a fianco di ogni Prestito un Campo Simple Math Field "Durata" che mostra la durata in giorni del Prestito. Ecco come:
| mostra la data di inizio | nella sezione Campi della Vista aggiungi il Campo "Inizio" in un formato leggibile all'Utente, es 13 febbraio 2026 e come Etichetta digita "Data di Inizio" |
| prepara la data di inizio per il calcolo della durata | aggiungi un secondo Campo "Inizio", come Formattatore seleziona Personalizzato e come Formato data/ora digita "U": questo formato rappresenta la data come numero di secondi passati da una data fissa (1 gennaio 1970; per una spiegazione di questo riferimento temporale vedi Tempo (Unix) su Wikipedia). L'elenco completo dei formati possibili per le date è nella apposita pagina del Manuale PHP . Nascondi il Campo, perché non serve all'Utente ma al calcolo della durata. |
| mostra la data di fine | aggiungi il Campo "Fine" in formato leggibile e come Etichetta digita "Data di Fine" |
| prepara la data di fine per il calcolo della durata | aggiungi un secondo Campo "Fine", come Formattatore seleziona Personalizzato e come Formato data/ora digita "U". Nascondi il Campo |
| crea il Campo dove svolgere il calcolo della durata | aggiungi un Campo Simple Math Field e come Etichetta digita "Durata" |
| seleziona i Campi che userai nel calcolo | nella configurazione del Campo, in Select the fields to use in the formula seleziona i due Campi nascosti. A fianco di ogni Campo è evidenziato il nome del Token corrispondente, che ha la forma @NOMEINTERNODELCAMPO es. @field_inizio_1 e @field_fine_1 (il _1 finale dipende dal fatto che sono la seconda copia dei Campi) |
| scrivi nel Campo la formula che calcola la differenza in giorni | Come Formula del Campo digita la formula di calcolo, che utilizza i Token sopra indicati: (@field_fine_1 - @field_inizio_1) / 86400 +1 La spiegazione della formula è semplice: dentro la parentesi viene calcolata la differenza in secondi tra la data di fine e la data di inizio; il risultato viene poi diviso per il numero di secondi di un giorno (86400) per tradurre i secondi in giorni. Alla differenza in giorni così calcolata si aggiunge 1, per evitare di mostrare 0 nel caso di un prestito che inizia e finisce nel medesimo giorno. Attiva l'opzione Arrotonda scegliendo zero numeri dopo la virgola, per mostrare un numero intero di giorni. |
| ATTENZIONE: Se nella Formula utilizzi un Token presente in Select the fields to use in the formula che però non hai selezionato, la Vista può andare in errore. Per rimediare, basta tornare nell'editor della Vista ed attivare la spunta a fianco del Token. |
Un Campo Simple Math è trattato come un qualunque altro Campo, quindi ad esso corrisponde un Token - di nome {{ field_views_simple_math_field }} - che ne contiene il valore calcolato e che può essere a sua volta usato nei Campi successivi.
Calcolare un valore basato su un Campo di tutte le Entità elencate
Per calcolare un valore come somma o media di un Campo delle Entità elencate in una Vista occorre installare e attivare il modulo aggiuntivo "Views Aggregator Plus". Questo modulo aggiunge il nuovo formato Table with aggregation options, che consente di modificare in modo significativo una Vista, qui però ci limitiamo a sfruttarne la capacità di aggiungere in fondo ad una Vista il valore calcolato su uno dei Campi elencati. Ad esempio, alla Vista prima esemplificata aggiungiamo la media della durata dei Prestiti:
| attiva l'aggregazione | nella sezione Formato della Vista seleziona Table with aggregation options |
| calcola la media del Campo "Durata" | nella sezione Formato della Vista, sotto Impostazioni identifica il Campo "Durata", attiva Apply column function e seleziona Median |
Memorizzare in un Campo un valore calcolato
Il valore calcolato in un Campo Simple Math è mostrato all'Utente, ma non viene salvato nell'Entità ed è quindi disponibile solo dentro la Vista. Se invece vuoi salvare in un Campo dell'Entità un valore calcolato in base agli altri Campi dell'Entità stessa o di altre Entità, ci sono due modi:
- aggiungere all'Entità un Campo di tipo Computed, messo a disposizione dal modulo aggiuntivo "Computed Field"; ma la configurazione di questo Campo richiede di saper programmare in PHP e quindi non rientra negli scopi di MieApp.
- costruire una procedura ECA che, al salvataggio dell'Entità, esegue il calcolo partendo dagli altri Campi dell'Entità e memorizza il risultato in un ulteriore Campo dell'Entità stessa.
Memorizzare in un Campo di una Entità il risultato di una elaborazione complessa consente di disporre immediatamente di quel risultato senza doverlo ricalcolare ogni volta che l'Entità viene mostrata. Tornando all'esempio svolto nei paragrafi precedenti di questa Guida, le date di inizio e fine di un Prestito della app "Vicinato" sono desumibili dalle Consegne effettuate lungo la "storia" del Prestito e una Vista EVA potrebbe mostrarle all'interno della pagina del Prestito. Ma questa soluzione sarebbe molto onerosa per mostrare tali date ad ogni Prestito elencato in una Vista ed usarle per calcolare la durata del Prestito. In casi come questi, è più conveniente aggiungere all'Entità "Prestito" due Campi data, in cui una procedura ECA attivata quando lo Stato del Prestito diventa "concluso" scrive le due date, identificate esaminando una tantum l'elenco delle Consegne associate al Prestito.
Le Entità selezionate con una Vista possono essere visualizzate non solo come un elenco o una tabella o una griglia, ma possono anche essere dislocate su una mappa geografica, grazie al modulo aggiuntivo "Geofield Map".
Installato ed attivato questo modulo, avremo a disposizione un nuovo tipo di Campo in cui memorizzare le coordinate geografiche dell'Entità, strumenti per memorizzarvi le coordinate selezionandole da una mappa o digitando l'indirizzo e un nuovo tipo di Visualizzazione per presentarle con una Vista su una mappa. Come esempio, georeferenziamo le Sedi della app "Vicinato".
Quale mappa?
Con Geofield Map è possibile utilizzare Google Maps oppure Leaflet. Google Maps mette a disposizione di Geofield Map molte più opzioni, ma richiede una configurazione più complessa (richiesta a Google di codici da inserire nel modulo) e pone alcuni limiti sulla numerosità di visualizzazioni nella versione non a pagamento. Leaflet ha meno funzioni, ma utilizza le mappe gratuite di Openstreetmap, che non richiedono registrazioni o pagamenti e non condivide con terzi le posizioni scritte nella tua app.
Per gli scopi di MieApp (e probabilmente per la maggior parte delle tue app) Leaflet è più che adeguato. Le istruzioni che seguono fanno quindi riferimento a Leaflet. Anche se Geofield Map può utilizzare Leaflet per georeferenziare le Entità, non consente però poi di mostrarle in una Vista con una mappa Leaflet: per far ciò è necessario installare ed attivare anche il modulo aggiuntivo "Leaflet".
| APPROFONDIMENTO: In realtà IL modulo Leaflet potrebbe sostituire integralmente il modulo Geofield Map ma, per scopi didattici, preferisco presentarli e farteli installare entrambi, così da lasciarti libero di usare Google Maps o Leaflet. |
Aggiungere coordinate ad una Entità
Per aggiungere coordinate ad una Entità è sufficiente aggiungere un Campo di tipo Geofield e stabilire quale sistema di mappa usare. Non definiamo su quale mappa mostrarla perché useremo a questo scopo una Vista.
| aggiungi un Campo Geofield al tipo di Entità | In Strutture - Tipi di Contenuto - Sede - Gestisci Campi aggiungi un Campo di tipo Geofield con nome "Coordinate", come Storage Backend seleziona Default (WKT) |
| scegli una posizione di default | Restando nella configurazione del Campo, attiva Set default value e seleziona sulla mappa una posizione di default. Ciò è utile per evitare che, quando inserisci la posizione di una Entità, ti venga mostrata una posizione a caso sulla mappa mondiale, tipicamente una mappa tutta blu perché posizionata in pieno oceano. |
| scegli la mappa con cui selezionare le coordinate | In Strutture - Tipi di Contenuto - Sede - Gestione visualizzazione form, per il Campo "Coordinate" come Widget seleziona Geofield. Viene segnalato un messaggio di errore per la mancanza di codici di accesso a Google Maps. Clicca sulla rotellina a fianco del Campo. Verifica che come Map Library sia selezionato Leaflet.js. Se per la tua app è utile proporre come punto di partenza della mappa la tua posizione, attiva l'opzione Use HTML5 Geolocation to set Default Values. Salva |
Georeferenziare l'Entità
Per definire la posizione geografica di una Sede, basta modificarla. Per il Campo "Coordinate" ti viene mostrata una mappa su cui cliccare per posizionare l'Entità. Se hai attivato l'opzione Use HTML5 Geolocation to set Default Values, viene mostrata una finestra che chiede l'autorizzazione a utilizzare la tua posizione attuale per posizionare il puntatore dentro la mappa:

Visualizzare le Entità su mappa con una Vista
Per mostrare su una mappa le Entità georeferenziate costruiamo una Vista che elenca le Entità su una Visualizzazione di tipo Mappa:
| crea la Vista | In Strutture - Viste aggiungi una Vista di nome "Mappa Sedi". che mostra Contenuti di tipo Sede, attiva la creazione di una pagina, come formato seleziona per ora Elenco non formattato di Campi. In Elementi da visualizzare seleziona 0 per mostrare tutte le Sedi. Salva |
| limita la Vista alle Sedi dotate di coordinate | In Criteri del filtro aggiungi il Campo "Coordinate" e come operatore seleziona Non è vuoto. Verifica sotto Anteprima che sia mostrato l'elenco delle Sedi |
| recupera le coordinate delle Sedi | In Campi aggiungi il Campo "Coordinate" |
| mostra le Sedi sulla mappa | In Formato seleziona Leaflet. In Impostazioni come Sorgente dati seleziona il Campo "Coordinate", come Tooltip Source seleziona "Titolo". Ci sono moltissime altre configurazioni possibili, ma per i nostri scopi didattici non servono, ad esempio c'è la possibilità di usare icone differenti per le Entità in base al valore di un loro Campo. |
Ecco il risultato: cliccando sul fumetto di una icona si viene portati direttamente alla pagina di quella Entità.

Volendo portare l'utente ad un'altra pagina, ad esempio alla Vista che elenca i prestiti in corso in quella Sede, basta aggiungere alla Vista un Campo Globale - Testo personalizzato in cui costruire il link a quella pagina e nelle Impostazioni del formato Leaflet selezionare quel Campo come Tooltip Source al posto di "titolo"
Posizionare le Entità tramite indirizzo
Georeferenziare una Entità cercandola visivamente su una mappa può dare un risultato impreciso. Se si dispone dell'indirizzo dell'Entità, può essere più comodo digitarlo e lasciare che sia Drupal a tradurre l'indirizzo in coordinate geografiche. A questa traduzione provvede uno dei servizi disponibili il modulo aggiuntivo Geocoder, che a sua volta richiama uno dei servizi di geocodifica disponibili on line.
PREDISPOSIZIONE ALLA GESTIONE DEGLI INDIRIZZI
Per predisporre la nostra app alla traduzione di indirizzi in coordinate, installiamo ed attiviamo i moduli "Geocoder" e "Address". Installiamo anche la libreria che connette Geocoder al servizio di geocodifica gratuito di Openstreetmap, dando questo comando nel terminale:
| ▶️ composer require 'geocoder-php/nominatim-provider' |
Infine configuriamo Geocoder perché utilizzi il servizio on line di Openstreetmap: in Configurazione - Geocoder - Fonti esterne - Add a Geocoder provider seleziona Openstreetmap.
| APPROFONDIMENTO: Le fonti elencate in Add a Geocoder provider dipendono dalle librerie installate. Per installare librerie diverse da Openstreetmap clicca sul link List of all possible Geocoder providers|packages e segui le istruzioni indicate nella pagina. |
TRADUZIONE DEGLI INDIRIZZI IN COORDINATE
Dopo aver provveduto a queste installazioni, vediamo come usare la traduzione di indirizzi in coordinate, esemplificando per gli indirizzi delle Sedi nella app "Vicinato":
| aggiungi il Campo "Indirizzo" alla Sede | In Strutture - Tipi di contenuto - Sede - Gestisci Campi aggiungi un Campo di tipo Indirizzo |
| definisci quali informazioni compongono il Campo "Indirizzo" | Nella configurazione del Campo "Indirizzo", in Paesi disponibili seleziona i Paesi di cui accettare gli indirizzi (es. la sola Italia); in Field overrides seleziona quali informazioni richiedere obbligatoriamente, facoltativamente o nascondere all'Utente (es. chiedere una riga di indirizzo, il CAP, la Città e la Provincia e nascondere tutte le altre) |
| Nel Campo "Coordinate" attiva Geocoder prelevando l'indirizzo dal Campo "Indirizzo" | In Strutture - Tipi di contenuto - Sede - Gestisci Campi - Coordinate - Modifica attiva l'opzione Geocode from an existing field. In Geocode from an existing field seleziona il Campo "Indirizzo". In Geocoder providers seleziona Openstreetmap, |
| nella pagina di creazione / modifica delle Sedi mostrare i Campi "Indirizzo" e "Coordinate" | In Strutture - Tipi di contenuto - Sede - Gestione visualizzazione form posiziona il Campo "Indirizzo" sopra il Campo "Coordinate". |
Puoi vedere l'effetto finale entrando nella app "Vicinato" e cliccando il comando "Sedi" nel menù.
Da SCRIVERE
DA SCRIVERE
Da scrivere prevedendo l'installazione dei due moduli indicati.
Esempio: azioni collettive dell'Amministratore o dei Gestori.
DA SCRIVERE, utilizzando Views Contextual Range Filter
Ecco come far eseguire a Drupal azioni ripetitive al posto nostro, grazie alle procedure ECA.
Cosa sono le procedure ECA
Per automatizzare attività ripetitive in Drupal, lo strumento più flessibile attualmente disponibile sono le procedure ECA (Event - Condition - Action) o "ECA models". ECA è lo strumento che più si avvicina alla stesura di un programma in Drupal, ma non richiede la conoscenza di un linguaggio di programmazione (quindi non avevo mentito quando, all'inizio di MieApp, ti ho detto che avremmo costruito app senza una riga di codice 😉).
Attraverso un editor grafico dentro il web browser, ti spiegherò come disegnare una procedura ECA, cioè una sequenza di Azioni, controllate da Condizioni, che Drupal svolge quando occorre un Evento (da qui il nome del modulo).
Tra gli Eventi che possono attivare una procedura ECA ci sono il click dell'Utente su un comando, il salvataggio di una Entità, il login di un Utente, l'esecuzione periodica del Cron di Drupal ecc.
Tra le Azioni che puoi eseguire in una ECA ci sono: la creazione di nuove Entità, la modifica dei valori dei loro Campi, la ripetizione di una sequenza di Azioni sulle Entità selezionate elencate da una Vista, la spedizione di mail, il logout forzato di un Utente ecc.
Tra le Condizioni che controllano l'esecuzione delle Azioni ci sono la verifica del valore contenuto in un Campo, il confronto tra un Campo data e la data di sistema, la verifica dell'identità dell'Utente che sta eseguendo la procedura ecc.
A cosa servono le procedure ECA
La risposta breve: un po' a tutto. Una risposta meno breve: a far fare a Drupal tutte le operazioni ripetitive o complesse che non intendi fare tu o far fare ai tuoi Utenti. Una risposta più completa: a inserire nella tua app tutte le automazioni che servono al suo corretto funzionamento, fungendo da "collante" tra operazioni eseguite dagli Utenti (o che gli Utenti si dimenticano di eseguire).
La stesura di una procedura ECA (o più facilmente, di un insieme di procedure ECA) può talvolta essere un'ottima alterativa alla installazione di un modulo aggiuntivo che non fa esattamente quel che ci serve o che è troppo complesso da configurare.
Cosa installare (e cosa no) per costruire le procedure ECA
Per poter costruire ed usare procedure ECA devi installare e attivare il modulo ECA.
Insieme ad esso vengono installati (ma non attivati) un buon numero di sotto moduli, ognuno dei quali mette a disposizione alcune degli Eventi, Condizioni ed Azioni che ci serviranno per la costruzione della nostra app. Questa struttura a piccoli moduli facilita agli sviluppatori della comunità Drupal la scrittura di nuove funzionalità ed infatti il cosiddetto "ecosistema ECA" cresce continuamente. In prima battuta, ti consiglio di attivarli tutti.
Se l'attivazione di un sotto modulo ECA si blocca con l'avviso che manca un altro modulo, molto probabilmente si tratta di un sotto modulo che aggiunge ad ECA la capacità di interagire col modulo mancante: ad esempio, il sotto modulo "ECA Project Browser" richiede la presenza del modulo "Project Browser" e quindi non serve installarlo fino a quando non deciderai che ti serve proprio "Project Browser".
Ti consiglio inoltre di non attivare il sotto modulo "ECA Workflow" perché, nonostante il nome, lavora col modulo "Workflows" del Core di Drupal che, come abbiamo visto, è una versione ridotta del ben più potente ed interessante modulo aggiuntivo "Workflow". E quest'ultimo non ha bisogno di sotto moduli per lavorare con ECA... c'è un po' di confusione di nomi con questi due moduli ma tu segui i miei consigli e via!
Insieme al modulo ECA devi anche installare ed attivare uno dei moduli che ti mettono a disposizione un editor grafico con cui disegnare le procedure. Ad oggi io ho sempre usato il modulo BPMN.IO e quindi nelle prossime guide userò questo; però ce n'è almeno un altro, più recente e che mi riprometto di studiare: Modeler.
L'editor grafico
Installato ed attivato il modulo aggiuntivo BPMN.IO che aggiunge l'editor grafico, possiamo iniziare a costruire le procedure ECA (Eventi, Condizioni, Azioni), disegnandole direttamente nel web browser. Il disegno segue una versione semplificata e ridotta dello standard BPMN (Business Process Model and Notation). Non è importante che tu conosca questo standard, perché in questa Guida ti fornirò le informazioni essenziali, mentre nelle Guide seguenti costruiremo insieme alcuni esempi.
Per entrare nell'editor, vai in Configurazione - ECA e clicca Add new model (in Drupal le procedure ECA sono chiamate "modelli" ma questo nome a me sembra vago). Ti appare un foglio da disegno vuoto, racchiuso da due barra di icone (a sinistra e sotto il foglio) e da una barra di pulsanti in alto. Nella figura che segue, ti mostro anche le due finestre di configurazione che appaiono quando clicchi su un elemento disegnato nel foglio:
| ECA Model: NOME DELLA PROCEDURA | Salva | Archivio | Ricetta | Token |
![]() | |||||
Spostati sul foglio da disegno | ![]() FOGLIO DA DISEGNO | |||||||||
Seleziona più elementi disegnati | ||||||||||
Spazia gli elementi disegnati | ||||||||||
Seleziona un elemento disegnato | ||||||||||
Disegna un Evento | ||||||||||
Disegna un gateway per le Condizioni | ||||||||||
Disegna una Azione | ||||||||||
Cambia nome della procedura | Riordina il disegno | Scarica il disegno | Copia | Incolla | Zoom in | Zoom out | Zoom tutto | Cerca | Mini mappa | |
I comandi per spostare , zoomare, riordinare e scaricare il disegno e quelli con cui selezionare uno o più elementi del disegno sono intuitivi e non li spiego. Mi soffermo invece sui comandi di disegno vero e proprio, evidenziati in grassetto nella figura.
Disegnare una procedura
Disegnare una procedura ECA con l'editor grafico consiste nell'aggiungere al foglio da disegno uno o più elementi collegati da frecce e nella loro configurazione. Gli elementi sono:
| un cerchio rappresenta un Evento | |
![]() | un rettangolo rappresenta una Azione |
![]() | un rombo rappresenta un gateway, utile per introdurre diramazioni del disegno controllabili da Condizioni |
| una freccia rappresenta un collegamento da un elemento al successivo; i collegamenti stabiliscono in quale ordine temporale gli altri elementi vengono eseguiti da Drupal | |
![]() | un riquadro aperto collegato ad un elemento da un collegamento a puntini rappresenta un commento, utile per documentare la procedura |
Ci sono due modi per aggiungere elementi al disegno:
- cliccare sull'icona corrispondente all'elemento nella barra di sinistra e trascinare l'elemento nel foglio (solo per cerchi, rettangoli e rombi)
- cliccare su un elemento già inserito nel disegno: nel menù grafico che appare sulla sua destra, cliccare sul nuovo elemento che si vuole aggiungere al disegno; in questo menù sono presenti anche il comando per cancellare l'elemento (bidone) e per colorare l'elemento (pennello)

Configurare un elemento
Un elemento aggiunto al disegno non serve a nulla se non si specifica quale funzione svolge ed quali sono i parametri necessari al suo funzionamento. Quando aggiungi un elemento nel disegno o clicchi su un elemento già disegnato, si apre la finestra Choose element template, in cui devi selezionare la funzione (template) svolta dall'elemento: le funzioni disponibili dipendono dal tipo di elemento (Evento, Condizione, Azione) e da quali moduli ECA hai attivato. Le funzioni sono elencate raggruppate per modulo. Selezionata una funzione, si apre la finestra di configurazione, in cui devi indicare i parametri richiesti dalla funzione. Se hai sbagliato a selezionare la funzione, nella finestra di configurazione clicca l'icona "bidone" per eliminarla dall'elemento e tornare a selezionare un'altra funzione.
I Token nelle procedure
Ogni elemento può creare o valorizzare un Token. Un Token creato o valorizzato da un elemento può essere usato per configurare gli elementi seguenti, nell'ordine indicato dalle frecce. Un Token quindi memorizza e trasporta lungo la procedura un valore, che può essere un testo, un numero, una data, una Entità o anche una lista di Entità. Ad esempio, se un elemento crea un Token di nome "attrezzo" e vi memorizza una Entità, nella configurazione di un elemento successivo potremo:
- usare il Token, digitandone il nome (senza parentesi): attrezzo
- usare il valore del Token (cioè l'Entità memorizzata in esso) digitiamone il nome tra parentesi quadre: [attrezzo]
Oltre ai Token creati lungo la procedura, per la configurazione degli elementi hai anche a disposizione i Token corrispondenti ai Campi delle Entità: per identificarli e copiarli nella configurazione degli elementi clicca il pulsante Token in alto a destra: ti viene mostrata la gerarchia dei Token da cui puoi copiare ed incollare i Token. Nella gerarchia, i Token sono però mostrati con un nome generico, che indica il tipo di Entità: ad esempio, il Token del Campo che contiene il nome dell'Autore di un Contenuto è [node:author], perché node è nome generico dei Contenuti. Quando incolli il Token nella configurazione di un elemento, devi invece specificare da quale Entità prelevare il valore del Campo sostituendo il nome generico col nome del Token in cui è memorizzata l'Entità: se l'Entità è memorizzata nel Token "attrezzo", nella configurazione modificherai [node:author] in [attrezzo:author].
Documentare una procedura
Se nella tua app crei più di una procedura ECA e, soprattutto, se le tue procedure non sono banali, è opportuno che documenti per bene cosa fa ogni procedura, per poterle manutenere nel tempo. Anzitutto dai un nome alla procedura che ricordi in modo stringato a cosa serve: clicca l'icona:
![]()
Appare una finestra in cui puoi digitare il nome ed una descrizione della procedura. Ti raccomando inoltre di descrivere cosa fa ogni elemento: basta cliccarci sopra e modificare la sua descrizione. Per descrivere cosa fa un percorso della procedura, puoi aggiungere un commento sul primo elemento del percorso e digitarvi una spiegazione. Infine, puoi scaricare il disegno della procedura cliccando l'icona:
![]()
Viene scaricato un file in formato SVG, che può essere importato in Word o LibreOffice.
Ogni procedura è esportabile col pulsante Archivio in formato YAML compresso (estensione .gz) , che è comprensibile con qualche difficoltà anche da un lettore umano. Puoi usare il file come base per scrivere un documento più chiaro. Oppure puoi andare su Gemini (o su altre IA generative), caricare il file esportato da Drupal con un prompt del tipo "traduci in un documento leggibile la configurazione del modello ECA di Drupal che ho caricato" e potresti ottenere una buona spiegazione della tua procedura.
Eseguire la procedura
Dopo che hai salvato la procedura col pulsante Salva, la procedura è pronta e resta in attesa che accada uno degli Eventi che hai inserito nel suo disegno. Quando infatti accade uno di essi, partendo da quell'elemento Drupal percorre il disegno seguendo le frecce ed esegue le funzioni associate agli elementi via via incontrati. L'esecuzione termina quando il percorso arriva su in un elemento da cui non partono altre frecce o che non richiama un'altra procedura (vedi Azione Custom Event).
Per impedire che una procedura venga eseguita, in Configurazione - ECA seleziona il comando Disattiva sulla procedura.

Gli Eventi
Per essere eseguita, la procedura deve contenere almeno un Evento. Se una procedura contiene più Eventi, verrà eseguita quando accade uno qualunque di essi, quindi la medesima procedura può rispondere a diversi Eventi. I tipi di Eventi sono molti. Ecco una breve spiegazione di quelli che, nella mia esperienza, sono più utili nella costruzione di una app:
| Evento | Attiva la procedura quando | Utile per |
| Presave content entity | un Utente salva una Entità. In Type seleziona il tipo di Entità per cui la procedura deve essere eseguita (es. "Contenuto - Attrezzo" o "Utente"). L'Evento memorizza nel Token [entity] l'Entità su cui è stata attivata. | modificare Campi dell'Entità prima di salvarla |
| Endpoint access | un Utente clicca il link corrispondente alla procedura. In First path argument digita una parola che identica la procedura (es. "consegna") cui puoi eventualmente aggiungere in Second path argument una seconda parola (es. "accettazione"): in questo caso la procedura sarà eseguita quando l'Utente clicca il link /eca/consegna/accettazione?id=453 che esporremo all'Utente come un comando all'interno di una Vista). Se, come in questo esempio, il link "passa" alla procedura un argomento (es. l'identificativo 453 della consegna da accettare), nella procedura useremo l'Azione Request: Get URL query parameter per memorizzare l'argomento in un Token. L'Evento memorizza nel Token [account] l'Utente che ha cliccato il link. | creare comandi non disponibili nativamente in Drupal |
| Cron event | si è arrivati ad una scadenza temporale. In Frequency digita ogni quanto eseguire la procedura, col formato spiegato in https://en.wikipedia.org/wiki/Cron | eseguire periodiche attività di manutenzione della app |
| Login of a user | un Utente entra in Drupal. L'Evento memorizza nel Token [account] l'Utente che ha fatto login. | mostrare un avviso all'ingresso dell'Utente |
| Custom event | un'altra procedura esegue l'Azione Trigger a custom event In Event ID assegna un nome univoco alla procedura: questo nome sarà usato dalla procedura "attivante" per eseguirla. | creare una "sub procedura", attivata in più punti di una procedura o da diverse procedure |
| Custom event (entity aware) | un'altra procedura esegue l'Azione Trigger a custom event (entity aware) passandole una Entità su cui agire. In Event ID assegna un nome univoco alla procedura: questo nome sarà usato dalla procedura "attivante" per eseguirla. L'Entità ricevuta è memorizzata nel Token [entity] | eseguire un ciclo di Azioni su Entità |
Le Azioni
Le Azioni sono le istruzioni eseguite da Drupal quando la procedura viene attivata. Ecco una breve spiegazione dei tipi di Azioni che, nella mia esperienza, sono più utili nella costruzione di una app:
| Azione | Cosa fa | Utile per |
| Mostra un messaggio all'utente | mostra un messaggio all'Utente, al termine dell'esecuzione della procedura. In Messaggio digita il testo da mostrare, che può contenere i valori di Token. | mostrare il valore di uno o più Token per verificare il corretto funzionamento della procedura (debug), avvisare l'Utente che la procedura ha effettuato modifiche ad una Entità. |
| Reindirizza all'URL | porta l'Utente su una pagina. Come parametro URL digita il link della pagina cui trasportare l'Utente; nel link puoi usare i valori di Token. | reindirizzare l'Utente dopo la eliminazione di una Entità o al termine dell'esecuzione della procedura |
| Entity: create new | crea una nuova Entità. In Name of token digita il nome del Token che memorizza l'Entità creata. In Tipo seleziona il tipo di Entità da creare. Parametri opzionali: in Etichetta il titolo della nuova Entità e in Owner UID l'identificativo dell'Utente che la crea. | creare nuove Entità come conseguenza di altre azioni |
| Entity: Load | memorizza in un Token una Entità esistente. In Name of token digita il nome del Token in cui memorizzare l'Entità. In Load entity from seleziona la modalità con cui identificare l'Entità. I parametri che seguono dipendono dalla modalità scelta: se selezioni Type and ID (l'opzione più semplice) in Tipo di Entità seleziona il tipo di Entità da caricare (es. Utente) e in ID Entità digita il suo identificativo. | mettere a disposizione della procedura le informazioni dell'Entità |
| Entity: Save | salva l'Entità memorizzata in un Token. In Name of token digita il nome del Token in cui è memorizzata l'Entità da salvare. | salvare le modifiche apportate dalla procedura all'Entità |
| Entity: Delete | elimina l'Entità memorizzata in un Token. In Name of token digita il nome del Token in cui è memorizzata l'Entità da eliminare. | eliminare Entità |
| Token: set value | crea un nuovo Token o aggiorna il valore di un Token esistente. In Name of token digita il nome del Token da creare o aggiornare. In Value of the token digita il valore da assegnare al Token, può contenere valori di Token.. | aggiungere e modificare Token nella procedura |
| Entity: set field value | aggiorna il Campo di una Entità. In Nome del campo digita il nome interno del Campo da aggiornare. In Valore del campo digita il valore da assegnare al Campo (può contenere valori Token). In Salvataggio Entità attiva l'immediato salvataggio dell'Entità (sconsiglio di farlo se la procedura è stata attivata dall'Evento Presave content entity). In Entità digita il nome del Token in cui è memorizzata l'Entità di cui modificare il Campo. | modificare i Campi di Entità |
| List: add item | aggiunge una Entità ad un elenco di Entità memorizzato in un Token. In Token containing the list digita il nome del Token che memorizza l'elenco. In Value to add digita il valore del Token che contiene l'Entità da aggiungere. Restituisce il Token aggiornato. | creare una lista di Entità su cui eseguire una procedura Custom event (entity aware) |
| Current user: load | memorizza in un Token l'Utente corrente. In Name of token digita il nome del Token in cui memorizzare l'Utente | mettere a disposizione della procedura le informazioni dell'Utente corrente |
| User: switch current account | cambia l'Utente che sta eseguendo la procedura. In User ID digita l'identificativo dell'Utente cui passare | eseguire la procedura come Amministratore superando i limiti imposti all'Utente corrente |
| Views: Execute query | memorizza in un Token le Entità elencate da una Vista. In Name of token digita il nome del Token in cui memorizzare l'elenco. In Visualizza seleziona la Vista. In Visualizzazione digita il nome interno della Visualizzazione della Vista. In Parametri digita gli argomenti da passare ai Filtri contestuali della Vista. | mettere a disposizione della procedura un elenco di Entità, su cui poi eseguire un ciclo di Azioni. |
| Trigger a custom event (entity-aware) | attiva una procedura secondaria, passandole un elenco di Entità su cui agire. In Event ID digita l'identificativo della procedura secondaria. In Entità digita il nome del Token che contiene l'elenco delle Entità. In Tokens to forward digita i nomi di eventuali altri Token passati alla procedura secondaria e che potranno da essa essere modificati. La procedura secondaria ha un evento di tipo Custom event (entity aware) | eseguire un ciclo di azioni sulle Entità |
| Request: Get URL query parameter | memorizza in un Token un argomento letto dal link di attivazione della procedura. In Name of token digita il nome del Token in cui memorizzare l'argomento. In Query parameter name digita il nome dell'argomento da cercare nel link | leggere gli argomenti in una procedura attivata dall'Evento Endpoint access |
| Tamper: Math | memorizza in un Token il risultato di una operazione matematica. In Data to be tampered digita il primo valore (può essere il valore di un Token). In Operazione seleziona l'operatore. In Valore digita il secondo valore (può essere il valore di un Token). In Result token name digita il nome del Token dove memorizzare il risultato. Richiede l'installazione del modulo aggiuntivo "ECA Tamper Integration" | eseguire calcoli nella procedura |
Le Condizioni (e i gateway)
Quando due elementi sono collegati da una freccia, Drupal li esegue sequenzialmente secondo il verso della freccia stessa. Applicando una Condizione alla freccia possiamo consentire o impedire l'esecuzione del secondo elemento (e di tutti quelli che lo seguono) sulla base dell'esito (positivo o negativo) di un confronto tra un valore dedotto da un Token ed un secondo valore (fisso o preso da un altro Token). Se da un elemento escono più frecce, applicando diverse Condizioni a ciascuna di esse possiamo far proseguire l'esecuzione in una parte della procedura oppure in un'altra. Quindi è come se le Condizioni facessero apparire o sparire le frecce in base ai valori assunti dei Token durante l'esecuzione.
Non è strettamente obbligatorio, però inserire un gateway (rombo) prima di un gruppo di frecce soggette a diverse Condizioni che dipartono da un medesimo elemento facilita la comprensione del disegno:
Le Condizioni sono applicate alle frecce, non al gateway. Oltre che come elemento che "divide" la procedura in tanti percorso alternativi, il gateway è usato anche come elemento che "raccoglie" percorsi precedentemente separati, come illustrato nell'esempio.
Ecco una breve spiegazione dei tipi di Condizioni che, nella mia esperienza, sono più utili nella costruzione di una app:
| Azione | Cosa fa | Utile per |
| Compare number of list items | Confronta il numero di Entità contenute in un Token con un altro numero. In Name of token containing the list digita il nome del Token che ha memorizzato l'elenco delle Entità. In Operatore di comparazione seleziona l'operatore di confronto (es. "maggiore di"). In Second value digita il valore con cui confrontare. Attiva Nega la condizione se vuoi invertire la condizione. | Verificare se ci sono ancora entità nella lista |
| Compare two scalar values | Confronta due valori. In First value digita il primo valore (accetta valori da Token). In Operatore di comparazione seleziona l'operatore di confronto (es. "maggiore di"). In Second value digita il secondo valore. Attiva Nega la condizione se vuoi invertire la condizione. | Confrontare due valori, ad esempio il valore di due Campi |
| Current user ID | Verifica se l'Utente corrente ha come identificativo un valore. In ID Utente digita il valore (accetta valore da un Token). Attiva Nega la condizione se vuoi invertire la condizione. | verificare se l'autore di una Entità (il cui identificativo è stato memorizzato in un Token) coincide con l'Utente corrente |
| Entity: field value is empty | Verifica se il Campo di una Entità è vuoto. In Nome del campo digita il nome interno del Campo. In Entità digita il nome del Token in cui è memorizzata l'Entità. Attiva Nega la condizione se vuoi invertire la condizione. | Verificare se il Campo di una Entità non è stato valorizzato. |
In una app capita spesso di dover applicare le stesse Azioni ad un insieme di Entità. Prendiamo come semplice esempio la costruzione di un comando che aggiorna il prezzo di rivendita di tutti i prodotti, calcolato come costo di acquisto per una percentuale di ricarico. Possiamo costruire questo comando facendo collaborare le procedure ECA con le Viste:
- Costruiamo una Vista che elenca tutte le Entità di tipo "Prodotto" di cui vogliamo aggiornare il prezzo. Questa Vista non viene mostrata all'Utente, ma serve solo per selezionare le Entità su cui agirà la procedura ECA.
- Disegniamo una procedura ECA che, lanciata da un click dell'Utente, richiama la Vista memorizzando in un Token l'elenco dei Prodotti e, per ogni Prodotto elencato nel Token, esegue una seconda procedura, che aggiorna il campo Prezzo dell'Entità passatole dalla prima procedura. Entrambe le procedure sono disegnate nello stesso foglio e salvate insieme dall'editor grafico.

La prima procedura (quella sopra nel disegno) è attivata dal click dell'Utente ed è formata dai seguenti elementi:
- l'Evento Endpoint access attiva la procedura quando l'Utente clicca il link /eca/aggiornaprezzi (mostrato all'Utente come comando "Aggiorna Prezzi")
- l'Azione Views: Execute query richiama la Vista che elenca i Prodotti e memorizza le Entità selezionate dalla Vista nel Token "prodotti"
- l'Azione Trigger a custom event (entity-aware) attiva la procedura "Aggiorna Prezzo" su ognuna delle Entità memorizzate nel Token "prodotti"
La seconda procedura (quella sotto nel disegno) è attivata dalla procedura "primaria", riceve da essa una Entità alla volta ed è formata dai seguenti elementi:
- l'Evento Custom event (entity aware) attiva la procedura quando viene eseguita un'Azione Trigger a custom event (entity-aware) che richiama "Aggiorna Prezzo" e memorizza l'Entità nel Token entity
- l'Azione Tamper: Math calcola il prezzo memorizzandolo nel Token "prezzo"
- l'Azione Entity: set field value scrive il valore [prezzo] nel Campo "Prezzo" della Entità [entity] e la salva
Quando termina l'esecuzione della seconda procedura, Drupal torna automaticamente all'Azione Trigger a custom event (entity-aware) della prima procedura, che attiva nuovamente la seconda procedura passandole stavolta l'Entità successiva e così via, fino all'esaurimento delle Entità memorizzate in "prodotti".
Anche se nel disegno non si vedono frecce che vanno dalla prima alla seconda procedura e viceversa, grazie al coordinamento dell'Azione Trigger a custom event (entity-aware) della prima procedura con l'Evento Custom event (entity aware).della seconda abbiamo realizzato un ciclo tra le due procedure, che viene ripetuto su tutte le Entità selezionate dalla Vista.
Un caso piuttosto frequente nella costruzione di app è la necessità di una procedura che, quando viene modificata una Entità, ne modifica automaticamente altre. Una procedura di questo tipo è di solito formata almeno dai seguenti elementi:
| 1 | un Evento Presave content entity | attiva la procedura quando sta per essere salvata una Entità di un certo tipo |
| 2 | una serie di Azioni e Condizioni | realizzano il comando |
| 3 | un'Azione o più Azioni Mostra un messaggio all'utente | avvisa l'Utente di aver modificato altre Entità |
Come esempio, costruiamo per la app "Vicinato" una procedura che allinea lo Stato della Richiesta allo Stato del Prestito concesso in risposta alla Richiesta. La procedura risultante è questa:

Vediamo passo passo come costruirla:
| crea la procedura | In Configurazione - ECA clicca Add new model. Clicca l'icona ℹ️ e in Etichetta digita un nome per la procedura | |
| 1 | attiva la procedura quando viene salvato un Prestito (nuovo o modificato) | Aggiungi un Evento Presave content entity. In Type (and bundle) seleziona il tipo di Entità "Contenuto: Prestito". L'Entità che ha attivato la procedura è memorizzata nel Token entity. |
| 2 | assegna alla procedura i privilegi di Amministratore, per consentire all'Utente di modificare lo Stato della Richiesta su cui non avrebbe diritti di modifica. | Aggiungi l'Azione User: switch current account. In User ID digita "1", che è l'identificativo di Amministratore |
| memorizza nel Token "richiesta" la Richiesta corrispondente al Prestito | Aggiungi l'Azione Entity: load. In Name of Token digita "richiesta" per creare il Token in cui memorizzare l'Entità Richiesta. In Load entity from seleziona Type and ID. In Tipo di Entità seleziona Contenuto, perché la Richiesta è una Entità di questo tipo. Copia dalla gerarchia dei Token il Token corrispondente al Campo del Prestito che contiene l'identificativo della Richiesta [node:field_richiesta_prestito:target_id]. In ID Entità incolla quel Token modificandolo in [entity:field_richiesta_prestito:target_id], perché l'Entità da cui prelevare quel Campo è il Prestito memorizzato nel Token entity. | |
| distingui cosa fare in base allo Stato del Prestito | Aggiungi un gateway (rombo). Da qui partono tre percorsi alternativi (2a) (2b) (2c) | |
| 2a | se il Prestito è "in corso", anche la Richiesta va messa "in corso" | Dal gateway aggiungi una Azione. Sul connettore che va dal gateway a questa Azione aggiungi la Condizione Compare two scalar values. Copia dalla gerarchia il Token che contiene il Campo Stato del Prestito [node:field_stato_prestito:value]. In First value incolla quel Token modificandolo in [entity:field_stato_prestito:value]. In Second value digita il nome interno dello Stato "in_corso". In questo modo le Azioni che seguono sono eseguite solo se lo Stato del Prestito è "in corso". Associa all'Azione la funzione Entity: set field value. In Nome del Campo digita il nome del Campo che memorizza lo Stato della Richiesta "field_stato_richiesta". In Valore del Campo digita "in_corso". In Entità digita "richiesta". |
| 2b | se il Prestito è "concluso", anche la Richiesta va messa "conclusa" | Come 2a, stavolta verificando che lo Stato del Prestito sia "concluso" e imponendo alla Richiesta lo Stato "conclusa" |
| 2c | se il Prestito è "concesso", la Richiesta è "accettata" | Come 2a, stavolta verificando che lo Stato del Prestito sia "concesso" e imponendo alla Richiesta lo Stato "accettata" |
| 3 | avvisa l'Utente che è stato cambiato lo Stato della Richiesta | Aggiungi l'Azione Mostra un messaggio all'utente. In Messaggio digita "Lo Stato della Richiesta [richiesta] è stato allineato a quello del Prestito" |
Oltre alle procedure attivate da attività dell'Utente (salvataggio di una Entità, click su un comando), nella costruzione di app possono risultare utili procedure attivate automaticamente da Drupal stesso, senza alcun intervento dell'Utente. Un caso comune sono le procedure che provvedono periodicamente a fare manutenzione della app: in questo caso, l'Evento che attiva la procedura è una scadenza temporale.
Una procedura di questo tipo è di solito formata almeno da questi elementi:
| 1 | un Evento Cron Eventi | attiva la procedura quando scatta una scadenza temporale |
| 2 | una serie di Azioni e Condizioni, tipicamente su più Entità selezionate con Views: Execute query | realizzano la procedura |
| 3 | eventualmente un'Azione Log Message | memorizza nel log di Drupal le conseguenze delle azioni svolte |
Come esempio, costruiamo per la app "Vicinato" una procedura che una volta al mese elimina le Richieste più vecchie di tre mesi cui non è stato concesso un Prestito. Ecco il disegno risultante (sono due percorsi perché è richiesto un ciclo di eliminazione sulle Richieste vecchie):
| crea la procedura | In Configurazione - ECA clicca Add new model. Clicca l'icona ℹ️ e in Etichetta digita un nome per la procedura | |
| 1 | attiva la procedura una volta al mese | Aggiungi l'Evento Cron Eventi. In Frequency digita "0 1 1 * *" per eseguire la procedura al minuto 0 dell'ora 1 del giorno 1 di ogni mese di ogni anno, cioè il primo di ogni mese alla 1 di notte. |
| 2 | cerca le Richieste da eliminare e memorizzale nel Token "richieste" | Come abbiamo visto, prepariamo a parte una Vista da richiamare nella procedura per cercare le Richieste da eliminare. La Vista elenca le Richieste con due Filtri: Stato = "emessa" (quindi senza Prestito); Creato il minore di "-3 month" Nella procedura aggiungi l'Azione Views: Execute query. In Name of token digita il nome del Token che conterrà la lista delle Richieste restituite dalla Vista, es. "richieste". In Visualizza seleziona la Vista che cerca le Richieste. |
| per ogni Richiesta elencata in "richieste" esegui la procedura di eliminazione | Aggiungi l'Azione Trigger a custom event (entity-aware). In Event ID digita il nome della procedura che provvederà ad eliminare ogni Richiesta, es. "Elimina_Richiesta_Vecchia". In Entità digita il contenuto del Token "richieste" cioè "[richieste]" | |
| 3 | al termine delle eliminazioni, scrivi nel log di Drupal la lista delle Richieste eliminate | Aggiungi l'Azione Log Message. In Tipo digita "Eliminazione Richieste Vecchie". In Rilevanza seleziona Avviso. In Messaggio digita "Eliminate le Richieste [richieste]" |
L'eliminazione vera e propria è eseguita dalla procedura "Elimina_Richiesta_Vecchia", disegnata nello stesso foglio della precedente:
| 1 | attiva la procedura quando richiamata dalla precedente | Aggiungi l'Evento Custom event (entity aware). In Event ID digita "Elimina_Richiesta_Vecchia". La Richiesta da eliminare è memorizzata nel Token entity. |
| 2 | elimina la Richiesta ricevuta | Aggiungi l'Azione Entity: Delete. In Entità digita entity |
Abbiamo visto in Guide precedenti come aggiungere comandi a pagine e Viste. Nella maggior parte dei casi, quei comandi richiamano altre pagine ed altre Viste, costruendo così un percorso all'interno della nostra app. Abbiamo però anche già incontrato un caso in cui il comando avrebbe dovuto modificare una Entità, anche superando i permessi dell'Utente che lo clicca.
In questa Guida vediamo come costruire una procedura che esegue un comando cliccato dall'Utente. Una procedura di questo tipo è di solito formata almeno dai seguenti elementi:
| 1 | un Evento Endpoint access | predispone il link /eca/parametro1/parametro2 che, quando viene cliccato, attiva la procedura |
| 2 | una o più Azioni Request: Get URL query parameter | recuperano dal link uno o più argomenti, necessari alle Azioni e Condizioni successive. Gli argomenti sono scritti così nel link: /eca/parametro1/parametro2?argomento1=valore1&argomento2=valore2. |
| 3 | una serie di Azioni e Condizioni | realizzano il comando |
| 4 | un'Azione Reindirizza all'URL | al termine dell'esecuzione del comando, porta l'Utente su una specifica pagina della app. In assenza di questa Azione, all'Utente viene mostrato il messaggio di errore "Pagina non trovata". |
Come esempio, costruiamo per la app "Vicinato" il comando "Accetta una consegna", con cui un Utente accetta la Consegna dell'Attrezzo proposta da un altro Utente. In dettaglio al punto 3 questo comando deve:
- registrare nella Consegna il nominativo dell'utente che accetta la Consegna
- cambiare lo Stato della Consegna da "Bozza" a "Accettata"
- registrare nel Campo "Sede" dell'Attrezzo la nuova posizione dell'Attrezzo (presso il Proprietario, presso il Richiedente, presso una Sede)
- se con la Consegna l'Attrezzo è tornato al Proprietario, cambiare lo Stato della Richiesta e del Prestito in "concluso"; altrimenti, cambiare (o confermare) lo Stato della Richiesta e del Prestito in "in corso"
Vediamo come costruirla passo per passo:
| crea la procedura | In Configurazione - ECA clicca Add new model. Clicca l'icona ℹ️ e in Etichetta digita un nome per la procedura | |
| 1 | predisponi il link che attiva la procedura | Aggiungi l'Evento Endpoint access. In First path argument digita "consegna" ed in Second path argument digita "accettazione": la procedura sarà attivata quando un Utente clicca il link /eca/consegna/accettazione |
| 2 | recupera dal link l'argomento che identifica la Consegna | Aggiungi l'Azione Request: Get URL query parameter. In Name of token digita "id_consegna" per creare il Token omonimo in cui memorizzare l'argomento recuperato dal link. In Query parameter name digita "id" come nome dell'argomento da cercare nel link. La procedura si attende quindi che nel link vi sia un argomento "id" con associato il valore dell'identificativo della Consegna, es: /eca/consegna/accettazione?id=143 |
| 3 | Memorizza nei Token omonimi le diverse Entità su cui il comando deve intervenire: la Consegna, il Prestito corrispondente alla Consegna, la Richiesta richiamata nel Prestito e l'Attrezzo richiamato nella Richiesta | Aggiungi l'Azione Entity: load. In Name of Token digita "consegna" per creare il Token in cui memorizzare la Consegna. In Load entity from seleziona Type and ID per identificare l'Entità tramite il suo tipo e il suo identificativo. In Tipo di Entità seleziona Contenuto, perché la Consegna è di quel tipo. In ID Entità digita [id_consegna] perché l'identificativo della Consegna è l'argomento ricevuto attraverso il link. Aggiungi l'Azione Entity: load. In Name of Token digita "prestito" per creare il Token in cui memorizzare il Prestito. In Load entity from seleziona Type and ID. In Tipo di Entità seleziona Contenuto. Copia dalla gerarchia dei Token il Token corrispondente al Campo della Consegna che contiene l'identificativo del Prestito [node:field_prestito_consegna:target_id]. In ID Entità incolla quel Token e modificalo in [consegna:field_prestito_consegna:target_id] sostituendo "node" con "consegna" perché l'Entità da cui prelevare l'identificativo del prestito è memorizzata nel Token "consegna". Aggiungi l'Azione Entity: load. In Name of Token digita "richiesta" per creare il Token in cui memorizzare la Richiesta. In Load entity from seleziona Type and ID. In Tipo di Entità seleziona Contenuto. Copia dalla gerarchia il Token corrispondente al Campo del Prestito che contiene l'identificativo della Richiesta [node:field_richiesta_prestito:target_id]. In ID Entità incolla il Token e modificalo in [prestito:field_richiesta_prestito:target_id] Aggiungi l'Azione Entity: load. In Name of Token digita "attrezzo" per creare il Token in cui memorizzare l'Attrezzo. In Load entity from seleziona Type and ID. In Tipo di Entità seleziona Contenuto. Copia dalla gerarchia il Token corrispondente al Campo della Richiesta che contiene l'identificativo dell'Attrezzo [node:field_attrezzo_richiesta:target_id]. In ID Entità incolla il Token e modificalo in [richiesta:field_attrezzo_richiesta:target_id] |
| Memorizza nel Token "Sede" la Sede dove avviene la Consegna | Aggiungi l'Azione Entity: load. In Name of Token digita "sede". In Load entity from seleziona Type and ID. In Tipo di Entità seleziona Contenuto. Copia dalla gerarchia il Token corrispondente al Campo della Consegna che contiene l'identificativo della Sede [node:field_sede_consegna:target_id]. In ID Entità incolla il Token e modificalo in [consegna:field_sede_consegna:target_id] | |
| Memorizza nel Token "utente" l'Utente corrente | Aggiungi l'Azione Current user: load. In Name of token digita "utente" | |
| Assegna alla procedura i privilegi di Amministratore, per consentire all'Utente corrente di modificare lo Stato di Richiesta e Prestito su cui potrebbe non aver diritti di modifica. | Aggiungi l'Azione User: switch current account. In User ID digita "1", che è l'identificativo di Amministratore | |
| Scrivi nella Consegna l'Utente corrente come l'utente che sta accettando l'Attrezzo | Aggiungi l'Azione Entity: set field value. In Nome del Campo digita il nome del Campo che memorizza l'Utente che accetta l'Attrezzo "field_accettazione_consegna". In Valore del Campo digita "[utente]". In Entità digita "consegna". | |
| Cambia lo Stato della Consegna in "accettata" | Aggiungi l'Azione Entity: set field value. In Nome del Campo digita il nome del Campo che memorizza lo Stato "field_stato_consegna". In Valore del Campo digita "accettata", che è il nome interno dello stato. In Entità digita "consegna". | |
| Scrivi nell'Attrezzo la sua nuova sede | Aggiungi l'Azione Entity: set field value. In Nome del Campo digita il nome del Campo che memorizza la posizione dell'Attrezzo "field_dove_attrezzo". In Valore del Campo digita "[sede]". In Entità digita "attrezzo". | |
| Distingui il caso di Consegna al Proprietario dalla Consegna ad altri (al Richiedente o presso una Sede) | Aggiungi un gateway (rombo). Da qui partono due percorsi alternativi (3a) e (3b) | |
| 3a | Se la Consegna è al Proprietario, cambio lo Stato di Richiesta e Prestito in "concluso" | Dal gateway aggiungi una Azione. Sul connettore che va dal gateway a questa Azione aggiungi la Condizione Compare two scalar values. In First value digita il Token che contiene il titolo della Sede "[sede:title]". In Operatore di comparazione seleziona contiene. In Second value digita "Proprietario". In questo modo le Azioni che seguono sono eseguite solo se la Consegna è al Proprietario. Associa all'Azione la funzione Entity: set field value. In Nome del Campo digita il nome del Campo che memorizza lo Stato del Prestito "field_stato_prestito". In Valore del Campo digita "concluso". In Entità digita "prestito". Aggiungi l'Azione Entity: set field value. In Nome del Campo digita il nome del Campo che memorizza lo Stato della Richiesta "field_stato_richiesta". In Valore del Campo digita "conclusa". In Entità digita "richiesta". |
| 3b | Se la Consegna è altrove, cambio lo Stato di Richiesta e Prestito in "in corso" | Dal gateway aggiungi una Azione. Sul connettore che va dal gateway all'Azione aggiungi la Condizione Compare two scalar values. In First value digita "[sede:title]". In Operatore di comparazione seleziona contiene. In Second value digita "Proprietario". Attiva Nega la condizione. In questo modo le Azioni che seguono sono eseguite solo se la Consegna non è al Proprietario. Associa all'Azione la funzione Entity: set field value. In Nome del Campo digita "field_stato_prestito". In Valore del Campo digita "in_corso". In Entità digita "prestito". Aggiungi l'Azione Entity: set field value. In Nome del Campo digita "field_stato_richiesta". In Valore del Campo digita "in_corso". In Entità digita "prestito". |
| 4 | Ricongiungi i due percorsi | Aggiungi un gateway. Tira da entrambe le Azioni finali dei percorsi 3a e 3b un connettore al gateway, senza associarvi Condizioni. In questo modo, in entrambi i casi si va alla prossima Azione |
| Riporta l'Utente alla pagina della Richiesta, dove aveva cliccato il comando | Aggiungi l'Azione Reindirizza all'URL. In URL digita "/node/[richiesta:nid]", perché [node:nid] è il Token che contiene l'identificativo di un Contenuto e quindi [richiesta:nid] contiene l'identificativo della Richiesta memorizzata nel Token "richiesta". |
Operazioni di manutenzione della app
Cos'è Cron?
DA SCRIVERE
Come lo eseguo?
DA SCRIVERE
Se Cron va in errore...
Se il comando Configurazione - Cron - Esegui Cron dentro Drupal va in errore, puoi provare a sbloccarlo come spiegato nella Guida a Drush.
Da scrivere, usando i moduli Feeds e Views Data Export
Perché devo aggiornare il Core ed i moduli aggiuntivi?
Con una buona frequenza la comunità di Drupal mette a disposizione aggiornamenti del Core e dei moduli. Gli aggiornamenti risolvono errori, aggiungono funzioni e, soprattutto, migliorano la sicurezza di Drupal. Drupal avvisa l'Amministratore quando sono disponibili aggiornamenti. In ogni momento, l'Amministratore può verificare la disponibilità di aggiornamenti sotto il menù Resoconti coi comandi Resoconto sullo stato e Aggiornamenti disponibili.
Poiché ogni aggiornamento può malauguratamente introdurre problemi e persino crash alla tua app, se nel quotidiano utilizzo della app non riscontri errori installa subito solo gli aggiornamenti di sicurezza, rinviando gli altri fino a quando la versione del modulo che stai usando non diventa incompatibile con il Core o con altri moduli installati. La pagina mostrata da Aggiornamenti disponibili fornisce le informazioni essenziali per decidere.
Prima di procedere ad un aggiornamento è sempre consigliato fare un backup della app, per poterla ripristinare in caso che l'aggiornamento provochi un blocco o crash della app.
Come aggiornare Drupal?
Come l'installazione, anche l'aggiornamento di Core e moduli non può essere effettuata dall'Amministratore dentro Drupal, ma deve essere effettuata da Terminale con Composer e Drush. Le istruzioni per aggiornare il Core all'ultima versione disponibile sono dettagliate sul sito Drupal. Le istruzioni per aggiornare un modulo sono le medesime che abbiamo già visto per la sua installazione.
da scrivere
arrivato qui
valutare se introdurre subito le tassonomie o cavarcela con tipo di contenuto gerarchico
Nella nostra app di esempio, vogliamo catalogare gli attrezzi utilizzando Categorie predefinite dall'Amministratore, per facilitare la ricerca degli attrezzi, che potrebbero essere descritti dai proprietari in modo non uniforme. A questo scopo possiamo creare un nuovo Tipo di Contenuto ma, per etichettare Contenuti, Drupal mette a disposizione uno strumento più potente: le Tassonomie. Una Tassonomia è un vocabolario di Termini con cui etichettare i Contenuti. Solo per le Tassonomie, Drupal offre comandi speciali che facilitano la creazione di gerarchie di Termini a più livelli, ad esempio:
- Falegnameria
- Sega
- Pialla
- Levigatrice
- Giardinaggio
- Falciatrice
- Troncarami
- Idropulitrice
- Lavori in muratura
- Trabattello
- Tagliapiastrelle
- Frattazzo
- Abbigliamento
- Macchina per cucire
- ...
Poiché è difficile prevedere quanto la gerarchia di etichette si complicherà con l'uso della app, è opportuno affrontarla da subito con una Tassonomia.
COSTRUIRE UNA TASSONOMIA
Come Amministratore, sotto il menù Struttura - Tassonomia trovi i comandi per creare e gestire le Tassonomie. Col comando Aggiungi vocabolario crei una nuova Tassonomia semplicemente dandole un nome (es. "Categorie di attrezzi") e caricandovi i Termini. Creata la nuova Tassonomia, puoi riordinare gerarchicamente i Termini richiamandone l'elenco col comando Lista termini e trascinandoli:
![]() |
Come i Contenuti, anche i Termini di Tassonomia hanno Campi automaticamente valorizzati da Drupal:
| Campo | Tipo | A cosa serve |
| ID Termine (o TID) | numero intero | identifica univocamente il Termine di Tassonomia rispetto a tutti gli altri Termini presenti nella app |
| Autore | Riferimento ad un Utente | identifica l'Utente che ha creato il Termine di Tassonomia . Nella app di esempio, sarà sempre l'Amministratore. |
| Data di creazione | data | Data e ora di creazione del Termine nella app |
| Data di modifica | data | Data e ora di ultima modifica del Termine nella app |
| Genitore | Riferimento ad un altro Termine | identifica il Termine soprastante nella gerarchia della Tassonomia |
| Peso | Numero intero | ordine del Termine rispetto agli altri Termini con medesimo Genitore |
| Profondità | Numero intero | livello di profondità del Termine nella gerarchia della Tassonomia (0 = livello più alto) |
Gli ultimi tre Campi contengono le informazioni relative alla gerarchia: quando trascini un Termine nella gerarchia della Tassonomia, Drupal ricalcola automaticamente i Campi Genitore, Peso e Profondità.
APPLICARE LA TASSONOMIA AI CONTENUTI
Per applicare una Tassonomia ad un Tipo di Contenuto basta aggiungere al Tipo di Contenuto un Campo Riferimento che fa riferimento a quella Tassonomia.
Nella app di esempio, aggiungi quindi al Tipo di Contenuto "Attrezzo" un Campo Riferimento che punta alla Tassonomia "Categorie di Attrezzi" creando così una relazione Attrezzo → Termine:
![]() |
Puoi vedere qui la struttura degli Attrezzi, aggiornata anche con questo Campo.
Ad esempio, se installi il modulo "Client-side Hierarchical Select", viene aggiunto ai Campi Riferimento che fanno riferimento ad una Tassonomia un Widget che fa scegliere un Termine di primo livello, poi uno di secondo livello limitato dalla scelta effettuata nel primo e così via, consentendo così all'Utente di muoversi lungo la gerarchia mentre sta scegliendo il Termine da applicare all'attrezzo:
![]() |
PRIMA DI PROSEGUIRE
Se la tua app richiede una Tassonomia, descrivila e popolala con un po' di termini, disponendoli su una gerarchia con un paio di livelli.
Qui puoi trovare la struttura della Tassonomia utilizzata nella app di esempio.
Comandi esposti ai diversi ruoli come comandi contestuali costruiti con le viste.
Definizione dei menu
Definizione della prima pagina per ruolo
oltre le viste: il motore di ricerca
DA AGGIORNARE
Nella precedente Guida abbiamo visto come creare una Vista basata sulla relazione "Attrezzo → Categoria". Grazie a quella relazione, partendo da un tipo di Entità (i Contenuti di tipo Attrezzo) la Vista mostra un altro tipo di Entità (i Termini della Tassonomia "Categoria di attrezzi").
Proseguendo nella realizzazione della app di esempio, vediamo ora come costruire la Vista "Categorie di attrezzi" da mostrare agli Utenti non ancora registrati ("visitatori") per invogliarli a iscriversi alla app.
IL MODULO VIEWS TREE
Come tutte le Tassonomie, le Categorie di attrezzi sono organizzate in una gerarchia, il che significa che in ogni Categoria esiste un riferimento che la lega alla Categoria superiore, ad esempio la Categoria "Falciatrice" contiene un riferimento alla Categoria "Giardinaggio".
Volendo rappresentare la gerarchia delle Categorie non come una tabella piatta, ci serve un formato di visualizzazione ad "albero". Questo formato non è disponibile nativamente nelle Viste, ma viene aggiunto installando in Drupal il modulo "Views Tree" (vedi questa Guida per sapere come installare un modulo).
CREAZIONE DELLA VISTA
Per creare e configurare la Vista "Categorie di attrezzi" procedi come per la precedente Vista: vai in Struttura - Viste - Aggiungi nuova vista, digita il nome della vista ("Categorie di attrezzi"). In Mostra seleziona "Termine di Tassonomia" di tipo "Categorie di attrezzi". Scegli di creare una "Pagina" di formato "Tree (List)".
IMPOSTAZIONE DELLA RELAZIONE
Entrato nell'editor della Vista, aggiungi la relazione che lega un Termine di Tassonomia al proprio Termine superiore, che in Drupal è chiamato "genitore": nella sezione Avanzate - Relazioni clicca Aggiungi, cerca e seleziona "genitore":

VISUALIZZAZIONE AD ALBERO
Per usare Il formato ad albero, devi aggiungere nella sezione Campi della Vista l'identificativo dell'Entità "base" e l'identificativo dell'Entità "genitore". Per "Identificativo" si intende il codice univoco che identifica l'Entità, che nel caso dei Termini di Tassonomia è il Campo "ID Termine".
Aggiungi quindi il Campo "ID Termine":

Nascondi questo Campo perché serve alla Vista per organizzare l'albero ma non serve mostrarlo all'Utente:

Aggiungi nuovamente il Campo "ID Termine" specificando stavolta come "Relazione" la relazione "genitore":

Nella sezione Campi hai quindi :

Per evitare che, cliccando sul nome di una Categoria il visitatore possa navigare nel sito, nel Campo "Termine della tassonomia: Nome" disattiva il parametro Collegamento a Termine della tassonomia.
Nella sezione Formato ora puoi finalmente configurare l'albero: a fianco di "Tree (list)" clicca Impostazioni; come Main field seleziona il primo dei due Campi "ID Termine" e come Parent field il secondo dei due Campi "ID Termine" (corrispondente al termine "genitore"):

Nella sezione Anteprima ecco apparire l'albero delle Categorie degli attrezzi:

Se non sono in ordine alfabetico, nella sezione Criteri di ordinamento aggiungi due criteri: il primo ordina per nome del genitore del Termine ed il secondo per nome del Termine:

Per non spezzare l'albero su più pagine, nella sezione Paginazione imponi che siano mostrate tutte le Entità in una sola pagina:
Poiché questa Vista ha lo scopo di incentivare i visitatori a iscriversi alla app, nella sezione Intestazione aggiungi una "Area di testo" in cui scrivere un messaggio del tipo "Vorresti un attrezzo di questi in prestito gratuito? Sei disponibile a prestare gratuitamente ai tuoi vicini un tuo attrezzo?" e nella sezione Piè di pagina un'altra "Area di testo" con un testo del tipo "Per partecipare a "Buon Vicinato" clicca il comando "Accedi" per registrarti: la tua domanda sarà verificata e riceverai una mail di conferma."
Vedremo in una prossima Guida come far diventare questa Vista la pagina di benvenuto per i visitatori.
Puoi vedere questa Vista in azione qui e qui sotto la sua configurazione:





























