MieApp

A cosa serve MieApp e come si usa.

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 localeInstallazione in cloud

1

Trasformare il computer in un serverScegliere il provider che offre il server adatto

2

Configurare il server(ci pensa il provider)

3

Preparare la cartella dove installare DrupalPreparare il sito dove installare Drupal
Installazione manuale di Drupal nel sitoSe disponibile: Installazione automatica di Drupal nel sito

4

Preparare il database necessario a DrupalPreparare il database necessario a Drupal(ci pensa il provider)

5

Installare Drupal nella cartellaInstallare Drupal nel sito(ci pensa il provider)

6

Configurare Drupal per il primo usoConfigurare 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

  1. Prepara in Apache una cartella in cui installare Drupal
  2. Prepara in MySQL un database dedicato alla app
  3. Prepara in Apache un indirizzo specifico per la app
  4. Installa Drupal nella cartella
  5. 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 è:

https://NOMEAPP.test

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:

  • Da Gestione Risorse di Windows apri la artella della app;  con Laragon puoi usare il comando www - Esplora - NOMEAPP
  • Entra nella sottocartella web creata da composer ed apri il file .htaccess con un editor di testi (es. Notepad)
  • Nel file, modifica la riga php_value assert.active come # php_value assert.active per disabilitarne l'esecuzione
  • Salva il file.

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 è:

https://NOMEAPP.test/web

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:

  1. Scegli il provider
  2. Prepara presso il provider il sito che ospiterà Drupal
  3. 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

https://vicinato.bottasini.eu

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.

SALVARE LA TUA APP CON DRUSH

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: 

ScopoA cosa serve la tua app? Descrivila con poche frasi, come se dovessi convincere i futuri utenti a considerarla.
UtentiChi 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?
ProcessiCosa fanno gli utenti con la app? Descrivi le principali azioni che gli utenti (o gruppi di utenti) eseguono nella app
InformazioniQuali informazioni gestisce la app? Descrivi i vari tipi di informazioni necessarie ai processi
PermessiQuali permessi hanno gli utenti sulle diverse informazioni? Chi può fare cosa?
PercorsiCome 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
AutomazioniQuali 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:

https://vicinato.bottasini.eu

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:

InformazioneCosa rappresenta
UtenteUna persona fisica che usa la app, cui i Gestori hanno rilasciato le credenziali (nome utente, password) personali per accedervi
AttrezzoUn attrezzo fisico, messo a disposizione dal suo Proprietario agli altri Partecipanti
CategoriaUna categoria di classificazione degli Attrezzi, predisposta dai Gestori ed applicata all'Attrezzo dal Proprietario, per facilitare la ricerca da parte dei Partecipanti
RichiestaUna richiesta di prestito avanzata da un Partecipante su un Attrezzo altrui
PrestitoLa concessione del prestito su un Attrezzo da parte del Proprietario in risposta ad una Richiesta
SedeUn luogo fisico dove l'Attrezzo può essere portato per facilitare il passaggio tra Proprietario e Richiedente
OperatoreUna persona fisica, abilitata dai Gestori a ricevere e consegnare Attrezzi presso una Sede
AbilitazioneL'abilitazione da parte dei Gestori di un Operatore ad agire presso una Sede
ConsegnaLa 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.
ValutazioneLa valutazione dell'esperienza relativa ad un Prestito, espressa dal Proprietario o dal Richiedente 
NotaUna 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:

InformazionePartecipanteOperatoreGestore
Dati UtenteModifica 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.
AttrezzoCrea l'Attrezzo. Modifica i propri Attrezzi. Vede tutti gli AttrezziVede tutti gli AttrezziVede e modifica tutti gli Attrezzi
CategoriaVede tutte le CategorieCrea e modifica tutte le Categorie
RichiestaCrea 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 è abilitatoVede, modifica ed elimina tutte le Richieste
PrestitoCrea 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 è abilitatoVede, modifica ed elimina tutti i Prestiti
SedeVede tutte le SediCrea, modifica e disattiva tutte le Sedi
AbilitazioneVede tutte le AbilitazioniCrea, modifica e disattiva tutte le Abilitazioni
ConsegnaCrea 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 
ValutazioneCrea 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
UtenteTu
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"
PartecipanteGli 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"
OperatoreConsegne nelle tue sedi
Elenco Prestiti non conclusi con consegna nelle sedi dell'Utente → Attrezzo, Prestito, Consegne
Comando "Archivio Consegne"
Comando "Operatori di sede"
GestoreGestione app
Comando "Gestione Utenti"
Comando "Gestione Categorie"
Comando "Gestione Sedi"
Comando "Gestione anomalie"

PERCORSO UTENTI

Tuoi datiUTENTE
UtenteSolo sui propri dati: Dati dell'Utente
GestoreDati dell'Utente
Solo se l'Utente è Operatore:
Elenco Sedi abilitate all'Utente → Sede
Comando "Aggiungi Sede a Operatore"
Gestione UtentiGESTIONE UTENTI
GestoreElenco degli Utenti → Utente 
Comando "Aggiungi Utente"
Aggiungi UtenteCREA UTENTE
Gestoremodulo di creazione Utente → Utente 

PERCORSO MESSAGGI

Tutti i MessaggiMESSAGGI
UtenteElenco 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
Utentemodulo di creazione di un Messaggio (se da "Rispondi al messaggio" viene precaricato il destinatario) → Messaggio

PERCORSO ATTREZZI

Gestione Categorie→ GESTIONE CATEGORIE
GestoreElenco delle Categorie → Categoria
Comando "Aggiungi Categoria"
Click su una Categoria→ CATEGORIA
GestoreDati della Categoria
Comando "Gestione Categorie"
Aggiungi Categoria→ CREA CATEGORIA
GestoreModulo di creazione di una Categoria → Categoria

Magazzino MAGAZZINO (vedi in funzione) (come è costruita)
UtenteElenco Attrezzi disponibili al prestito → Attrezzo
PartecipanteComando "Tuoi Attrezzi"

Tuoi AttrezziTUOI ATTREZZI (vedi in funzione) (come è costruita)
PartecipanteComando "Magazzino Attrezzi"
Comando "Aggiungi Attrezzo"
Elenco Attrezzi dell'Utente → Attrezzo

Click su un Attrezzo→ATTREZZO (vedi in funzione) (come è costruita)
UtenteComando "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 AttrezzoCREA ATTREZZO
PartecipanteModulo di creazione di un Attrezzo → Attrezzo

PERCORSO RICHIESTE

Chiedi Attrezzo in prestitoCREA 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 concluseRICHIESTE CONCLUSE
PartecipanteElenco Richieste concluse dell'Utente →  Attrezzo, Richiesta, Prestito, Consegna, Valutazioni
Gestione anomalieGESTIONE ANOMALIE
GestoreElenco di tutte Richieste →  Attrezzo, Richiesta, Prestito,  Consegna, Valutazioni

PERCORSO PRESTITI

Presta l'AttrezzoCREA 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)
PartecipanteElenco Richieste concluse dell'Utente come Proprietario →  Attrezzo, Richiesta, Prestito (filtrato per Attrezzo se da comando "Prestiti sull'Attrezzo conclusi ")
Consegna AttrezzoCREA 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 ConsegneARCHIVIO CONSEGNE
OperatoreElenco delle Consegne emesse nelle Sedi dell'Utente: → Attrezzo, Prestito, Consegne

PERCORSO VALUTAZIONI

Aggiungi ValutazioneCREA 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
UtenteMappa ed elenco delle Sedi: → Sede
GestoreComando "Aggiungi Sede"
Aggiungi SedeCREA SEDE
GestoreModulo di creazione di Sede → Sede
Click su una Sede→SEDE
UtenteDati della Sede
GestoreElenco delle Abilutazioni di Operatori nella sede → Abilitazione, Utente Operatore
Comando "Aggiungi Operatore a Sede"
Aggiungi Operatore a Sede
Aggiungi Sede a Operatore
CREA ABILITAZIONE
GestoreModulo 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
GestoreDati della Abilitazione → Sede, Utente Operatore
Operatori di sedeOPERATORI DI SEDE
OperatoreElenco 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:

https://NOMESITO/user

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:

SezioneA cosa serveVedi
ContenutoAggiungere Contenuti alla app, cercare e modificare quelli inseriti.I Contenuti
StrutturaModificare la struttura delle informazioni gestite da Drupal e come vengono mostrate agli utenti

Le Entità

Le Viste

AspettoCambiare colori, font, logo ed ogni aspetto grafico della tua app 
EstendiAttivare e disattivare i moduli aggiuntivi di Drupal che hai installatoCore e moduli aggiuntivi
ConfigurazioneCambiare 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
UtentiGestire gli Utenti, attribuire loro permessiGli Utenti
ResocontiVerificare il funzionamento di Drupal, aggiornamento dei moduli 
AiutoRicevere 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 testoin Struttura - Layout dei blocchi vai nella sezione Contenuto (Main content), clicca Posiziona il blocco e poi Add content block
scrivi il testo che vuoi mostrareIn 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 loginin Struttura - Layout dei blocchi vai nella sezione Main content e sposta il Blocco "Istruzioni ai Visitatori" in fondo alla sezione.
provaLancia 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 Utentein Persone clicca Aggiungi utente, digita l'email della persona, assegna un nome utente ed una password. Non salvare
assegna all'Utente il Ruolo di AmministratoreNella 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 CommentoCommenti 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:

AutoreRiferimento all'Utente che ha creato il Contenuto
Creato il Data e ora di creazione del Contenuto
ModificatoData 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:

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 ContenutoVai 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 ContenutoDigita 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 Titoloin 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: 

  1. esportare in un file l'identificativo dell'Entità ed il valore del Campo, utilizzando il modulo Views Data Export
  2. aggiungere alle Entità un nuovo Campo del tipo desiderato
  3. importare dal file i valori nel nuovo Campo, utilizzando il modulo Feeds
  4. 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:

CampoTipoDescrizione
TitolotestoDescrizione breve dell'Attrezzo
Descrizionetesto formattatoDescrizione lunga dell'Attrezzo
CategoriaRiferimento a CategoriaCategoria cui appartiene l'Attrezzo (Attrezzo → Categoria)
ImmagineimmagineImmagine che raffigura l'Attrezzo
AllegatiFile (più valori)Documenti che descrivono l'Attrezzo
StatoElenco di testiPrestabile | Ritirato
DoveRiferimento a SedeDove 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:

CampoTipoDescrizione
Nome (titolo)testoNome della Categoria. Es. "Falciatrice"
SinonimitestoAltri 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:

CampoTipoDescrizione
TitolotestoNome della Sede
Indirizzotesto formattatoIndirizzo completo della Sede
Contattitesto formattatoModalità di contatto e orari di apertura al pubblico per la consegna degli Attrezzi
Statoelenco di selezioneAttiva | Inattiva 
Tipoelenco di selezioneReale | Nominale (serve per distinguere tra Sedi reali e le due "sedi" corrispondenti al Proprietario e al Richiedente)
Coordinatecoordinate geograficheVedi Mappe

ABILITAZIONE

L'abilitazione di un Operatore ad una Sede è rappresentata da un Contenuto di tipo "Abilitazione", formato dai seguenti Campi:

CampoTipoDescrizione
TitolotestoGenerato automaticamente come "Abilitazione n. CODICE"
CodiceSerialeCodice univoco generato automaticamente 
SedeRiferimento a SedeSede di abilitazione (Abilitazione → Sede)
OperatoreRiferimento a UtenteOperatore abilitato (Abilitazione→ Utente)
Notatesto formattatoNota relativa alla abilitazione dell'Operatore alla Sede
Statoelenco di selezioneAttiva | 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:

CampoTipoDescrizione
TitolotestoGenerato automaticamente come "Richiesta n. CODICE"
CodiceSerialeCodice univoco generato automaticamente
AttrezzoRiferimento ad AttrezzoAttrezzo chiesto in prestito (Richiesta → Attrezzo)
Notatesto formattatoDescrizione della Richiesta
StatoWorkflowVedi 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:

CampoTipoDescrizione
TitolotestoGenerato automaticamente dalla app come "Prestito n. CODICE"
CodiceSerialeCodice univoco generato automaticamente
RichiestaRiferimento a RichiestaRichiesta cui il Prestito risponde (Prestito → Richiesta)
Notatesto formattatoDescrizione del Prestito (es. condizioni di utilizzo, periodo ecc.)
PeriodoData (intervallo)Periodo indicativo di prestito
StatoWorkflowVedi 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:

CampoTipoDescrizione
TitoloTestoGenerato automaticamente come "Consegna n. CODICE"
CodiceSerialeIntero univoco generato automaticamente
PrestitoRiferimento a PrestitoPrestito cui si riferisce la Consegna  (Consegna → Prestito)
SedeRiferimento a SedeDove viene consegnato l'Attrezzo (Consegna → Sede). Sono previste anche due Sedi nominali * Proprietario e *Richiedente. 
AccettazioneRiferimento a UtenteUtente che ha accettato la consegna (Consegna → Utente)
NotaTesto formattatoNota per situazioni particolari (es. consegna incompleta, delega)
StatoWorkflowVedi 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:

CampoTipoDescrizione
TitoloTestoGenerato automaticamente come "Valutazione n. CODICE"
CodiceSerialeIntero univoco generato automaticamente
PrestitoRiferimento a PrestitoPrestito cui si riferisce la Valutazione (Valutazione → Prestito)
ValoreElenco di selezione di interiValore della Valutazione (-1=negativa, 0=neutra, 1=positiva, 2=ottima)
NotaTesto formattatoNota che spiega la Valutazione
StatoWorkflowVedi 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:

CampoTipoDescrizione
TitoloTestoGenerato automaticamente come "Nota n. CODICE"
CodiceSerialeIntero univoco generato automaticamente
RiferimentoRiferimento al ContenutoContenuto cui si riferisce la Nota (Nota→ Richiesta) (Nota→ Attrezzo) (Nota→ Sede) (Nota→ Abilitazione) (Nota→ Categoria) (Nota→ "App)"     
DestinatarioRiferimento a UtenteDestinatario della Nota
AllegatiFile 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 stessoIn 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 tipoIn 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:

  1. in Configurazione - Workflow disegnare il Workflow definendone gli stati, i passaggi tra gli stati ed i Permessi assegnati agli Utenti in ogni stato 

  2. In Persone - Permessi regolare i Permessi base per coordinarli coi Permessi gestiti dal Workflow ed autorizzare gli Utenti a usare i Workflow

  3. 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 WorkflowIn Configurazione - Workflow seleziona Aggiungi Workflow e digita il nome del nuovo Workflow 
definisci gli statiIn 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 statiIn 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'altroIn 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 statiIn 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 WorkflowIn 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 statiIn 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 WorkflowOccorre 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 VistaIn Struttura - Viste clicca  Aggiungi nuova vista e digita il nome della nuova vista (es. "Magazzino")
seleziona cosa mostrareIn Mostra seleziona che tipo di Entità mostrare nella Vista (es. contenuto di tipo "Attrezzo")
descrivi la VistaAttiva Descrizione e descrivi a tua memoria futura cosa fa la Vista (es. "Elenco degli Attrezzi disponibili al prestito") 
definisci il link di richiamo della VistaIn Percorso digita il link con cui sarà richiamata la Vista (es. "/magazzino")
scegli come mostrareAttiva 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 
definisce quali Utenti possono vedere la Vista

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 VistaClicca 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 CampoIdentificato 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 CampoNella 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 CampoIn 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 Camponella 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 Campoattiva 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 CampoIl Campo "Immagine" fa parte dell'Entità principale della Vista (l'Attrezzo) quindi in Relazione non selezionare nulla. 
completa la configurazione del CampoNella 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'ordinamentonella 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 esponiloNella 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 ricercacome operatore seleziona Contiene ogni parola, in modo da poter stringere la ricerca digitando più parole
definisci dove cercarein 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 paginazioneNella sezione Paginazione seleziona Risultati paginati, paginatore ridotto oppure Risultati paginati, paginatore completo
regola la paginazioneIndica 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:

Permessola Vista elenca le Entità tenendo conto dei Permessi degli Utenti sulle Entità
Ruolola Vista elenca le Entità solo agli Utenti che hanno uno o più Ruoli specificati  
Senza restrizionila 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 mostrarein 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 relazioneNella 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 VistaIn 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 → RichiestaNella 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 AttrezzoNella 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 sezioneCampo specialea cosa serverichiede il modulo
CampiGlobale - Testo personalizzatomostra un testo fisso o dipendente da altri Campi (attraverso i Token, vedi sotto) 
Globale - Visualizzarichiama un'altra Vista dentro la VistaViews Field View
Viste - Views Conditional mostra un valore A o un valore B in base al valore di un altro CampoViews Conditional
Globale  - Simple Math Fieldmostra il risultato di un calcolo basato sui valori di altri CampiViews Simple Math 
Intestazione o Piè di paginaGlobale - Area di testomostra un testo fisso o dipendente da altri Campi (attraverso i Token, vedi sotto) 
Globale - Riassunto del risultatomostra il numero di entità elencate dalla Vista, accompagnato da un testo a piacere 
Globale - Area della Vistarichiama un'altra Vista dentro la Vista 
Globale - Linkaggiunge 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 Campocorrisponde 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 sezionecome 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 partenzaIn 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 VisteNella 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 VisteNelle 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 appareSe 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 partenzaDentro 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 VisualizzazioniNella 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 appareSe 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 prestitoNella 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 Attrezziaggiungi Contenuto - Tipo di contenuto e seleziona "Attrezzo" 
elenca Attrezzi prestabiliaggiungi Contenuto - Stato (field_stato_attrezzo) - Appare in: attrezzo.
elenca Attrezzi di proprietà dell'Utente correnteaggiungi 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:

 

se B è soddisfatto

se B non è soddisfatto

se A è soddisfatto

(A AND B) è soddisfatta

(A AND B) non è soddisfatta

se A non è soddisfatto

(A AND B) non è soddisfatta

(A AND B) non è soddisfatta

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:

 

se B è soddisfatto

se B non è soddisfatto

se A è soddisfatto

(A OR B) è soddisfatta

(A OR B) è soddisfatta

se A non è soddisfatto

(A OR B) è soddisfatta

(A OR B) non è soddisfatta

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 Richiestenella 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:

  • aggiungi la relazione Contenuto -  Utente - Nome utente dell'autore del contenuto e rinominala "Richiedente"
  • aggiungi la relazione Contenuto - Contenuto referenziato da field_attrezzo_richiestato - Appare in: prestito e rinominala "Attrezzo"
  • aggiungi la relazione Contenuto -  Utente - Nome utente dell'autore del contenuto, seleziona la relazione "Attrezzo" e rinominale "Proprietario".
mostra le Richieste che hanno come Richiedente l'Utente correnteNella 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 correnteNella 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 EVAIn 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 mostrarlaNella 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 mostrarlaNella 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 EVAIn 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 mostrarlaNella sezione Filtri contestuali aggiungi ID - Contenuto
identifica il Richiedente, grazie alla relazione Attrezzo → AutoreNella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto e rinomina come "Richiedente"
identifica l'Attrezzo, grazie alla relazione Richiesta → AttrezzoNella sezione Relazioni  aggiungi  Contenuto referenziato da field_attrezzo_richiesta - Contenuto - Appare in: richiesta e rinominalo "Attrezzo"
identifica il Proprietario, grazie alla relazione Attrezzo → AutoreNella 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 inversoNella 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: 

  • aggiungiamo il Filtro che limita la Vista alle sole Richieste dell'Utente corrente (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)
  • aggiungiamo il Filtro che limita la Vista alle sole Richieste su Attrezzi dell'Utente corrente (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)
  • mettiamo questi due Filtri in OR logico tra loro (perché l'Utente corrente deve essere il Proprietario oppure il Richiedente) e in AND logico con gli altri Filtri.
mostra le informazioni relativa alla Richiesta ed all'Attrezzo

nella sezione Campi:

  • per la Richiesta: Campo "titolo" (Etichetta "Richiesta"), "Creato il", "Descrizione" e "Stato";
  • per il Richiedente: "nome" (Relazione "Richiedente", Etichetta "Richiedente")
  • per l'Attrezzo: Campo "Immagine" (Relazione "Attrezzo"), "titolo" (Relazione "Attrezzo", Etichetta "Attrezzo")
  • Per il Proprietario: "nome" (Relazione "Proprietario", Etichetta "Proprietario")
  • per il Prestito: "titolo" (Relazione "Prestito", Etichetta "Prestito"),  "Istruzioni" (Relazione "Prestito", Etichetta "Istruzioni") e "Stato" (Relazione "Prestito", Etichetta "Stato del Prestito")

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 EVAIn 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: 

  • aggiungiamo il Filtro che limita la Vista alle sole Richieste dell'Utente corrente (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)
  • aggiungiamo il Filtro che limita la Vista alle sole Richieste su Attrezzi dell'Utente corrente (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)
  • mettiamo questi due Filtri in OR logico tra loro (perché l'Utente corrente deve essere il Proprietario oppure il Richiedente) e in AND logico con gli altri Filtri.
mostra le informazioni relativa alle Consegnenella 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 

Tuoi Attrezzi

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ì:

  • apri una pagina della app in cui appare un pulsante, es. la pagina di modifica di una Entità mostra in fondo il pulsante "Salva"
  • clicca sulla pagina col pulsante destro del mouse e seleziona "Visualizza sorgente pagina" (il comando può variare in base al web browser che stai usando) che ti mostra il codice HTML della pagina
  • cerca in esso la parola "Salva" e troverai un frammento di codice simile a questo:

    <input data-drupal-selector="edit-submit" type="submit" id="edit-submit" name="op" value="Salva" class="button button--primary js-form-submit form-submit"/>

  • il nome della classe che genera il pulsante è quello racchiuso tra virgolette a fianco di "class", in questo caso button button--primary js-form-submit form-submit
  • per trasformare un link in pulsante, nella configurazione del Campo che mostra il link incolla il nome della classe in Classe del link

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: 

  1. una Vista che mostra il comando "Chiedi il prestito" precaricando l'identificativo dell'Attrezzo
  2. 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 VistaIn 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'AttrezzoNella 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 → AutoreNella 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 comandonella 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 EVAIn 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 → AttrezzoNella 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 richiamaNella sezione Filtri contestuali aggiungi ID - Contenuto, come Relazione seleziona "Attrezzo"
identifica il Richiedente, grazie alla relazione Richiesta → AutoreNella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto e rinomina come "Richiedente"
identifica il Proprietario dell'Attrezzo, grazie alla relazione Attrezzo → AutoreNella 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 Richiestanella 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'elenconella 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 Attrezzinella configurazione del Campo attiva l'opzione Visualizza anche se la vista non da risultati
scegli il testo con cui il comando si mostrain Testo del collegamento digita "Aggiungi Attrezzo"
definisci cosa esegue il comandoin 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 nascondilonella sezione Campi della Vista aggiungi  ID - Contenuto e attiva Escludi dalla visualizzazione 
aggiungi il Campo che conterrà il comandonella sezione Campi aggiungi Globale - Testo personalizzato
definisci come si presenta il comando all'utentecome 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 comandocome 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 aggregaAggiungi il Campo speciale Globale - Testo personalizzato - Fornisce testo o link personalizzato e come Etichetta digita "Identità" 
inserisci nel Campo i valori del Campi nascostiNella 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 fieldSeleziona 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 valueDigita 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 thisDigita 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 thisDigita 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:

DataRichiestaRichiedenteStato
10 Gen 2026------In corso
12 Gen 2026Richiesta n.324TUAperta
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 Richiestanella sezione Relazioni aggiungi il Campo Contenuto - Utente - Nome utente dell'autore del contenuto e rinomina "Richiedente"
memorizza l'identificativo del Richiedentenella sezione Campi aggiungi il Campo Utente - ID utente - ID dell'utente, come Relazione seleziona "Richiedente" e nascondilo. 
memorizza l'identificativo dell'Utente correntenella 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:

  • In If this field...  seleziona il Campo Utente corrente (corrisponde all'identificativo del Richiedente).
  • In Is... seleziona "Equal to" (questo operatore controlla se this field e this value sono uguali)
  • In This value copia il Token {{ nothing }} corrispondente al Campo Globale che contiene l'identificativo dell'Utente corrente
  • In Then output this... digita "TU"
  • In Otherwise, output this...  digita "---"

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 primariaNella 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:

VisualizzazioneIndirizzoStato della RichiestaUtente corrente
Tue Richieste aperte/richieste-apertediverso da ConclusaRichiedente
Tue Richieste concluse/richieste-concluseConclusaRichiedente
Tuoi Prestiti aperti/prestiti-apertidiverso da ConclusaProprietario
Tuoi Prestiti conclusi/prestiti-conclusiConclusaProprietario 

 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 PartecipantiNella sezione Impostazione pagina - Accesso seleziona Ruolo e seleziona "Partecipante"
filtra la Vista sull'Utente correnteNella 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'UtenteNella 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 Categoriein 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 titoloNella 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 Visualizzazionevai 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 inizionella 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 durataaggiungi 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 fineaggiungi il Campo "Fine" in formato leggibile e come Etichetta digita "Data di Fine"
prepara la data di fine per il calcolo della durataaggiungi 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 durataaggiungi un Campo Simple Math Field e come Etichetta digita "Durata"
seleziona i Campi che userai nel calcolonella 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'aggregazionenella 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 defaultRestando 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 VistaIn 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 coordinateIn 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 SediIn 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.

 

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 PROCEDURASalvaArchivioRicettaToken

 

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:

EventoAttiva la procedura quandoUtile per
Presave content entityun 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 accessun 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 eventsi è 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 userun 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:

AzioneCosa faUtile 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'URLporta 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 newcrea 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: Deleteelimina 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: loadmemorizza in un Token l'Utente corrente. In Name of token digita il nome del Token in cui memorizzare l'Utentemettere a disposizione della procedura le informazioni dell'Utente corrente
User: switch current accountcambia l'Utente che sta eseguendo la procedura. In User ID digita l'identificativo dell'Utente cui passareeseguire la procedura come Amministratore superando i limiti imposti all'Utente corrente
Views: Execute querymemorizza 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 parametermemorizza 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 linkleggere gli argomenti in una procedura attivata dall'Evento Endpoint access
Tamper: Mathmemorizza 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:

AzioneCosa faUtile per
Compare number of list itemsConfronta 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 valuesConfronta 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 IDVerifica 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 emptyVerifica 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:

  1. 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.
  2. 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:

1un Evento Presave content entityattiva la procedura quando sta per essere salvata una Entità di un certo tipo 
2una serie di Azioni e Condizionirealizzano il comando
3un'Azione o più Azioni Mostra un messaggio all'utenteavvisa 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 proceduraIn Configurazione - ECA clicca Add new model.  Clicca l'icona ℹ️ e in Etichetta digita un nome per la procedura
1attiva 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.
2assegna 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 PrestitoAggiungi 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 PrestitoAggiungi un gateway (rombo).  Da qui partono tre percorsi alternativi (2a) (2b) (2c)
2ase 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".

2bse 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"
2cse il Prestito è "concesso", la Richiesta è "accettata"Come 2a, stavolta verificando che lo Stato del Prestito sia "concesso" e imponendo alla Richiesta lo Stato "accettata"
3avvisa l'Utente che è stato cambiato lo Stato della RichiestaAggiungi 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:

1un Evento Cron Eventiattiva la procedura quando scatta una scadenza temporale 
2una serie di Azioni e Condizioni, tipicamente su più Entità selezionate con Views: Execute queryrealizzano la procedura
3eventualmente 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 proceduraIn Configurazione - ECA clicca Add new model. Clicca l'icona ℹ️ e in Etichetta digita un nome per la procedura
1attiva la procedura una volta al meseAggiungi 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.
2cerca 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 eliminazioneAggiungi 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]"
3al termine delle eliminazioni, scrivi nel log di Drupal la lista delle Richieste eliminateAggiungi 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:

1attiva la procedura quando richiamata dalla precedenteAggiungi l'Evento Custom event (entity aware). In Event ID digita "Elimina_Richiesta_Vecchia". La Richiesta da eliminare è memorizzata nel Token entity.
2elimina la Richiesta ricevutaAggiungi 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:

1un Evento Endpoint accesspredispone il link /eca/parametro1/parametro2 che, quando viene cliccato, attiva la procedura
2una o più Azioni Request: Get URL query parameterrecuperano 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
3una serie di Azioni e Condizionirealizzano il comando
4un'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 proceduraIn Configurazione - ECA clicca Add new model. Clicca l'icona ℹ️ e in Etichetta digita un nome per la procedura
1predisponi il link che attiva la proceduraAggiungi 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
2recupera dal link l'argomento che identifica la ConsegnaAggiungi 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
3Memorizza 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 sedeAggiungi 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)
3aSe 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".

3bSe 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".

4Ricongiungi i due percorsiAggiungi 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 comandoAggiungi 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". 

 

temi

dove trovarli e come installarli (composer)

configurazioni

 

 

 

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.

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:

CampoTipoA cosa serve
ID Termine (o TID)numero interoidentifica univocamente il Termine di Tassonomia rispetto a tutti gli altri Termini presenti nella app
AutoreRiferimento ad un Utenteidentifica l'Utente che ha creato il Termine di Tassonomia . Nella app di esempio, sarà sempre l'Amministratore.
Data di creazionedataData e ora di creazione del Termine nella app
Data di modificadataData e ora di ultima modifica del Termine nella app
GenitoreRiferimento ad un altro Termineidentifica il Termine soprastante nella gerarchia della Tassonomia
PesoNumero interoordine del Termine rispetto agli altri Termini con medesimo Genitore
ProfonditàNumero interolivello 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: