MieApp

A cosa serve MieApp e come si usa.

Imparare e costruire app senza programmare

"Mi servirebbe una app per gestire le richieste dei miei clienti | le iscrizioni alla mia associazione | i miei dischi in vinile | qualunque altra cosa" MA "non so programmare | chissà quanto costa farla fare | non so a chi chiedere | come faccio a spiegare cosa voglio".

MieApp è qui per aiutarti a dare una risposta a queste tue esigenze, mettendoti in mano uno strumento per creare le tue app, anche se non sai programmare. Con MieApp imparerai a descrivere cosa vuoi e farlo da te, senza bisogno di rivolgerti ad un programmatore e senza spendere soldi in licenze. Le app che realizzerai saranno tue e solo tue e potrai farle usare da colleghi ed amici su pc, tablet e smartphone. Anche MieApp è gratis, non devi neppure iscriverti e lasciare i tuoi dati. 

Tutto ciò è reso possibile da Drupal, una piattaforma software open source e gratuita, disponibile in italiano, che mette a disposizione migliaia di funzioni per coprire tutte le tue esigenze. MieApp ti guiderà passo passo a conoscere Drupal, dalla descrizione di cosa vuoi dalla tua app fino al suo rilascio. MieApp è organizzato in brevi Guide, che ti consiglio di leggere nell'ordine in cui sono presentate ma, in base alle tue competenze ed alle tue esigenze, puoi decidere di saltarne qualcuna e tornare indietro. 

Limiti di MieApp

Prima di proseguire, ecco alcuni avvisi sui limiti di MieApp: 

  • MieApp è un tutorial pensato per accompagnarti ad usare Drupal subito, imparando quel che serve e senza doverti preoccupare della sua complessità. Il resto lo scoprirai da te, a mano a mano che ne avrai bisogno. Inoltre contiene una serie di piccoli trucchi ed avvertenze che nascono dalla mio personale utilizzo di Drupal in ambito lavorativo. Se invece preferisci un approccio più strutturato, puoi far riferimento alla guida ufficiale di Drupal per utenti (Drupal User Guide) o a una delle numerose pubblicazioni in italiano.
  • MieApp è pensato per chi vuole usare Drupal per costruire applicazioni senza scrivere codice, cioè per coloro che, nel gergo di Drupal sono chiamati "site builder". Non tratta invece di sviluppo di nuovi moduli, operazione che ovviamente richiede competenze di programmazione.
  • Anche se non è necessario saper programmare per costruire una app con Drupal, bisogna saper ragionare per modelli e processi ed è utile avere una formazione informatica generale: insomma, Drupal non è proprio per tutti tutti tutti, ma con MieApp provo a rendere più facile tutto questo.
  • (la più importante) MieApp è un work in progress, nel senso che le Guide vengono pubblicate a mano a mano che ho tempo, quindi all'inizio ne troverai poche e non sempre complete 😃​. E dove non ho tempo o voglia di approfondire metterò rimandi a risorse già disponibili in rete.

Costruire app senza programmare

L'approccio "no code" (senza scrittura di codice software) è molto di moda. Se cerchi "no code platform" in internet puoi scoprire molti servizi on line che promettono di farti produrre app senza saper programmare, Alcune di esse generano app vere e proprie, installabili su smartphone da Apple Store o Play Store. Altre preparano web app, che vengono eseguite dal servizio, che quindi devi tener attivo non solo durante la creazione della app, ma anche per tutto il periodo di utilizzo della app. Con pochissime eccezioni, l'uso di questi servizi è a pagamento.

"No code" non significa però "no work" (nessuna fatica). Anche se non dovrai programmare, creare una app richiede di analizzare il problema che si vuol risolvere con la app, modellare i dati ed i processi che servono per risolverlo. E qualunque piattaforma "no code" tu scelga, dovrai imparare ad usarla.

In questi ultimi mesi, le IA promettono di fare loro tutto il lavoro dei programmatori. Ma, come spesso capita con le IA, per valutarne correttamente il risultato devi conoscere l'argomento, quindi un codice generato dalla IA deve ad oggi essere verificato da qualcuno che sa programmare. Inoltre le IA non possono occuparsi delle fasi successive allo sviluppo ed in particolare ad oggi non provvedono alla distribuzione e mantenimento in cloud della app sviluppata. Sui rapporti tra IA e Drupal prima o poi dedicherò una specifica Guida. Per ora, affidiamoci alla intelligenza naturale presente in ciascuno di noi.

I vantaggi di Drupal

Drupal nasce come una piattaforma software per creare siti aziendali e governativi, intranet, blog ecc., ma col tempo è evoluto a gestire dati, interrogazioni sui dati e processi automatizzati. Queste caratteristiche consentono di usare Drupal anche come una piattaforma "no code" con cui creare web app senza scrivere codice.

Rispetto ad altre piattaforme, Drupal presenta alcuni vantaggi interessanti:

  • è gratuito: per usare Drupal non si pagano licenze; puoi creare le tue app con Drupal e farle usare da un numero illimitato di utenti senza dover nulla a nessuno; se lo installi in cloud per condividere le tue app con utenti fuori dalla tua rete locale, l'unica spesa che dovrai sostenere è quella dell'hosting, in cui potrai ospitare più di una app a poche decine di euro all'anno;
  • è open source, supportato da una vasta comunità di sviluppatori che mette a disposizione gratuitamente migliaia di moduli aggiuntivi in grado di soddisfare (quasi) tutte le tue esigenze;
  • è continuamente aggiornato: esiste dal 2011 e viene periodicamente aggiornato (siamo alla versione 11), con frequenti rilasci minori per la sicurezza e la correzione di errori.
  • è supportato da una comunità di migliaia di sviluppatori ed utilizzatori, quindi quando incontri un problema molto spesso trovi anche la soluzione.  

Sul sito Drupal ci sono DUE Drupal: CMS e Core. Quale devo guardare?

Da qualche mese, sul sito Drupal sono presentati due filoni di Drupal. Semplificando al massimo: "Drupal CMS" è pensato per la creazione di siti internet "belli" e più "commerciali"; "Drupal Core" è invece pensato per la creazione di applicazioni. Poiché in realtà Drupal CMS è basato su Drupal Core, possiamo ad oggi ignorare questa differenziazione. Dato lo scopo di MieApp, ovviamente nelle Guide si fa riferimento a Drupal Core, quindi ti invito a guardare la parte del sito Drupal dedicata a Drupal Core, ignorando l'altra. 

Devo leggere tutte queste Guide?

No. Sei libero di consultare le Guide di MieApp nell'ordine che vuoi. Però ti raccomando - almeno all'inizio - di leggerle nell'ordine in cui sono presentate, perché ogni Guida dà per scontato che tu abbia letto quelle precedenti. Proseguendo nella lettura, scoprirai da te che ci sono approfondimenti che non ti interessano e che puoi saltare, almeno fino a quando non ti serviranno. MieApp vuole infatti farti usare subito Drupal, senza perdere troppo tempo con la teoria. Le sue Guide sono scritte per introdurti a Drupal partendo da zero e per complessità crescente. Se invece vuoi una introduzione più formale a Drupal, ti consiglio di consultare il sito di Drupal. 

Come leggerle

Comandi, nomi di campi e di sezioni, messaggi ed altri testi fissi mostrati in Drupal e negli altri software sono evidenziati in rosso.

ATTENZIONE ! I riquadri con questa scritta contengono avvertenze importanti, da leggere con attenzione
APPROFONDIMENTO I riquadri con questa scritta contengono approfondimenti che, se sei di fretta, puoi saltare ad una prima lettura
▶️ Digita questi comandi nel Terminale del computer o in cloud  

Posso trasformare le Guide in un libro da leggere?

Si. In fondo all'Indice che elenca le Guide clicca il comando Guida Completa per accedere alla pagina che contiene il testo di tutte le Guide e che puoi stampare in formato PDF coi comandi del web browser. 

Il "vocabolario" di Drupal

Come tutti i software, anche Drupal ha un suo vocabolario, cioè un elenco di termini con un significato preciso. MieApp ti introduce a questi termini a mano a mano che servono. La prima volta che un termine viene usato, ti viene spiegato brevemente cosa significa e, cliccandoci sopra, viene mostrata una pagina di approfondimento. Per distinguere questi termini dal linguaggio comune, vengono sempre presentati con la lettera maiuscola. Infine, puoi consultare il vocabolario Drupal di MieApp.

Mi serve una installazione funzionante di Drupal?

Si. Puoi anche limitarti a leggere le Guide per farti un'idea di Drupal, ma lo scopo vero di MieApp è guidarti a costruire passo passo la app che ti serve e, a questo fine, ti serve una installazione funzionante di Drupal. La Guida alla Installazione ti spiega come procurartela.

Le app di esempio

Per concretizzare la teoria, nelle Guide faccio spesso riferimento alla app di esempio "Buoni Vicini", in cui ho cercato di utilizzare le principali tecniche messe a disposizione da Drupal. Ovviamente lo scopo di MieApp non è di farti ricostruire questa app sul tuo computer però, partendo da quell'esempio, puoi provare a costruire da subito la tua app. 

Per ora c'è solo una app di esempio ma in futuro potrei aggiungerne altre, per coprire aspetti di Drupal che non hanno trovato spazio nella prima. Nel caso, le elencherò qui.

Per costruire una app con Drupal hai bisogno di una installazione di Drupal sul tuo computer locale o in cloud presso un provider internet.

Puoi installare Drupal su un tuo computer locale oppure in cloud presso un provider internet. Ecco qualche domanda per aiutarti a scegliere tra installazione locale e installazione in cloud:

Ho qualche competenza sistemistica?

Per installare Drupal localmente sul tuo computer devi prima trasformare il computer in un server, installandovi alcuni componenti normalmente non presenti o non attive: un web server, un database server ed un interprete del linguaggio PHP. Esistono diverse procedure guidate per farlo, più o meno complesse, ma tutte richiedono qualche competenza sistemistica. L'installazione in cloud è più semplice, perché il server lo predispone il provider. Un suggerimento: prova l'installazione locale per imparare ad usare Drupal e poi passa al cloud se non ne vieni a capo o quando è il momento di condividere la tua app con altri utenti via internet.

Chi userà la mia app?

Se la app sarà usata solo da persone connesse alla rete locale di casa tua o del tuo ufficio, può bastare l'installazione locale. Se invece la tua app sarà usata da persone che accedono da internet, allora devi installare Drupal in cloud (oppure "esporre" il tuo computer su internet, ma questo scenario esula dalle Guide di MieApp).

Sono disposto a spendere qualcosa?

L'installazione locale sul tuo computer non ti costa nulla, se non il tempo che perderai nell'allestimento. L'uso di Drupal in cloud di per sé costa zero, ma devi mettere in conto il costo di un abbonamento per l'uso del server del provider: un "web hosting" (la forma base e meno costosa del cloud) è sufficiente per partire e per la maggior parte delle tue app e costa poche decine di euro all'anno.

Un rapido confronto....

Le operazioni da eseguire nei due casi non sono esattamente le stesse ma il percorso è abbastanza simile (i dettagli li trovi nelle due Guide dedicate):

 Installazione localeInstallazione in cloud

1

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

2

Configurare il server(ci pensa il provider)

3

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

4

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

5

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

6

Configurare Drupal per il primo usoConfigurare Drupal per il primo uso(ci pensa quasi interamente il provider) Configurare solo alcuni aspetti di Drupal 

Ok, ho scelto di...

Leggi questa Guida se hai deciso di installare Drupal sul tuo computer locale, altrimenti passa alla Guida per installare Drupal in cloud.

Per installare Drupal sul tuo computer locale, devi prima trasformarlo in un server e poi installarvi Drupal.

Come trasformo il mio pc in un server?

Per funzionare, Drupal richiede che sul computer siano presenti ed attivate i seguenti componenti software:

  • un web server (es. Apache), che cura le comunicazioni tra Drupal e il pc o smartphone dell'utente
  • un database server (es. MySQL o MariaDB), che gestisce il database in cui sono archiviate le informazioni necessarie a Drupal
  • un interprete di linguaggio PHP, che esegue il codice sorgente di Drupal, scritto appunto in PHP
  • composer, un tool che facilita l'installazione delle diverse librerie software di cui è composto Drupal

Se sei sul posto di lavoro, ti consiglio di rivolgiti all'informatico aziendale, che provvederà all'installazione di tutti questi componenti, probabilmente su un computer Linux, facendo riferimento a queste istruzioni nell sito di Drupal.

Se sei a casa o ti devi arrangiare con un computer Windows, la comunità Drupal raccomanda di usare DDEV, una procedura che installa e configura tutti i componenti necessari a Drupal. Semplificando un bel po', DDEV simula un server Linux sul tuo computer Windows. La procedura è guidata, ma richiede parecchie competenze sistemistiche e più di 250 GB di disco libero: per quest'ultimo motivo, non ho finora potuto provarla.

Qualcosa di più semplice?

Per computer Windows ci sono soluzioni più semplici e leggere di DDEV: anche se considerate meno stabili, sono ragionevolmente utilizzabili per app non troppo critiche. Queste soluzioni sono identificate con la sigla "WAMP" (dalle iniziali di Windows, Apache, MySQL/MariaDB e Php) e sono tutte dotate di una procedura di installazione semplificata. Dopo l'installazione, presentano tutte un pannello di controllo, attraverso cui configurare ed attivare i componenti software, ed un Terminale in cui digitare i comandi necessari all'installazione di Drupal. 

Tra le soluzioni WAMP più utilizzate ci sono XAMPP, WAMPserver, WAMP.NET e Laragon. Io ho utilizzato XAMPP fino alla versione 10 di Drupal, ma attualmente (settembre 2025) non è possibile usarla con la versione 11 di Drupal, perché XAMPP installa una versione di PHP (8.2) inferiore a quella richiesta da Drupal (8.3). WAMP.NET non installa composer. WAMPserver la conosco poco. Con Laragon ho installato Drupal 11 in pochi minuti sul mio portatile e quindi te la consiglio. La versione gratuita di Laragon non si autoaggiorna e all'avvio mostra un invito a comprare una licenza, però è un disturbo sopportabile. Le istruzioni che seguono sono esemplificate su Laragon, ma sono abbastanza simili per tutte le soluzioni WAMP.

Scaricato ed installato Laragon (o un'altra soluzione WAMP), occorre modificare la configurazione di Apache, MySQL e PHP per tener conto delle esigenze particolari di Drupal. In particolare:

CONFIGURAZIONE PHP: nel file di configurazione php.ini occorre impostare i seguenti parametri:

realpath_cache_size = 10M

memory_limit = 4G

In Laragon, si accede a php.ini col comando PHP - php.ini

Occorre inoltre attivare le estensioni di PHP 

gd (obbligatoria) 

opcache (raccomandata). 

In Laragon, per attivarle basta selezionarle dal menù PHP -  Estensioni 

Ok, ho trasformato il pc in un server. Come installo Drupal?

Una volta trasformato il pc in un server con tutti i componenti software sopra indicati, il pc è pronto ad ospitare Drupal.

APPROFONDIMENTO  Per inciso, i componenti software che hai installato per Drupal sono gli stessi richiesti anche da altre applicazioni web based scritte in PHP, tra cui Nextcloud per la gestione di documenti, LimeSurvey per la gestione di questionari, Prestashop per avere un negozio online, Moodle per distribuire corsi di formazione, Mediawiki per creare siti informativi, osTicket per gestire richieste di assistenza, Kimai per valorizzare il tuo tempo lavorativo ecc. Accenno a queste opportunità perché, prima di imbarcarti a costruire da zero una app con Drupal, potresti verificare se la tua necessità può essere soddisfatta da una applicazione già disponibile. Per un elenco aggiornato di queste applicazioni cerca "open source php web based applications".

Poiché sul tuo pc potresti voler ospitare più di una app costruite con Drupal, ti consiglio di fare una installazione separata di Drupal per ogni app, in modo che l'eventuale crash di una app non blocchi le altre. Inoltre questa scelta semplifica la futura migrazione delle singole app in cloud o su un altro server. Le istruzioni che seguono sono quindi da ripetere ogni volta che ti accingi a costruire una nuova app

  1. Prepara in Apache una cartella in cui installare Drupal
  2. Prepara in MySQL un database dedicato alla app
  3. Prepara in Apache un indirizzo specifico per la app
  4. Installa Drupal nella cartella
  5. Configura Drupal per il primo utilizzo

Sono tanti passaggi, ma tutti abbastanza semplici (soprattutto con Laragon).

1. PREPARA LA CARTELLA DOVE INSTALLARE DRUPAL

Con l'aiuto del pannello di controllo della tua soluzione WAMP, identifica la cartella "base" in cui Apache memorizza le pagine da distribuire. Di solito si chiama www o htdocs. Trovata la cartella base, con Gestione Risorse di Windows crea in essa una sottocartella, dandole il nome della app (in minuscolo, senza spazi o caratteri speciali) che intendi costruire. Ad esempio, se la tua app si chiamerà "Gestione Prestiti", la sottocartella potrebbe chiamarsi "gestione-prestiti" o semplicemente "prestiti".

In Laragon, usa il comando Creazione veloce - blank e digita il nome della app. Laragon provvede non solo a creare la sottocartella nel posto giusto, ma crea subito anche il database omonimo in MySQL e crea l'indirizzo specifico per la app, semplificando le istruzioni successive. 

2.PREPARA IN MYSQL IL DATABASE DEDICATO ALLA APP

Se stai usando Laragon, il database è già stato creato nel passaggio precedente: col comando Attrezzi - HeidiSQL entra in MySQL, seleziona il database col nome della app, clicca l'icona Utenti, crea un utente con lo stesso nome della app e con password a tua scelta ed attiva tutti i privilegi dell'utente.

Con le altre soluzioni WAMP: dal pannello di controllo lancia la gestione di MySQL (di solito è phpmyadmin); entrato in MySQL, crea un nuovo utente dandogli il nome della app e con password a tua scelta, seleziona l'opzione per creare un database con lo stesso nome dell'utente ed attiva tutti i privilegi per quell'utente sul quel database.

3.PREPARA IN APACHE L'INDIRIZZO DELLA APP

Se stai usando Laragon, l'indirizzo è già stato creato nel primo passaggio ed è:

https://NOMEAPP.test

dove NOMEAPP è il nome che hai dato alla app. 

Con altre soluzione WAMP: DA SCRIVERE.

4.INSTALLA DRUPAL NELLA CARTELLA

Se stai usando Laragon, lancia il Terminale col comando Laragon - Terminale. Con le altre soluzioni WAMP, dal pannello di controllo lancia il Terminale.

Dentro il terminale, usando i comandi Windows cd e dir posizionati nella sottocartella della app e digita il comando:

▶️ composer create-project drupal/recommended-project .

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

ATTENZIONE ! Attualmente (settembre 2025) al termine della installazione dei file di Drupal da parte di composer, è necessario eseguire le seguenti istruzioni, per evitare un problema bloccante nel passaggio successivo, riscontrato da me e da altri, e che ha trovato una soluzione temporanea in questa pagina:

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

5.CONFIGURA DRUPAL PER IL PRIMO UTILIZZO

Sul pc vai con un web browser sull'indirizzo della app aggiungendo web in fondo. Ad esempio, con Laragon è:

https://NOMEAPP.test/web

Nel web browser appare la procedura di prima configurazione di Drupal, in cui occorre specificare:

  •  la lingua ("italiano")
  • il tipo di installazione ("Standard")
  • i tre parametri del database (utente, password, nome database) che hai definito nel passaggio 2
  • l'indirizzo email del sito (la tua email)
  • il nome utente dell'Amministratore Drupal (tipicamente "admin")
  • la password dell'Amministratore (a tua scelta)
  • l'indirizzo email dell'Amministratore (la tua email)
  • il fuso orario ("Roma")
  • se attivare le notifiche di aggiornamento (attivale) 

Ora Drupal è installato,  pronto all'uso e sei dentro Drupal come Amministratore. Prima di iniziare ad esplorare Drupal ti raccomando di installare anche l'utility Drush

Per installare Drupal in cloud, esegui questi passaggi:

  1. Scegli il provider
  2. Prepara presso il provider il sito che ospiterà Drupal
  3. Installa Drupal nel sito

1. SCEGLI IL PROVIDER

Per scegliere il provider cerca "drupal hosting" e seleziona un servizio cloud con queste caratteristiche:

  • per iniziare spendendo poco, è sufficiente un servizio del tipo "web hosting" o "condiviso", meno performante del noleggio di un server vero e proprio, ma molto meno costoso
  • il servizio deve includere Apache, Php, MySql o MariaDB, che sono i componenti software necessari a Drupal
  • In particolare, verifica che sia disponibile una versione PHP compatibile con quella richiesta Drupal (attualmente almeno PHP 8.3); per gli altri requisiti necessari vedi sul sito di Drupal
  • il servizio deve fornire un Terminale in cui poter dare comandi; presso alcuni provider, è chiamato "Shell" o "ssh"; il Terminale è essenziale per poter installare Drupal e i suoi moduli aggiuntivi
  • il servizio deve consentire di realizzare più "siti": per ogni app che vorrai costruire con Drupal ti serve un "sito" distinto, quindi più "siti" sono compresi nel servizio più app potrai realizzare con lo stesso abbonamento
  • preferisci un servizio che mette a disposizione una procedura per l'installazione automatica di Drupal: non è strettamente necessario, ma se c'è ti semplifica la vita; presso molti provider, a questo scopo viene fornita l'applicazione Softaculous
  • preferisci un servizio che mette a disposizione procedure di backup manuali o automatici, utilissime per ripristinare una app dopo un eventuale crash o hackeraggio.

Tra le offerte disponibili (luglio 2025), segnalo a titolo di esempio IONOS OVHcloud Netsons Infomaniak e Hostinger. Personalmente da anni uso Netsons e Infomaniak.

2. PREPARA IL SITO CHE OSPITERA' DRUPAL

Quando attivi un web hosting in cloud, normalmente ti viene assegnato anche un dominio internet, condiviso o tuo personale. Ad esempio, io ho comprato il dominio "bottasini.eu". Per ogni app che intendi ospitare nel cloud, devi prima predisporre il "sito" che la ospiterà e in cui installerai Drupal. Le istruzioni variano da provider a provider, però la procedura di creazione dei siti è solitamente molto guidata. Alla creazione di un nuovo sito, ti viene chiesto se intendi dedicargli l'intero dominio (es. "bottasini.eu") oppure un sottodominio (es. "buonivicini.bottasini.eu"): scegli questa opzione se intendi ospitare più app evitando di acquistare un dominio diverso per ogni app. Devi infine specificare la versione di PHP che intendi usare nel sito: ricordati che deve essere uguale o superiore a quella richiesta da Drupal (attualmente PHP 8.3)

3. INSTALLA DRUPAL NEL SITO

Dal pannello di controllo del provider entra nel sito che hai appena creato.

Se il provider ti mette a disposizione una procedura per l'installazione automatica di Drupal, usala: ti risparmierai una serie di attività. Ad esempio, col provider Infomaniak l'installazione di Drupal dentro un sito si presenta così:

La procedura di installazione automatica di Drupal crea il database dove la app memorizzerà le informazioni, installa nel sito i file che compongono Drupal e lo configura per il primo utilizzo. La procedura ti chiede solo alcune informazioni base, tra cui la lingua ("italiano"), la username dell'Amministratore (di solito si sceglie "admin"), la password dell'Amministratore (a tua scelta), l'email dell'Amministratore e del sito (normalmente, la tua email). Al termine della procedura automatica, Drupal è pronto all'uso. Prima però ti raccomando di installare anche l'utility Drush

Se il provider NON ti mette a disposizione una procedura per installare automaticamente Drupal nel sito, niente paura: ecco le istruzioni per installarlo manualmente. I passaggi sono questi:

  • 3.1 Prepara il database
  • 3.2 Installa Drupal nel sito
  • 3.3 Configura Drupal per il primo utilizzo

3.1 Prepara il database 

Drupal necessita di un database per memorizzarvi la propria configurazione e le informazioni gestite dalla app. Dal pannello di controllo del provider, lancia il gestore di database (solitamente si chiama phpmyadmin). Le istruzioni che seguono valgono dentro phpmyadmin, ma non cambiano molto se l'applicazione offerta dal provider è un'altra.

  • clicca Account utente e crea un nuovo utente
  • Scegli come nome utente il nome della app che stai costruendo, per facilitarti l'abbinamento tra database e app
  • Scegli una password non banale oppure chiedi di generarla automaticamente
  • Accendi le opzioni per la creazione di un database con lo stesso nome dell'utente e per dare all'utente tutti i privilegi sul nuovo database
  • Memorizza da qualche parte nome utente, password e nome del database, perché ti serviranno nell'ultimo passaggio
  • Clicca "Esegui"

3.2 Installa i file di Drupal
Dal pannello di controllo del provider lancia il Terminale . In esso, usa i comandi Linux, per trovare la cartella che ha lo stesso nome del sito ed entrarvi:

  • pwd (per sapere in che cartella sei)
  • ls (per elencare il contenuto della cartella)
  • cd (per spostarti di cartella)

Alcuni provider collezionano tutte le cartelle dei siti sotto un'unica cartella, ad esempio /sites, in questo caso, per entrare nella casella del sito digita nel Terminale:

▶️ cd sites/NOMEAPP

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

▶️ composer create-project drupal/recommended-project .

Il punto finale è importante perché dice a Composer di installare Drupal nella cartella corrente.

3.3  Configurare Drupal per il primo utilizzo

Al termine del precedente passaggio esci dal pannello di controllo del provider e lancia un web browser sul sito. Ad esempio, se hai creato il sito "buonivicini" nel dominio "bottasini.eu" lancia

https://buonivicini.bottasini.eu

Nel web browser appare la procedura di prima configurazione di Drupal, che chiede alcune informazioni per completare l'installazione, tra cui la lingua ("italiano"), la username dell'Amministratore (di solito si sceglie "admin"), la password dell'Amministratore (a tua scelta), l'email dell'Amministratore e del sito (normalmente, la tua email) e le tre informazioni definite al passo 3.2 (nome del database, nome dell'utente del database, password dell'utente del database).

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

Cos'è Drush e a cosa mi serve?

Drush è una utility molto importante, perché ti permette di modificare la configurazione di Drupal da Terminale anziché da web browser. Quindi permette di agire sulla tua app anche quando, per qualche motivo, Drupal non risponde più da web browser. Oltre a fare da "salvagente" delle tue app, Drush consente di eseguire diverse operazioni di manutenzione su Drupal. 

Come installo drush?

Apri il pannello di controllo del tuo provider (se sei in cloud) o della tua soluzione WAMP (se hai installato Drupal sul tuo computer locale), lancia il Terminale, entra nella cartella dove hai installato Drupal e digita il comando:

▶️ composer require drush/drush

Come si usa drush?

Una volta installato, verifica il funzionamento di Drush: apri il Terminale, entra nella cartella in cui hai installato Drupal e digita il comando:

▶️ vendor/bin/drush

Se sei in una installazione locale su Windows e ottieni un errore, prova con

▶️ vendor\bin\drush

I comandi che puoi dare a Drush sono elencati sul sito di drush. Qui sotto elenco quelli di uso più comune.

SALVARE LA TUA APP CON DRUSH

Se la tua app non risponde più nel web browser, puoi provare a recuperarla digitando il comando:

▶️ vendor/bin/drush cr

Questo comando pulisce la Cache (memoria temporanea di Drupal): talvolta basta questa semplice operazione per risolvere un crash di Drupal.

DISINSTALLARE UN MODULO

Se la tua app non risponde più dopo che hai installato un modulo aggiuntivo, con Drush puoi disinstallare quel modulo riportando la app in una situazione probabilmente funzionante. Col comando:

▶️ vendor/bin/drush pm:list

ottieni l'elenco di tutti i moduli installati. Identifica in esso l'esatto nome interno del modulo che vuoi disinstallare e poi digita il comando:

▶️ vendor/bin/drush pm:uninstall NOMEMODULO

dove NOMEMODULO è il nome interno del modulo. che hai scoperto col comando precedente.

SBLOCCARE CRON

Se Cron non funziona più, puoi provare a sbloccarlo eseguendolo da Drush col comando:

▶️ vendor/bin/drush cron

Moduli aggiuntivi? Perché dovrei aver bisogno di altri moduli ?

Drupal è formato da un nucleo principale, detto Core e da moduli, ognuno dei quali aggiunge funzioni a Drupal. Ad esempio, la gestione di immagini e video è svolta dal modulo "Media". Quando installi Drupal, vengono installati il Core ed una ventina di moduli essenziali. Col comando Estendi del menù di Amministratore puoi vedere l'elenco di tutti i moduli presenti ed attivi. 

E' molto probabile che la tua app richieda funzionalità non offerte dalla installazione base di Drupal., quali ad esempio la gestione di calendari, mappe, mail ecc. Uno dei punti di forza di Drupal è che la comunità degli sviluppatori mette gratuitamente a disposizione migliaia di moduli aggiuntivi, in grado di soddisfare (quasi) tutte le esigenze. Anzi, talvolta la medesima esigenza è risolta con strategie differenti da moduli diversi e, col tempo, alcuni moduli vengono abbandonati a favore di quelli preferiti dagli utilizzatori di Drupal.

Dove trovo i moduli che mi servono?

Puoi esplorare l'elenco dei moduli disponibili sul sito di Drupal alla pagina:

https://www.drupal.org/project/project_module

Nel seguito di MieApp evidenzierò i moduli di utilizzo più comune per la creazione di app. Qui puoi vedere l'elenco completo dei moduli utilizzati nelle diverse Guide di MieApp. Ogni volta che cito un modulo, viene proposta una pagina con una breve illustrazione di cosa fa, col link alla pagina del sito Drupal che contiene una descrizione completa, i requisiti e le istruzioni per installarlo ed gli eventuali problemi noti. 

Come installo un modulo?

Con l'attuale versione di Drupal (11) non è possibile installare un modulo da web browser ma occorre agire da Terminale. Una volta identificato sul sito di Drupal il modulo che ti serve, per installarlo:

  • Sul sito di Drupal vai nella pagina del modulo
  • In quella pagina, copia l'istruzione mostrata a fianco di Install. L'istruzione è formata dal comando composer require seguito da nome e versione del modulo. Ad esempio
▶️ composer require 'drupal/eva:^3.1' 
  • è l'istruzione per installare il modulo EVA versione 3.1. Se la pagina mostra più versioni disponibili, installa la versione più recente compatibile con la versione di Drupal che stai usando (attualmente Drupal 11). Se un modulo non ha una versione compatibile con la tua versione di Drupal, non puoi usarlo e devi cercarne uno diverso che faccia quel che ti serve. Se possibile, non installare moduli in versione "alpha" perché sono instabili.
  • Se hai trovato il modulo giusto ed hai copiato l'istruzione di installazione, passa al pannello di controllo del tuo provider cloud o della tua installazione locale, apri il Terminale, posizionati nella cartella dove hai installato Drupal ed incolla l'istruzione nel terminale.
  • Al termine dell'installazione, lancia un web browser sulla tua app, entra come Amministratore, seleziona Estendi nel menù ed attiva il modulo appena installato. In alcuni casi, l'installazione di un modulo trascina con sé l'installazione di altri moduli necessari al suo funzionamento.

Ecco un video che mostra i passaggi per l'installazione di un modulo aggiuntivo, esemplificato sul provider Infomaniak:

Quali moduli aggiuntivi mi suggerisci?

La risposta dipende da cosa deve fare la tua app. Però ci sono moduli che, nella mia esperienza, mi ritrovo a installare praticamente sempre. Invece che elencarteli qui senza poter entrare nel merito, te li indicherò a mano a mano che servono nelle Guide che seguono. All'inizio di ogni Guida trovi elencati i moduli richiesti o consigliati in quella Guida. Ogni volta che citerò un modulo, cliccando su di esso potrai consultare una pagina con una breve spiegazione dello scopo del modulo stesso ed il link alla sua pagina nel sito Drupal, ad esempio vedi il modulo Token. Puoi anche consultare l'elenco completo dei moduli citati in MieApp.  

Aiuto! Dopo l'installazione di un modulo la app non risponde più

Se dopo l'installazione di un nuovo modulo la tua app non risponde più (caso raro, ma ahimè può succedere), disabilita il modulo con Drush come spiegata qui.

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

Costruire la app = configurare Drupal

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

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

Cosa vuoi dalla tua app?

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

ScopoA cosa serve la tua app? Descrivila con poche frasi, come se dovessi convincere i futuri utenti a considerarla.
UtentiChi utilizza la app? Solo tu o altre persone? Ci sono gruppi di utenti? E' necessario iscriversi alla app o è disponibile anche ai visitatori non iscritti? Chi autorizza gli utenti? Chi gestisce la app?
ProcessiCosa fanno gli utenti con la app? Descrivi le principali azioni che gli utenti (o gruppi di utenti) eseguono nella app
InformazioniQuali informazioni gestisce la app? Descrivi i vari tipi di informazioni gestite ed i diritti degli utenti su di esse.
PermessiQuali permessi hanno gli utenti sulle informazioni? Chi può fare cosa?
PercorsiCome si muovono gli utenti nella app? Di quali comandi dispongono? Descrivi a parole o con un diagramma i percorsi previsti per i diversi tipi di Utenti attraverso le diverse pagine della app
AutomazioniQuali attività svolge autonomamente la app senza la necessità di comandi da parte degli utenti?

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

Una app di esempio

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

https://buonivicini.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: "Buoni vicini" è 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 di esempio applico il metodo che ti ho suggerito nella Guida precedente. I dettagli li svilupperò nelle Guide successive.   

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, in 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, gli Utenti diventano Partecipanti, che si prestano vicendevolmente gli attrezzi. Lo scambio degli attrezzi presso le diverse sedi è intermediato dagli Operatori autorizzati dai Gestori.

Processi

Il Visitatore avanza domanda di iscrizione ai Gestori. Se l'iscrizione viene accettata, diventa Partecipante. 

Il Partecipante popola il "magazzino" virtuale della app con i suoi attrezzi, catalogandoli secondo categorie predefinite dai Gestori. Chiede attrezzi altrui in prestito. Concede in prestito i propri attrezzi in risposta ad una Richiesta. Riceve o consegna gli attrezzi direttamente con la controparte o attraverso un Operatore. Quando il prestito è terminato, valuta l'esperienza del prestito.

L'Operatore gestisce la consegna degli attrezzi presso la sede cui è assegnato.

Il Gestore accetta le richieste di iscrizione dei Visitatori. Gestisce gli Utenti. Supporta gli Utenti nell'utilizzo della app. Definisce le sedi di consegna e assegna gli Operatori alle sedi. Definisce le categorie per classificare gli attrezzi. Interviene su richieste e prestiti per risolvere eventuali anomalie.

Tutti gli Utenti si scambiano messaggi nella app per concordare i dettagli dei prestiti, per risolvere problemi, per chiedere assistenza ai Gestori, senza la necessità di esporre i propri contatti personali. 

Informazioni 

Lo svolgimento dei processi sopra descritti richiede la gestione delle seguenti informazioni:

  • L'Utente registrato nella app
  • il Messaggio scritto da un Utente ad un altro
  • la Sede in cui può avvenire la consegna
  • l'Assegnazione di un Operatore ad una Sede
  • La Categoria di classificazione degli Attrezzi
  • L'Attrezzo messo a disposizione di un Partecipante agli altri Partecipanti
  • La Richiesta espressa da un Partecipante su un Attrezzo altrui
  • Il Prestito concesso dal Proprietario dell'Attrezzo al Richiedente
  • la Ricevuta che attesta l'avvenuto passaggio dell'Attrezzo (1)
  • la Valutazione dell'esperienza di Prestito, espressa dal proprietario e dal richiedente

(1) Per la tracciabilità dei passaggio di un attrezzo, chi riceve un attrezzo deve rilasciare una Ricevuta a chi lo consegna. Le Ricevute sono emesse e registrate nella app, senza necessità di stampe o firme. Se i passaggi dell'attrezzo avvengono direttamente tra proprietario e richiedente: 

  • il Richiedente emette la Ricevuta di consegna quando riceve l'Attrezzo dal Proprietario
  • il Proprietario emette la Ricevuta di restituzione quando riceve l'Attrezzo dal Richiedente

Se i passaggi avvengono con l'intermediazione degli Operatori:

  • l'Operatore emette la Ricevuta di ingresso quando riceve l'Attrezzo dal Proprietario
  • il Richiedente emette la Ricevuta di consegna quando riceve l'Attrezzo da un Operatore
  • l'Operatore emette la Ricevuta di restituzione quando riceve l'Attrezzo dal Richiedente
  • il Proprietario emette la Ricevuta di uscita dalla sede quando riceve l'Attrezzo da un Operatore 

Il Prestito è considerato "in corso" dopo l'emissione della Ricevuta di consegna e "concluso" dopo l'emissione della Ricevuta di restituzione.

Vedremo in questa Guida come tradurre queste informazioni in Entità gestite nella app.

Permessi

I Permessi definiscono cosa possono fare gli Utenti sulle informazioni:

 Il PartecipanteL'OperatoreIl Gestore
UtenteModifica i propri dati personali (password compresa)
Vede il nome degli altri Utenti
Non vede i dati personali degli altri Utenti
Crea l'Utente
Vede e modifica i dati personali di tutti gli Utenti
MessaggioCrea il Messaggio; vede, modifica e cancella i propri Messaggi
Vede i Messaggi altrui di cui è destinatario
SedeVede tutte le SediVede tutte le SediCrea, modifica e sospende tutte le Sedi
Assegnazione Vede tutte le AssegnazioniCrea, modifica e elimina tutte le Assegnazioni
CategoriaVede tutte le Categorie Crea, modifica e sospende tutte le Categorie
AttrezzoCrea l'Attrezzo; modifica i suoi Attrezzi
Vede tutti gli Attrezzi
Vede tutti gli AttrezziVede e modifica tutti gli Attrezzi
RichiestaCome richiedente:
Crea la Richiesta su un Attrezzo altrui
Prima della emissione della Ricevuta di consegna: modifica e elimina le proprie Richieste
Vede le Richieste associate a Prestiti che prevedono la consegna presso la sua SedeVede, modifica e elimina tutte le Richieste
Come proprietario:
Vede le Richieste altrui sui suoi Attrezzi 
PrestitoCome richiedente:
Vede i Prestiti altrui se in risposta a sue Richieste 
Vede i Prestiti che prevedono la consegna presso la sua SedeVede, modifica e elimina tutti i Prestiti
Come proprietario:
Crea il Prestito in risposta ad una Richiesta di un suo Attrezzo
Prima della emissione della Ricevuta di consegna: modifica e elimina i propri Prestiti 
RicevutaCome richiedente:
Crea la Ricevuta di consegna relativa ad una sua Richiesta 
Vede le Ricevute altrui emesse per una sua Richiesta
Crea la Ricevuta di ingresso o di restituzione per uno scambio avvenuto nella sua Sede
Vede tutte le Ricevute relative alla sua Sede
Vede, modifica e elimina tutte le Ricevute
Come proprietario:
Crea la Ricevuta di restituzione o di uscita relativa ad un suo Prestito
Vede le Ricevute altrui emesse per un suo Prestito
ValutazioneCome richiedente:
Crea la Valutazione su un Prestito emesso in risposta ad una sua Richiesta
Vede le Valutazioni altrui emesse per una sua Richiesta
 Vede, modifica e elimina tutte le Valutazioni
Come proprietario:
Crea la Valutazione su un suo Prestito
Vede le Valutazioni altrui emesse per un suo Prestito

Una Richiesta può essere eliminata anche dopo la concessione del Prestito, perché l'Utente potrebbe aver chiesto in parallelo più Attrezzi simili e averne scelto un altro. L'eliminazione di una Richiesta comporta l'eliminazione del Prestito eventualmente concesso, perché privo di senso in assenza della Richiesta. L'eliminazione di un Prestito concesso non elimina la Richiesta, che può essere modificata, ad esempio posticipata. Il coordinamento delle eliminazioni tra Richiesta e Prestito richiede qualche automatismo, per evitare anomalie nella app.

Vedremo in questa Guida come configurare i Permessi in Drupal. 

Percorsi

Come ogni applicazione web, la app si presenta come una sequenza di pagine, visitate dagli Utenti secondo uno o più percorsi predisposti dall'Amministratore, ad esempio mettendo a disposizione comandi agli Utenti. Nella app di esempio, tutti i percorsi partono da una pagina "Cruscotto", che mostra all'Utente le informazioni più importanti o urgenti e una serie di comandi per imboccare i diversi percorsi. In tutte le pagine è presente un comando che riporta immediatamente al Cruscotto. Vedremo da questa Guida in poi come costruire le pagine e di percorsi. 

Ecco i Percorsi previsti nella app ed il corrispondente elenco delle pagine con il contenuto mostrato ai diversi Utenti ed i link che fanno passare ad un'altra pagina.

Al login→
Cruscotto
CRUSCOTTO
UtenteTu
Comando "Tuoi dati"
La comunità
Elenco Messaggi per l'Utente e non ancora letti  → Messaggio
Comando "Tutti i  Messaggi"
Comando "Scrivi Messaggio"
Comando "Le sedi di consegna"
PartecipanteGli Attrezzi
Comando "Magazzino Attrezzi"
Comando "Tuoi Attrezzi"
Le tue Richieste
Elenco Richieste dell'Utente non concluse → Richiesta, Attrezzo, Prestito, Ricevuta, Valutazione
Comando "Archivio Tue Richieste"
I tuoi Prestiti
Elenco Prestiti dell'Utente non conclusi → Richiesta, Attrezzo, Prestito,  Ricevuta, Valutazione
Comando "Archivio Tuoi Prestiti"
OperatoreConsegne nelle tue sedi
Elenco Prestiti non conclusi con consegna nelle sedi dell'Utente → Attrezzo, Prestito, Ricevute
Comando "Archivio Ricevute"
Comando "Operatori di sede"
GestoreGestione app
Comando "Gestione Utenti"
Comando "Gestione Categorie"
Comando "Gestione Sedi"
Comando "Gestione anomalie"

PERCORSO UTENTI

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

PERCORSO MESSAGGI

Tutti i MessaggiMESSAGGI
UtenteElenco dei Messaggi inviati o ricevuti dall'Utente → Messaggio
Comando "Scrivi messaggio"
Click su un Messaggio→MESSAGGIO
Utente (se Mittente del Messaggio)Dati del Messaggio
Comando "Tutti i Messaggi"
Utente (se Destinatario del Messaggio) Dati del Messaggio
Comando "Rispondi al messaggio"
Comando "Tutti i Messaggi"
Scrivi messaggio
Rispondi al messaggio
CREA MESSAGGIO
Utentemodulo di creazione di un Messaggio (se da "Rispondi al messaggio" viene precaricato il destinatario) → Messaggio

PERCORSO ATTREZZI

Gestione Categorie→ GESTIONE CATEGORIE
GestoreElenco delle Categorie → Categoria
Comando "Aggiungi Categoria"
Click su una Categoria→ CATEGORIA
GestoreDati della Categoria
Comando "Gestione Categorie"
Aggiungi Categoria→ CREA CATEGORIA
GestoreModulo di creazione di una Categoria → Categoria
Magazzino AttrezziMAGAZZINO ATTREZZI
UtenteElenco Attrezzi disponibili al prestito → Attrezzo
PartecipanteComando "Tuoi Attrezzi"
Tuoi AttrezziTUOI ATTREZZI
PartecipanteElenco Attrezzi dell'Utente → Attrezzo
Comando "Aggiungi Attrezzo"
Comando "Magazzino Attrezzi"
Click su un Attrezzo→ATTREZZO
UtenteDati dell'Attrezzo
Partecipante (se Proprietario dell'Attrezzo)Elenco Richieste non concluse sull'Attrezzo  → Richiesta, Attrezzo, Prestito, Ricevuta, Valutazioni
Comando "Archivio Prestiti Attrezzo"
Partecipante (se diverso dal Proprietario dell'Attrezzo)Elenco Richieste non concluse (senza dati personali e senza possibilità di cliccare) → Richiesta 
Comando "Chiedi Attrezzo in prestito"
Aggiungi AttrezzoCREA ATTREZZO
PartecipanteModulo di creazione di un Attrezzo → Attrezzo

PERCORSO RICHIESTE

Chiedi Attrezzo in prestitoCREA RICHIESTA
Partecipante (se diverso dal Proprietario dell'Attrezzo)Modulo di creazione di Richiesta, con precaricato l'Attrezzo → Richiesta
Click su una Richiesta→RICHIESTA
Partecipante (se autore della Richiesta)Dati della Richiesta → Attrezzo, Prestito, Ricevuta, Valutazioni
Se il Prestito è concesso e non ha ancora ritirato l'Attrezzo: Comando "Emetti Ricevuta di consegna"  
Se il Prestito è concluso: Comando "Valuta il Prestito"
Partecipante (se Proprietario dell'Attrezzo)Dati della Richiesta → Attrezzo, Prestito, Ricevuta, Valutazioni
Se Prestito non già concesso: Comando "Concedi in prestito"
Archivio Tue RichiesteARCHIVIO TUE RICHIESTE
PartecipanteElenco Richieste concluse dell'Utente →  Attrezzo, Richiesta, Prestito, Ricevuta, Valutazioni
Gestione anomalieGESTIONE ANOMALIE
GestoreElenco di tutte Richieste →  Attrezzo, Richiesta, Prestito,  Ricevuta, Valutazioni

PERCORSO PRESTITI

Concedi Attrezzo in PrestitoCREA PRESTITO
Partecipante (se Proprietario dell'Attrezzo)Modulo di creazione di Prestito , con precaricato la Richiesta → Prestito
Click su un Prestito→PRESTITO
Partecipante (se Proprietario dell'Attrezzo)Dati del Prestito → Attrezzo, Richiesta,  Ricevute, Valutazioni
Se consegna diretta e non è presente Ricevuta di restituzione: Comando "Emetti Ricevuta di restituzione"
Se consegna in sede e non è presente Ricevuta di ingresso: Comando "Emetti Ricevuta di ingresso in sede"
Se il Prestito è concluso: Comando "Valuta il Prestito"
Operatore (se assegnato alla sede di consegna)Solo se il Prestito prevede consegna in sede:
Dati del Prestito → Attrezzo, Ricevute
Se non è presente Ricevuta di ingresso: Comando "Emetti Ricevuta di ingresso"
Se non è presente Ricevuta di restituzione: Comando "Emetti Ricevuta di restituzione"
Archivio Tuoi Prestiti
Archivio Prestiti Attrezzo
ARCHIVIO TUOI PRESTITI
PartecipanteElenco Prestiti conclusi dell'Utente →  Attrezzo, Richiesta, Prestito, Ricevute, Valutazioni (limitato all'Attrezzo se da comando "Archivio Prestiti Attrezzo")
Emetti RicevutaCREA RICEVUTA
Partecipante (se Proprietario dell'Attrezzo)
Partecipante (se autore della Richiesta)
Operatore (se assegnato alla sede di consegna)
Modulo di creazione di Ricevuta, con precaricato Prestito (e quindi la sede)→ Ricevuta
Click su una Ricevuta→RICEVUTA
Partecipante (se Proprietario dell'Attrezzo)
Operatore (se assegnato alla sede di consegna)
Dati della Ricevuta → Attrezzo, Richiesta, Prestito
Partecipante (se autore della Richiesta)Dati della Ricevuta → Attrezzo, Richiesta, Prestito
Archivio ConsegneARCHIVIO CONSEGNE
OperatoreElenco delle Ricevute emesse nelle Sedi dell'Utente: → Attrezzo, Prestito, Ricevute

PERCORSO VALUTAZIONI

Aggiungi ValutazioneCREA VALUTAZIONE
Partecipante (se Proprietario dell'Attrezzo)
Partecipante (se Autore della Richiesta)
Modulo di creazione di Valutazione con precaricato il Prestito → Valutazione
Click su una Valutazione→VALUTAZIONE
Partecipante (se Proprietario dell'Attrezzo)Dati della Valutazione del Richiedente e del Proprietario → Prestito
Partecipante (se Autore della Richiesta)Dati della Valutazione del Richiedente e del Proprietario → Richiesta

PERCORSO SEDI

Gestione sedi
Le sedi per le consegne
SEDI
UtenteMappa ed elenco delle Sedi: → Sede
GestoreComando "Aggiungi Sede"
Aggiungi SedeCREA SEDE
GestoreModulo di creazione di Sede → Sede
Click su una Sede→SEDE
UtenteDati della Sede
GestoreElenco delle Assegnazioni di Operatori nella sede → Assegnazione, Utente Operatore
Comando "Aggiungi Operatore a Sede"
Aggiungi Operatore a Sede
Aggiungi Sede a Operatore
CREA ASSEGNAZIONE
GestoreModulo di creazione di Assegnazione → Assegnazione 
Se da comando "Aggiungi Operatore a Sede" con precaricata Sede
Se da comando "Aggiungi Sede a Operatore" con precaricata Operatore
Click su una Assegnazione→ASSEGNAZIONE
GestoreDati dell'Assegnazione → Sede, Utente Operatore
Operatori di sedeOPERATORI DI SEDE
OperatoreElenco delle Assegnazioni di Operatori nelle Sedi cui è assegnato l'Utente

Automazioni

La app provvede automaticamente a:

  • eliminare il Prestito di cui è stata eliminata la Richiesta

L'Amministratore e gli altri Utenti della app

Il primo Utente di Drupal

L'Amministratore di Drupal è l'Utente che hai creato durante l'installazione di Drupal. L'Amministratore è il primo Utente di Drupal ed è identificato internamente col numero "1".  L'Amministratore ha pieni poteri su Drupal e può cambiarne ogni aspetto, trasformando quindi Drupal nella app che desideri. Di solito sei tu stesso. L'Amministratore può essere l'unico Utente della tua app, se non prevedi che sia usata da altre persone.

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 è la barra di amministrazione, solitamente mostrata in alto. 

Cliccando Gestisci si accede alle seguenti sezioni, che consentono di configurare Drupal per costruire la app che vogliamo:

  • Contenuto: aggiungere nuovi Contenuti alla app e di cercare e modificare quelli già inseriti.
  • Struttura: modificare la struttura delle informazioni gestite da Drupal e come vengono mostrate agli utenti.
  • Aspetto: cambiare colori, font, logo ed ogni aspetto grafico della tua app
  • E:stendi: attivare e disattivare i moduli aggiuntivi di Drupal che hai installato
  • Configurazione: cambiare il titolo della app mostrato agli utenti, scegliere la pagina inziale, selezionare il formato di data ed ora e la lingua, configurare l'editor visuale per l'inserimento dei testi, lanciare operazioni di manutenzione tra cui la pulizia della cache (comando Prestazioni), lanciare operazioni periodiche (comando Cron); se hai installato il modulo aggiuntivo ECA, puoi anche disegnare le automazioni della app
  • Persone: gestire gli Utenti della app e di attribuire loro permessi sui contenuti e sui comandi
  • Resoconti: ricevere una serie di informazioni sul funzionamento e sugli eventuali problemi di Drupal, suggerendo aggiornamenti dei moduli installati
  • Aiuto: ricevere un primo aiuto (piuttosto scarno) 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 anche informazioni riservate ad un gruppo specifico di persone, allora devi modificare questa impostazione: in Persone - Permessi vai alla riga Visualizza contenuti pubblicati e 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 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à. 

Creare gli Utenti

Per ogni persona con cui intendi condividere l'uso della app, come Amministratore devi creare un Utente, assegnandogli le credenziali (nome utente e password) con cui fare login nella app. Per creare un Utente

  • seleziona Persone - Aggiungi un Utente
  • digita l'indirizzo email della persona (può anche essere fittizia, se non si prevede che la app debba inviare email alla persona)
  • attribuisci un nome utente univoco alla persona (definisci fin da subito una regola per la composizione dei nomi utente nella tua app, ad esempio nome.cognome)  
  • scegli una password per la persona
  • metti lo Stato ad attivo (altrimenti la persona non potrà entrare nella app)
  • In Ruoli attiva utente autenticato
  • Salva

 Per consentire ai Visitatori di iscriversi da sé alla tua app:

  • seleziona Configurazione - Impostazione profilo
  • Sotto Registrazione e cancellazione - Chi può creare nuovi profili utente? seleziona Visitatori

Con questa configurazione, nella pagina di login appare una nuova opzione per registrarsi alla app.

Bloccare un Utente

Se devi estromettere (anche temporaneamente) un Utente dalla tua app, invece che cancellarlo puoi bloccarlo, mantenendo così la possibilità di un suo rientro successivo. Per bloccare un Utente:

  • In Persone identifica l'Utente e clicca Modifica
  • In Stato seleziona Bloccato
  • Salva

Utenti di prova

Se la tua app prevede altri Utenti oltre l'Amministratore, per provarne il corretto funzionamento puoi creare uno o più Utenti di prova, senza comunicare a nessuno le credenziali di questi Utenti. Per connetterti contemporaneamente dallo stesso pc sia come Amministratore sia come Utente di prova, puoi utilizzare due web browser diversi, ad esempio facendo login come Amministratore in Chrome e come Utente di prova in Edge. In questo modo puoi verificare in tempo reale l'effetto sull'Utente di modifiche che apporti alla app come Amministratore. 

In alternativa all'utilizzo di due web browser, puoi installare ed attivare il modulo aggiuntivo Masquerade, che ti permette nello stesso web browser di impersonare un altro Utente, senza necessità di entrare ed uscire dalla app.

Anche se prevedi di essere l'unico Utente della tua app, ti suggerisco di creare comunque un Utente non Amministratore per te stesso, con cui entrare nella app per il suo utilizzo quotidiano, entrando come Amministratore solo se devi modificarla: in questo modo ridurrai il rischio di apportare per errore modifiche alla app.

Ruoli degli Utenti

Oltre al Ruolo base di utente autenticato, è possibile assegnare altri Ruoli agli Utenti, che definiscono cosa possono fare. Come Amministratore, puoi definire nuovi Ruoli, cui affidare compiti specifici nella app: ad esempio, il Ruolo "Redattore" potrebbe essere assegnato agli Utenti che preparano le notizie da pubblicare nella app ed il Ruolo "Editore" agli Utenti che controllano le notizie e le pubblicano. Per creare un Ruolo:

  • vai in Persone - Ruoli clicca Aggiungi ruolo
  • Digita il nome del nuovo Ruolo
  • Salva

Di per sé, un Ruolo è una semplice etichetta: cosa può fare un Ruolo è definito dai Permessi assegnati a quel Ruolo.

Per la app "Buoni Vicini" 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 aver imparato a modellare le informazioni nella app, vedremo nelle Guide relative alla protezione delle informazioni come usare i Permessi assegnati ai Ruoli per regolare cosa possono fare gli Utenti sulle singole informazioni.  

Nominare altri Amministratori

L'Amministratore può nominare altri Amministratori, per condividere lo sforzo di costruzione e gestione della app. Sconsiglio caldamente di condividere la password dell'Amministratore, perché non sarebbe più possibile risalire a chi ha modificato la app. Conviene invece creare un nuovo Utente ed assegnargli il Ruolo di Amministratore. Ecco come:

crea un nuovo Utentein Persone clicca Aggiungi utente, digita l'email della persona, assegna un nome utente ed una password. Non salvare
assegna all'Utente il Ruolo di AmministratoreNella stessa pagina, sotto Ruoli attiva Amministratore 
ATTENZIONE: Assegna il Ruolo di Amministratore solo a persone di cui ti fidi completamente, perché potrebbero rovinare la app ed escluderti dall'amministrazione della app.  

Deleghe parziali di Amministrazione

Se la "delega in bianco" sopra descritta ti appare troppo estesa e pericolosa, puoi delegare ad altri Utenti solo alcuni dei tuoi poteri di Amministratore, senza concedere loro il Ruolo di Amministratore. Ci sono infatti diversi moduli aggiuntivi che consentono deleghe parziali di amministrazione agli Utenti non Amministratori. Eccone un paio.

Se installi e attivi il modulo aggiuntivo "Administer Users by Role" puoi delegare la gestione degli Utenti ad uno o più Ruoli, specificando su quali Ruoli a sua volta potrà agire. In questo modo, gli Utenti cui ha delegato la gestione degli Utenti non potranno escluderti e, se opportunamente configurato, evitare che possano escludere altri Utenti di pari potere. Ad esempio, nella app "Buoni Vicini" deleghiamo la gestione degli Utenti al Ruolo Gestore, escludendo che un Gestore possa intervenire sugli altri Gestori.

Se installi ed attivi il modulo aggiuntivo "Delegate Permission" consente di delegare singole funzioni di Amministratore.

Le informazioni che la tua app deve gestire sono rappresentate in Drupal dalle Entità e dalle loro specializzazioni, in particolare dai Contenuti. 

Cos'è una Entità

Ogni Entità è  un insieme strutturato di dati che viene creato, modificato o eliminato come un tutt'uno: ad esempio, se una Entità viene cancellata, vengono cancellate tutte le informazioni in essa contenute; se un Utente ha il permesso di modificare una Entità, può modificarne tutte le informazioni.

Tipi di Entità

Nelle Guide precedenti abbiamo già incontrato Entità: ogni Utente è infatti gestito in Drupal come una Entità. Drupal gestisce diversi tipi di Entità: Contenuti, Utenti, Termini di Tassonomia, File, Media, Commenti ecc. I moduli aggiuntivi di Drupal possono aggiungere ulteriori tipi di Entità, ad esempio i Gruppi. Per ogni tipo di Entità, Drupal mette a disposizione specifiche funzioni: ad esempio, solo le Entità di tipo Utente possono fare login, solo le Entità di tipo File hanno una dimensione, espressa in KB. Alcuni tipi di Entità prevedono una ulteriore specializzazione, chiamata Bundle. I tipi di Entità predefiniti in Drupal e i corrispondenti Bundle sono:

Tipo di EntitàSottotipo (bundle)A cosa serve
Contenuto (content, detto anche node)Tipo di Contenuto (content type)I Contenuti sono il tipo di Entità più utilizzato nelle app. Per ogni tipologia di informazione si crea un Tipo di Contenuto differente.
Termine di tassonomia (taxonomy term, term)Tassonomia (taxonomy, vocabulary)Le Tassonomie sono usate come "vocabolari" di termini con cui etichettare i Contenuti
Utente (user) Sono gli Utenti della app 
Media (media)Tipo di Media (media type)File, immagini, audio, video
Commento (comment)Tipo di Contenuto del CommentoCommenti degli Utenti sulle altre Entità

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). Alcuni moduli aggiuntivi aggiungono ulteriori tipi di Campi, ad esempio coordinate geografiche. Vedremo i diversi tipi di Campi disponibili nella Guida relativa ai Contenuti.

L'Amministratore può aggiungere Campi a tipi e sottotipi di Entità. Ad esempio, è possibile aggiungere agli Utenti 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.

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 visto dagli Utenti. Il nome interno è quello con cui Drupal identifica il Campo ed è composto automaticamente come 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 lo stesso per Campi appartenenti a diversi tipi di Entità, il nome interno deve essere univoco e quindi 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:

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.

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 tipi o sottotipi di 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 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
Data di creazione (Inserito il)Data e ora di creazione del Contenuto
Data di modificaData e ora di ultima modifica del Contenuto

 Di default, I Campi predefiniti non sono mostrati agli Utenti, ma vedremo come esporli con le Viste.

L'identificativo di Entità

Ad ogni Entità è associato un numero intero che lo identifica univocamente rispetto alle altre Entità dello stesso tipo. Ad esempio, l'Utente Amministratore è il 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 cancellata, il suo numero univoco non viene riciclato. Il numero univoco è memorizzato in un apposito Campo predefinito; 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.

I Token

Le informazioni contenute nelle Entità e molte altre informazioni "di sistema" (es. la data e ora del computer che ospita Drupal) sono riutilizzabili attraverso i Token. Un Token è una parola speciale che identifica una informazione della app e viene sostituita da Drupal col valore di quella informazione: un concetto molto vicino a quello di "variabile" nei linguaggi di programmazione o di incognita o parametro in matematica. Ad esempio, il Token [node:nid] viene sostituito dal codice identificativo di un Contenuto.

Anche se Drupal mette nativamente a disposizione un buon numero di Token, raccomando di installare sempre il modulo aggiuntivo Token perché ne estende il numero e le potenzialità.

Non è necessario conoscere a memoria i Token, perché in ogni pagina Drupal elenca i Token disponibili in quella pagina sotto la dicitura Sfoglia i Token disponibili o Replacement patterns. In alcuni casi, i Token sono presentati come una gerarchia, in cui "scendere" fino a trovare il Token desiderato: in questi casi, la voce solitamente più utile è Node, sotto cui si trovano tutti i Token relativi ai Contenuti (in Drupal "node" è sinonimo di Contenuto). Una volta trovato il Token desiderato, lo si copia e poi lo si incolla nella casella dove serve.

I Token si presentano in due forme: 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 solo i Token disponibili e nella forma utile al contesto.

Cosa sono i Contenuti

I Contenuti sono il tipo di Entità meno "specializzato" 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 quali tipi di oggetti, documenti, luoghi ecc. la app deve gestire, ma è opportuno considerare anche "oggetti" più astratti, come procedure, progetti, gruppi di lavoro ecc. Vediamo qualche criterio di massima che può guidare alla traduzione dei concetti in Contenuti.

Criterio della semplicità. Più Tipi di Contenuto definiamo, più la costruzione della app si complica. Lo vedremo in dettaglio quando costruiremo le Viste che mostrano i Contenuti agli Utenti. Se l'analisi evidenza che due Tipi di Contenuti corrispondenti a due concetti 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 mostrati. 

Criterio dell'unità. Come abbiamo già visto parlando di Entità (e i Contenuti sono un caso particolare di Entità), in Drupal un Contenuto è gestito come un'unità, quindi i Permessi di modifica e cancellazione non possono essere dati agli Utenti sui singoli Campi ma solo sull'intero Contenuto. Se per un Tipo di Contenuto ci accorgiamo che alcuni Campi sono gestiti da un gruppo di Utenti e gli altri Campi sono gestiti da altri Utenti, 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 "Buoni Vicini" per rappresentare i concetti di Attrezzo, Categoria, Sede creiamo gli omonimi Tipi di Contenuto, cui aggiungiamo il Tipo "Assegnazione" per associare gli Utenti Operatori alle Sedi. La rappresentazione del "prestito" è più complessa, perché le informazioni relative ad un prestito sono gestite da diversi Utenti (il richiedente, il proprietario, l'operatore) e le protezioni delle informazioni variano nel tempo. Applicando i criteri sopra suggeriti, il concetto di "prestito" viene spacchettato nei seguenti Tipi di Contenuto:

  • la Richiesta, creata dal Partecipante "richiedente", contiene i Campi relativi all'Attrezzo richiesto e ai dettagli della richiesta
  • il Prestito, creato dal Partecipante "proprietario" dell'Attrezzo richiesto, contiene il riferimento alla Richiesta cui risponde e i dettagli sulle condizioni del prestito, tra cui la modalità di consegna (diretta o presso una Sede scelta dal proprietario)
  • la Ricevuta, creata dal richiedente o dal proprietario o da un Operatore, in base alla modalità di consegna indicate nel Prestito: contiene il riferimento al Prestito cui si riferisce, i dettagli sulla consegna e ha come Autore l'Utente che l'ha emessa e che quindi dichiara di aver ricevuto fisicamente l'Attrezzo; tutte le Ricevute hanno gli stessi Campi indipendentemente dall'Autore e dalla motivazione (ingresso e uscita dell'Attrezzo dalla Sede, consegna e restituzione dell'Attrezzo alle parti), quindi è possibile rappresentarle tutte con un solo Tipo di Contenuto, aggiungendo un Campo "Motivazione".  
  • la Valutazione, creata dal richiedente o dal proprietario, può essere espressa solo dopo la restituzione dell'Attrezzo, quando il Prestito non più modificabile e richiede quindi un Contenuto a se stante, contenente la valutazione e il riferimento al Prestito

Come costruire un nuovo Tipo di Contenuto

Ecco come Amministratore puoi costruire un nuovo Tipo di Contenuto:

crea il nuovo tipo di ContenutoVai in Struttura - Tipi di contenuto - Aggiungi un tipo di contenuto, digita il nome per il nuovo Tipo (es. "Attrezzo") ed una breve descrizione
configura i  Campi predefiniti  del nuovo tipo di ContenutoDigita il Titolo, cioè il nome del Campo testo che lo identifica visivamente. Disattiva Promosso alla prima pagina, opzione che lo colloca nella prima pagina del sito (poco utile nella costruzione di una app). Disattiva Sempre in cima agli elenchi, opzione che lo colloca in cima agli elenchi (come sopra). Disattiva Crea una nuova revisione, opzione che genera diverse Versioni del Contenuto (salvo che la app abbia una specifica necessità di tener traccia delle modifiche apportate ad un Contenuto). Disattiva Visualizzare informazioni sull'autore e sulla data, opzione che mostra Autore e data di pubblicazione del Contenuto (da valutare se serve per la app).
aggiungi un Campo al nuovo tipo di Contenuto

Vai in Struttura - Tipi di contenuto e clicchiamo Gestione campi a fianco del Tipo di Contenuto. Clicca Create new field. Seleziona uno dei tipi di Campo tra quelli proposti:

configura il Campo nella pagina seguente, digita l'etichetta con cui il Campo deve essere mostrato all'Utente, specifica se la compilazione del Campo è obbligatoria e quanti valori il Campo può accettare; ad esempio, un singolo Campo "Allegati" di tipo File può accettare più documenti, senza necessità di definire più campi "Allegato 1", "Allegato 2" ecc.

Ora costruisci nella tua installazione Drupal i Tipi di Contenuto che servono alla tua app !

Riusare i Campi 

In una app di media complessità, servono normalmente decine di Campi. Per ridurne la proliferazione, è possibile "riciclare" un Campo su più Tipi di Contenuto (e anche su altri tipi di Entità). Definito il Campo la prima volta in un Tipo di Contenuto, per riusarlo in un altro Tipo di Contenuto non cliccare Create new field ma clicca Riutilizzare un campo esistente e seleziona il Campo che intendi riusare. 

ATTENZIONE: Il riuso di Campi è raccomandabile solo se è probabile che non eliminerai quel Campo in una futura revisione della app, perché l'eliminazione di un Campo da un tipo di Entità ha conseguenze anche sulle altre Entità che lo usano. 

Titoli automatici

Il Campo Titolo è presente ed obbligatorio per tutti i Contenuti, ma in alcuni caso non è molto significativo. Nella app di esempio, mentre il Campo Titolo di Attrezzi, Categoria, Sede è utile per identificare l'attrezzo stesso, per Richieste, Prestiti, Ricevute, 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 identificativo univoco, es. "Richiesta n. 253", Oltre a evitare all'Utente di doversi inventare un titolo non significativo, ciò consente all'Utente di identificare senza ambiguità il Contenuto, ad esempio nei Messaggi scambiati con gli altri Utenti. 

Per automatizzare la compilazione del titolo usiamo i moduli aggiuntivi "Automatic Entity Label,  "Token" e "Serial". Installati ed attivati questi moduli:

aggiungi al Tipo di Contenuto un Campo di tipo "Numero Seriale"in Struttura - Tipi di Contenuto seleziona Gestisci campi a fianco del Tipo di Contenuto di cui vuoi automatizzare i titoli ed aggiungi un Campo di tipo Numero Seriale 
attiva la compilazione automatica del Titoloin Struttura - Tipi di Contenuto seleziona Modifica a fianco del Tipo di Contenuto e clicca Automatic label
nascondi il titolo all'Utente quando modifica l'Entitàseleziona Automatically generate the label and hide the label field
definisci come comporre il Titolo 

in Pattern for the label componi lo schema per la generazione dei titoli, utilizzando sia testo fisso (es. "Richiesta n.") sia i Token che recuperano i valori degli altri Campi del Contenuto: per vedere i Token disponibili, clicca Sfoglia i token disponibili e naviga in Nodi  fino a trovare il Campo che vuoi sia riprodotto nel Titolo. 

Questo è solo un esempio di titolo automatico, perché con la stessa modalità si possono creare titoli più ricchi di significato, ad esempio "Richiesta su NOMEATTREZZO di PROPRIETARIO". Per semplificare l'identificazione del Contenuto, conviene comporre titoli automatici diversi per ogni Contenuto. Poiché il Titolo di un Contenuto è di default mostrato nella pagina del Contenuto con un carattere più grande, suggerisco di non comporre titoli troppo lunghi.  

ATTENZIONE: Nella composizione di un titolo automatico non è possibile utilizzare l'identificativo del Contenuto (Token [node:nid]) perché, nel momento in cui si sta creando  il nuovo Contenuto, quel valore non è stato ancora assegnato da Drupal. Ecco perché negli esempi precedenti ho preferito basare il titolo su un Campo Numero Seriale. I Campi di questo tipo non devono essere riusati né devono essere "nascosti" trascinandoli sotto Disattivati, perché altrimenti cessano di funzionare: il Campo non viene comunque mostrato all'Utente.

Eliminare un Campo

Se ci ripensi e decidi che un Campo non ti serve più, puoi eliminarlo.  Drupal potrebbe avvisarti che l'eliminazione di quel Campo pregiudica il funzionamento di qualche parte della tua app, ad esempio potrebbe pregiudicare una Vista o un'altra configurazione in cui è utilizzato. Se decidi di procedere lo stesso, la Vista o il workflow non vengono cancellati ma vengono disabilitati, per consentirti di modificarle e rimetterle in linea senza quel Campo.

L'eliminazione di un Campo riusato ne comporta la scomparsa in tutti i tipi di Entità in cui è stata usato.

Se l'eliminazione di un Campo comporta troppo lavoro di sistemazione, potresti decidere di mantenerlo, limitandoti a nascondendolo nelle pagine di inserimento, modifica e visualizzazione dell'Entità cui appartiene.

Cambiare il tipo di un Campo

Se hai scoperto che un Campo numerico intero ti serve invece con numerico con la virgola, oppure che ti risulta più semplice gestire un Campo di tipo data come un Campo testo, sappi che in Drupal non c'è un meccanismo per cambiarne il tipo salvando i dati già inseriti. Ci sono moduli sperimentali che promettono di farlo, ma contengono sempre avvertenze. I più esperti propongono interventi diretti sul database, che richiedono competenze e molta attenzione. Quando mi è capitato di doverlo fare, ho scelto la strada più lunga ma più sicura: 

  1. esportare in un file l'identificativo dell'Entità ed il valore del Campo, utilizzando il modulo Views Data Export
  2. aggiungere alle Entità un nuovo Campo del tipo desiderato
  3. importare dal file i valori nel nuovo Campo, utilizzando il modulo Feeds
  4. eliminare il Campo iniziale

Esamineremo qualche dettaglio di questa tecnica quando parleremo di importazione ed esportazione di informazioni. 

I Contenuti di Buoni Vicini

Utilizziamo quanto descritto in questa Guida per costruire i Tipi di Contenuto necessari alla app di esempio "Buoni Vicini". Non è necessario creare un Tipo di Contenuto per rappresentare gli Utenti della app, perché ognuno di essi sarà realizzato come un Utente Drupal.

ATTREZZO

Ogni attrezzo fisico che può essere prestato è rappresentato da un Contenuto di tipo "Attrezzo". L'Attrezzo è aggiunto alla app dall'Utente suo Proprietario, che quindi è memorizzato come Autore dell'Attrezzo. I Campi dell'Attrezzo sono:

CampoTipoDescrizione
TitolotestoDescrizione breve dell'Attrezzo
Descrizionetesto formattatoDescrizione lunga dell'Attrezzo
CategoriaRiferimento a CategoriaCategoria cui appartiene l'Attrezzo (Attrezzo → Categoria)
ImmagineimmagineImmagine che raffigura l'Attrezzo
AllegatiFile (più valori)Documenti che descrivono l'Attrezzo
StatoElenco di testiPrestabile | Ritirato

CATEGORIA

Solitamente in Drupal per rappresentare una Entità che categorizza altre Entità (come le Categorie della app che categorizzano gli Attrezzi) si utilizzando le Tassonomie. Per motivi didattici, nella app di esempio rappresento anche le Categorie come un Tipo di Contenuto. Una categoria è quindi rappresentata nella app da un Contenuto di tipo "Categoria", formato dai seguenti Campi:

CampoTipoDescrizione
Nome (titolo)testoNome della Categoria. Es. "Falciatrice"
SinonimitestoAltri termini che identificano la Categoria. Es. "tagliabordi estirpatore"
Categoria SuperioreRiferimento a CategoriaCategoria superiore. Es. Giardinaggio. Questo Campo consente di costruire una gerarchia di Categorie. (Categoria → Categoria superiore) (Categoria → Categoria)

SEDE

Ogni sede in cui può avvenire la consegna e la restituzione degli Attrezzi prestati è rappresentata da un Contenuto di tipo "Sede", formato dai seguenti Campi:

CampoTipoDescrizione
TitolotestoNome della Sede
Indirizzotesto formattatoIndirizzo completo della Sede
Contattitesto formattatoModalità di contatto e orari di apertura al pubblico per la consegna degli Attrezzi
Statoelenco di selezioneAttiva | Inattiva
Coordinatecoordinate geograficheVedi Mappe

ASSEGNAZIONE

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

CampoTipoDescrizione
TitolotestoGenerato automaticamente come "Appartenenza n. CODICE"
CodiceSerialeCodice univoco generato automaticamente 
SedeRiferimento a SedeSede di assegnazione (Assegnazione → Sede)
OperatoreRiferimento a UtenteOperatore assegnato (Assegnazione → Utente)
Notatesto formattatoNota relativa all'assegnazione dell'Operatore alla Sede
Statoelenco di selezioneAttiva | Inattiva

RICHIESTA

Ogni Richiesta di prestito è rappresentata da un Contenuto di tipo "Richiesta". La Richiesta è aggiunta alla app dall'Utente Richiedente, che quindi è memorizzato come Autore del Contenuto. I Campi della Richiesta sono:

CampoTipoDescrizione
TitolotestoGenerato automaticamente come "Richiesta n. CODICE"
CodiceSerialeCodice univoco generato automaticamente
AttrezzoRiferimento ad AttrezzoAttrezzo chiesto in prestito (Richiesta → Attrezzo)
Testotesto formattatoDescrizione della Richiesta
StatoWorkflowVedi Workflow

PRESTITO

Ogni Prestito attivato in risposta ad una Richiesta è rappresentato da un Contenuto di tipo "Prestito" Il Prestito è aggiunto alla app dall'Utente Proprietario dell'Attrezzo richiesto, che quindi è memorizzato come Autore del Contenuto. l Campi del Prestito sono:

CampoTipoDescrizione
TitolotestoGenerato automaticamente dalla app come "Prestito n. CODICE"
CodiceSerialeCodice univoco generato automaticamente
RichiestaRiferimento a RichiestaRichiesta cui il Prestito risponde (Prestito → Richiesta)
Notatesto formattatoDescrizione del Prestito
Sede di consegnaRiferimento a SedeSede in cui effettuare la consegna dell'Attrezzo (Prestito → Sede). Se lasciato vuoto, indica consegna diretta tra le parti.
StatoWorkflowVedi Workflow

RICEVUTA

Ogni Ricevuta emessa per tracciare il passaggio dell'Attrezzo prestato tra i diversi Utenti della app è rappresentata da un Contenuto di tipo "Ricevuta". La Ricevuta è aggiunta alla app dall'Utente che riceve fisicamente l'Attrezzo, che quindi è memorizzato come Autore della Ricevuta. I Campi della Ricevuta sono:

CampoTipoDescrizione
TitoloTestoGenerato automaticamente come "Ricevuta n. CODICE"
CodiceSerialeIntero univoco generato automaticamente
PrestitoRiferimento a PrestitoPrestito cui si riferisce la Consegna  (Ricevuta→ Prestito)
DataDataData in cui  l'Attrezzo viene preso in carico dall'Autore
Motivo Elenco di testiMotivo della Ricevuta: Ingresso in sede | Consegna | Restituzione | Uscita dalla sede 
NotaTesto formattatoNota per situazioni particolari (es. consegna incompleta, delega)
StatoWorkflowVedi Workflow

VALUTAZIONE

Ogni valutazione espressa su un Prestito è rappresentata da un Contenuto di tipo "Valutazione". La Valutazione è aggiunta alla app dal Proprietario o dal Richiedente, che quindi è memorizzato come Autore della Valutazione. I Campi della Valutazione sono:

CampoTipoDescrizione
TitoloTestoGenerato automaticamente come "Valutazione n. CODICE"
CodiceSerialeIntero univoco generato automaticamente
PrestitoRiferimento a PrestitoPrestito cui si riferisce la Valutazione (Valutazione → Prestito)
ValoreElenco di selezioneValore della Valutazione
NotaTesto formattatoNota che spiega la Valutazione
StatoWorkflowVedi Workflow

MESSAGGIO

I Messaggi tra gli Utenti sono memorizzati con una apposita Entità, gestita dal modulo aggiuntivo Private Message.

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.

Aggiungere contenuti alla app

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 richiamano la pagina di inserimento al link:

/node/add/tipo_contenuto

dove tipo_contenuto è il nome del Tipo di Contenuto che stai creando, es:

/node/add/attrezzo

APPROFONDIMENTO: La parola "node" (nodo) nell'indirizzo di richiamo di un Contenuto è un residuo delle prime versioni di Drupal, in cui i Contenuti erano appunto chiamati nodi. Essendo profondamente maturato negli anni, in Drupal si ritrovano spesso vestigia del passato. A mio avviso sono considerabili tali le Tassonomie (e quindi i Termini di Tassonomia, oggi sostituibili con gerarchie di Entità) e i File (oggi inclusi nel concetto di Media), anche se se ne continua a farne un ampio utilizzo ed escono tuttora nuovi moduli che arricchiscono questi tipi di Entità.

Se l'ordine con cui i Campi sono mostrati nella pagina di inserimento non ti soddisfa, vai in Struttura - Tipi di contenuto e seleziona Gestione visualizzazione form a fianco del Tipo di Contenuto: ti viene mostrata una pagina in cui puoi 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. 

Ritrovare i Contenuti

Come Amministratore, in 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

Per ogni Contenuto inserito, Drupal predispone una pagina che lo visualizza al link:

/node/ID

dove ID è il codice univoco che identifica il 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. 

Modificare un Contenuto

Per modificare un Contenuto, vai nella sua pagina di visualizzazione e clicca Modifica. Puoi anche andare direttamente alla pagina di modifica a 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 a 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), Drupal prevede in Persone - Permessi un unico Permesso - Visualizza contenuti pubblicati - che vale per tutti i tipi di Contenuto, da assegnare all'Utente registrato e, per le app che non intendono mostrare informazioni ai Visitatori, da negare agli Utenti anonimi. Vedremo più avanti con le Viste come modulare la visualizzazione delle informazioni Utente per Utente. 

Per le operazioni CUD è invece possibile  in Persone - Permessi assegnare i Permessi per tipo di Contenuto e distinguere tra Contenuti creati dall'Utente e Contenuti creati da altri Utenti. Ecco come:

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
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 non adeguata 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 sono un problema (come lo sono per la costruzione della app di esempio), 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: nella app di esempio: dato un Prestito concesso in risposta ad una Richiesta (che contiene qual è l'Attrezzo richiesto e chi è il Richiedente), se la Richiesta viene eliminata non sappiamo più chi e per cosa è stato emesso il Prestito. 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.

Nella app di esempio "Buoni Vicini" abbiamo visto che Richieste e Prestiti non devono essere eliminabili dopo la consegna dell'Attrezzo al Richiedente o ad un Operatore, perché perderemmo traccia dell'Attrezzo prestato. D'altra parte, la protezione base offerte da Permessi e Ruoli non può variare nel tempo. Per modificare i Permessi sui singoli Contenuti in funzione di eventi che accadono nella app possiamo usare i Workflow. 

Cos'è un Workflow

Un Workflow è un tipo di Entità, messo a disposizione dal modulo aggiuntivo Workflow, che quindi deve essere installato ed attivato per poter usare i Workflow nella tua app.

ATTENZIONE:  tra i moduli base installati con Drupal c'è un modulo di nome "Workflows" (con la "s" finale), che però ha funzionalità molto limitate. In questa Guida e nelle successive non utilizzeremo quel modulo, ma il modulo aggiuntivo quasi omonimo "Workflow" (senza la "s" finale), da deve essere installato.

Un Workflow è uno strumento utile per rappresentare il "ciclo di vita" di un Contenuto, inteso come una sequenza di "stati" attraverso cui il Contenuto passa dalla sua creazione alla sua eliminazione. Il passaggio da uno stato al successivo è provocato da eventi, ad esempio da un comando dato da un Utente. In ogni "stato", i Permessi dei diversi Utenti sul Contenuto possono essere differenti e ciò consente di realizzare Permessi che variano nel tempo. I Workflow assegnano i Permessi RUD (Read, Update, Delete), ma non il Permesso di creazione (Create) che quindi deve essere assegnato coi Permessi base.

Quali Workflow servono

Per identificare quali Workflow servono alla tua app, occorre anzitutto identificare quali tipi di Contenuto hanno Permessi che variano nel tempo: se i Permessi su un tipo di Contenuto non variano nel tempo è molto probabile che non serva un Workflow.

Nella app di esempio Attrezzi, Categorie, Sedi ed Assegnazioni non hanno questa necessità, mentre i Contenuti che rappresentano il prestito (cioè Richieste, Prestiti, Ricevute e Valutazioni) sì. Per questi tipi di Contenuto servono due Workflow distinti:

  • un Workflow per Richieste e Prestiti, per impedirne la modifica e l'eliminazione dopo la consegna dell'Attrezzo al Richiedente
  • un Workflow per Ricevute e Valutazioni, per impedirne la modifica e l'eliminazione dopo che sono state "firmate" dal loro Autore (passaggio necessario per consentire la correzione di errori di digitazione) o dopo qualche minuto dalla loro creazione (per evitare che restino nella app Ricevute e Valutazioni non confermate)

Come creare e usare i Workflow

Per disegnare ed utilizzare un Workflow occorrono i seguenti passaggi:

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

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

  • In Struttura - Tipo di Contenuto applicare il Workflow ad uno o più tipi di Entità o Contenuto

Disegnare il Workflow

Per disegnare un Workflow, in Configurazione - Workflow devi compilare alcuni moduli in cui elencare gli stati, i passaggi da stato a stato ed i Permessi concessi ai diversi Utenti in ogni stato:

crea il WorkflowIn Configurazione - Workflow seleziona Aggiungi Workflow e digita il nome del nuovo Workflow 
definisci gli statiIn Stati elenca aggiungi gli stati previsti per il Workflow. Di default trovi sempre lo stato fittizio "Creation" in cui si trova l'Entità mentre viene creata
definisci i passaggi tra gli statiIn Transizioni attiva le caselle corrispondenti al Ruolo che fa passare l'Entità dallo stato indicato nella riga allo stato indicato in colonna.
dai un nome ai comandi per passare da uno stato all'altroIn Transition labels digita in Etichetta i nome dei comandi che fanno transitare tra gli stati indicati. Questa configurazione non è strettamente necessaria, perché i nomi dei comandi possono essere successivamente definiti nelle Viste che utilizzano il Workflow.
definisci i Permessi nei diversi statiIn Accesso attiva le caselle corrispondenti ai Ruoli cui, nello stato indicato nella riga, vuoi concedere il Permesso indicato in colonna (View, Edit, Delete).

Come esempio, disegniamo il Workflow di protezione di Richieste e Prestiti per la app "Buoni Vicini":

crea il WorkflowIn Configurazione - Workflow seleziona Aggiungi Workflow e nominalo "Protezione" 
definisci gli statiIn Stati aggiungi gli stati "Prima" e "Dopo" la consegna dell'Attrezzo
definisci i passaggi tra gli statiIn Transizioni attiva il passaggio Creation → Prima per il solo Autore. Non attivare il passaggio Prima → Dopo perché non viene eseguito dagli Utenti ma automaticamente (1) da Drupal dopo la firma della Ricevuta di consegna. Per i Gestori attiva tutti i passaggi (compreso il ritorno Prima → Dopo), perché servono loro per intervenire a risolvere eventuali situazioni anomale.
definisci i Permessi nei vari stati In Accesso, attiva il Permesso View in entrambi gli stati per tutti gli Utenti; attiva Update e Delete nel solo stato "Prima" per Autore. Disattiva tutti i Permessi dei Visitatori. Attiva tutti i Permessi per i Gestori.

Disegniamo anche il Workflow per Valutazioni e Ricevute della stessa app:

crea il WorkflowIn Configurazione - Workflow seleziona Aggiungi Workflow e nominalo "Firma" 
definisci gli statiIn Stati aggiungi gli stati "Bozza" e "Firmata" 
definisci i passaggi tra gli statiIn Transizioni attiva il passaggio Creation → Bozza per il solo Autore. Attiva passaggio Bozza → Firmata (che corrisponde all'operazione di firma) . Per i Gestori attiva tutti i passaggi (compreso il ritorno Firmata → Bozza), perché servono loro per intervenire a risolvere eventuali situazioni anomale.
definisci i Permessi nei vari stati In Accesso, attiva il Permesso View in entrambi gli stati per tutti gli Utenti; attiva Update e Delete nel solo stato "Bozza" per Autore. Disattiva tutti i Permessi dei Visitatori. Disattiva tutti i Permessi dei Visitatori. Attiva tutti i Permessi per i Gestori.

Regolare i Permessi base

L'attivazione del modulo Workflow aggiunge un secondo strumento di controllo dei Permessi, che deve essere coordinato coi Permessi base concessi in Persone - Permessi. Vediamo come.

Anzitutto, come abbiamo visto negli esempi, i Workflow non possono assegnare i Permessi di creazione di nuovi Contenuti, che quindi devono essere attivati in Persone - Permessi. Nella app di esempio, in Persone - Permessi attiviamo il Permesso di creazione di Richieste, Prestiti e Valutazioni ai ruoli Partecipante e Gestore ed il Permesso di creazione di Ricevute ai ruoli Partecipante, Operatore e Gestore.

I Workflow possono assegnare ma non togliere i Permessi di modifica ed eliminazione. Quindi per poter regolare la modifica o l'eliminazione in un Workflow occorre prima disattivare i Permessi di modifica e eliminazione in Persone - Permessi e poi concederli nella configurazione Accesso del Workflow. Pertanto, nella app di esempio, disattiviamo in Persone - Permessi i Permessi di modifica ed eliminazione di Utenti autenticati, Partecipanti ed Operatori su Richiesta, Prestito, Ricevuta e Valutazione.

 In Persone - Permessi occorre infine autorizzare la partecipazione ai Workflow per i diversi Ruoli, attivando il Permesso NOMEWORKFLOW: Participate in workflow). Nella app di esempio, attiviamo il Permesso "Firma: Participate in workflow" per i Ruoli Partecipante, Operatore e Gestore e il Permesso "Protezione: Participate in workflow" per i Ruoli Partecipante e Gestore.

APPROFONDIMENTO: Il modulo Workflow è solo uno dei numerosi moduli aggiuntivi che modificano i Permessi degli Utenti sui Contenuti. Quasi tutti questi moduli lavorano come il modulo Workflow e quindi aggiungono Permessi ma non li tolgono. Se si attiva più di un modulo aggiuntivo di gestione dei Permessi, il risultato può cambiare in base all'ordine temporale con cui i diversi moduli vengono eseguiti da Drupal: se il risultato non è quello atteso, si può cambiare l'ordine di esecuzione dei diversi moduli modificando un apposito parametro numerico nella configurazione dei moduli. Per il modulo Workflow questo parametro è modificabile in Configurazione - Workflow - Access settings - Workflow Access Priority. In generale, non è consigliabile attivare più di un paio di moduli di gestione di Permessi nella stessa installazione di Drupal. 

Applicare il Workflow

Per applicare un Workflow ad un tipo di Contenuto, basta aggiungere a quel tipo un Campo di tipo Workflow State, specificando il Workflow che si intende applicare.  

Nella app di esempio "Buoni Vicini", aggiungiamo al tipo Richiesta un Campo Workflow di nome "Stato", specificando il Workflow "Protezione"; lo stesso per il tipo Prestito; anche ai tipi Ricevuta e Valutazione aggiungiamo un Campo Workflow di nome "Stato", specificando stavolta il Workflow "Firma".  

Dopo l'applicazione di un Workflow (e talvolta anche dopo aver cambiato la configurazione di un Workflow) può rendersi necessaria la ricostruzione dei Permessi sulle Entità: in questo caso, Drupal mostra un messaggio all'Amministratore, che contiene il link da cliccare per ricostruire i Permessi su tutti i Contenuti. In caso di dubbi, puoi sempre lanciare la ricostruzione col comando Resoconti - Resoconto sullo Stato - Rebuild permissions.

ATTENZIONE: le protezioni del Workflow valgono per i Contenuti aggiunti successivamente all'applicazione del Workflow al loro Tipo. Per gli eventuali Contenuti preesistenti all'applicazione del Workflow occorre inizializzare lo stato: a questo scopo conviene creare una Vista di tipo VBO (riservata all'Amministratore) in cui selezionare tutte le Entità esistenti e definirne massivamente il valore iniziale del Campo Workflow.

Per cambiare lo stato di un Contenuto basta cambiare il valore del suo Campo Workflow: Drupal presenta all'Utente solo gli stati per cui è prevista nel Workflow una transizione dallo stato corrente del Contenuto. Per cambiare il valore del Campo Workflow, l'Utente deve avere il Permesso di modifica del Contenuto. Nella app di esempio, il Partecipante o l'Operatore può modificare una propria Ricevuta fintanto che il Campo Stato vale "Bozza". Se modifica il valore del Campo Stato in "Firmata", la Ricevuta diventa immodificabile.

Vedremo in una prossima Guida come costruire la procedura che cambia automaticamente lo Stato di Ricevute e Valutazioni in "Firmata" dopo un certo tempo dalla loro creazione e la procedura che cambia automaticamente lo Stato di Richieste e Prestiti in "Dopo" dopo la firma delle Ricevute di consegna dell'Attrezzo al Richiedente.   

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.

 

 

 

 

 

 

Da scrivere partendo da 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 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 e come presentarle all'Utente, senza necessità di conoscere il linguaggio di interrogazione del database (SQL) e neppure 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 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.

Dedicherò quindi un buon numero di Guide, partendo dalle più semplici e costruendo passo passo i percorsi previsti nella app di esempio.

Come primo esempio, costruiamo la Vista "Magazzino" (prevista dalla app di esempio) che elenca gli Attrezzi messi a disposizione dagli Utenti per il prestito.

Costruire una nuova Vista

Per creare  la nuova Vista "Magazzino":

  • Vai in Struttura - Viste - Aggiungi nuova vista.
  • Scegli il nome della nuova vista ("Magazzino").
  • In Mostra scegli contenuto di tipo "Attrezzo".
  • Scegli di creare una Pagina e di mostrare il risultato come Tabella

Le sezioni della Vista

Salvata la Vista, si apre l'editor della Vista (Views UI), composto dalle seguenti sezioni, ognuna delle quali configura un aspetto della Vista:

Visualizzazioni elenca le visualizzazioni della Vista Comandi di gestione della Vista
Nome della Visualizzazione che si sta modificando  Comandi di gestione della Visualizzazione
Formato definisce come mostrare le Entità (tabella, elenco, mappa, grafico ecc.)Impostazioni pagina definisce l'Indirizzo della pagina ed il  menù da cui richiamarla (*)Relazioni elenca le relazioni tra le Entità 

Accesso definisce quali Utenti possono vedere la Vista

Campi elenca i Campi delle Entità da mostrareIntestazione elenca cosa mostrare nella Vista prima delle EntitàFiltri contestuali elenca i filtri da cercare nel link di richiamo della Vista 
Criteri del filtro elenca i filtri da applicare alle Entità Piè di pagina elenca cosa mostrare nella Vista dopo le  EntitàForm esposto definisce come mostrare i Filtri all'Utente 
Criteri di ordinamento elenca i Campi su cui ordinare le EntitàComportamento se non ci sono risultati elenca cosa mostrare se non ci sono Entità da mostrareAltro contiene altre configurazioni Vista
 Paginazione definisce quante Entità per volta mostrare 
Anteprima mostra come viene mostrata la Vista agli Utenti, in base al Display correntemente selezionato ed in base agli eventuali parametri "passati" alla Vista.  

(*) 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 ritroviamo le scelte effettuate al momento della creazione della Vista: 

  • nella sezione Visualizzazioni  compare una Visualizzazione di tipo Pagina e, come Formato la Tabella
  • nella sezione Criteri del filtro compare un Filtro che limita la Vista ai soli Contenuti di tipo "Attrezzo"
  • nella sezione Campi compare il "titolo" degli Attrezzi

Aggiungere Campi nelle sezioni

In molte sezioni della Vista è necessario aggiungere Campi per raggiungere il risultato desiderato. La modalità di identificazione e selezione di un Campo è sempre la medesima per tutte le sezioni:

aggiungi un Campo nella sezioneclicca Aggiungi a fianco della sezione: appare una finestra "Aggiungi campi", che elenca tutti i Campi disponibili per quella sezione 
cerca il Campo da aggiungereseleziona in Categoria il tipo di Entità cui appartiene il Campo (es: se stai cercando il nome utente degli Utenti, in Categoria seleziona Utente); in Cerca digita una parte del nome del Campo (es: "nome"); se ci sono più Campi con lo stesso nome, controlla nella colonna Descrizione che il Campo appartenga al tipo di Entità giusto
seleziona il Campoattiva la casella a fianco del Campo e clicca Aggiungi e configura campi
seleziona la Relazione che consente di raggiungere il Camponella finestra di configurazione, seleziona la Relazione che identifica l'Entità in cui leggere il Campo: se il Campo appartiene alla Entità principale su cui stai costruendo la Vista (cioè quella che hai scelto mentre creavi la Vista) non selezionare alcuna Relazione. Su questo punto tornerò con molti esempi, quindi per ora non preoccuparti.
completa la configurazione del CampoIn base alla sezione in cui stai lavorando, la finestra di configurazione può chiedere altre informazioni, che spiegherò caso per caso; alla fine clicca Salva

Quali Campi mostrare (sezione Campi)

La sezione Campi elenca i Campi che la Vista mostra. Se, oltre al titolo dell'Attrezzo, vogliamo mostrare nella Vista "Magazzino" la sua immagine:

  • nella sezione Campi clicca Aggiungi
  • come spiegato sopra, cerca e seleziona il Campo "immagine" che appare in Attrezzo:
  • Nella finestra di configurazione, come Stile immagine del Campo seleziona Miniatura per uniformarne e ridurne le dimensioni

Con la stessa modalità, aggiungi il Campo "Descrizione" e, nella sua configurazione, attiva Escludi dalla visualizzazione per non mostrarlo all'Utente: ci servirà tra poco per eseguire ricerche nel Magazzino.

Modificare l'ordine dei Campi (sezione Campi)

Se l'ordine delle colonne (Campi) nella tabella non ti soddisfa, nella sezione Campi clicca Rearrange e riordinali. 

Campi e Token

Ad ogni Campo aggiunto alla Vista corrisponde un Token che contiene il valore di quel Campo e che puoi usare negli altri Campi. Ogni Campo "vede" i Token dei Campi che lo precedono nella sezione Campi ma non "vede" i Token dei Campi che lo seguono, quindi l'ordine dei Campi nella sezione Campi limita la possibilità di riusare il valore di un Campo in un altro Campo. L'elenco dei Token riusabili in un Campo è disponibile sotto Replacement patterns del Campo stesso e da lì può essere copiato ed incollato.

Per usare il valore di un Campo A in un Campo B:

  • clicca sul Campo B
  • Sotto Replacement Patterns di B trova il Token corrispondente al Campo A (lo riconosci sia dall'ordine di elencazione sia dal nome)
  • Sempre sotto Replacement Patterns trova il Token corrispondente al Campo B (è l'ultimo Token elencato)
  • Sotto Risultati di riscrittura attiva Sovrascrivere l'output di questo campo con testo personalizzato e come Testo digita un testo a tuo piacere, in cui puoi inserire sia il Token di A (che sarà sostituito dal valore di A) sia il Token di B (che sarà sostituito dl valore originario di B)

Modificare l'ordine delle Entità (sezione Criteri di ordinamento)

Gli attrezzi sono elencati nella tabella in un ordine casuale. Se li vuoi ordinare per nome: 

  • nella sezione Criteri di ordinamento clicca Aggiungi
  • cerca e seleziona il Campo Titolo dell'Attrezzo
  • nella finestra di configurazione, seleziona l'ordinamento ascendente.

Se metti più criteri di ordinamento, essi vengono eseguiti nell'ordine in cui sono mostrati, dall'alto verso il basso.

Filtrare le Entità (sezione Criteri del filtro)

La  sezione Criteri del filtro elenca i Filtri che limitano quali Entità mostrare 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 tenuti nascosti. Nella Vista "Magazzino" troviamo anche il Filtro Tipo di Contenuto = Attrezzo che avevamo impostato nel momento della creazione della Vista. Per limitare la Vista ai soli Attrezzi attualmente prestabili, aggiungiamo un Filtro sul Campo "Stato" imponendo che sia uguale a "Prestabile".

Filtri esposti all'Utente (sezione Criteri del filtro)

I Filtri impostati nella sezione Criteri del filtro sono per default nascosti all'Utente. Attivando Esponi questo filtro, per permettere ai visitatori di modificarlo, il Filtro viene mostrato perché l'Utente possa modificarne il valore ed eventualmente anche l'operatore (ma non il Campo su cui agisce). Ad esempio, il Filtro sopra descritto che limita la Vista ai soli attrezzi Prestabili potrebbe essere esposto, per consentire all'Utente di scegliere di vedere anche gli Attrezzi di cui è stato sospeso il prestito. 

Cercare nella Vista (sezione Criteri del filtro)

I Filtri esposti sono particolarmente utili per consentire all'Utente di trovare nella Vista le Entità che soddisfano uno o più criteri di ricerca. In particolare, se aggiungiamo ed esponiamo il Filtro Globale - Combina filtri dei campi, all'Utente verrà mostrata una finestra di ricerca, in cui digitare una o più parole che saranno cercate su più Campi contemporaneamente, purché i Campi siano tutti di tipo testo e siano presenti nella sezione Campi. Ecco come impostare la ricerca:

  • nella sezione Criteri del filtro aggiungi il Filtro Combina filtri dei campi ed attiva Esponi questo filtro, per permettere ai visitatori di modificarlo
  • come operatore seleziona Contiene ogni parola, in modo da poter stringere la ricerca digitando più parole
  • in Scegli i campi da combinare per il filtraggio seleziona i Campi testuali in cui cercare; nella nostra Vista: "titolo" e "descrizione"

Paginare la Vista (sezione Paginazione)

Se l'elenco delle Entità mostrato dalla Vista è lungo, conviene presentarlo in pagine:

  • Nella sezione Paginazione seleziona Risultati paginati, paginatore ridotto oppure Risultati paginati, paginatore completo
  • Indica quante Entità mostrare in ogni pagina (es. "10") 

Aggiungere informazioni per l'Utente (sezioni Intestazione e Piè di pagina)

Nella sezione Intestazione possiamo aggiungere informazioni che saranno mostrate all'Utente sopra l'elenco degli Attrezzi:

  • aggiungi Riassunto del risultato - Globale - Mostra il riassunto del risultato, per esempio gli elementi per pagina. per mettere a disposizione dell'Utente il numero di Attrezzi elencati;
  • in Visualizzazione digita "@total Attrezzi disponibili al prestito. Clicca su un Attrezzo per vederne le caratteristiche e chiederlo in prestito.<br>", dove @total sarà sostituito dal numero di Attrezzi elencati e "<br>" è una istruzione che dice di andare a capo.

Proteggere la Vista (sezione Accesso)

Nella sezione Accesso possiamo proteggere la Vista limitandone la visibilità a specifici insiemi di Utenti. Le protezioni offerte nella sezione Accesso sono:

Permessola Vista mostra le informazioni tenendo conto dei Permessi degli Utenti sulle Entità elencate
Ruolola Vista mostra le informazioni solo agli Utenti che hanno uno o più Ruoli specificati  
Senza restrizionila Vista mostra le informazioni a qualunque Utente, compresi i Visitatori

Il risultato reale dipende dalla combinazione tra l'impostazione di questa sezione, i Permessi attribuiti ai diversi Ruoli ed eventuali ulteriori moduli di protezione dei contenuti attivati e può portare a dinieghi o visualizzazioni non previste. Salvo necessità più complesse, la soluzione più semplice è selezionare qui la protezione per Ruolo, consentendo l'accesso solo agli Utenti autenticati (o all'Amministratore, se si tratta di una Vista utile solo a questo Ruolo).

ATTENZIONE: Anche se formalmente è possibile attribuire protezione diverse alla diverse Visualizzazione di una medesima Vista, nella mia esperienza sembra che l'ultima impostazione della sezione Accesso venga applicata indistintamente a tutte le Visualizzazioni. Quindi se si intende avere due Viste con protezione diverse (es. una per gli Utenti e l'altra per l'Amministratore) conviene creare due Viste separate e non due Visualizzazioni della stessa Vista.  

Relazioni tra Entità

Nella Guida precedente abbiamo costruito una semplice Vista "Magazzino", che mostra le informazioni memorizzate nelle Entità scelte per quella Vista (gli Attrezzi). Vediamo ora come arricchire una Vista con informazioni memorizzate in altre Entità, collegate da relazioni alle Entità della Vista. 

Le relazioni tra Entità sono basate sui Campi Riferimento. Una Entità A è in relazione con una Entità B se l'Entità A ha un Campo Riferimento che rimanda all'Entità B. Rappresentiamo sinteticamente questa relazione come A → B

Grazie al Campo Riferimento, quando in una Vista si conosce l'Entità A si può risalire all'Entità B ed utilizzarne le informazioni insieme alle informazioni di A.

In una Vista basata sulle Entità di tipo A, per risalire alle corrispondenti Entità di tipo B occorre dichiarare la relazione A→B nella sezione Relazioni della Vista e poi usare la relazione nelle altre sezioni della Vista. 

Ad esempio, nella Vista "Magazzino" che elenca gli Attrezzi (A) vogliamo aggiungere le informazioni sulla Categoria cui ogni Attrezzo appartiene (B), grazie al Campo "Categoria" dell'Attrezzo che rimanda alla Categoria (Attrezzo → Categoria). Grazie al Campo predefinito "Autore" dell'Attrezzo, possiamo anche aggiungere alla Vista il nome del Proprietario dell'Attrezzo (Attrezzo → Autore).

Come dichiarare una relazione nella Vista

Per dichiarare la relazione Attrezzo → Categoria basata sul Campo "Categoria" dell'Attrezzo:

  • nella sezione Relazioni della Vista clicca Aggiungi
  • come spiegato, seleziona "Categoria" dell'Attrezzo, che è elencato come contenuto referenziato da seguito dal nome interno del Campo ("field_categoria") e che appare in: "attrezzo"
  • Nella finestra di configurazione, come titolo amministrativo della relazione digita "categoria dell'attrezzo" perché, grazie a questa relazione, identifichi appunto la Categoria associata all'Attrezzo.

Per dichiarare la relazione Attrezzo → Autore basata sul Campo Autore dell'Attrezzo:

  • nella sezione Relazioni della Vista clicca Aggiungi
  • cerca "autore" e seleziona Utente - Contenuto - Nome utente dell'autore del contenuto e, come titolo amministrativo, digita "proprietario"

Come usare le relazioni nella Vista

Dichiarata una relazione A→B nella sezione Relazioni, per usare nelle altre sezioni della Vista un Campo dell'Entità B basta selezionare quella relazione nella finestra di configurazione del Campo. Ecco ad esempio come aggiungere alla Vista il Campo "titolo" della Categoria cui appartiene un Attrezzo:

  • nella sezione Campi clicca Aggiungi
  • Seleziona il Campo titolo e, nella finestra di configurazione, come Relazione seleziona "Categoria dell'attrezzo"

Ed ecco come aggiungere il nome del Proprietario dell'Attrezzo:

  • seleziona Nome - Utente - Il nome dell'utente o dell'autore e, come Relazione, seleziona "proprietario"; come Etichetta digita "Proprietario"

Relazioni concatenate

Nella app di esempio, una Categoria (es. "Cesoia") può appartenere ad una Categoria superiore (es. "Giardinaggio"). La relazione Categoria → Categoria Superiore è basata sul Campo "Categoria Superiore" della Categoria. In una Vista basata sugli Attrezzi, con la catena di relazioni Attrezzo → Categoria e  Categoria → Categoria Superiore possiamo associare all'Attrezzo anche la Categoria superiore: 

Come esempio, vediamo come aggiungere alla Vista "Magazzino" anche il titolo della Categoria Superiore: 

  • nella sezione Relazioni clicca Aggiungi
  • seleziona il Campo "Categoria Superiore" della Categoria, elencato come Contenuto referenziato da field_categoria_superiore" che appare in Categoria
  • Nella finestra di configurazione del Campo, come Relazione seleziona "Categoria dell'attrezzo" e come titolo amministrativo digita "Categoria superiore"

Non ci sono limiti alla lunghezza delle catene di relazioni: l'importante è nella sezione Relazioni le relazioni siano elencate nell'ordine corretto. Drupal evidenzia la dipendenza di una relazione da una precedente mettendone il nome tra parentesi: ad esempio "(categoria dell'attrezzo) categoria superiore" indica che la relazione che mette a disposizione le informazioni sulla categoria superiore dipende dalla precedente relazione "categoria dell'attrezzo"

In tutte le altre sezioni della Vista, per accedere ad un Campo di una Entità messa a disposizione da una relazione, basta selezionarla come Relazione nella configurazione del Campo. In questo modo, nella sezione Campi possiamo aggiungere alla Vista "Magazzino" il Campo "Sinonimi" della Categoria ed i Campi "Titolo" e "Sinonimi" della Categoria Superiore; nascondiamo i Campi "Sinonimi" (li useremo per la ricerca ma confonderebbero l'Utente se mostrati) e riordiniamo i Campi, per mostrare da sinistra verso destra prima la Categoria superiore (di cui possiamo cambiare etichetta in "Ambiente"), poi la Categoria ed infine l'Attrezzo vero e proprio:

Nella sezione Criteri del filtro Ora possiamo estendere la ricerca nella Vista "Magazzino" alla Categoria, alla Categoria Superiore ed ai loro Sinonimi:

  • Nella sezione Criteri del Filtro seleziona il Filtro Globale: Combina filtri dei campi (esposto) che avevamo già creato
  • In Scegli i campi da combinare per il filtraggio estendiamo la ricerca a tutti i Campi elencati, che ora includono titolo e descrizione dell'Attrezzo, titolo e sinonimi della Categoria e titolo e sinonimi della Categoria Superiore.

Infine, nella sezione Criteri di ordinamento ordiniamo gli Attrezzi per titolo di Categoria superiore, titolo di Categoria e titolo dell'Attrezzo. 

Relazioni inverse

Nelle Viste è anche possibile usare una relazione A→ B in senso inverso, cioè per identificare A partendo da B come se fosse B→ A  Ecco come.

Quando nella sezione Relazioni selezioni il Campo su cui si basa la relazione, al posto di selezionare la riga:

Titolo

Categoria

Descrizione

Contenuto referenziato da CContenutoche appare in A

che identifica l'Entità B richiamata dal campo C dell'Entità A (quindi  A→ B), seleziona invece la riga:

Titolo

Categoria

Descrizione

Contenuto che usa CContenutoRelate each A with a C set to the content item

che identifica l'Entità A come l'Entità che utilizza il Campo C per referenziare B (quindi B→ A). 

Ad esempio, per la relazione Attrezzo Categoria, se selezioni la riga evidenziata in verde la usi in senso diretto (dall'Attrezzo risali alla Categoria), mentre se selezioni la riga evidenziata in giallo la usi in senso inverso (dalla Categoria risali all'Attrezzo).  

ATTENZIONE ! Usando la relazione A B in senso diretto, dato A si trova un solo B (a meno che il Campo Riferimento ammetta più valori di B). Usando la stessa relazione in senso inverso (B A), potrebbe capitare che identifichi più A. Ad esempio, se l'Entità "Disco" ha un Campo "Cantante" che ammette un solo valore, la relazione Disco Cantante restituisce un solo Cantante; ma se usiamo quella relazione in senso inverso potrebbe restituire più di un Disco, cioè tutti i Dischi di quel Cantante.   

Nelle prossime Guide, sfrutteremo questa possibilità nella app di esempio, per trovare il Prestito attivato in risposta ad una Richiesta (per come abbiamo disegnato le Entità, la relazione va infatti dal Prestito alla Richiesta e non viceversa).

Nelle Guide precedenti abbiamo costruito la Vista "Magazzino", che elenca tutti gli Attrezzi disponibili al prestito. Vogliamo ora mettere a disposizione di ogni Utente una Vista "Miei Attrezzi" come una variazione della Vista "Magazzino" che mostra solo gli Attrezzi di proprietà dell'Utente stesso. Nella prossima Guida aggiungeremo i comandi per aggiungere un Attrezzo, passare da una Vista all'altra con un click e predisporre il comando che porta l'Utente al Cruscotto della app. 

I passaggi per ottenere questo risultato sono:

  • creare la Vista "Miei Attrezzi" come variazione della Vista "Magazzino"
  • aggiungere un Filtro a "Miei Attrezzi" che la limiti ai soli Attrezzi dell'Utente che sta usandola, cioè il cosiddetto Utente corrente (current user)

Puoi vedere il risultato guardando la Vista "Magazzino" e la Vista "Miei Attrezzi" sul sito di esempio.

Creare una variazione di una Vista

Per non creare la Vista "Miei Attrezzi" da zero, possiamo crearla una variazione della Vista "Magazzino" e poi adattarla alle nuove necessità. Per creare una variazione di una Vista esistente ci sono due metodi: fare una copia della Vista originale, oppure creare una nuova Visualizzazione della Vista originale. Vediamo entrambi i metodi ed i loro pro e contro.

Creare una nuova Vista come copia della Vista originale

Per duplicare la Vista originaleVai in Struttura - Viste e seleziona Duplica a fianco della Vista originale
Per distinguere la nuova Vista dalla Vista originaleDai un nome significativo alla nuova Vista e modifica anche il nome interno
Per evitare che Drupal confonda le due VisteNella sezione Impostazioni pagina della nuova Vista modifica il Percorso differenziandolo da quello della Vista originale  

I vantaggi di questo metodo sono la sua semplicità e l'impossibilità di rovinare per errore la Vista originale. Lo svantaggio è che qualunque modifica si apporterà in futuro alla Vista originale non verrà applicato automaticamente alla nuova Vista.

Creare una nuova Vista come nuova Visualizzazione della Vista originale.

Per creare la nuova Visualizzazione della Vistaseleziona Duplica page:  in Visualizzazioni appare una seconda Visualizzazione di nome "page". Da qui in poi, prima di effettuare una qualunque modifica, assicurati di agire sulla Visualizzazione desiderata (originale o nuova) cliccandovi sopra.
Per distinguere la nuova Visualizzazione dalla Visualizzazione originale Clicca su Nome visualizzato e rinominala (es. "Miei Attrezzi") per distinguerla dall'originale
Per evitare che Drupal confonda le due VisteNella sezione Impostazioni pagina della nuova Visualizzazione modifica il Percorso differenziandolo da quello della Visualizzazione originale  

Quando apporti una qualunque modifica in una delle due Visualizzazioni, nella casella Per puoi decidere se applicarla a tutte le Visualizzazioni oppure solo alla Visualizzazione selezionata in quel momento. Il pulsante in fondo conferma tale scelta:   

Il vantaggio di questo metodo è che puoi facilmente estendere le modifiche a tutte o alcune delle variazioni di una Vista. Vedremo inoltre in Guide successive che questo è il metodo standard per creare alcuni Viste che si allegano a Entità (EVA) o ad altre Viste. Lo svantaggio di questo metodo è che, se non si sta attenti, si rischia di rovinare una Vista funzionante applicando ad essa una modifica pensata per un'altra Visualizzazione della stessa Vista. Suggerisco questo secondo metodo quando la nuova Vista si differenzia dall'originale per pochi dettagli. 

Filtrare la Vista sull'Utente corrente

Abbiamo visto nella Guida precedente come usare in una Vista informazioni contenute in Entità collegate da un Campo Riferimento alle Entità principali della Vista stessa. Creata nella Vista "Magazzino" una nuova Visualizzazione "Miei Attrezzi", vediamo come aggiungervi l'informazione sull'Utente Proprietario dell'Attrezzo e usarla per filtrare gli Attrezzi, limitandoli a quelli di proprietà dell'Utente corrente.

identifica il proprietario dell'Attrezzo, che coincide con l'Autore dell'AttrezzoNella sezione Relazioni  aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto e rinominala come "Proprietario"
filtra la Visualizzazione limitandola ai soli Attrezzi di proprietà dell'Utente correnteNella sezione Criteri del filtro aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "Proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si

 

In questa Guida vediamo come aggiungere comandi sopra o sotto l'elenco delle Entità mostrato nella Vista e come aggiungere comandi sulle singole Entità elencate nella Vista. Per "comando" si intende un link che, cliccato dall'Utente, porta su un'altra pagina della app,  crea o modifica una Entità o esegue operazioni più complesse. 

Comando nella sezione Intestazione della Vista
Entità 1Comando sulla Entità 1
Entità 2Comando sulla Entità 2
Entità 3Comando sulla Entità 3
Comando nella sezione Piè di pagina della Vista

Aggiungere comandi sopra e sotto l'elenco delle Entità

Come esempio, completiamo le Viste "Magazzino" e "Miei Attrezzi" (costruite nelle Guide precedenti) con comandi che consentano di passare da una Vista all'altra e di passare al Cruscotto della app. Nella Vista "Miei Attrezzi" vogliamo inoltre aggiungere un comando "Aggiungi Attrezzo" per caricare un nuovo Attrezzo nella app: 

Vista "Magazzino"
Cruscotto - Miei Attrezzi
Attrezzo 1
Attrezzo 2
Attrezzo 3
Vista "Miei Attrezzi"
Cruscotto - Magazzino - Aggiungi Attrezzo
Attrezzo 1
Attrezzo 2
Attrezzo 3

Perché il comando sia mostrato una volta sola (e non ripetuto per ogni Entità elencata dalla Vista) occorre posizionarlo nella sezione Intestazione mostrata sopra l'elenco delle Entità oppure nella sezione Piè di pagina mostrata sotto l'elenco. Per aggiungere un comando senza dover scrivere codice HTML, suggerisco di installare ed attivare il modulo aggiuntivo Views Linkarea, che mette a disposizione un nuovo Campo  Link - Globale - Provide an internal or external link. Vediamo ad esempio come aggiungere il comando "Aggiungi Attrezzo" nella Vista "Miei Attrezzi":

aggiungi il comando in cima all'elenconella sezione Intestazione aggiungi  Link - Globale - Provide an internal or external link
mostra il comando anche se non ci sono ancora Attrezzi dell'Utente nella configurazione del link attiva Visualizza anche se la vista non da risultati
scegli il testo del comando da mostrare all'Utentein Testo del collegamento digita "Aggiungi Attrezzo"
definisci cosa esegue il comandoin Percorso del link digita il link da eseguire "/node/add/attrezzo"
mostra il comando come un pulsante colorato anziché solo come un linkin Classe del link digita "btn btn-primary" (questa opzione può cambiare in base al tema grafico installato)  

Con la stessa modalità aggiungiamo alla Vista "Miei Attrezzi" il comando "Magazzino" per tornare al Magazzino (Testo del collegamento: "Magazzino" e Percorso del link: "/magazzino") ed alla Vista "Magazzino" il comando "Miei Attrezzi" (Testo del collegamento: "Miei Attrezzi" e Percorso del link: "/miei-attrezzi"). Ad entrambe le Viste aggiungiamo anche il comando "Cruscotto" per tornare al Cruscotto  (Testo del collegamento: "Cruscotto" e Percorso del link: "/cruscotto").

Aggiungere comandi sulle Entità elencate in una Vista

Per aggiungere su ogni singola Entità elencata in una Vista un comando che agisce su quella Entità si può aggiungere alla sezione Campi della Vista un Campo Testo personalizzato - Globale - Fornisce testo o link personalizzato. Ad esempio, volendo aggiungere a fianco di ogni Attrezzo elencato nella Vista "Magazzino" un comando "Coda" che elenca le Richieste ancora aperte su quell'Attrezzo:

trova l'identificativo dell'Attrezzo e nascondilonella sezione Campi aggiungi  ID - Contenuto e attiva Escludi dalla visualizzazione 
aggiungi il Campo che conterrà il comandonella sezione Campi aggiungi Testo personalizzato - Globale - Fornisce testo o link personalizzato.
definisci come si presenta il comando all'utentecome Testo del Campo digita "Coda", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato.
definisci cosa succede quando l'utente clicca il comandocome Percorso del link digita l'indirizzo della Vista che elenca le Richieste aperte sull'Attrezzo (es. "/richieste-aperte-attrezzo") passandole l'identificativo dell'Attrezzo stesso, che è contenuto nel Token {{ nid }} corrispondente al primo Campo e che trovi elencato sotto Replacement patterns, es. "/richieste-aperte/{{ nid }}"

Consultando la Vista "Magazzino" che abbiamo creato nelle Guide precedenti, un Utente può trovare un Attrezzo di suo interesse e, cliccandovi sopra, accedere alla pagina dell'Attrezzo. Vediamo come personalizzare la pagina dell'Attrezzo con informazioni e comandi che dipendono sia dall'Attrezzo sia dall'Utente. 

EVA: una Vista dentro la pagina di una Entità

Per arricchire la pagina di una Entità con informazioni prese da altre Entità e con comandi che dipendono dall'Entità e dall'Utente, possiamo usare le EVA (Entity Views Attachment). Una EVA è una Vista che viene richiamata dentro la pagina di una Entità. Per utilizzare le EVA occorre installare ed attivare il modulo aggiuntivo EVA: Entity Views Attachment

La costruzione di una EVA è del tutto simile alla costruzione di una Vista, con i seguenti passaggi in più necessari per collegare la Vista alla pagina in cui deve essere richiamata:

Crea la EVACrea la Vista come al solito. Nella sezione Visualizzazioni della Vista clicca Aggiungi - EVA. Appare una nuova Visualizzazione EVA
Collega la EVA alla pagina dell'Entità (es. pagina dell'Attrezzo)Nella nuova sezione Entity content settings (che sostituisce la sezione Impostazioni pagina) della Visualizzazione EVA, seleziona il tipo di Entità ed il Bundle cui la Vista deve essere allegata (es. "Contenuto" - "Attrezzo")
Definisci l'identificativo della Entità in cui la EVA verrà richiamataNella sezione Filtri contestuali aggiungi il Campo identificativo dell'Entità, es. ID - Contenuto (vedremo in una prossima Guida una spiegazione più estesa dei Filtri contestuali)
(Se necessario) Utilizza l'identificativo dell'Entità nelle altre sezioni della EVAL'identificativo dell'Entità nella cui pagina verrà richiamata la EVA è scritto nel Token {{ raw_arguments.nid }} 

Esempi di EVA

Con riferimento alla app di esempio, esemplifichiamo le potenzialità delle EVA personalizzando la pagina dell'Attrezzo. Il metodo qui illustrato è generalizzabile per personalizzare la pagina di una qualunque Entità della tua app e lo riapplicheremo anche alle pagine della Richiesta, del Prestito e del Messaggio. 

Vogliamo che la pagina di ogni Attrezzo sia così formata:

Pagina dell'Attrezzo
Se l'Utente è il Proprietario dell'AttrezzoSe l'Utente non è il Proprietario dell'Attrezzo
Comando "Miei Attrezzi" | Comando "Prestiti conclusi sull'Attrezzo"Comando "Magazzino" | Comando "Chiedi in prestito questo Attrezzo"

Informazioni sull'Attrezzo

Elenco di Richieste e Prestiti aperti sull'Attrezzo 

Per ognuno dei riquadri sopra elencati costruiamo una EVA.  

COMANDI SULL'ATTREZZO PER IL PROPRIETARIO

Questa EVA mostra al Proprietario dell'Attrezzo i comandi "Miei Attrezzi" e "Prestiti conclusi sull'Attrezzo".

crea la EVAvai in Struttura - Viste - Aggiungi nuova vista;  scegli il nome della Vista ("Comandi Attrezzo Proprietario");  in Mostra scegli contenuto di tipo "Attrezzo"; scegli di creare una Pagina e di mostrare il risultato come Elenco non formattato di campi. Nella sezione Visualizzazioni clicca Aggiungi - EVA
Collega la EVA alla pagina dell'AttrezzoNella sezione Entity content settings, come Tipo di Entità seleziona Contenuto e come Bundle seleziona "Attrezzo"
Definisci l'identificativo dell'Attrezzo in cui la EVA verrà richiamataNella sezione Filtri contestuali aggiungi ID - Contenuto
identifica il Proprietario dell'Attrezzo, con la relazione Attrezzo → AutoreNella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto e rinomina come "proprietario"
limita la visualizzazione al ProprietarioNella sezione Criteri del Filtro aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si
mostra il comando "Miei Attrezzi" Nella sezione Campi aggiungi Testo personalizzato - Globale - Fornisce testo o link personalizzato, come Testo digita "Miei Attrezzi", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato, come Percorso del link digita "/miei-attrezzi" e come Classe del link digita "btn btn-primary"
mostra il comando "Prestiti conclusi sull'Attrezzo" Nella sezione Campi aggiungi Testo personalizzato - Globale - Fornisce testo o link personalizzato, come Testo digita "Prestiti conclusi sull'Attrezzo", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato, come Percorso del link digita "/miei-prestiti-conclusi/{{ raw_arguments.nid }}" (la sintassi di questo comando sarà spiegata nella prossima Guida) e come Classe del link digita "btn btn-primary"
allinea orizzontalmente i due comandiNella sezione Formato, in Mostra - Impostazioni attiva Campi allineati per tutte e due i Campi.

COMANDI SULL'ATTREZZO PER GLI UTENTI DIVERSI DAL PROPRIETARIO

Questa EVA mostra agli Utenti diversi dal proprietario dell'Attrezzo i comandi "Magazzino" e "Chiedi in prestito questo Attrezzo". Questa Vista è molto simile alla precedente, salvo per il Filtro (utente corrente deve essere diverso dal proprietario) e per il contenuto dei comandi:

crea la EVAvai in Struttura - Viste - Aggiungi nuova vista;  scegli il nome della Vista ("Comandi Attrezzo Non Proprietario");  in Mostra scegli contenuto di tipo "Attrezzo"; scegli di creare una Pagina e di mostrare il risultato come Elenco non formattato di campi. Nella sezione Visualizzazioni cliccare Aggiungi - EVA
Collega la EVA alla pagina dell'AttrezzoNella sezione Entity content settings, come Tipo di Entità seleziona Contenuto e come Bundle seleziona "Attrezzo"
Definisci l'identificativo dell'Attrezzo in cui la EVA verrà richiamataNella sezione Filtri contestuali aggiungi ID - Contenuto
identifica il Proprietario dell'Attrezzo, con la relazione Attrezzo → AutoreNella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto e rinomina come "proprietario"
limita la visualizzazione agli utenti diversi dal ProprietarioNella sezione Criteri del Filtro aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona no
mostra il comando "Magazzino" Nella sezione Campi aggiungi Testo personalizzato - Globale - Fornisce testo o link personalizzato, come Testo digita "Magazzino", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato, come Percorso del link digita "/magazzino" e come Classe del link digita "btn btn-primary"
mostra il comando "Chiedi ni prestito questo Attrezzo" Nella sezione Campi aggiungi Testo personalizzato - Globale - Fornisce testo o link personalizzato, come Testo digita "Chiedi in prestito questo Attrezzo", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato, come Percorso del link digita "/node/add/richiesta?attrezzo={{ raw_arguments.nid }}" (la sintassi di questo comando sarà spiegata nella prossima Guida) e come Classe del link digita "btn btn-primary"
alline orizzontalmente i due comandiNella sezione Formato, in Mostra - Impostazioni attiva Campi allineati per tutte e due i Campi.

INFORMAZIONI SULL'ATTREZZO

Di default, la pagina di una Entità mostra tutti i Campi dell'Entità stessa. Perché quindi creare una EVA per mostrarli? Per un paio di buoni motivi: 

  • la pagina dell'Entità non mostra di default il nome del Proprietario dell'Attrezzo, che è contenuto in uno dei Campi predefiniti non elencato nella pagina (Campo Autore)
  • usare una EVA al posto dell'esposizione diretta dei Campi consente di personalizzare la loro presentazione, ad esempio per affiancare al Campo Categoria dell'Attrezzo anche l'informazione sulla Categoria superiore. 

In generale, io preferisco usare una EVA per presentare i dati di una Entità anziché limitarmi a mostrarne i Campi. Per presentare in modo "allineato" etichette e valori dei Campi, può risultare utile installare ed attivare il modulo aggiuntivo "Views Flipped Table". Grazie a questo modulo possiamo costruire una Vista come tabella e poi "ruotarla" invertendo le righe con le colonne. Ad esempio se la Vista in formato tabella è così:

AttrezzoCategoriaAmbienteNotaAllegatiProprietario
LevigatriceUtensiliCasa Manuale utenteCarla.Bianchi

selezionando come Formato Flipped Table, la tabella viene mostrata così:

AttrezzoLevigatrice
CategoriaUtensile
AmbienteCasa
Nota 
AllegatiManuale Utente
ProprietarioCarla.Bianchi

Se decidi di usare anche tu una Flipped View per mostrare i dati dell'Attrezzo a tutti gli Utenti:

nascondi i Campi dell'AttrezzoIn Struttura - Tipi di contenuto - Attrezzo - Gestione visualizzazione nascondi tutti i Campi trascinandoli sotto Disattivati.
crea la EVAvai in Struttura - Viste - Aggiungi nuova vista,  scegli il nome della vista ("Dati Attrezzo");  in Mostra scegli contenuto di tipo "Attrezzo"; scegli di creare una Pagina e di mostrare il risultato come Flipped Table. Nella sezione Visualizzazioni cliccare Aggiungi - EVA
Collega la EVA alla pagina dell'AttrezzoNella sezione Entity content settings, come Tipo di Entità seleziona Contenuto e come Bundle seleziona "Attrezzo"
Definisci l'identificativo dell'Attrezzo in cui la EVA verrà richiamataNella sezione Filtri contestuali aggiungi ID - Contenuto
identifica il Proprietario dell'Attrezzo, con la relazione Attrezzo → AutoreNella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto e rinomina come "proprietario"
identifica la Categoria dell'Attrezzo, con la relazione Attrezzo → Categoriaaggiungi  Contenuto referenziato da field_categoria - Contenuto - Appare in: richiesta e rinomina come "categoria"
identifica la Categoria superiore dell'Attrezzo, con la relazione Categoria → Categoria Superiorenella sezione Relazioni aggiungi  anche Contenuto referenziato da field_categoria_superiore - Contenuto - Appare in: categoria, come Relazione seleziona "categoria"  e rinomina come "categoria superiore"
mostra le informazioni relativa all'Attrezzo, al Proprietario ed alle Categorie

nella sezione Campi mostra le informazioni 

  • sull'Attrezzo: aggiungi "titolo" cambiando Etichetta in "Attrezzo", aggiungi "Descrizione", "Immagine", "Allegati" e "Stato".
  • sul Proprietario: aggiungi "nome" (Relazione "Proprietario", Etichetta "Proprietario")
  • sulle Categorie: aggiungi "titolo" (Relazione "Categoria", Etichetta "Categoria"), aggiungi "titolo" (Relazione "Categoria superiore", Etichetta "Categoria superiore")

RICHIESTE E PRESTITI APERTI

Questa EVA mostra solo al Proprietario dell'Attrezzo l'elenco delle Richieste aperte sull'Attrezzo e l'eventuale Prestito aperto in risposta ad esse. 

crea la EVAvai in Struttura - Viste - Aggiungi nuova vista,  scegli il nome della vista ("Richieste aperte su Attrezzo");  in Mostra scegli contenuto di tipo "Richiesta"; scegli di creare una Pagina e di mostrare il risultato come Tabella. Nella sezione Visualizzazioni cliccare Aggiungi - EVA
Collega la EVA alla pagina dell'AttrezzoNella sezione Entity content settings, come Tipo di Entità seleziona Contenuto e come Bundle seleziona "Attrezzo"
identifica l'Attrezzo oggetto della Richiesta, con la relazione Richiesta→ Attrezzonella sezione Relazioni aggiungi Contenuto referenziato da field_attrezzo - Contenuto - Appare in: richiesta e rinomina come "attrezzo"
Definisci l'identificativo dell'Attrezzo in cui la EVA verrà richiamataNella sezione Filtri contestuali aggiungi ID - Contenuto e come Relazione seleziona "attrezzo"
identifica il Richiedente, con la relazione Richiedente → AutoreNella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto e rinomina come "richiedente"
identifica il Proprietario dell'Attrezzo, con  la relazione Attrezzo → AutoreNella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto, come Relazioni seleziona "attrezzo" e rinomina come "proprietario"
identifica l'eventuale Prestito attivato in risposta alla Richiesta, con la relazione Prestito → Richiesta usata in senso inversoNella sezione Relazioni aggiungi Contenuto che usa field_richiesta - Contenuto - Relate each Contenuto with a field_richiesta set to the content item e rinomina come "prestito"
limita la visualizzazione delle Richieste al ProprietarioNella sezione Criteri del Filtro aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si
limita la Vista alle sole Richieste aperte (cioè senza Prestito o con Prestito senza data di restituzione)Nella sezione Criteri del Filtro aggiungi Restituzione (field_restituzione) - Contenuto - Appare in: prestito, come Relazione seleziona "prestito" e come operatore seleziona è vuoto
mostra le informazioni relative a Richieste, Richiedente e Prestito

nella sezione Campi mostra le informazioni:

  • sulla Richiesta: aggiungi "Creato il" (Etichetta "Data"), "titolo2 (Etichetta "Richiesta")
  • sul Richiedente: aggiungi "nome" (Relazione "Richiedente", Etichetta "Richiedente")
  • sul Prestito: aggiungi "titolo" (Relazione "Prestito", Etichetta "Prestito"), "Consegna" (Relazione "Prestito", Etichetta "Consegna"), 

Non mostriamo l'Attrezzo (perché siamo già nella pagina dell'Attrezzo) né il nome del Proprietario (perché è l'Utente che sta guardando la Vista e comunque è già scritto nei Dati dell'Attrezzo). 

ordina le Richieste in ordine di data di richiestaNella sezione Criteri di ordinamento, aggiungi Creato il - Contenuto - The date and time that the content was created e seleziona ordine ascendente
Mostra istruzioni all'UtenteNella sezione Intestazione aggiungi Area di testo - Globale - Provide markup for the area using any available text format e come Contenuto digita "<h3>Richieste aperte sull'Attrezzo</h3>Clicca sulla Richiesta per vederne i dettagli ed eventualmente attivare un Prestito"

Posizionare le EVA nella pagina

Ogni EVA è come se fosse un Campo aggiuntivo dell'Entità, il cui contenuto viene ricalcolato ogni volta che si richiama la pagina. Può quindi essere posizionato a piacere nella pagina dell'Entità, come abbiamo già visto per i Campi veri e propri: 

  • In Struttura - Tipo di Contenuto - Attrezzo - Gestione visualizzazione trascina i "campi" EVA nell'ordine desiderato (es. "Dati Attrezzo" prima delle altre due) e salva.

In questa Guida vediamo come passare informazioni tra le pagine della app, in particolare come passare attraverso un link:

  • uno o più valori alla pagina di creazione di una Entità per precaricarne i Campi, esemplificato al caso della pagina di creazione di una nuova Richiesta
  • uno o più valori ad una Vista, per filtrare le Entità elencate, esemplificato al caso della pagina che elenca i Prestiti conclusi su uno specifico Attrezzo

Precaricare Campi di una Entità attraverso un link

In molte situazioni è utile precaricare attraverso un link uno o più Campi di una nuova Entità, per evitare all'Utente di selezionare nuovamente valori già noti dal contesto. Ad esempio, vogliamo che il comando "Chiedi in prestito questo Attrezzo" lanciato dalla pagina di un Attrezzo A precarichi nella nuova Richiesta il Campo "Attrezzo" con l'identificativo dell'Attrezzo A, evitando così all'Utente di dover selezionare nuovamente l'Attrezzo. Nella app di esempio questa tecnica è utile sia nella creazione di una nuova Richiesta (che eredita l'identificativo dell'Attrezzo richiesto), sia nella creazione di un nuovo Prestito (che eredita l'identificativo della Richiesta cui risponde) e sia nella creazione di un nuovo Messaggio (che eredita la Richiesta cui si riferisce).

Ciò richiede l'installazione e l'attivazione del modulo aggiuntivo Entity Prepopulate. Attivato il modulo, servono due passaggi:

  1. predisporre il Campo "Attrezzo" della Richiesta a ricevere via link il codice identificativo dell'Attrezzo
  2. costruire nella pagina dell'Attrezzo un link di creazione della Richiesta che trasmetta quell'identificativo

Predisporre il Campo ad accettare un valore via link

Per predisporre  il Campo "Attrezzo" della Richiesta a ricevere via link il codice 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] dice a Drupal di prelevare dal link ("query") della pagina corrente ("current_page") il valore associato all'argomento "attrezzo". Come sempre, non è necessario ricordare questo Token a memoria, perché è tra quelli elencati nella pagina di configurazione del Campo.

Costruire il link che trasmette il valore

Per costruire nella pagina dell'Attrezzo un link di creazione della Richiesta che trasmetta quell'identificativo procediamo (come già visto in una Guida precedente) ad aggiungere alla pagina dell'Attrezzo il comando "Chiedi in prestito questo Attrezzo" cui far corrispondere il link

/node/add/richiesta?attrezzo={{ raw_arguments.nid }}

dove il Token {{ raw_arguments.nid }} contiene l'identificativo dell'Attrezzo.

Se dovessimo passare alla pagina di inserimento di una Entità due o più valori destinati ad altrettanti Campi, il link diventerebbe:

/node/add/richiesta?argomento1=valore1&argomento2=valore2&argomento3=valore3

dove Il carattere ? inizia l'elenco delle coppie argomento/valore, il carattere = associa l'argomento al suo valore ed il carattere & separa le diverse coppie tra loro

Filtrare una Vista attraverso il link: i Filtri contestuali

Un altro caso molto frequente nella costruzione di una app è filtrare l'elenco delle Entità di una Vista con valori scritti nel link di richiamo della Vista. 

Ad ognuno dei valori scritti nel link deve corrispondere un Filtro contestuale, cioè un Filtro scritto nella sezione Filtri contestuali della Vista. Mentre un Filtro scritto nella sezione Criteri del Filtro prende il valore di confronto dalla configurazione stessa della Vista (Filtro "nascosto") o lo chiede all'Utente (Filtro esposto), un Filtro contestuale prende il valore dal link con cui viene richiamata la Vista. I valori devono essere scritti nel link nel medesimo ordine con cui i corrispondenti Filtri sono elencati nella sezione Filtri contestuali.

Applichiamo questo metodo al caso della Vista "Miei Prestiti conclusi" che, nella app di esempio, viene utilizzata due volte: 

  • richiamata dal Cruscotto col link /miei-prestiti-conclusi, elenca tutti i Prestiti conclusi dell'Utente corrente
  • richiamata dalla pagina di un Attrezzo col link /miei-prestiti-conclusi/{{ raw_arguments.nid }} dove il Token {{ raw_arguments.nid }} contiene l'identificativo dell'Attrezzo, elenca i Prestiti conclusi su quell'Attrezzo. 

La Vista è la medesima in entrambi i casi, ma nel secondo caso riceve come Filtro contestuale l'identificativo dell'Attrezzo (vedi passaggio in grassetto):

crea la Vista "Miei Prestiti conclusi"Vai in Struttura - Viste - Aggiungi nuova vista  e scegli il nome della vista ("Miei Prestiti Conclusi"); in Mostra scegli contenuto di tipo "Prestito"; scegli di creare una Pagina e di mostrare il risultato come Tabella
imposta il link di richiamo della VistaNella sezione Impostazione pagina come Percorso digita "miei-prestiti-conclusi"
identifica la Richiesta cui il Prestito risponde (Prestito → Richiesta)Nella sezione Relazioni aggiungi Contenuto referenziato da field_richiesta - Contenuto - Appare in: prestito e rinomina come "richiesta"
identifica il Richiedente (Richiesta → Autore)Nella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto, come Relazione seleziona "richiesta" e rinomina come "richiedente"
identifica l'Attrezzo prestato (Richiesta → Attrezzo)Nella sezione Relazioni aggiungi Contenuto referenziato da field_attrezzo - Contenuto - Appare in: richiesta, come Relazione seleziona "richiesta" e rinomina come "attrezzo"
identifica il Proprietario dell'Attrezzo (Attrezzo → Autore)Nella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto, come Relazione seleziona "attrezzo" e rinomina come "proprietario"
limita la Vista ai soli Prestiti su un Attrezzo, se specificato nel link di richiamo della VistaNella sezione Filtri contestuali aggiungi ID - Contenuto e come Relazione seleziona "attrezzo"; come Quando il valore del filtro NON è nell'URL seleziona Mostra tutti i risultati per il campo specifico
limita la Vista ai soli Prestiti conclusiNella sezione Criteri del filtro aggiungi Restituzione (field_restituzione) - Contenuto - Appare in: prestito. e come operatore seleziona non è vuoto
limita la Vista ai soli Prestiti effettuati dal Proprietario dell'AttrezzoNella sezione Criteri del filtro aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si
mostra le informazioni relative a Prestiti, Richieste, Attrezzi e Richiedenti

Nella sezione Campi mostra le informazioni relative 

  • alla Richiesta: aggiungi "Creato il" (relazione "Richiesta" etichetta "Data"), "titolo" (relazione "Richiesta" etichetta "Richiesta"), "voto" (relazione "Richiesta" etichetta "VotoR")
  • all'Attrezzo: aggiungi "titolo" (etichetta "Attrezzo" e relazione "Attrezzo")
  • al Richiedente: aggiungi "nome" (relazione "Richiedente" etichetta "Richiedente")
  • al Prestito: aggiungi "titolo" (cambia Etichetta in "Prestito"), "Consegna", "Restituzione" e "Voto" (etichetta "VotoP")
esponi la ricerca nella VistaNella sezione Criteri del filtro aggiungi Combina filtri dei campi, attiva Esponi questo filtro, come operatore seleziona Contiene ogni parola, in Scegli i campi da combinare per il filtraggio seleziona tutti i Campi elencati

Se una Vista prevede più di un Filtro contestuale, i corrispondenti valori devono essere passati col link:

/pagina_della_vista/argomento1/argomento2/argomento3

dove il carattere / separa il percorso della Vista dagli argomenti e gli argomenti tra loro.

In questa Guida proseguiamo la costruzione della app di esempio, concentrandoci per motivi didattici sulla pagina "Richiesta" che mostra le informazioni relativa ad una Richiesta, all'eventuale Prestito attivato in risposta ad essa ed i Messaggi scambiati tra Richiedente e Proprietario dell'Attrezzo. Con le stesse tecniche qui spiegate potremo proteggere anche la pagina "Messaggio" e la pagina "Prestito". Queste pagine hanno in comune il fatto che devono mostrare i loro contenuti sia al Richiedente sia al Proprietario, escludendo però tutti gli altri Utenti.

Usare le Viste per proteggere le informazioni

Rinviando ad una futura Guida soluzioni più sofisticate per la protezione delle informazioni, per gli scopi della app di esempio nelle pagine Richiesta, Messaggio e Prestito è sufficiente: 

  1. nascondere tutti i Campi a tutti gli Utenti e
  2. mostrarli solo al Richiedente ed al Proprietario, grazie a Viste EVA.

Come abbiamo già visto, per nascondere i Campi della Richiesta a tutti gli Utenti: 

  • vai in Struttura - Tipi di contenuto - Richiesta - Gestione visualizzazione
  • trascina tutti i Campi sotto Disattivati.  
  • Salva

Dopo questa operazione, qualunque Utente acceda alla pagina di una qualunque Richiesta ne vedrà solo il titolo, che di per sé non "svela" nulla sul contenuto della Richiesta.

La pagina "Richiesta" è formata da un insieme di EVA, che restituiscono queste informazioni ai diversi Utenti:

Pagina della Richiesta
Se l'Utente è il Proprietario dell'Attrezzo richiestoSe l'Utente è il Richiedente l'AttrezzoSe è un altro Utente
Comandi "Cruscotto" e "Presta l'Attrezzo" (EVA Comandi Richiesta per Proprietario)Comando "Cruscotto" (EVA Comandi Richiesta per Richiedente")(nulla)
Informazioni su Richiesta e Prestito (EVA Dati Richiesta)
Messaggi scambiati tra Richiedente e Proprietario sulla Richiesta (EVA Messaggi Richiesta)

Comando "Scrivi Messaggio" (EVA Comandi Messaggi Richiesta)

COMANDI RICHIESTA PER PROPRIETARIO

La EVA "Comandi Richiesta Proprietario", che mostra al Proprietario i comandi "Cruscotto" e "Presta l'Attrezzo" è facilmente costruibile con le tecniche che abbiamo già visto nelle Guide precedenti:

crea la EVAvai in Struttura - Viste - Aggiungi nuova vista;  scegli il nome della Vista ("Comandi Richiesta Proprietario");  in Mostra scegli contenuto di tipo "Richiesta"; scegli di creare una Pagina e di mostrare il risultato come Elenco non formattato di campi. Nella sezione Visualizzazioni cliccare Aggiungi - EVA
aggancia la EVA alla pagina della RichiestaNella sezione Entity content settings, come Tipo di Entità seleziona Contenuto e come Bundle seleziona "Richiesta"
passa alla EVA l'identificativo della RichiestaNella sezione Filtri contestuali aggiungi ID - Contenuto
identifica l'Attrezzo richiesto, con la relazione Richiesta → AttrezzoNella sezione Relazioni  aggiungi  Contenuto referenziato da field_attrezzo- Contenuto - Appare in: richiesta e rinomina come "attrezzo"
identifica il Proprietario dell'Attrezzo, con la relazione Attrezzo → AutoreNella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto, come Relazione seleziona "attrezzo" e rinomina come "proprietario"
identifica l'eventuale Prestito effettuato sulla Richiesta, con la relazione Prestito → Richiesta,  usata in senso inversoNella sezione Relazioni aggiungi Contenuto che usa field_richiesta - Contenuto - Relate each Contenuto with a field_richiesta set to the content item e rinomina come "prestito"
limita la visualizzazione del comando al ProprietarioNella sezione Criteri del Filtro aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si
mostra il comando "Presta questo attrezzo" Nella sezione Campi aggiungi Testo personalizzato - Globale - Fornisce testo o link personalizzato, come Testo digita "Presta questo Attrezzo", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato, come Percorso del link digita "/node/add/prestito?richiesta={{ raw_arguments.nid }}" e come Classe del link digita "btn btn-primary"
mostra il comando "Cruscotto" Nella sezione Campi aggiungi Testo personalizzato - Globale - Fornisce testo o link personalizzato, come Testo digita "Cruscotto", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato, come Percorso del link digita "/cruscotto" e come Classe del link digita "btn btn-primary"

Così costruita, questa Vista mostra il comando "Presta questo Attrezzo" anche se sulla Richiesta è già stato aperto un Prestito. Per motivi didattici, sistemeremo questo aspetto nella prossima Guida.

COMANDI RICHIESTA PER RICHIEDENTE

Questa Vista è costruibile come variazione della precedente, eliminando il comando "Presta questo Attrezzo" e filtrando per Richiedente e non per Proprietario.

Combinazioni di Filtri

EVA DATI RICHIESTA

La EVA "Dati Richiesta" che mostra i dati della Richiesta come Flipped  Table è facilmente costruibile in analogia alla EVA "Dati Attrezzo" che abbiamo già visto. Rispetto alle Viste fin qui esaminate, presenta però una complicazione, perché deve essere vista sia dal Richiedente sia dal Proprietario e solo da loro

Se ci limitassimo ad aggiungere alla EVA un Filtro che la limita al Richiedente ed un Filtro che la limita al Proprietario, in realtà nessuno vedrebbe la EVA, perché i Filtri sono per default considerati in AND logico tra loro, cioè solo ad un Utente che sia contemporaneamente Richiedente e Proprietario. Ma nella nostra app il Richiedente non coincide mai col Proprietario, quindi questa Vista non verrebbe mostrata a nessuno.

Perché la EVA sia mostrata sia al Richiedente sia al Proprietario escludendo tutti gli altri Utenti, i Filtri su Richiedente e Proprietario devono essere in OR logico tra loro, in modo che le informazioni siano mostrate se almeno uno dei due Filtri è soddisfatto. 

Cosa significano Filtri in AND e OR tra loro?

Dati due Filtri A e B, la combinazione A AND B è soddisfatta solo se entrambi sono soddisfatti. Quindi:

  • A non soddisfatto, B non soddisfatto: A AND B non soddisfatto
  • A non soddisfatto, B soddisfatto: A AND B non soddisfatto
  • A soddisfatto, B non soddisfatto: A AND B non soddisfatto
  • A soddisfatto, B soddisfatto: A AND B soddisfatto

Nel nostro esempio, la combinazione "Proprietario=si" AND "Richiedente=si" non è mai soddisfatta, perché non c'è nessun Utente che sia contemporaneamente Proprietario e Richiedente.

La combinazione A OR B è soddisfatta se almeno uno dei Filtri è soddisfatto. Quindi:

  • A non soddisfatto, B non soddisfatto: A OR B non soddisfatto
  • A non soddisfatto, B soddisfatto: A OR B soddisfatto
  • A soddisfatto, B non soddisfatto: A OR B soddisfatto
  • A soddisfatto, B soddisfatto: A OR B soddisfatto

Nel nostro esempio, la combinazione "Proprietario=si" OR "Richiedente=si" è soddisfatta se l'Utente è il Proprietario oppure se l'Utente è il Richiedente. Non è soddisfatta per tutti gli Utenti che non sono né il Proprietario né il Richiedente. Ed è proprio questo l'effetto desiderato.

Ecco come mettere due Filtri in OR tra loro nella sezione Criteri del Filtro:

  • aggiungi il Filtro "Proprietario=si" sull'Utente corrente
  • aggiungi il Filtro "Richiedente=si" sull'Utente corrente
  • clicca And/Or Arrange
  • clicca Crea un nuovo gruppo di filtri
  • per il nuovo gruppo di filtri seleziona come operatore O (=OR)
  • trascina i due Filtri nel nuovo gruppo
  • clicca Applica. Controlla che i due Filtri siano raggruppati a parte, in OR tra loro ed in AND con gli altri Filtri:

Chiarito questo aspetto, la costruzione della EVA "Dati Richiesta" segue le modalità già viste per la pagina dell'Attrezzo:

crea la EVAvai in Struttura - Viste - Aggiungi nuova vista;  scegli il nome della Vista ("Dati Richiesta");  in Mostra scegli contenuto di tipo "Richiesta"; scegli di creare una Pagina e di mostrare il risultato come Flipped Table.. Nella sezione Visualizzazioni cliccare Aggiungi - EVA
aggancia la EVA alla pagina della RichiestaNella sezione Entity content settings, come Tipo di Entità seleziona Contenuto e come Bundle seleziona "Richiesta"
passa alla EVA l'identificativo della RichiestaNella sezione Filtri contestuali aggiungi ID - Contenuto
identifica il Richiedente dell'Attrezzo, con la relazione Richiesta → Autoreidentifica il Richiedente dell'Attrezzo, con la relazione Richiesta → Autore
identifica l'Attrezzo richiesto, con la relazione Richiesta → AttrezzoNella sezione Relazioni  aggiungi  Contenuto referenziato da field_attrezzo- Contenuto - Appare in: richiesta e rinomina come "attrezzo"
identifica il Proprietario dell'Attrezzo, con la relazione Attrezzo → AutoreNella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto, come Relazione seleziona "attrezzo" e rinomina come "proprietario"
identifica l'eventuale Prestito effettuato sulla Richiesta, con la relazione Prestito → Richiesta,  usata in senso inversoNella sezione Relazioni aggiungi Contenuto che usa field_richiesta - Contenuto - Relate each Contenuto with a field_richiesta set to the content item e rinomina come "prestito"
limita la visualizzazione dei dati al Proprietario ed al RichiedenteNella sezione Criteri del Filtro aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si; aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "richiedente", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si. Metti in OR tra loro questi due Filtri, come spiegato sopra.
mostra le informazioni relative a Richiesta ed eventuale Prestito 

Nella sezione Campi aggiungi le informazioni relative 

  • alla Richiesta: "titolo" (etichetta "Richiesta"), "Creato il" (etichetta "Data"), "voto", "Valutazione"
  • al Richiedente: "nome" (relazione "Richiedente", etichetta "Richiedente").
  • all'Attrezzo: "titolo" (relazione "Attrezzo", etichetta "Attrezzo").
  • al Proprietario: "nome" (relazione "Proprietario", etichetta "Proprietario"),
  • al Prestito: "titolo" (relazione "Prestito", etichetta "Prestito"), "Consegna" (relazione "Prestito"), "Restituzione" (relazione "Prestito"), "voto" (relazione "Prestito"), "Valutazione" (relazione "Prestito")

MESSAGGI RICHIESTA

Questa Vista mostra i Messaggi scambiati tra Proprietario e Richiedente su una Richiesta. Applichiamo anche a questa Vista i due Filtri in OR tra loro, perché i Messaggi devono essere mostrati sia al Proprietario sia al Richiedente e nascosti a tutti gli altri Utenti.

APPROFONDIMENTO: Per la discussione tra Utenti, solitamente in Drupal si utilizzano i Commenti. I Commenti sono Entità associate ad una Entità oggetto della discussione. Nel nostro caso, per consentire a Proprietario e Richiedente di discutere i dettagli relativi ad una Richiesta, basterebbe aggiungere al Tipo di Contenuto "Richiesta" un Campo di tipo "Commento" e magicamente nella pagina di ogni Richiesta apparirebbero i comandi per aggiungervi un commento, rispondere ad un commento precedente e l'elenco dei commenti finora arrivati.

Nella app di esempio non sfruttiamo questa soluzione, perché qualunque Utente che vede la Richiesta potrebbe anche pubblicarvi Commenti, mentre noi vogliamo che la discussione sia riservata al Proprietario ed al Richiedente.  E fin qui non abbiamo attivato meccanismi di protezione avanzata delle Entità, ma ci siamo limitati per semplicità a nascondere agli Utenti diversi dal Proprietario e dal Richiedente i Campi della Richiesta, ma non la Richiesta in sé.

Poiché la discussione tra Proprietario e Richiedente è breve e semplice, riguardando presumibilmente solo i dettagli sul periodo di prestito e sulle modalità di consegna e restituzione, possiamo realizzarla con un Tipo di Contenuto "Messaggio", anch'esso protetto da sguardi altrui con lo stesso metodo usato per Richiesta e Prestito.   

 Ecco come costruire la Vista:

crea la EVAvai in Struttura - Viste - Aggiungi nuova vista;  scegli il nome della Vista ("Messaggi Richiesta");  in Mostra scegli contenuto di tipo "Messaggio"; scegli di creare una Pagina e di mostrare il risultato come Elenco non formattato di campi. Nella sezione Visualizzazioni cliccare Aggiungi - EVA
aggancia la EVA alla pagina della RichiestaNella sezione Entity content settings, come Tipo di Entità seleziona Contenuto e come Bundle seleziona "Richiesta"
passa alla EVA l'identificativo della RichiestaNella sezione Filtri contestuali aggiungi ID - Contenuto
identifica il Richiedente dell'Attrezzo, con la relazione Richiesta → Autoreidentifica il Richiedente dell'Attrezzo, con la relazione Richiesta → Autore
identifica l'Attrezzo richiesto, con la relazione Richiesta → AttrezzoNella sezione Relazioni  aggiungi  Contenuto referenziato da field_attrezzo- Contenuto - Appare in: richiesta e rinomina come "attrezzo"
identifica il Proprietario dell'Attrezzo, con la relazione Attrezzo → AutoreNella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto, come Relazione seleziona "attrezzo" e rinomina come "proprietario"
limita la visualizzazione dei Messaggi al Proprietario ed al RichiedenteNella sezione Criteri del Filtro aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si; aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "richiedente", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si. Metti in OR tra loro questi due Filtri, come spiegato sopra.
mostra per ogni Messaggio il nome del mittente, la data e ora dell'invio, il testo e gli eventuali allegatiNella sezione Campi aggiungi Utente - Contenuto - Nome utente dell'autore del contenuto. Aggiungi Creato il. Testo e Allegati.  
ordina i Messaggi per data e oraNella sezione Criteri di ordinamento aggiungi Creato il e seleziona l'ordinamento ascendente.

COMANDI MESSAGGI RICHIESTA

Questa Vista mostra nella pagina della Richiesta il comando "Scrivi Messaggio" solo al Proprietario ed al Richiedente. Questo comando non può essere aggiunto come un link nella sezione Piè di pagina della EVA "Messaggi Richiesta" perché, dovendo essere mostrato anche in assenza di Messaggi, verrebbe mostrato anche a Utenti diversi dal Proprietario e dal Richiedente.  Questa EVA può essere facilmente costruita con le tecniche già viste:

predisponi il nuovo Messaggio a ricevere l'identificativo della Richiesta dal comandovai in Struttura - Tipi di contenuto - Messaggio - Gestisci Campi - Richiesta - Modifica. Nella sezione Entity Prepopulate scrivi il Token [current-page:query:richiesta]
crea la EVAvai in Struttura - Viste - Aggiungi nuova vista;  scegli il nome della Vista ("Comandi Messaggi Richiesta");  in Mostra scegli contenuto di tipo "Richiesta"; scegli di creare una Pagina e di mostrare il risultato come Elenco non formattato di campi. Nella sezione Visualizzazioni cliccare Aggiungi - EVA
aggancia la EVA alla pagina della RichiestaNella sezione Entity content settings, come Tipo di Entità seleziona Contenuto e come Bundle seleziona "Richiesta"
passa alla EVA l'identificativo della RichiestaNella sezione Filtri contestuali aggiungi ID - Contenuto
identifica il Richiedente dell'Attrezzo, con la relazione Richiesta → Autoreidentifica il Richiedente dell'Attrezzo, con la relazione Richiesta → Autore
identifica l'Attrezzo richiesto, con la relazione Richiesta → AttrezzoNella sezione Relazioni  aggiungi  Contenuto referenziato da field_attrezzo- Contenuto - Appare in: richiesta e rinomina come "attrezzo"
identifica il Proprietario dell'Attrezzo, con la relazione Attrezzo → AutoreNella sezione Relazioni aggiungi Utente - Contenuto- Nome utente dell'autore del contenuto, come Relazione seleziona "attrezzo" e rinomina come "proprietario"
limita la visualizzazione dei Messaggi al Proprietario ed al RichiedenteNella sezione Criteri del Filtro aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "proprietario", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si; aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come Relazione seleziona "richiedente", come operatore seleziona è uguale a e come è l'utente autenticato seleziona si. Metti in OR tra loro questi due Filtri, come spiegato sopra.
mostra il comando "Scrivi Messaggio"Nella sezione Campi aggiungi Testo personalizzato - Globale - Fornisce testo o link personalizzato, come Testo digita "Scrivi Messaggio", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato, come Percorso del link digita "/node/add/messaggio?richiesta={{ raw_arguments.nid }}" e come Classe del link digita "btn btn-primary"

Per completare la gestione dei Messaggi, è necessario proteggere la pagina del Messaggio dallo sguardo di Utenti diversi dal Proprietario e dal Richiedente, così come abbiamo già fatto per la pagina della Richiesta:

Nascondi i Campi del Messaggio a tutti gli UtentiIn Struttura - Tipi di contenuto - Messaggio - Visualizzazione sposta tutti i Campi sotto Nascosto
Mostra i Campi ai soli Proprietario e RichiedenteCrea una EVA 'Dati Messaggio" che mostra come Flipped Table i campi del Messaggio col filtro in OR su Proprietario e Richiedente. Il Campo "Richiesta" del Messaggio consente di tornare alla Richiesta.

Analogamente proteggeremo la pagina del Prestito:

Nascondi i Campi del Prestito a tutti gli UtentiIn Struttura - Tipi di contenuto - Prestito - Visualizzazione sposta tutti i Campi sotto Nascosto
Mostra i Campi ai soli Proprietario e RichiedenteCrea una EVA 'Dati Prestito" che mostra come Flipped Table i campi del Prestito col filtro in OR su Proprietario e Richiedente. i Campi "Richiesta" e "Attrezzo" consentono di uscire dalla pagina. Nella sezione Intestazione della Vista aggiungiamo anche il comando "Cruscotto". 

da scrivere

Campi condizionati

Oltre ai Filtri (esposti, nascosti, contestuali) illustrati nelle Guide precedenti, esistono altri metodi in Drupal per alterare il risultato mostrato da una Vista. In particolare, in questa Guida vediamo come modificare la visualizzazione dei Campi di una Vista in base al valore degli altri Campi, grazie ai Campi "condizionati". Mentre i Filtri intervengono sulle "righe" della Vista selezionando quali Entità mostrare, i Campi condizionati intervengono sulle "colonne" della Vista, selezionando quali dati mostrare di ogni singola Entità in base al valore di altri Campi dell'Entità stessa. 

Per utilizzare i Campi condizionati è necessario installare ed attivare il modulo aggiuntivo "Views Conditional", che aggiunge il nuovo tipo di Campo Views Conditional - Viste - Output data based off of certain criteria .

Quando si aggiunge un Campo condizionato nella sezione Campi della Vista, devi configurarne i seguenti parametri:

if this fieldSeleziona il Campo "condizionante" il cui valore stabilisce cosa mostrare nel Campo condizionato. Sono selezionabili tutti i Campi che precedono il Campo condizionato nell'elenco dei Campi, es. il Campo "Prezzo", che contiene il prezzo di una Entità.
Is...Seleziona l'Operatore da applicare al valore del Campo condizionante: "vuoto", "non vuoto", "maggiore di", "inizia per" ecc. 
This valueDigita il Valore da confrontare col valore del Campo condizionante.  Puoi digitare un valore fisso (es. "1000") oppure un Token corrispondente ad uno dei Campi che precedono il Campo condizionato. I Token disponibili sono elencati sotto Replacement Variables
Then output this

Digita il valore assegnato al Campo condizionato se la condizione formata dal valore del Campo condizionante + Operatore + valore da confrontare è VERA

Es. se il Campo "Prezzo" ha valore "2000", Operatore è "maggiore di" e il valore da confrontare è "1000", nel Campo condizionato appare è il valore scritto nel parametro Then output this , es. "prezzo elevato". 

In questo parametro puoi anche digitare un mix di valori fissi e Token, es. "prezzo elevato, pari a {{ field_prezzo }}", che verrà mostrato come "prezzo elevato, pari a 2000".

Otherwise output thisDigita il valore assegnato al Campo condizionato se la condizione formata dal valore del Campo condizionante + Operatore + valore da confrontare è FALSA, es. "prezzo nella norma". 

Il risultato di un Campo condizionato così impostato è il seguente:

Campo "Fornitore"Campo "Prezzo"(nascosto)Campo "Valutazione" condizionato
Rossi Srl1200Prezzo elevato, pari a 1200 euro
Bianchi & Figli960Prezzo nella norma, pari a 960

Esempio di utilizzo 

Nella Guida precedente avevamo costruito la Vista EVA "Comandi Richiesta Proprietario" che mostra al solo Proprietario dell'Attrezzo nella pagina della Richiesta i comandi "Cruscotto" e "Presta questo Attrezzo". Avevamo lasciato in sospeso il problema di non mostrare il comando "Presta questo Attrezzo" se esiste già un Prestito associato alla Richiesta. Il problema poteva essere risolto spezzando la Vista in due: una Vista che mostra il comando "Miei Attrezzi", filtrata solo sul Proprietario, ed una Vista che mostra il comando "Presta questo Attrezzo", filtrata sul Proprietario e sulla inesistenza del Prestito associato alla Richiesta. 

Per evitare di avere due Viste, coi conseguenti problemi di allineamento visivo tra i due comandi e per motivi didattici, vediamo come risolvere il problema con una sola Vista, usando i Campi condizionati. Ecco come modificare la sezione Campi della Vista "Comandi Richiesta Proprietario":

Aidentifica l'eventuale Prestito associato alla Richiesta e nascondiloNella sezione Campi aggiungi Titolo - Contenuto, come Relazione seleziona "Prestito" ed attiva Escludi dalla visualizzazione. Il contenuto di questo Campo è disponibile nel Token {{ title }}
Bpredisponi il comando "Presta questo Attrezzo" e nascondiloNella sezione Campi aggiungi Testo personalizzato - Globale - Fornisce testo o link personalizzato, come Testo digita "Presta questo Attrezzo", in Risultati di riscrittura attiva Mostra questo campo come un collegamento personalizzato, come Percorso del link digita "/node/add/prestito?richiesta={{ raw_arguments.nid }}" e come Classe del link digita "btn btn-primary". Attiva Escludi dalla visualizzazione. Il contenuto di questo Campo è disponibile nel Token {{ nothing }}
Cse il Prestito non esiste mostra il comando "Presta questo Attrezzo"

Nella sezione Campi aggiungi  Views Conditional - Viste - Output data based off of certain criteria

Se il titolo del Prestito (contenuto nel Campo A) è vuoto e quindi il Prestito non è stato ancora concesso, mostra il comando "Presta questo attrezzo", contenuto nel Campo B e messo a disposizione dal Token {{ nothing }}. Se invece il titolo del Prestito non è vuoto e quindi il Prestito è stato concesso, non mostrare nulla. Ecco come si traduce nella configurazione del Campo C condizionato: 

Come if this field seleziona (Prestito) Contenuto - Titolo. Come Is seleziona Empty. Come This value non scrivere nulla. Come Then output this digita {{ nothing }}. Come Otherwise output this non digitare nulla

Concatenazione di Campi condizionati

Per gestire casi più complessi, è possibile concatenare più Campi condizionati. Poiché un Campo condizionato è trattato da Drupal esattamente come i Campi "nativi" delle Entità gestite nella Vista, anche al Campo condizionato corrisponde un Token di nome {{ views_conditional_field }}, che può essere utilizzato come parametro nella impostazione di un secondo Campo condizionato, il cui valore dipenderà quindi dal valore del primo Campo condizionato.  La concatenazione può estendersi a tre o più Campi condizionati, il cui Token sarà {{ views_conditional_field }}, {{ views_conditional_field_1 }}, {{ views_conditional_field_2 }} ecc.

Se nella app hai bisogno di svolgere calcoli basati sui valori dei Campi delle Entità, puoi farlo con le Viste. Distinguiamo due casi diversi:

 EsigenzaEsempio
ACalcolare un valore da attribuire ad una Entità, partendo da valori contenuti nel Campi dell'Entità (o nei Campi di Entità in relazione con l'Entità) e mostrarlo nella Vista a fianco dell'EntitàCalcolare il prezzo di una cassetta di frutta venduta a peso, moltiplicando il prezzo al kg del tipo di frutta per il peso della cassetta.  
BCalcolare un valore partendo dall'insieme dei valori di un Campo delle Entità elencate nella Vista e mostrarlo in fondo alla VistaCalcolare la media dei prezzi degli oggetti elencati

A. Campi calcolati in base ad altri Campi

La prima esigenza sopra indicata può essere risolta installando ed attivando il modulo aggiuntivo "Views Simple Math Field" che aggiunge alle Viste il Campo Simple Math Field -  Globale - Views field that performs simple math expressions. Nella configurazione di questo 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. 

Riprendendo l'esempio sopra citato, data l'Entità "Cassetta" con un Campo "Peso", che contiene il peso in kg della cassetta ed un Campo "Tipo di Frutta", che punta ad una Entità di tipo "Frutta" che ha un Campo "Prezzo al kg", se si elencano nella Vista i Campi "Peso" e "(Tipo d Frutta) Prezzo al kg", possiamo aggiungere un Campo di tipo Simple Math in cui scrivere la formula Peso * Prezzo_al_kg e che quindi restituisce il Prezzo della cassetta.

Come esempio didattico, aggiungiamo alla Vista "Miei Prestiti conclusi" della app di esempio un Campo che indichi la durata in giorni di ogni Prestito effettuato, calcolato come differenza tra la data di consegna dell'Attrezzo al Richiedente e la data di restituzione dell'Attrezzo al Proprietario. Con l'occasione, vediamo anche un metodo per calcolare la differenza in giorni tra due date:

aggiungi alla Vista "Miei Prestiti conclusi" il Campo "Consegna" in un formato utile al calcolonella sezione Campi della Vista esiste già un Campo "Consegna", mostrato all'Utente nel formato leggibile "giorno mese anno". Questo formato però non è adatto per calcolare la differenza tra date. Aggiungi quindi nella sezione Campi una seconda copia del Campo "Consegna", come Formattatore seleziona Personalizzato e come Formato data/ora digita "U": questo formato rappresenta la data come numero di secondi passati da una data fissa (1 gennaio 1970; per una spiegazione di questo riferimento temporale vedi Tempo (Unix) su Wikipedia). L'elenco completo dei formati possibili per le date è nella apposita pagina del Manuale PHP . Nascondi il Campo, perché non serve all'Utente ma al calcolo della durata.
aggiungi alla Vista il Campo "Restituzione" nello stesso formatonella sezione Campi esiste già un Campo "Restituzione", mostrato all'Utente nel formato leggibile "giorno mese anno". Per lo stesso motivo sopra spiegato, nella sezione Campi aggiungi una seconda copia del Campo "Restituzione", come Formattatore selezione Personalizzato e come Formato data/ora digita "U". Nascondi il Campo. 
aggiungi alla Vista un Campo di tipo Simple Mathnella sezione Campi della Vista aggiungi il Campo Simple Math Field -  Globale - Views field that performs simple math expressions e come Etichetta digita "Durata"
predisponi il Campo ad usare i valori dei Campi "Consegna" e "Restituzione" per il calcolonell'elenco Select the fields to use in the formula della configurazione del Campo, seleziona i Campi "Consegna" e "Restituzione". A questi Campi corrispondono i Token (anch'essi elencati) "@field_restituzione_1" e  "@field_consegna_1" (il _1 in fondo al nome del Token è dovuto al fatto che la Vista conteneva già un Campo "Consegna" ed un Campo "Restituzione").
scrivi nel Campo la formula che calcola la differenza in giorni

Come Formula del Campo digita:

(@field_restituzione_1 - @field_consegna_1) / 86400 +1

La formula è piuttosto intuitiva: dentro la parentesi viene calcolata la differenza in secondi tra la data di restituzione e la data di consegna; il risultato viene poi diviso per il numero di secondi di un giorno, per tradurre i secondi in giorni. Alla differenza in giorni così calcolata, si aggiunge 1 per evitare di mostrare 0 nel caso di un prestito che inizi e finisca nel medesimo giorno. 

Attiva l'opzione Arrotonda scegliendo zero numeri dopo la virgola, per mostrare un numero intero di giorni.

 

ATTENZIONE:  Se nella Formula si utilizza un Token presente in Select the fields to use in the formula ma non selezionato, la Vista può andare in errore. Per rimediare, basta tornare nell'editor della Vista ed attivare il flag a fianco del Token.

Poiché un Campo di tipo Simple Math è trattato come un qualunque altro Campo, anche ad esso corrisponde un Token  - di nome {{ field_views_simple_math_field }} - che ne contiene il valore calcolato e che può essere a sua volta usato nei Campi successivi.

Il valore calcolato in un Campo Simple Math è mostrato all'Utente, ma non viene salvato nella Entità, quindi è disponibile solo dentro la Vista. Se invece si vuole salvare in un Campo dell'Entità un valore calcolato in base agli altri Campi dell'Entità stessa ci sono due modi, che richiedono altri moduli aggiuntivi:

  • aggiungere all'Entità un Campo di tipo Computed, messo a disposizione dal modulo "Computed Field", che però richiede di programmare in PHP e che quindi non viene esaminato da MieApp.
  • disegnare col modulo "ECA" una procedura che, al salvataggio di una Entità, esegue il calcolo usando i Campi dell'Entità stessa e scrive il risultato in un ulteriore Campo dell'Entità. Questo metodo evita di dover programmare in PHP e sarà spiegato nella sezione Automazioni di MieApp  

B. Aggregare valori di un Campo delle Entità elencate 

Se invece si vuole calcolare un valore sulla base dei valori di un Campo delle Entità elencate nella Vista - ad esempio il prezzo medio delle cassette di frutta - , occorre installare e attivare il modulo aggiuntivo "Views Aggregator Plus". 

Questo potente modulo consente di modificare in modo significativo una Vista: In questo primo esempio ci limitiamo a sfruttarne la capacità di aggiungere in fondo alla Vista "Miei Prestiti Conclusi" sopra descritta la media della durata dei Prestiti effettuati: 

attiva l'aggregazionenella sezione Formato della Vista seleziona Table with aggregation options
attiva sul Campo "Durata" il calcolo della medianella sezione Formato della Vista, sotto Impostazioni identifica il Campo Durata, attiva Apply column function e seleziona Median

Nelle Guide precedenti abbiamo visto come assemblare una o più Viste (di tipo EVA) nella pagina di una Entità. Vediamo ora invece come assemblare più Viste dentro una semplice pagina di testo o dentro una Vista principale. Esemplifichiamo entrambi i metodi per costruire il Cruscotto della nostra app di esempio

Il Cruscotto

La nostra app di esempio prevede una pagina "Cruscotto" che mostra all'Utente le informazioni ed i comandi essenziali per agire sia come Richiedente sia come Proprietario:

Informazioni e comandi per l'utenteCosa mostra il CruscottoFornito dalla Vista
in generaleIl nome dell'Utente, come link che porta al suo profilo, ad esempio per cambiare la passwordcomando_mio_profilo
"Ultimi Messaggi pervenuti": elenco degli ultimi Messaggi inviati all'Utente da altri Utenti, relativamente a sue Richieste o a Richieste altrui sui suoi Attrezziultimi_messaggi_pervenuti
come Richiedente di Attrezzi altrui"Mie Richieste aperte": elenco delle Richieste aperte dall'Utente, con l'eventuale Prestito attivatomie_richieste_aperte
Comando "Mie Richieste concluse" che porta all'elenco delle Richieste dell'Utente ormai concluse
Comando "Magazzino" che porta al Magazzino, in cui cercare Attrezzi da chiedere in prestito
"Mie Richieste concluse ancora da valutare": elenco delle Richieste dell'Utente concluse ma in cui manca la sua valutazione

mie_richieste_concluse 

(visualizzazione: da_valutare)

come Proprietario di Attrezzi "Richieste e Prestiti aperti sui miei Attrezzi": elenco delle Richieste sugli Attrezzi dell'Utente non ancora conclusemiei_prestiti_aperti
Comando "Miei Prestiti conclusi" che porta all'elenco delle Richieste sugli Attrezzi dell'Utente ormai concluse
Comando "Miei Attrezzi" che porta all'elenco degli Attrezzi dell'Utente ed al comando per aggiungerne di nuovi
"Miei Prestiti conclusi ancora da valutare": elenco dei Prestiti dell'Utente conclusi ma in cui manca la sua valutazione

miei_prestiti_conclusi 

(visualizzazione: da_valutare)

Le Viste qui sopra elencate sono facilmente costruibili in analogia alle Viste costruite nelle precedenti Guide e non vengono pertanto ulteriormente spiegate. Vediamo invece come assemblarle in una sola pagina "Cruscotto", utilizzando due metodi alternativi, basati su due differenti moduli aggiuntivi.

Viste in una Pagina

Un primo metodo è basato sul modulo "Insert View", che consente di inserire una o più Vista dentro il Campo testuale di una qualunque Entità. Installato ed attivato questo modulo, per inserire una Vista in un Campo testo, basta digitare nel testo il Token

[view:name=display=args] 

in cui:

  • name è il nome ad uso interno della Vista, nome elencato da Struttura - Viste. E' l'unico parametro obbligatorio per questo Token.
  • display è il nome della Visualizzazione dentro la 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 argomenti passati ai Filtri contestuali della Vista, separati da /. Se la Vista non prevede Filtri contestuali, su può omettere questo parametro dal Token 

Per creare il Cruscotto della app di esempio con questo metodo:

predisponi i Campi testo a riconoscere il Token [view]Vai in Configurazione - Formati testo e editor - Html completo - Configura e attiva Insert View
crea la pagina "Cruscotto"Con Contenuto - Aggiungi Contenuto - Pagina base crea una Pagina; come titolo digita "Cruscotto", come Formato del testo seleziona HTML completo, come Alias URL digita "/cruscotto". 
mostra le informazioni

Digita nel testo della pagina i Token corrispondenti alle Viste

[view:comando_mio_profilo] 

[view:ultimi_messaggi_pervenuti]

[view:mie_richieste_aperte]

[view:mie_richieste_concluse=da_valutare]

[view:miei_prestiti_aperti]

[view:miei_prestiti_conclusi=da_valutare]

Questo metodo è semplice e consente di mescolare le informazioni fornite dalla Viste con testi fissi, immagini ecc. Se però una delle Viste richiamate necessita di valori per i propri Filtri contestuali e questi valori non sono fissi ma dipendono dal contesto in cui la pagina viene richiamata, allora quasi sicuramente occorre passare al metodo successivo.

Viste in una Vista 

Un secondo metodo, più potente e leggermente più complesso, è basato sul modulo "Views Field View" che consente di aggiungere dentro una Vista "principale" una o più Viste "secondarie". Installato ed attivato questo modulo, per inserire nella Vista principale una Vista secondaria basta aggiungere nella sezione Campi della Vista principale il nuovo tipo di Campo Visualizza - Globale - Embed a view as a field. This can cause slow performance, so enable some caching. Nella configurazione di questo Campo si specifica la Vista secondaria da richiamare, la sua eventuale Visualizzazione e gli eventuali argomenti da passare.

La Vista principale può passare alle Viste secondarie qualunque valore noto nella Vista principale stessa, compresi eventuali valori a sua volta ricevuti. Si possono creare così catene di Viste che richiamano altre Viste, che però è opportuno limitare per non incorrere in complessità tali delle interrogazioni sul database da rallentare eccessivamente la app o da mandarla in errore.

Nella app di esempio, aggiungiamo quindi una Vista "Cruscotto" basata sull'Utente corrente (in modo da essere certi che la Vista venga mostrata anche quando l'Utente non abbia ancora fatto nulla nella app) e, dentro questa Vista principale, richiamiamo le Viste sopra elencate:

crea la Vista "Cruscotto"vai in Struttura - Viste - Aggiungi nuova vista;  scegli il nome della Vista ("Cruscotto");  in Mostra scegli Utente; scegli di creare una Pagina e di mostrare il risultato come Elenco non formattato di campi.  
filtra la Vista sull'Utente correnteNella sezione Criteri del filtro aggiungi Corrente - Utente- Filtra la vista con l'utente attualmente autenticato, come operatore seleziona è uguale a e come è l'utente autenticato seleziona si
definisci il percorso con cui richiamare il CruscottoNella sezione Impostazione pagina come Percorso digita "/cruscotto"
mostra le informazioni

per ogni Vista sopra elencata:

  •  nella sezione Campi aggiungi Globale - Embed a view as a field. This can cause slow performance, so enable some caching
  • per un difetto attualmente presente in Drupal, conferma il Campo senza configurarlo e poi riaprilo per configurarlo
  • In Visualizza seleziona la Vista secondaria che vuoi richiamare (es "Miei Richieste aperte")
  • In Visualizzazione seleziona se necessario la specifica Visualizzazione nella Vista secondaria
  • In Filtri contestuali digita se necessario i valori da passare ai Filtri contestuali della Vista secondaria (nel nostro esempio, non ci sono). Al posto di valori fissi puoi usare i Token messi a disposizione dalla Vista principale, elencati sotto Schemi di sostituzione

 

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.

Le Viste sono lo strumento molto versatile e possono essere usate non solo per mostrare elenchi di Entità, ma anche per altri scopi. Vediamo in questa Guida come guidare  con una Vista l'inserimento di un valore in un Campo di tipo Riferimento, prendendo come esempio la selezione della Categoria quando si carica un nuovo Attrezzo nella app: invece che digitare "a caso" caratteri confidando di azzeccare il nome della Categoria, vorremmo mostrare all'Utente l'elenco di tutte le Categorie, ordinate secondo la loro Categoria superiore:

  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). Vediamo passo passo come ottenere questo risultato:

  • Creare una Visualizzazione di tipo Entity Reference
  • Usare la Visualizzazione in un Campo Riferimento
  • Scegliere come selezionare i valori

Creare una Visualizzazione di tipo Entity Reference

Una Vista di tipo Entity Reference è una Vista normale, con una Visualizzazione di tipo Entity Reference. La creiamo quindi come abbiamo imparato a fare nelle Guide precedenti, in grassetto le istruzioni specifiche:

crea una Vista che elenca le Categoriein Struttura - Viste crea una nuova Vista di nome "Selezione Categoria", formata da Contenuti di tipo Categoria, mostrati come elenco non formattato
aggiungi la relazione Categoria → Categoria Superiorenella sezione Relazioni della Vista aggiungi il Campo "Categoria Superiore" della Categoria e rinominalo come "Superiore"
elenca tutte le Categorie ordinate per Categoria Superiore

nella sezione Campi aggiungi un Campo Titolo, selezionando per esso come Relazione "Superiore" (mostra quindi il titolo della Categoria Superiore) ed un secondo Campo Titolo, senza alcuna Relazione (mostra quindi il titolo della Categoria).

Nella sezione Criteri di ordinamento aggiungi un Campo Titolo, selezionando come Relazione "Superiore" e, dopo di esso, un altro Campo Titolo, in modo che l'elenco sia prima ordinato per Categoria Superiore e poi per Categoria

Nella sezione Criteri del filtro aggiungi un Campo Titolo con Relazione "Superiore" e come operatore seleziona non è vuoto. In questo modo non saranno elencate le Categorie Superiori come righe a se stante, perché le Categorie Superiori non hanno a loro volta una Categoria Superiore.

aggiungi alla Vista una Visualizzazione di tipo Entity Reference seleziona Duplica come Entity Reference:  in Visualizzazioni appare una seconda Visualizzazione di nome "Entity Reference". Clicca su di essa.
configura la Visualizzazione

nella sezione Formato - Elenco di riferimenti a entità - Impostazioni seleziona entrambi i Campi Titolo

Nella sezione Formato - Mostra - Entity Reference inline fields - Impostazioni seleziona entrambi i Campi Titolo per allinearli orizzontalmente e digita come separatore " - "

Nella sezione Paginazione - Elementi da visualizzare seleziona Visualizza tutti gli elementi (per motivi i di efficienza le Visualizzazioni di tipo Enitty Reference vengono di default limitate a 10 elementi ma in realtà funzionano bene anche con molti più elementi).

Usare la Visualizzazione in un Campo Riferimento

Creata la Visualizzazione di tipo Entity Reference che elenca le Categorie, possiamo usarla come strumento per selezionare la Categoria nel Campo "Categoria" dell'Attrezzo: 

  • vai in Struttura - Tipi di Contenuto - Attrezzo - Gestisci Campi - Categoria - Modifica,
  • come Tipo di riferimento seleziona Views filter by an entity reference view
  • come Vista utilizzata per selezionare le entità seleziona la Visualizzazione di tipo Entity Reference che hai predisposto es. "Seleziona Categoria".

Scegliere come selezionare i valori

In Struttura - Tipi di Contenuto - Attrezzo - Gestione visualizzazione form - Categoria, come Amministratore puoi scegliere se mostrare l'elenco delle Categorie come elenco da cui selezionarne una oppure come un Campo in cui digitare il nome della Categoria.  

DA SCRIVERE

Da scrivere prevedendo l'installazione dei due moduli indicati.

Esempio: azioni collettive dell'Amministratore o dei Gestori.

 

DA SCRIVERE

Filtri su intervalli di valore

temi

dove trovarli e come installarli (composer)

configurazioni

 

 

 

Operazioni di manutenzione della app

Cos'è Cron?

DA SCRIVERE

Come lo eseguo?

DA SCRIVERE

Se Cron va in errore...

Se il comando Configurazione - Cron - Esegui Cron dentro Drupal va in errore, puoi provare a sbloccarlo come spiegato nella Guida a Drush.

Perché devo aggiornare il Core ed i moduli aggiuntivi?

Con una buona frequenza la comunità di Drupal mette a disposizione aggiornamenti del Core e dei moduli. Gli aggiornamenti risolvono errori, aggiungono funzioni e, soprattutto, migliorano la sicurezza di Drupal. Drupal avvisa l'Amministratore quando sono disponibili aggiornamenti. In ogni momento, l'Amministratore può verificare la disponibilità di aggiornamenti sotto il menù Resoconti coi comandi Resoconto sullo stato e Aggiornamenti disponibili

Poiché ogni aggiornamento può malauguratamente introdurre problemi e persino crash alla tua app, se nel quotidiano utilizzo della app non riscontri errori installa subito solo gli aggiornamenti di sicurezza, rinviando gli altri fino a quando la versione del modulo che stai usando non diventa incompatibile con il Core o con altri moduli installati. La pagina mostrata da Aggiornamenti disponibili fornisce le informazioni essenziali per decidere.  

Prima di procedere ad un aggiornamento è sempre consigliato fare un backup della app, per poterla ripristinare in caso che l'aggiornamento provochi un blocco o crash della app.

Come aggiornare Drupal?

Come l'installazione, anche l'aggiornamento di Core e moduli non può essere effettuata dall'Amministratore dentro Drupal, ma deve essere effettuata da Terminale con Composer e Drush. Le istruzioni per aggiornare il Core all'ultima versione disponibile sono dettagliate sul sito Drupal. Le istruzioni per aggiornare un modulo sono le medesime che abbiamo già visto per la sua installazione.

da scrivere

arrivato qui 

valutare se introdurre subito le tassonomie o cavarcela con tipo di contenuto gerarchico

Nella nostra app di esempio, vogliamo catalogare gli attrezzi utilizzando Categorie predefinite dall'Amministratore, per facilitare la ricerca degli attrezzi, che potrebbero essere descritti dai proprietari in modo non uniforme. A questo scopo possiamo creare un nuovo Tipo di Contenuto ma, per etichettare Contenuti, Drupal mette a disposizione uno strumento più potente: le Tassonomie. Una Tassonomia è un vocabolario di Termini con cui etichettare i Contenuti. Solo per le Tassonomie, Drupal offre comandi speciali che facilitano la creazione di gerarchie di Termini a più livelli, ad esempio:

  • Falegnameria
    • Sega
    • Pialla
    • Levigatrice
  • Giardinaggio
    • Falciatrice
    • Troncarami
    • Idropulitrice
  • Lavori in muratura
    • Trabattello
    • Tagliapiastrelle
    • Frattazzo
  • Abbigliamento
    • Macchina per cucire
    • ...

Poiché è difficile prevedere quanto la gerarchia di etichette si complicherà con l'uso della app, è opportuno affrontarla da subito con una Tassonomia. 

COSTRUIRE UNA TASSONOMIA

Come Amministratore, sotto il menù Struttura - Tassonomia trovi i comandi per creare e gestire le Tassonomie. Col comando Aggiungi vocabolario crei una nuova Tassonomia semplicemente dandole un nome (es. "Categorie di attrezzi") e caricandovi i Termini. Creata la nuova Tassonomia, puoi riordinare gerarchicamente i Termini richiamandone l'elenco col comando Lista termini e trascinandoli:

Come i Contenuti, anche i Termini di Tassonomia hanno Campi automaticamente valorizzati da Drupal:

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

Gli ultimi tre Campi contengono le informazioni relative alla gerarchia: quando trascini un Termine nella gerarchia della Tassonomia, Drupal ricalcola automaticamente i Campi Genitore, Peso e Profondità.

APPLICARE LA TASSONOMIA AI CONTENUTI

Per applicare una Tassonomia ad un Tipo di Contenuto basta aggiungere al Tipo di Contenuto un Campo Riferimento che fa riferimento a quella Tassonomia. 

Nella app di esempio, aggiungi quindi al Tipo di Contenuto "Attrezzo" un Campo Riferimento che punta alla Tassonomia "Categorie di Attrezzi" creando così una relazione Attrezzo → Termine:

Puoi vedere qui la struttura degli Attrezzi, aggiornata anche con questo Campo.

 

Ad esempio, se installi il modulo "Client-side Hierarchical Select", viene aggiunto ai Campi Riferimento che fanno riferimento ad una Tassonomia un Widget che fa scegliere un Termine di primo livello, poi uno di secondo livello limitato dalla scelta effettuata nel primo e così via, consentendo così all'Utente di muoversi lungo la gerarchia mentre sta scegliendo il Termine da applicare all'attrezzo:

PRIMA DI PROSEGUIRE

Se la tua app richiede una Tassonomia, descrivila e popolala con un po' di termini, disponendoli su una gerarchia con un paio di livelli.

Qui puoi trovare la struttura della Tassonomia utilizzata nella app di esempio.

Comandi esposti ai diversi ruoli come comandi contestuali costruiti con le viste.

Definizione dei menu

Definizione della prima pagina per ruolo

oltre le viste: il motore di ricerca

 

 

 

DA AGGIORNARE

 

Nella precedente Guida abbiamo visto come creare una Vista basata sulla relazione "Attrezzo → Categoria". Grazie a quella relazione, partendo da un tipo di Entità (i Contenuti di tipo Attrezzo) la Vista mostra un altro tipo di Entità (i Termini della Tassonomia "Categoria di attrezzi"). 

Proseguendo nella realizzazione della app di esempio, vediamo ora come costruire la Vista "Categorie di attrezzi" da mostrare agli Utenti non ancora registrati ("visitatori") per invogliarli a iscriversi alla app. 

IL MODULO VIEWS TREE

Come tutte le Tassonomie, le Categorie di attrezzi sono organizzate in una gerarchia, il che significa che in ogni Categoria esiste un riferimento che la lega alla Categoria superiore, ad esempio la Categoria "Falciatrice" contiene un riferimento alla Categoria "Giardinaggio". 

Volendo rappresentare la gerarchia delle Categorie non come una tabella piatta, ci serve un formato di visualizzazione ad "albero". Questo formato non è disponibile nativamente nelle Viste, ma viene aggiunto installando in Drupal il modulo "Views Tree" (vedi questa Guida per sapere come installare un modulo).

CREAZIONE DELLA VISTA

Per creare e configurare la Vista "Categorie di attrezzi" procedi come per la precedente Vista: vai in Struttura - Viste - Aggiungi nuova vista, digita il nome della vista ("Categorie di attrezzi"). In Mostra seleziona "Termine di Tassonomia" di tipo "Categorie di attrezzi". Scegli di creare una "Pagina" di formato "Tree (List)". 

IMPOSTAZIONE DELLA RELAZIONE

Entrato nell'editor della Vista, aggiungi la relazione che lega un Termine di Tassonomia al proprio Termine superiore, che in Drupal è chiamato "genitore": nella sezione Avanzate - Relazioni clicca Aggiungi, cerca e seleziona "genitore":

VISUALIZZAZIONE AD ALBERO

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

Aggiungi quindi il Campo "ID Termine":

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

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

Nella sezione Campi hai quindi :
 

Per evitare che, cliccando sul nome di una Categoria il visitatore possa navigare nel sito, nel Campo "Termine della tassonomia: Nome" disattiva il parametro Collegamento a Termine della tassonomia.

Nella sezione Formato  ora puoi finalmente configurare l'albero: a fianco di "Tree (list)" clicca Impostazioni; come Main field seleziona il primo dei due Campi "ID Termine" e come Parent field il secondo dei due Campi "ID Termine" (corrispondente al termine "genitore"):

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

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

Per non spezzare l'albero su più pagine, nella sezione Paginazione imponi che siano mostrate tutte le Entità in una sola pagina:

Poiché questa Vista ha lo scopo di incentivare i visitatori a iscriversi alla app, nella sezione Intestazione aggiungi una "Area di testo" in cui scrivere un messaggio del tipo "Vorresti un attrezzo di questi in prestito gratuito? Sei disponibile a prestare gratuitamente ai tuoi vicini un tuo attrezzo?" e nella sezione Piè di pagina un'altra "Area di testo" con un testo del tipo "Per partecipare a "Buon Vicinato" clicca il comando "Accedi" per registrarti: la tua domanda sarà verificata e riceverai una mail di conferma."

Vedremo in una prossima Guida come far diventare questa Vista la pagina di benvenuto per i visitatori.

Puoi vedere questa Vista in azione qui e qui sotto la sua configurazione: