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. Dei rapporti tra IA e Drupal mi occuperò nella prossima Guida.

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. 

MieApp è costruito con Drupal

Naturalmente anche MieApp è una app costruita con Drupal. Per spiegare alcune delle potenzialità di Drupal userò quindi come esempio ciò che vedi in questo sito.

La IA dentro Drupal è un ecosistema che sta rilasciando molte soluzioni e sembra promettente, perché orientato non a produrre codice aggiuntivo ma a integrare nel robusto framework di Drupal le funzioni IA di produttività (generazione testi e immagini, chatbot, ricerca ecc.) intorno a un modulo principale, quindi sfruttando appieno anche la architettura modulare di Drupal. C'è anche un modulo (Views AI Generator) che promette di assisterci nella costruzione di Viste, strumento fondamentale in Drupal che però può risultare di difficile configurazione al primo impatto.

Insomma, la comunità degli sviluppatori Drupal ha abbracciato in pieno la sfida IA, a noi "site builder" è affidato il compito di sperimentare i moduli e a MieApp di provare a fare sintesi dei più utili per la costruzione di web app, in un approccio che definirei di “vibe configuration” e non di “vibe coding”.

A mano a mano che avrò tempo aggiungerò quindi Guide dedicate alla IA dentro Drupal.

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.

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.

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:

Non dimenticare il punto finale "." perché dice a composer di installare Drupal nella cartella corrente.

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 mail della app (per ora la tua email, eventualmente poi da sistemare)
  • 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)

In realtà mancano alcune impostazione base, che vedremo tra poco.

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:

dove NOMEAPP è il nome che hai dato al sito. Sempre nel Terminale digita il comando:

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 della app (per ora la tua email, eventualmente poi da sistemare) e le tre informazioni definite al passo 3.2 (nome del database, nome dell'utente del database, password dell'utente del database).

In realtà mancano alcune impostazione base, che vedremo tra poco.

Ora Drupal è installato e pronto all'uso. Prima però ti raccomando di installare anche l'utility Drush.

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

  • Vai nella pagina del modulo sul sito di Drupal
  • 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.

Durante l'installazione di Drupal hai impostato il nome della tua app, il fuso orario e la lingua. Per completare le impostazioni base di Drupal mancano ancora alcuni dettagli, che ti suggerisco di sistemare prima di iniziare a costruire la tua app. 

Per farlo devi fare login in Drupal con le credenziali (nome utente e password) di Amministratore che hai definito durante l'installazione. Vedremo più avanti tutti i comandi di cui disponi come Amministratore, per ora ci concentriamo su quelli utili per completare l'impostazione. 

Entrato come Amministratore, nella barra in alto clicca Configurazione e poi Impostazioni internazionali

  • In Paese predefinito seleziona Italia
  • in Primo giorno della settimana seleziona Lunedì
  • In Fusi orari seleziona Roma
  • (se non hai esigenze specifiche) Disattiva Gli utenti possono definire il loro fuso orario

In Impostazioni di base puoi:

  • modificare il Nome del sito con cui la tua app si presenta
  • aggiungere uno slogan, che sarà presentato al nome 
  • modificare l'email del sito (utile se la tua app deve spedire mail)
  • modificare la prima pagina predefinita mostrata agli utenti (per ora lascia così, vedremo più avanti come modificarla)

In Configurazione ci sono molti altri parametri, che esamineremo a mano a mano che ci servirà

Perché la app deve spedire mail?

Ci sono diversi motivi per cui la tua app potrebbe avere la necessità di spedire email. Ecco i più comuni:

  • consentire agli utenti di impostarsi una nuova password se l'hanno dimenticata. Come vedremo, se un Utente della tua app dimentica la password di accesso, può richiedere di ricevere una mail, che contiene un link che gli consente di reimpostarla.
  • consentire agli utenti di contattarti senza conoscere la tua mail. Usando il modulo Contatti, un Utente può scriverti un messaggio compilando una pagina della app e Drupal provvede a inviarti una mail col messaggio dell'Utente
  • consentire agli Utenti di iscriversi da sé alla tua app. L'autoiscrizione di un Utente alla app richiede che Drupal spedisca una mail per verificare l'indirizzo mail dell'Utente.
  • avvisare l'Amministratore di fatti che accadono nella app. Vedremo come costruire procedure che automaticamente avvisano per email l'Amministratore quando occorrono fatti di particolare interesse.
  • ricevere avvisi sugli aggiornamenti dei moduli. Se abiliti la tua app a spedire mail, come Amministratore puoi ricevere mail che ti avvisano quando sono disponibili aggiornamenti dei moduli installati nella tua app.

Se la tua app non è particolarmente critica, non ha altri Utenti oltre a te oppure ha pochi Utenti che puoi contattare esternamente alla app, la spedizione di mail da parte della app potrebbe non interessarti. In tutti gli altri casi, vediamo come attivarla. 

L'indirizzo mail della app

Durante l'installazione di Drupal hai definito un indirizzo mail della app, che puoi rivedere e modificare in Configurazione - Impostazioni di base - Indirizzo e-mail. Questo indirizzo è utilizzato da Drupal come mittente da cui spedire i messaggi. 

Ogni indirizzo mail appartiene ad un dominio, che è la parte a destra della chiocciola (es. l'indirizzo "rossi@gmail.com" appartiene al dominio "gmail.com"). A sua volta, la tua app appartiene al dominio indicato nel suo indirizzo (es. una app con indirizzo https://vicinato.bottasini.eu appartiene al dominio "bottasini.eu"). La maggior parte dei sistemi di posta elettronica considerano sospetti i messaggi che hanno un mittente appartenente ad un dominio (es. "gmail.com") diverso da quello della app che spedisce il messaggio (es. "bottasini.eu"). I messaggi sospetti vengono automaticamente spostati nella casella di posta indesiderata (spam) e quindi non vengono visti dal destinatario. Per evitare questo problema, il dominio dell'indirizzo mail della app deve coincidere col dominio della applicazione che invia il messaggio. 

Se la tua app è installata in un servizio cloud di web hosting, fa parte di un dominio pubblico. Se, come quasi sempre accade, il servizio cloud ti mette a disposizione anche almeno un indirizzo mail nel medesimo dominio, sei a posto: ti basta scrivere quell'indirizzo mail in Configurazione - Impostazioni di base - Indirizzo e-mail. Idem, se la tua app è installata su un server locale che fa parte di di un dominio pubblico ed il gestore della tua rete locale ti mette a disposizione un indirizzo mail nello stesso dominio.

Come configurare la app per la spedizione di mail

Il modo più semplice per inviare mail da Drupal è usare il protocollo SMTP perché tutti i server di spedizione mail lo accettano e forniscono i parametri necessari al suo utilizzo. Ci sono diversi moduli aggiuntivi che consentono di utilizzare SMTP in Drupal. Tra questi, suggerisco il modulo "Drupal Symfony Mailer Lite" (DSML), perché supporta SMTP (oltre ad altri metodi di trasporto di mail, es. Sendmail) ed è particolarmente semplice da configurare. 

Con DSML viene automaticamente installato anche il modulo "Mail System", che intercetta le richieste di spedizione mail da parte delle diverse funzioni di Drupal e le passa a DSML.

Questo schema evidenzia come un messaggio generato da una funzione della tua app arrivi nella casella Gmail, Outlook o altro dell'Utente destinatario, passando per Mail System e DSML dentro Drupal e, fuori Drupal, attraverso il server SMTP (in grigio i protocolli con cui il messaggio viaggia in internet):

Installati ed attivati i moduli DSML e Mail System, ecco come fare per attivare la spedizione mail dalla tua app:

Se sei arrivato qui, hai installato Drupal sul tuo computer o in cloud, sei entrato in Drupal come Amministratore e sai come installare i moduli aggiuntivi che servono alla tua app. Sei quindi pronto per costruire la tua prima app !

Costruire la app = configurare Drupal

La costruzione di una app con Drupal consiste essenzialmente nella configurazione di Drupal attraverso le pagine offerte all'Amministratore da Drupal stesso. In queste pagine, l'Amministratore è guidato a cliccare link, selezionare valori predefiniti e compilare campi testuali, senza necessità di ricordare a memoria comandi o parole chiave. 

Una difficoltà che potresti incontrare all'inizio è data dalla numerosità dei comandi disponibili e delle selezioni richieste da Drupal. Lo scopo di MieApp è proprio quello di aiutarti a scoprire passo passo le configurazioni più importanti, senza preoccuparti se sbagli o dimentichi qualcosa: in ogni momento potrai tornare indietro e raffinare la tua opera. Grazie a questa flessibilità offerta da Drupal, non è quindi necessario avere tutto chiaro prima di partire a costruire, anzi la progressiva costruzione della app ti fornirà suggerimenti su come proseguire. 

Cosa vuoi dalla tua app?

Prima di partire a costruire la tua app con Drupal, ti suggerisco di provare a descriverla sinteticamente rispondendo a queste domande: 

  • Scopo: A cosa serve la tua app? Descrivila con poche frasi, come se dovessi convincere i futuri utenti a considerarla.
  • Utenti: Chi utilizza la app? Solo tu o altre persone? Ci sono gruppi di utenti? E' necessario iscriversi alla app o è disponibile anche ai visitatori non iscritti? Chi autorizza gli utenti? Chi gestisce la app?
  • Processi: Cosa fanno gli utenti con la app? Descrivi le principali azioni che gli utenti (o gruppi di utenti) eseguono nella app.
  • Informazioni: Quali informazioni gestisce la app? Descrivi i vari tipi di informazioni necessarie ai processi.
  • Permessi: Quali permessi hanno gli utenti sulle diverse informazioni? Chi può fare cosa?
  • Percorsi: Come si muovono gli utenti nella app? Di quali comandi dispongono? Descrivi a parole o con un diagramma i percorsi previsti per i diversi tipi di Utenti attraverso le diverse pagine della app.
  • Automazioni: Quali attività svolge autonomamente la app senza la necessità di comandi da parte degli utenti?

Vedremo come tradurre questi aspetti in configurazioni di Drupal, utilizzando come esempio la app "Vicinato"

Una app di esempio

Come esempio per la costruzione delle app con Drupal utilizzo "Vicinato", una app per il prestito di attrezzi tra vicini di casa che puoi vedere in bozza qui:

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

I principali processi che si svolgono nella app e le azioni svolte dai ruoli sopra identificati sono:

  • Gestione Utenti: I Visitatori che intendono partecipare si registrano nella app. La loro registrazione viene accettata o meno dai Gestori. I Gestori supportano gli Utenti nell'uso della app e possono sospenderli. 
  • Formazione del Magazzino degli Attrezzi: i Partecipanti caricano nel Magazzino della app i propri Attrezzi che intendono mettere a disposizione degli altri Partecipanti. Possono sospendere la disponibilità dei propri Attrezzi. I Gestori definiscono le Categorie di classificazione degli Attrezzi utilizzate dai Partecipanti. 
  • Prestito di un Attrezzo: un Partecipante seleziona dal Magazzino un Attrezzo altrui e lo chiede in prestito al Proprietario. L'Attrezzo viene consegnato dal Proprietario direttamente al Richiedente o a un Operatore di una Sede. L'Operatore consegna l'Attrezzo al Richiedente. Il Richiedente consegna l'Attrezzo al Proprietario o a un Operatore. Proprietario e Richiedente valutano l'esperienza di prestito. I Gestori possono intervenire per risolvere eventuali anomalie e eliminare prestiti non concessi da troppo tempo.
  • Gestione di sedi e Operatori: i Gestori aggiungono, abilitano e disabilitano le Sedi presso cui è possibile consegnare gli Attrezzi. I Gestori aggiungono alla app gli Operatori abilitandoli presso una o più Sedi. Gli Operatori gestiscono il deposito temporaneo degli Attrezzi presso le loro Sedi.
  • Comunicazioni: tutti gli Utenti possono scambiarsi Note, senza necessità di esporre i propri recapiti personali.

Informazioni 

I processi sopra descritti lavorano sulle seguenti informazioni: (in evidenza modifiche in corso d'opera)

UTENTE: una persona fisica che utilizza la app (i Visitatori sono Utenti anonimi, cioè indistinti tra loro). I Campi di un Utente sono:

CampoTipoCosa contiene
NometestoNome della persona
CognometestoCognome della persona
Attivosi/noIndica se la persona è autorizzata ad entrare oppure è sospesa dall'uso della app
RuoliruoloRuoli svolti dalla persona nella app (Partecipante | Operatore | Gestore)

ATTREZZO: un Attrezzo fisico prestabile. L'Attrezzo appartiene al Partecipante che lo aggiunge alla app. I Campi dell'Attrezzo sono:

CATEGORIA: Una categoria di classificazione degli Attrezzi, predisposta dai Gestori ed applicata all'Attrezzo dal Proprietario, per facilitare la ricerca da parte dei Partecipanti. I Campi della Categoria sono:

SEDE: uno dei luoghi aperti al pubblico in cui può avvenire la consegna degli Attrezzi. I Campi della Sede sono:

ABILITAZIONE: l'abilitazione di un Operatore ad agire in una Sede. I Campi dell'Abilitazione sono:

RICHIESTA: richiesta di prestito di un Attrezzo. I Campi della Richiesta sono:

CONSEGNA: un passaggio dell'Attrezzo da un Utente ad un altro Utente. La Consegna è creata dall'Utente che consegna l'Attrezzo e accettata dall'Utente che lo riceve. La Consegna accettata funge quindi da "ricevuta" dell'avvenuto passaggio. I Campi della Consegna sono:

VALUTAZIONE: una valutazione espressa sulla Richiesta dal Proprietario o dal Richiedente. La Valutazione è chiusa quando chi la emette la firma. I Campi della Valutazione sono:

NOTA: una Nota è un testo inviato da un Utente ad un altro Utente. I Campi della Nota sono:

Permessi

Ecco cosa possono fare i diversi Utenti sulle diverse Informazioni:

Vedremo in questa Guida come configurare i Permessi in Drupal. 

Percorsi

Essendo una applicazione web, la app si presenta come un insieme di pagine, visitate dagli Utenti secondo uno o più percorsi progettati dall'Amministratore. I percorsi sono diversi per i ruoli Partecipante, Operatore e Gestore.

TUTTI I RUOLI

PARTECIPANTE

La prima pagina è il "Cruscotto":

OPERATORE

GESTORE

Automazioni

Cambiare lo Stato della Richiesta in base alle Consegne

Aggiornare il periodo della Richiesta in base alle Consegne

Eliminare le Richieste più vecchie di tre mesi senza Consegne

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

Cambio della password di un Utente

Come Amministratore, tu puoi cambiare la password di ogni Utente, entrando in Modifica sull'Utente stesso. Drupal non ti consente di conoscere l'attuale password di un Utente, ma tu puoi imporre una nuova password senza conoscere la precedente.

Ogni Utente può cambiare la propria password, entrando in Modifica sul proprio profilo.

Se un Utente ha dimenticato la propria password e quindi non può entrare nella app per impostarne una nuova, può chiedere a te di modificarla. Se prevedi per la tua app molti Utenti, questa incombenza può diventare onerosa e sarebbe meglio che ogni Utente potesse provvedere da sé. Come la maggior parte delle applicazioni on line, Drupal mette a disposizione una procedura per farlo:

  • nella pagina di login, Drupal presenta all'Utente il link Reimposta la tua password
  • se l'Utente lo clicca, gli viene chiesta il suo nome utente
  • se quel nome utente esiste, Drupal invia all'indirizzo mail dell'Utente un messaggio contenente un link
  • se l'Utente clicca quel link, Drupal gli mostra una pagina in cui può impostare la nuova password

Perché questa procedura funzioni, è necessario che Drupal possa spedire mail

Consentire alle persone di iscriversi alla tua app

In Configurazione - Impostazione del profilo - Registrazione e cancellazione - Chi può creare nuovi profili utente? puoi decidere se e come le persone possono iscriversi alla tua app diventandone Utenti:

Solo amministratorisolo tu (e gli altri eventuali Amministratori) puoi creare nuovi Utenti: una persona interessata a diventare Utente deve chiedertelo fuori app e tu provvedi a creare l'Utente, assegnandogli il nome utente e la password e comunicandogli questi dati fuori app.
Visitatorinella pagina di login della app appare un link che consente al Visitatore di iscriversi da sé alla app, autoassegnandosi un nome utente ed una password. In questo caso, raccomando di attivare anche l'opzione Richiedere la verifica dell'-mail quando un visitatore crea un nuovo profilo: prima di accettare il nuovo Utente, Drupal invia al suo indirizzo mail un messaggio che gli consente di impostare la password, verificando così l'indirizzo mail della persona. (*)
Tutti i visitatori del sito, ma è richiesta l'approvazione dell'amministratorecome sopra, ma viene richiesto all'Amministratore di abilitare l'Utente che si è iscritto da sé.(*)

(*) Per funzionare, questa opzione richiede che Drupal possa spedire mail.

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.

Contatti con gli Utenti

Drupal offre un sistema molto semplice di contatto degli Utenti con l'Amministratore (o con altre persone, anche esterne alla app), che provvede a spedire una mail al destinatario, senza la necessità di esporre l'indirizzo del destinatario all'Utente. Vediamo come:

attiva Contattiin Estendi attiva il modulo Contatti, installato di default con Drupal
autorizza all'uso di Contattiin Persone - Permessi attiva per l'Utente autenticato il permesso Usa il modulo di contatto del sito perché possano scrivere all'Amministratore.
configura la pagina di contattoin Struttura - Moduli di contatto clicca Aggiungi un form di contatto e in Destinatari metti il tuo indirizzo personale di email cui vuoi essere contattato.
esponi agli Utenti il comando per richiamare la pagina di contattoCon le tecniche che vedremo, aggiungi alla tua app un comando che richiama il link /contact 

Contatti richiede che Drupal possa spedire mail.

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:

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.

Monitorare le visite alla app

Se la tua app è esposta su internet e/o è condivisa con altri Utenti, è importante verificarne l'uso che ne viene fatto. Un modo per monitorare le visite di Visitatori ed Utenti è installare ed attivare uno dei moduli aggiuntivi che registrano gli accessi alle singole pagine della app e mostrano statistiche. Uno dei più semplici ed efficaci moduli di statistica visite è Visitors (Web Analytics).

Una volta installato e attivato:

Monitorare specifiche azioni

Cercando sul sito di Drupal puoi scoprire altri moduli aggiuntivi, in grado di monitorare specifiche azioni degli Utenti (es. il login o la creazione di nuovi Contenuti), e di avvisarti via mail quando occorrono. In alternativa, potresti costruirti una procedura ECA che svolge esattamente il compito da te desiderato. Come vedremo, una procedura ECA viene attivata da un evento a tua scelta e può reagire a quell'evento mandandoti una mail o registrandolo nel log di Drupal.     

 

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.

Entità di contenuto ed Entità di configurazione

In Drupal ci sono due famiglie di Entità: le Entità di contenuto (content entities) e le Entità di configurazione (configuration entities). Come suggerito dal nome, una Entità di contenuto è un insieme di dati che rappresenta una informazione gestita dalla app, mentre una Entità di configurazione è un insieme di dati che rappresenta una configurazione della app. Ad esempio, un Utente è una Entità di contenuto, mentre il profilo che regola tutti gli Utenti è una Entità di configurazione; nel seguito vedremo molte Entità di configurazione, tra cui le Viste, i Menù, i Blocchi, i Formati di testo ecc.

Se non specificato diversamente, nelle Guide di MieApp con "Entità" intendo sempre "Entità di contenuto".  

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:

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

🟩 I Campi

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.

 

🟩 I Token

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, la Richiesta, la Consegna, la Nota e la Valutazione creiamo gli omonimi Tipi di Contenuto. 

Come costruire un nuovo Tipo di Contenuto

Ecco come Amministratore puoi costruire un nuovo Tipo di Contenuto:

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. 

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:

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.  

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. 

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

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 le Richieste non possono essere eliminate dopo la prima Consegna dell'Attrezzo, mentre 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.

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 protezioni base offerte da Permessi e Ruoli, mentre per i Contenuti che evolvono nel tempo (le Richieste) e per quelli che richiedono una conferma (Consegne e Valutazioni) utilizzeremo Workflow.

Come creare e usare i Workflow

Per creare ed usare un Workflow occorrono i seguenti passaggi:

disegna il workflowIn Configurazione - Workflow definisci gli stati, i passaggi tra gli stati ed i Permessi assegnati agli Utenti in ogni stato 
abilita gli utenti al workflowIn Persone - Permessi regola i Permessi base per coordinarli coi Permessi gestiti dal Workflow ed autorizzare gli Utenti a usare i Workflow
applica il workflow alle EntitàIn Struttura - Tipo di Contenuto applica il workflow ad uno o più tipi di Entità, aggiungendo un Campo di tipo workflow
cambia lo stato di una EntitàNella pagina di modifica dell'Entità cambia il valore del Campo workflow.

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:

Come esempio, disegniamo il Workflow delle Richieste per la app "Vicinato". Alla creazione, una Richiesta è "aperta" ed è modificabile e eliminabile. Mentre è "aperta" può essere "annullata". Diventa "in corso" e non più modificabile ed eliminabile quando l'Attrezzo viene consegnato al Richiedente. Diventa "conclusa" quando l'Attrezzo è tornato al Proprietario.

Workflow Consegna: Alla creazione, una Consegna è "In consegna" ed è modificabile e eliminabile. Diventa "Consegnato" e non più modificabile ed eliminabile quando la Consegna viene accettata dal destinatario dell'Attrezzo

Workflow Valutazione: Alla creazione, una Valutazione è "bozza" ed è modificabile e eliminabile. Diventa "firmata" e non più modificabile ed eliminabile quando la Valutazione viene firmata dal valutatore

Da questi esempi 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 consegna" ad "Consegnato")
  • 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. la accettazione di una Consegna fa passare la Richiesta da "aperta" a "in corso").

Abilitare gli Utenti al workflow

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:

Applicare il Workflow alle Entità

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 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.

Cambiare lo stato di una Entità

Per cambiare lo stato di una Entità, 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 dell'Entità. Per cambiare il valore del Campo Workflow, l'Utente deve avere il Permesso di modificare l'Entità. 

Se però nel nuovo stato in cui l'Utente porta l'Entità 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 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 quando vengono accettate 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:

La tua prima Vista è già pronta al link da te indicato per mostrare le Entità da te scelte.

L'editor della Vista e le sue sezioni

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.

(*) 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
  • 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 Entità georeferenziate su una mappa interattiva. 

Formato Tabella

Il formato Tabella è quello più intuitivo e più utile in caso di un numero elevato di Campi, però può essere di difficile lettura sui dispositivi con schermo piccolo (smartphone). Per ovviare a questo problema ci sono diverse strade. 

Per default, nel formato Tabella ogni Campo è mostrato in una colonna a se stante. Cliccando Impostazioni a fianco del formato si può selezionare per ogni Campo se presentarlo nella colonna di un altro Campo, riducendo così il numero di colonne della tabella. Se si aggregano più Campi in una sola colonna è opportuno specificare come separarne i valori nella visualizzazione: ad esempio, con uno spazio oppure con il codice HTML "<br>" che introduce un ritorno a capo.

Nelle ultime versioni di Drupal è stata introdotta le tabelle "responsive", che si adattano alle dimensioni dello schermo. Per le Viste in formato tabellare è stata introdotta la possibilità di classificare i Campi per "priorità" selezionandola in Impostazioni - Responsive: 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.

Un altro metodo - spesso più comodo perché automatico - consiste nel convertire le tabelle in pile (stack), mostrando i Campi dell'Entità impilati uno sopra l'altro. Ciò è reso possibile dal modulo aggiuntivo "Responsive Tables Filter". Installato ed attivato il modulo, in Configurazione - Responsive Tables scegli la modalità di default di restringimento delle tabelle (tipicamente Stack). Ecco ad esempio come si adatta automaticamente il Magazzino Attrezzi della app di esempio "Vicinato" su uno schermo largo e su uno stretto grazie a questo modulo:

Schermo largo:

Schermo stretto:

Aggiungere Campi nelle sezioni

La configurazione di molte sezioni della Vista consiste nell'aggiunta e nella configurazione di Campi nella sezione. Le modalità di identificazione, selezione e configurazione di un Campo sono sempre le stesse e quindi le spiego qui, una volta per tutte:

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:

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, senza 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: 

Se si aggiungono più Campi nella sezione Criteri di ordinamento, essi vengono considerati 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 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 consente di aggiunge alla Vista una funzione di ricerca sulle Entità elencate. Ecco come:

Paginare la Vista (sezione Paginazione)

Se l'elenco delle Entità mostrato dalla Vista è lungo, conviene presentarlo in pagine, configurando la sezione Paginazione

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:

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:

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 con B. 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 (=Autore) dell'Attrezzo. Ecco come:

Usare le relazioni nella Vista

Aggiunta nella sezione Relazioni il Campo dell'Entità A che regge la relazione A→B, per usare in un'altra sezione della Vista un Campo dell'Entità B basta aggiungere quel Campo nella sezione, specificando quella 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:

Relazioni concatenate

Nella sezione Relazioni è possibile aggiungere più 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" una Consegna ha un Campo "Richiesta" che la collega ad una Richiesta (Consegna → Richiesta). A sua volta, la Richiesta ha un Campo "Attrezzo" che rimanda all'Attrezzo richiesto (Richiesta → Attrezzo). Quindi, percorrendo la catena Prestito → Richiesta → Attrezzo è possibile conoscere l'Attrezzo consegnato, senza necessità di replicare l'informazione nella Consegna. 

Se stiamo costruendo una Vista che elenca le Consegne e vogliamo mostrare per ciascuno di essi la Richiesta corrispondente e l'Attrezzo prestato, nella sezione Relazioni aggiungeremo prima la relazione Consegna → Richiesta e poi la relazione Richiesta → Attrezzo, specificando 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:

Relazioni inverse

Data una relazione A→ B, è anche possibile utilizzarla in senso inverso per risalire da B ad A. Ad esempio, se l'Entità "Disco" ha un Campo riferimento che identifica l'Entità "Cantante" (Disco → Cantante), possiamo usare questa relazione in senso inverso (cioè come se fosse Cantante → Disco) per identificare tutti i Dischi di un Cantante. Per usare la relazione in senso inverso, nella sezione Relazioni non aggiungiamo il Campo:

Contenuto - Contenuto referenziato da field_cantante_disco

ma aggiungiamo il Campo:

Contenuto - Contenuto che usa field_cantante_disco

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, filtrate per utente, attrezzo, stato ecc.  

In tutti questi casi, può risultare conveniente creare la nuova Vista partendo da una esistente, modificandone il comportamento. In Drupal ci sono due modalità per creare una nuova Vista come variazione di una esistente: 

  • fare una copia della Vista di partenza
  • aggiungere una 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:

PRO: è semplice e ed azzera la possibilità di rovinare la Vista di partenza con le modifiche apportate nella Vista copia. CONTRO: ogni miglioramento apportato nella Vista di partenza o nella Vista copia 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:

PRO: ogni miglioramento apportato in una Visualizzazione può essere facilmente propagato automaticamente alle altre Visualizzazioni, selezionando nella casella Per "Tutte le visualizzazioni". 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.

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à usando una relazione che le lega all'Utente corrente. 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 solo gli Attrezzi di proprietà dell'Utente corrente. La costruiamo come variazione della Vista "Magazzino, aggiungendo alla sezione Relazioni la relazione Attrezzo → Autore (l'Autore dell'Attrezzo è il suo Proprietario) e modificando i Filtri della sezione Criteri del filtro della Vista.   

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 l'Utente. Però anche in questi casi Drupal conosce 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 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:

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 corrispondono a questa logica:

 (Tipo di contenuto=Attrezzo) AND (Stato dell'Attrezzo=Prestabile) AND (Utente corrente = Proprietario dell'Attrezzo)

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) oppure all'Utente che presta l'Attrezzo (Utente Proprietario), ma nascondere l'elenco a tutti gli Utenti diversi dal Richiedente e dal Proprietario. Se in questa Vista aggiungiamo alla sezione Criteri del filtro un Filtro "Utente corrente = Richiedente" e un Filtro "Utente corrente = Proprietario" non vedremo nessuna Richiesta, perché i due Filtri sono in AND logico tra loro ma nessuno Utente è contemporaneamente Proprietario dell'Attrezzo e Richiedente dello stesso Attrezzo.

In un caso come questo, abbiamo bisogno che i due Filtri siano in OR logico tra loro, in modo che le Entità siano mostrate se è soddisfatto almeno uno dei Filtri, cioè:

(Utente corrente=Richiedente) OR (Utente corrente=Proprietario)

Come comporre nella Vista i Filtri in AND / OR logico tra loro

In realtà le Viste supportano nativamente sia Filtri in AND logico tra loro (è il default) sia in OR logico tra loro, sia in combinazione più complesse di AND e OR. Torniamo all'esempio della Vista che deve elencare 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))

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

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 indicato 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").

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 le Richieste concluse su tutti gli Attrezzi dell'Utente corrente oppure le Richieste concluse 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.

Nelle prossime Guide utilizzeremo i Filtri contestuali per costruire comandi cliccabili dall'Utente che richiamano una Vista passandole l'argomento. Anche il comando sarà costruito con una Vista in 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 automaticamente la Vista, passandole come argomento l'identificativo dell'Entità mostrata.

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 di tipo 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:

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 pagina di un tipo di Entità, per aggiungervi informazioni prelevate da altre Entità e decidere cosa mostrare o nascondere 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 al Richiedente, nascondendoli a tutti gli altri Utenti. Vogliamo inoltre aggiungere alla pagina della Richiesta alcune informazioni sull'Attrezzo e una sintesi delle altre informazioni conseguenti alla Richiesta, cioè le Note scambiate tra Richiedente e Proprietario, le Consegne effettuate dell'Attrezzo e le Valutazioni finali espresse dai due Utenti. 

Come primo passaggio nascondiamo i Campi della Richiesta a tutti gli Utenti e poi affidiamo ad una EVA il compito di mostrarli solo a Richiedente e Proprietario. 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.

Creiamo ora la EVA che mostra i Campi della Richiesta e dell'Attrezzo prestato, riservandola ai soli Richiedente ('Autore della Richiesta) e Proprietario (Autore dell'Attrezzo):

Aggiungiamo ora alla pagina della Richiesta una seconda EVA, che elenca (sempre solo al Richiedente ed al Proprietario) le Note scambiate tra i due. Diversamente dalla EVA sopra descritta, in questa seconda EVA le Entità mostrate (Note) non coincidono con l'Entità della pagina in cui la EVA viene richiamata (Richiesta):questa differenza è evidenziata dal Filtro contestuale della EVA: nella prima EVA era semplicemente l'identificativo della Richiesta Contenuto - ID, nella seconda l'identificativo della Richiesta deve essere messo in Relazione con le Note. Ecco come:

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

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, richiama un link. Il link può essere l'indirizzo di visualizzazione, creazione, modifica o eliminazione di una 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.

Aggiungere comandi nella pagina di una Entità

Nella pagina che mostra una Entità, Drupal mostra nativamente i comandi "Modifica" e "Elimina" 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 nella pagina dell'Entità. 

Come esempio, vediamo come aggiungere il comando "Chiedi in prestito" nella pagina di un Attrezzo nella app "Vicinato". Il comando deve essere mostrato ai Partecipanti diversi dal Proprietario dell'Attrezzo. Allo scopo creiamo una Vista EVA, richiamata nella pagina delle Entità di tipo "Attrezzo", che mostra il comando solo se l'Utente corrente è diverso dal Proprietario dell'Attrezzo.  

Aggiungere comandi in una Vista 

Nella costruzione di una app risulta spesso utile aggiungere comandi dentro una Vista che elenca Entità. Il comando può essere aggiunto:

  • sopra o sotto l'elenco delle Entità mostrato in una Vista, se il comando non si riferisce ad una specifica Entità, oppure 
  • a fianco delle singole Entità elencate nella Vista, se il comando si riferisce ad una Entità

Vediamo esempi concreti e come realizzarli per entrambi i casi.

COMANDI SOPRA O SOTTO L'ELENCO DELLE ENTITA'

Un comando collocato 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 il comando "Aggiungi Attrezzo" 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, suggerisco 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).

Per aggiungere alla Vista "Tuoi Attrezzi" il comando "Aggiungi Attrezzo":

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:

 

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à":

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:

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:

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

Richiamo condizionato di una Vista

E' anche possibile richiamare una Vista secondaria nella sezione Comportamento se non ci sono risultati della Vista primaria. Ciò può risultare utile per richiamare una Vista secondaria solo quando la Vista primaria non identifica nessuna Entità da mostrare.

Ad esempio, nella app "Vicinato" vogliamo evitare che l'Utente possa esprimere due volte la sua Valutazione su una Richiesta cui partecipa come Richiedente o come Proprietario dell'attrezzo. Subordineremo quindi la visualizzazione del comando "Aggiungi Valutazione" su una Richiesta all'assenza di sue Valutazioni già espresse sulla medesima Richiesta. Per far ciò costruiamo due Viste:

  • una Vista EVA "Verifica Presenza Valutazione" (richiamata automaticamente nella pagina della Richiesta) che elenca le Valutazioni espresse dall'Utente corrente sulla Richiesta; nella sezione Comportamento se non ci sono risultati aggiungiamo il richiamo della Vista "Comando Aggiungi Valutazione" che sarà attivato solo se non ci sono Valutazioni da mostrare
  • una Vista "Comando Aggiungi Valutazione"  (richiamata dalla EVA solo se non ci sono già Valutazioni dell'Utente corrente sulla Richiesta) che riceve l'identificativo della Richiesta e mostra all'Utente il link per aggiungere la Valutazione.

Richiamare una o 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 una o più Viste secondarie, richiamate nella sezione Campi della Vista primaria. 

Questa possibilità è offerta dal modulo aggiuntivo "Views Field View". Installato ed attivato questo modulo, per richiamare dentro una Vista primaria una Vista secondaria basta aggiungere nella sezione Campi della Vista primaria il nuovo tipo di Campo Globale - Visualizza - Embed a view as a field. Nella configurazione di questo Campo si seleziona la Vista secondaria da richiamare, quale sua Visualizzazione e gli eventuali argomenti da passarle.

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 suo nome, come link che porta alla pagina dei suoi dati personali (es. per cambiare password)
  • l'elenco dei suoi Prestiti aperti (cioè le Richieste di altri Partecipanti sui suoi Attrezzi), con un link ai suoi Prestiti conclusi e un link ai suoi Attrezzi
  • l'elenco delle sue Richieste aperte (cioè le sue Richieste su Attrezzi altrui), con un link alle sue Richieste concluse e un link al Magazzino 

Supponiamo di aver creato, coi metodi illustrati nelle Guide precedente, una Vista "Richieste" contenente queste Visualizzazioni:

  • "Aperte Richiedente", che elenca le Richieste in stato "aperta" o "in corso" che hanno come Richiedente l'Utente corrente e che mostra nel suo Piè di pagina i comandi "Richieste concluse" e "Magazzino"
  • "Aperte Proprietario", che elenca le Richieste in stato "aperta" o "in corso" che hanno come Proprietario l'Utente corrente e che mostra nel suo Piè di pagina i comandi "Prestiti conclusi" e "Tuoi Attrezzi"
  • "Concluse Richiedente", che elenca le Richieste in stato "conclusa" o "annullata" che hanno come Richiedente l'Utente corrente 
  • "Concluse Proprietario", che elenca le Richieste in stato "conclusa" o "annullata" che hanno come Proprietario l'Utente corrente 

Poiché il punto di vista del Cruscotto è l'Utente corrente, costruiamo la Vista "Cruscotto" come una Vista basata sull'Entità di tipo Utente e filtrata sull'Utente corrente. Nella sezione Campi del Cruscotto aggiungiamo:

  • il Campo "nome" dell'Utente, presentato come un link alla pagina "/user" che mostra i suoi dati personali
  • un Campo Globale - Visualizza che richiama la Vista "Richieste" e Visualizzazione "Aperte Proprietario"
  • un Campo Globale - Visualizza che richiama la Vista "Richieste" e Visualizzazione "Aperte Richiedente"

Ecco i dettagli:

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]

Gemini può suggerire come costruire una Vista. Il modulo AI Views Generator genera jn file taml da importare come Vista. Da provare.

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:

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: 

Per modificare una Entità elencata in una Vista, occorre cliccare su di essa per passare alla pagina di visualizzazione dell'Entità e poi cliccare Modifica. Se vogliamo apportare la medesima modifica a più Entità elencate nella Vista, possiamo velocizzare l'operazione installando e attivando i moduli aggiuntivi "Views Bulk Operations (VBO)" e "Views Bulk Edit (VBE)". 

Il modulo VBO aggiunge alla Vista la possibilità di selezionare una o più Entità e applicare loro una operazione. Il modulo VBE completa il modulo VBO aggiungendo l'operazione "Modifica", stranamente non prevista dal modulo VBO.

Installati ed attivati questi due moduli, vediamo come utilizzarli per creare una Vista  nella app "Vicinato" che consenta ad un Gestore di modificare o eliminare un insieme di vecchie Richieste rimaste inevase.

Richiamata questa Vista, l'Utente gestore vede l'elenco delle Richieste non completate più vecchie di tre mesi. Per eliminare una o più Richieste:

  • attiva la casella a fianco delle Richieste che intende eliminare
  • clicca il pulsante "Elimina"
  • conferma la eliminazione

Per modificare una o più Richieste:

  • attiva la casella a fianco delle Richieste che intende eliminare
  • clicca il pulsante "Modifica"
  • seleziona quale Campo mostrare e digita o seleziona il nuovo valore
  • conferma la modifica 

Vedremo più avanti come creare nuove operazioni grazie alla procedure ECA

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 all'Entità "Richiesta" della app di esempio "Vicinato" aggiungiamo un Campo data "Inizio" ed un Campo data "Fine" in cui memorizzare le date di inizio e fine del prestito, 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:

Un Campo Simple Math è trattato come un qualunque altro Campo, quindi ad esso corrisponde il Token  {{ 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:

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 una Richiesta della app "Vicinato" sono desumibili dalle Consegne effettuate e una Vista EVA potrebbe mostrarle all'interno della pagina del Prestito. Ma questa soluzione sarebbe molto onerosa per mostrare tali date ad ogni Richiesta elencata in una Vista. In casi come questi, è più conveniente aggiungere alla Richiesta due Campi data, in cui una procedura ECA attivata quando lo stato della Richiesta diventa "conclusa" scrive le due date, identificate analizzando una tantum l'elenco delle Consegne associate alla Richiesta.

Georeferenziare una Entità

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 il nuovo tipo di Campo Geofield in cui memorizzare le coordinate geografiche dell'Entità. Una volta aggiunto il Campo ad un tipo di Entità, il modo più semplice per scrivervi le coordinate è cercare la posizione geografica dell'Entità su una mappa e cliccarvi sopra.

Mappa → Geofield 

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, in particolare occorre richiedere a Google un codice da inserire nel modulo, pone limiti sulla quantità di visualizzazioni (nella versione gratuita) e può porre problemi di riservatezza. Leaflet ha meno funzioni, ma utilizza le mappe gratuite di Openstreetmap, che non richiedono registrazioni o pagamenti e non condivide con terzi le informazioni della tua app. Per gli scopi di MieApp (e forse 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". 

Installati ed attivati questi moduli, vediamo come georeferenziare le Entità. Vediamo come esempio le Sedi della app "Vicinato":

Mostrare più Entità su una mappa

Per mostrare su una mappa le Entità georeferenziate, costruiamo una Vista che elenca le Entità su una Visualizzazione di tipo Mappa. 

Geofield → Mappa 

Come esempio, costruiamo la mappa delle Sedi della app "Vicinato": 

Ecco il risultato: cliccando sul fumetto di una icona si viene portati direttamente alla pagina di quella Entità. 

Georeferenziare le Entità tramite indirizzo

In alcune situazioni, georeferenziare una Entità cercandola visivamente su una mappa può essere scomodo o dare un risultato impreciso. Se si conosce l'indirizzo preciso dell'Entità, può risultare più comodo digitarlo e lasciare che sia Drupal a tradurre l'indirizzo in coordinate geografiche. A questo fine installiamo ed attiviamo i moduli aggiuntivi Geocoder e Address . Il modulo "Address" aggiunge il nuovo tipo di Campo Indirizzo in cui scrivere l'indirizzo, il modulo "Geocoder" provvede a interrogare uno dei servizi internet di traduzione degli indirizzi in coordinate e a memorizzarle in un Campo di tipo Geofield.

Indirizzo → Geocoder → Geofield  

Proseguendo nell'esempio delle Sedi, ecco tutti i passaggi necessari:

Se una Entità ha un Campo di tipo data viene spontaneo pensare di presentarla, oltre che negli elenchi testuali che abbiamo imparato a costruire con le Viste, anche su un calendario sfogliabile per settimane, mesi o anni. Per ottenere questo risultato, ci basta installare ed attivare uno dei moduli che aggiungono "calendario" ai formati selezionabili nella sezione Formato della Vista. Alcuni di essi non consentono però di scegliere quale Campo di tipo data usare per collocare l'Entità sul calendario, ma utilizzano soli i Campi data predefiniti (data di creazione e modifica). 

Il modulo aggiuntivo FullCalendar View consente invece di selezionare un qualunque Campo di tipo data e quindi lo userò in questa Guida. Il modulo aggiunge alla sezione Formato delle Viste il formato Full Calendar Display. Nelle Impostazioni del Formato è possibile selezionare quali calendari mettere a disposizione (mese, anno, settimana, lista ecc.), quale mostrare per default, quali informazioni mostrare dell'Entità ed altri parametri. 

Come esempio, vediamo come costruire con questo modulo nella app Vicinato un calendario che elenchi al Proprietario di un Attrezzo i periodi in cui l'Attrezzo è in prestito: questo calendario può aiutare il Proprietario a proporre ai Richiedenti un periodo in cui l'Attrezzo è libero. Ogni periodo è definito dai Campi "Inizio prestito" e "Fine prestito" delle Richieste in corso sull'Attrezzo.

crea la Vista che elenca al Proprietario le Richieste sull'Attrezzo

In Strutture - Viste aggiungi una Vista di nome "Calendario Attrezzo". che mostra Contenuti di tipo "Richiesta", attiva la creazione di una pagina, come formato seleziona per ora Tabella. In Elementi da visualizzare seleziona 0. Salva

Nella sezione Relazioni:

  • aggiungi Contenuto - Utente e rinomina "Richiedente" 
  • aggiungi il Campo della Richiesta che richiama l'Attrezzo: Contenuto - Contenuto referenziato da field_attrezzo_richiesta e rinomina  "attrezzo"
  • aggiungi Contenuto -  Utente con Relazione "Attrezzo"  e rinomina "Proprietario" (perché è il Proprietario che carica nella app l'Attrezzo)

Nella sezione Criteri del filtro aggiungi Utente - Corrente con Relazione "Proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si

predisponi la Vista ad essere richiamata filtrandola su uno specifico Attrezzo

Nella sezione Impostazioni pagina - Impostazione percorso digita il link con cui richiamare il calendario es. "/richieste-calendario"

Nella sezione Filtri contestuali aggiungi Contenuto - ID con Relazione "Attrezzo"

aggiungi i Campi necessari a posizionare l'Entità nel calendarioNella sezione Campi aggiungi i Campi di tipo data "Inizio prestito" e "Fine prestito" della Richiesta
aggiungi i Campi che identificafo visivamente l'Entità nel calendario 

Nella sezione Campi aggiungi

  • il titolo della Richiesta: Campo "Titolo"
  • il nome dell'Attrezzo: Campo "Titolo" con Relazione "Attrezzo"
  • l'immagine dell'Attrezzo: Campo "Immagine" con Relazione "Attrezzo"
  • il nome del Richiedente: Campo "Nome" con Relazione "Richiedente"

Per comporre tutte queste informazioni nelle caselle del calendario aggiungi un Campo Globale - Testo personalizzato; copia uno ad uno da Sfoglia i Token disponibili  i Token dei Campi sopra elencati e incollali in Testo, separandoli con <br>, che è il codice HTML che introduce un ritorno a capo

presenta la Vista come un calendario

Nella sezione Formato seleziona Full Calendar Display. Nelle Impostazioni:

  • come Default date source seleziona Data corrente per aprire il calendario intorno a oggi
  • come Start Date Field seleziona il Campo "Inizio prestito"
  • come End Date Field seleziona il Campo "Fine prestito"
  • come Title Field seleziona il Campo "Globale - Testo personalizzato" che contiene la descrizione da mostrare per la Richiesta
  • sotto Visualizzazioni scegli quali calendari mostrare (mese, anno, lista ecc.) ed altre dettagli
(facoltativo) limita temporalmente il calendario  Se il numero di Entità da mostrare nel calendario è elevato e quindi rischia di rallentarne la visualizzazione, puoi limitare il calendario ad un periodo temporale, ad esempio agli ultimi tre anni: nella sezione Criteri del filtro aggiungi il Campo "Inizio prestito", come Operatore seleziona Maggiore di, come Tipo di valore seleziona An offset from the current time e come Valore digita "-3 years"

Per richiamare il calendario dalla pagina dell'Attrezzo, come abbiamo già visto creiamo una Vista ECA richiamata sul tipo di Entità "Attrezzo", limitata al Proprietario (= Autore dell'Attrezzo) e che mostra un Campo Globale - Testo personalizzato contenente il link 

/richieste-calendario/{{ raw_arguments.nid }}

🟥 Grafici

Da SCRIVERE

Ecco come far eseguire a Drupal azioni ripetitive al posto nostro, grazie alle procedure ECA.

Nelle Guide precedenti, abbiamo imparato a descrivere con le Entità gli oggetti e i concetti che la nostra app deve gestire e a presentarle all'Utente con le Viste. Grazie alle Viste, l'Utente non deve di volta in volta cercare le Entità che gli interessano, perché le Viste provvedono a estrarle dal database al posto dell'Utente e mostrarle. Quindi possiamo dire che le Viste automatizzano la lettura delle Entità. Con la sola eccezione parziale delle VBO, quel che le Viste non possono fare è automatizzare la scrittura delle Entità, cioè modificarne il contenuto al posto dell'Utente.  A ciò provvedono altri strumenti di Drupal ed in particolare le procedure ECA. 

APPROFONDIMENTO: Nelle versioni precedenti di Drupal c'era un altro strumento (le Rules) che però non sono state aggiornate alle ultime versioni ed hanno di fatto ceduto il posto alle ECA. Ogni tanto sorgono nuove proposte e abbozzi di moduli per automatizzare le azioni in Drupal, ma ad oggi ECA è lo strumento che ha avuto maggiore successo e che ha suscitato la nascita di un intero "ecosistema" di moduli che integrano le ECA con gli altri moduli di Drupal.

Viste ed ECA lavorano insieme in diversi modi per automatizzare le app:

🟩 Le ECA

Cosa sono le ECA

Per automatizzare attività ripetitive in Drupal, lo strumento più flessibile attualmente disponibile sono le procedure ECA (Event - Condition - Action) o "ECA models". Nel seguito per semplicità scriverò spesso "ECA" per intendere una procedura ECA

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 😉.

In questa Guida e nelle seguenti vedremo come disegnare dentro il web browser una ECA, cioè una sequenza grafica 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 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 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 ECA (o più facilmente, di un insieme di 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 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 ECA 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. 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: 

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 ECA

Disegnare una 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:

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 ECA 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 ECA, 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 ECA

Se nella tua app crei più di una ECA e, soprattutto, se le tue procedure non sono banali, è opportuno che documenti per bene cosa fa ogni ECA, per poterle manutenere nel tempo. Anzitutto dai un nome alla ECA che ricordi in modo stringato a cosa serve: clicca l'icona:

 

Appare una finestra in cui puoi digitare il nome ed una descrizione della ECA. Ti raccomando inoltre di descrivere cosa fa ogni elemento: basta cliccarci sopra e modificare la sua descrizione. Per descrivere cosa fa un percorso della ECA, puoi aggiungere un commento sul primo elemento del percorso e digitarvi una spiegazione. Infine, puoi scaricare il disegno della ECA cliccando l'icona:

 

Viene scaricato un file in formato SVG, che può essere importato in Word o LibreOffice. 

Eseguire la ECA

Dopo che hai salvato la ECA 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 ECA (vedi Azione Custom Event). 

Per impedire che una ECA venga eseguita, in Configurazione - ECA seleziona il comando Disattiva sulla ECA.

Gli Eventi

Per essere eseguita, la ECA deve contenere almeno un Evento. Se una ECA contiene più Eventi, verrà eseguita quando accade uno qualunque di essi, quindi la medesima ECA 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:

Le Azioni

Le Azioni sono le istruzioni eseguite da Drupal quando la ECA viene attivata. Ecco una breve spiegazione dei tipi di Azioni che, nella mia esperienza, sono più utili nella costruzione di una app:

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 ECA 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 ECA in tanti percorsI 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:

 

In una app capita spesso di dover applicare le stesse Azioni su 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 grazie alla capacità di un Token di memorizzare una lista di Entità e facendo collaborare le 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 ECA.
  2. Disegniamo una 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 ECA che aggiorna il campo Prezzo dell'Entità passatole dalla prima ECA.  Entrambe le ECA sono disegnate nello stesso foglio e salvate insieme dall'editor grafico.

La prima ECA (quella sopra nel disegno) è attivata dal click dell'Utente ed è formata dai seguenti elementi:

  • l'Evento Endpoint access attiva la ECA 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 ECA "Aggiorna Prezzo" su ognuna delle Entità memorizzate nel Token "prodotti"

La seconda ECA (quella sotto nel disegno) è attivata dalla ECA "primaria", riceve da essa una Entità alla volta ed è formata dai seguenti elementi:

  • l'Evento Custom event (entity aware) attiva la ECA 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 ECA, Drupal torna automaticamente all'Azione Trigger a custom event (entity-aware) della prima ECA, che attiva nuovamente la seconda ECA 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 ECA e viceversa, grazie al coordinamento dell'Azione Trigger a custom event (entity-aware) della prima ECA con l'Evento Custom event (entity aware).della seconda abbiamo realizzato un ciclo tra le due ECA, che viene ripetuto su tutte le Entità selezionate dalla Vista.

Un caso piuttosto frequente nella costruzione di app è la necessità di una ECA che, quando viene modificata una Entità, ne modifica automaticamente altre. Una ECA di questo tipo è formata dai seguenti elementi:

un Evento Presave content entityattiva la ECA quando sta per essere salvata una Entità di un certo tipo. In Type (and bundle) scegli per quale tipo di Entità e di bundle la ECA deve attivarsi. Questo evento mette a disposizione nel Token entity l'Entità che si sta salvando.
una serie di Azioni e Condizionirealizzano le modifiche nell'Entità e nelle Entità ad essa correlate.
Mostra un messaggio all'utenteavvisa l'Utente di aver modificato l'Entità ed eventuali altre Entità.

Oltre alle ECA attivate da attività dell'Utente (salvataggio di una Entità, click su un comando), nella costruzione di app possono risultare utili ECA attivate automaticamente da Drupal stesso, senza alcun intervento dell'Utente. Un caso comune sono le ECA che provvedono periodicamente a fare manutenzione della app: in questo caso, l'Evento che attiva la ECA è una scadenza temporale.

Una ECA di questo tipo è di solito formata almeno da questi elementi:

Come esempio, costruiamo per la app "Vicinato" una ECA che una volta al mese elimina le Richieste più vecchie di tre mesi cui non è seguita una Consegna. Ecco il disegno risultante (sono due percorsi perché è richiesto un ciclo di eliminazione sulle Richieste vecchie):

L'eliminazione vera e propria è eseguita dalla ECA "Elimina_Richiesta_Vecchia", disegnata nello stesso foglio della precedente:

 

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 ECA che esegue un comando cliccato dall'Utente. Una ECA di questo tipo è formata dai seguenti elementi:

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. L'esempio è abbastanza complesso e applichiamo in essa molte delle tecniche che abbiamo visto nelle Guide precedenti, compreso l'uso di Viste dentro le ECA. L'accettazione di una Consegna ha infatti una serie di effetti sulla Consegna stessa, sulla Richiesta cui si riferisce e sull'Attrezzo prestato:

  • cambia lo stato della Consegna da "in consegna" a "accettato"
  • sposta l'Attrezzo dal consegnante al ricevente (es. dal Proprietario al Richiedente o a una Sede)
  • se è la prima Consegna, cambia lo stato della Richiesta da "aperta" a "in corso" e scrive la data corrente come data di inizio prestito della Richiesta
  • se è la Consegna al Proprietario, cambia lo stato della Richiesta a "conclusa" e scrive la data corrente come data di fine prestito della Richiesta

Ecco come costruirla passo per passo:

Uno dei punti di forza di Drupal è la possibilità, offerta dalla piattaforma e ampiamente sfruttata dagli sviluppatori dei moduli, di far lavorare insieme moduli nati per scopi distinti, aggiungendo così ulteriori funzioni a disposizione di noi costruttori di app. Un bell'esempio di questa integrazione tra moduli è quella tra ECA e VBO

Installando e attivando il modulo aggiuntivo "ECA VBO", possiamo costruire procedure ECA richiamabili nelle Viste VBO, aggiungendo così alle funzioni native di Drupal di modifica e eliminazione di Entità altre azioni personalizzate, eseguite dalle procedure ECA. Il modulo "ECA VBO" aggiunge alle procedure ECA il nuovo tipo di evento VBO: Execute Views bulk operation (one by one): una procedura che inizia con questo tipo di evento viene aggiunta all'elenco delle azioni attivabili nelle VBO. 

Come esempio, aggiungiamo alla Vista VBO "Gestione Richieste" che abbiamo costruito nella Guida sulle VBO un nuovo comando "Sollecito" che invia una mail di sollecito agli Utenti delle Richieste selezionate, affinché provvedano a modificare o eliminare le Richieste rimaste inevase tra tre mesi.

 

temi

dove trovarli e come installarli (composer)

configurazioni

 

 

 

Operazioni di manutenzione della app

🟨 Cron

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: