MieApp

A cosa serve MieApp e come si usa.

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 alle tue esigenze, mettendoti tra le mani uno strumento per creare le tue app, anche se non sai programmare, semplicemente partendo dalla descrizione di cosa hai bisogno. Le app che realizzerai saranno tue, non dovrai spendere un euro in licenze software 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, con migliaia di funzioni già pronte che possono coprire (quasi) tutte le tue esigenze. MieApp ti guida passo passo a conoscere Drupal, partendo dalla descrizione di cosa vuoi dalla tua app fino al suo rilascio agli utenti. 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 oppure di tornare indietro, quando pensi ti sia sfuggito qualche passaggio. 

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. Contiene anche una serie di piccoli trucchi ed avvertenze che nascono dalla mia esperienza personale con Drupal. Se preferisci un approccio più strutturato, ti consiglio la guida ufficiale di Drupal per utenti (Drupal User Guide) o una delle numerose pubblicazioni in italiano.
  • MieApp è pensato per chi vuole usare Drupal per costruire applicazioni senza programmare: è quini pensata per quelli che, nel gergo di Drupal, sono chiamati "site builder". Non tratta invece dello sviluppo di nuovi moduli, che ovviamente richiede competenze di programmazione.
  • Non è necessario saper programmare per costruire una app con Drupal, però bisogna saper ragionare per modelli e processi e può risultare utile 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 (Intelligenze Artificiali) promettono di fare loro tutto il lavoro dei programmatori. MieApp non è scritto dalla IA e prescinde dall'utilizzo della IA per la costruzione delle tua app, perché lo scopo è insegnarti ad usare Drupal per capire cosa stai facendo ed essere sempre padrone. A mano a mano che avrò il tempo di sperimentare cosa si può fare con la IA dentro Drupal aggiungerò Guide su questo argomento.  

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 costruire web app senza programmare. 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.  

Ci sono DUE Drupal: CMS e Core. Quale devo guardare?

Da qualche tempo sul sito Drupal sono presentati due filoni distinti di Drupal: CMS e Core. Semplificando al massimo: Drupal CMS è pensato per la creazione di siti internet "belli" e più "commerciali"; Drupal Core è pensato per la creazione di applicazioni. In realtà, Drupal CMS è basato su Drupal Core, quindi per gli scopi di MieApp ci concentriamo su Drupal Core. 

MieApp è costruito con Drupal

Anche MieApp è una app costruita con Drupal. Per spiegare alcune delle potenzialità di Drupal, userò quindi anche questo sito come esempio.

L'intelligenza artificiale (IA) si sposa bene con Drupal.

IA a supporto dell'uso di Drupal

La IA può infatti darci una mano per identificare i moduli aggiuntivi da installare nella nostra app per disporre delle funzionalità che ci servono o per configurare correttamente una Vista. I suggerimenti della IA devono però essere verificati puntualmente perché, pur conoscendo Drupal, talvolta fanno riferimento a moduli o funzioni obsolete.

IA dentro Drupal

Di più: la IA dentro Drupal è un ecosistema che sta rilasciando molte soluzioni che integrano nel robusto framework di Drupal le funzioni IA di produttività (generazione testi e immagini, chatbot, ricerca ecc.) intorno a un modulo principale, quindi sfruttando appieno anche la architettura modulare di Drupal. 

C'è anche un modulo (AI Views Generator) che promette di assisterci nella costruzione di Viste, strumento fondamentale in Drupal che però può risultare di difficile configurazione al primo impatto.

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

A mano a mano che avrò tempo aggiungerò Guide (o passaggi nelle Guide esistenti) dedicate alla IA dentro Drupal.

Devo leggere tutte queste Guide?

No. Sei libero di consultare le Guide di MieApp nell'ordine che vuoi. Però ti raccomando - almeno all'inizio - di leggerle nell'ordine in cui sono presentate, perché ogni Guida dà per scontato che tu abbia letto quelle precedenti. Proseguendo nella lettura, scoprirai da te che ci sono approfondimenti che non ti interessano e che puoi saltare, almeno fino a quando non ti serviranno. MieApp vuole infatti farti usare subito Drupal, senza perdere troppo tempo con la teoria.

Qualche convenzione editoriale

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

La dicitura "(Persona) Cognome" indica che per conoscere il cognome dobbiamo prima conoscere la persona; una spiegazione più completa verrà data quando parleremo dei Campi riferimento. 

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. MieApp ti introduce a termini tecnici di Drupal 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: ad esempio la Vista (uno strumento fondamentale di Drupal) è scritta con la V maiuscola per distinguerla dalla semplice vista degli occhi. Tutti i termini sono elencati nel 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 le tue app e, per questo fine, ti serve una installazione funzionante di Drupal. La Guida alla Installazione ti spiega come procurartela.

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

Cosa serve a Drupal

Per funzionare, Drupal richiede che sul computer su cui viene eseguito siano presenti ed attive le 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 Drupal, che è scritto in PHP
  • un terminale, cioè un'applicazione che consente di dare comandi alle altre componenti e al server

Inoltre, per la gestione di Drupal servono anche:

  • composer, un'applicazione eseguita dentro il terminale, necessaria per l'installazione delle diverse librerie software di cui è composto Drupal
  • drush, un'applicazione PHP eseguita dentro il terminale, che consente di manovrare Drupal da terminale.

Dove installare Drupal

La pagina System Requirement del sito di Drupal elenca tutto quanto è necessario per installare ed usare Drupal. In quella pagina si raccomanda di usare Drupal su un server Linux, ma in realtà è possibile installarlo e usarlo anche su un semplice computer Windows, neppure particolarmente potente. In questa Guida provo a spiegarti, nel modo più semplice possibile, cosa serve per far girare Drupal e come installarlo su un tuo pc Windows o in cloud presso un provider internet, rinviandoti alla suddetta pagina per installazioni più professionali. 

Ecco tre domande che possono aiutarti a scegliere se installare Drupal su un tuo computer o in cloud presso un provider:

  • Hai qualche competenza sistemistica?  Per quanto guidata da apposite procedure, l'installazione sul tuo computer delle componenti software necessarie a Drupal può riservare qualche difficoltà, superabile se hai competenze sistemistiche o puoi chiederle a un amico o collega. L'installazione in cloud è normalmente più semplice, perché pensa il provider quasi a tutto.
  • Chi userà la tua app? Se la app che intendi costruire sarà usata solo da te o al massimo 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 vi accedono da internet, allora devi installare Drupal in cloud (oppure potresti "esporre" il tuo computer su internet, ma questo scenario esula dalle Guide di MieApp).
  • Sei disposto a spendere qualcosa? L'installazione locale sul tuo computer non ti costa nulla, se non il tempo che investirai nell'allestimento. L'uso di Drupal in cloud di per sé costa zero, però 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 di cloud) è sufficiente per partire e per la maggior parte delle tue app e costa poche decine di euro all'anno.

Come installare Drupal

I passaggi per installare Drupal sono gli stessi sia in locale sia in cloud, con qualche differenza, come vedremo nelle Guide seguenti:

  1. Installare le componenti software necessarie (web server, database server, interprete PHP, terminale)
  2. Predisporre lo spazio dove installare Drupal
  3. Predisporre l'indirizzo della app
  4. Creare il database della app
  5. Installare Drupal nello spazio predisposto memorizzando la configurazione nel database
  6. Configurare Drupal per il primo utilizzo 
  7. Installare drush

Il passaggio 1 è una tantum. I passaggi da 2 a 7 sono da ripetere per ogni app che vuoi costruire sul tuo pc o in cloud: in questo modo ogni app avrà una installazione dedicata di Drupal, evitando così che un problema di una app si propaghi alle altre.

Questa Guida ti è utile se hai deciso di installare Drupal localmente sul tuo computer locale. Vediamo come fare, seguendo i passaggi che avevamo elencato qui:

1.Installare le componenti software necessarie

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

Se invece devi arrangiarti con un computer Windows, per l'installazione delle componenti necessarie la comunità Drupal raccomanda di usare la procedura DDEV.. Semplificando un bel po', DDEV installa un server Linux dentro il tuo computer Windows. La procedura è guidata ed è stata recentemente semplificata, però richiede qualche competenza sistemistica e più di 250 GB di disco libero: per quest'ultimo motivo, non ho finora potuto provarla.

Se non hai bisogno di una installazione professionale come quella offerta da DDEV, per Windows ci sono soluzioni più semplici, anche se considerate meno stabili, ne puoi trovare un certo numero cercando la sigla "WAMP" (Windows Apache MySQL PHP), tra cui XAMPP, WAMPserver, WAMP.NET e Laragon. Io ho utilizzato XAMPP fino alla versione 10 di Drupal, ma attualmente (agosto 2026) XAMPP installa una versione di PHP (8.2) inferiore a quella richiesta da Drupal 11 (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 quindi esemplificate su Laragon, ma sono molto simili per tutte le soluzioni WAMP. Dopo l'installazione, tutte le procedure presentano un pannello di controllo, attraverso cui configurare ed attivare i componenti software e un Terminale in cui digitare i comandi necessari all'installazione di Drupal. 

Scaricato ed installato Laragon (o un'altra soluzione WAMP), occorre modificare la configurazione di Apache, MySQL e PHP per adattarle alle 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 

2.Predisporre lo spazio 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, usa Gestione Risorse di Windows per creare 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 crea la sottocartella nel posto giusto, un database omonimo in MySQL e l'indirizzo con cui richiamare la app, semplificando quindi le istruzioni successive. 

3.Predisporre l'indirizzo della app

Se stai usando Laragon, la tua app è richiamabile all'indirizzo 

https://nomeapp.test

dove nomeapp è il nome che hai dato alla app

Con le altre procedure WAMP segui le istruzioni specifiche.

4.Creare il database della app

Se stai usando Laragon, il database è già stato creato nel passaggio precedente: col comando Attrezzi - HeidiSQL entra nel gestore database MySQL, seleziona il database col nome della app, clicca l'icona Utenti, crea un utente con lo stesso nome della app e con una 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 una 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.

Segnati il nome del database, dell'utente e la sua password: ti serviranno durante l'installazione di Drupal.

5.Installare Drupal

Se stai usando Laragon, lancia il Terminale col comando Laragon - Terminale. Con le altre soluzioni WAMP, dal pannello di controllo lancia il Terminale. Dentro il Terminale, usando i comandi Windows cd e dir posizionati nella sottocartella della app e digita il comando:

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

6.Configurare Drupal per il primo utilizzo

Con un web browser vai 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 devi specificare:

  • la lingua ("italiano")
  • il tipo di installazione ("Standard")
  • i tre parametri del database (utente, password, nome database) che hai precedentemente impostato
  • l'indirizzo mail della app (per ora la tua email, eventualmente poi da sistemare)
  • il nome utente dell'Amministratore Drupal ("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 e pronto all'uso. 

7.Installare drush

Prima di iniziare ad esplorare Drupal ti raccomando di installare anche l'utility Drush.

Questa Guida ti è utile se hai deciso di installare in cloud presso un provider. Vediamo come fare, seguendo i passaggi che avevamo elencato qui. 

1. Installare le componenti software necessarie

Se si sceglie correttamente il servizio cloud giusto, all'installazione delle componenti software necessarie a Drupal (ed eventualmente anche alla installazione di Drupal stesso) ci pensa il provider. Ti consiglio di cercare "drupal hosting" e di scegliere 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 appunto le componenti software necessare a Drupal
  • In particolare, verifica che sia disponibile una versione PHP compatibile con quella richiesta Drupal (attualmente almeno PHP 8.3), ma questo requisito è di solito soddisfatto
  • il servizio deve fornire anche un Terminale in cui poter dare comandi; presso alcuni provider, questa componente è chiamata "Shell" o "ssh"; il Terminale è essenziale per installare Drupal e i suoi moduli aggiuntivi
  • è preferibile un servizio che consenta 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
  • è preferibile un servizio che mette a disposizione una procedura per l'installazione automatica di Drupal: non è strettamente necessario, ma può semplificarti la vita; presso alcuni provider, trovi la procedura tra quelli fornite dall'applicazione Softaculous
  • è raccomandabile un servizio che mette a disposizione procedure di backup manuali o automatici, utilissime per ripristinare una app dopo un eventuale crash o hackeraggio.

A titolo di esempio, ti segnalo IONOS OVHcloud Netsons Infomaniak e Hostinger. Personalmente uso da anni Netsons e Infomaniak.

2. Predisporre lo spazio dove installare Drupal

Quando attivi un web hosting in cloud, 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 un "sito" che la ospiterà e in cui installerai Drupal. Le istruzioni per creare i siti variano da provider a provider, però tutti ti chiedono se intendi dedicargli l'intero dominio (es. "bottasini.eu") oppure un sottodominio (es. "vicinato.bottasini.eu"): scegliendo questa opzione,  potrai ospitare nello stesso servizio cloud e con lo stesso dominio più app, che saranno raggiungibili con indirizzi del tipo "app.dominio.it" es. "mieapp.bottasini.eu", "politico.bottasini.eu" ecc. Nella creazione del sito verifica infine che la versione di PHP sia uguale o superiore a quella richiesta da Drupal (attualmente PHP 8.3)

3. Predisporre l'indirizzo della app

L'indirizzo con cui richiamare la tua app è l'indirizzo del sito, che hai selezionato nel passaggio precedente, es

https://vicinato.bottasini.eu

4. Creare il database della app

Se il tuo provider ti mette a disposizione una procedura automatica per l'installazione di Drupal nel sito, attivala: ti semplifica sia questo passaggio sia quelli successivi, perché ti crea automaticamente il database e installa Drupal.

Se invece devi creare manualmente il database, 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 il gestore del database è un altro.

  • 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"

5. Installare Drupal

Se non hai usato la procedura di installazione automatica di Drupal, devi installare manualmente Drupal. Dal pannello di controllo del provider lancia il Terminale. In esso, usa i comandi Linux per posizionarti nella cartella che ha lo stesso nome del sito ed entrarvi:

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

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

dove nomeapp è il nome che hai dato al sito. Una volta che sei certo di essere nella cartella corrispondente al sito giusto, digita il comando:

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

Approfondimento: se, come spesso accade con le installazioni in cloud, il Terminale utilizza il protocollo SSH, un modo efficiente di installare i moduli e usare drush da smarphone consiste nell'uso di una app che emula appunto un terminale SSH. Io ad esempio faccio spesso manutenzione da cellulare, usando la app ConnectBot per Android.

6. Configurare Drupal per il primo utilizzo

Se non hai usato la procedura di installazione automatica di Drupal, al termine del precedente passaggio esci dal pannello di controllo del provider e lancia un web browser sull'indirizzo del sito. Nel web browser appare la procedura di prima configurazione di Drupal, che chiede alcune informazioni per completare l'installazione, tra cui la lingua ("italiano"), la username dell'Amministratore (di solito si sceglie "admin"), la password dell'Amministratore (a tua scelta), l'email dell'Amministratore e della app (per ora la tua email, eventualmente poi da sistemare) e le tre informazioni definite al passo 4 (nome del database, nome dell'utente del database, password dell'utente del database).

Ora Drupal è installato e pronto all'uso. 

7.Installare drush

Prima di iniziare ad esplorare Drupal ti raccomando di installare anche l'utility Drush

🟦 Drush

Cos'è drush e a cosa 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:

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:

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

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

Salva la tua app con drush

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

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

Disinstallare un modulo con drush

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:

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:

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

Sbloccare cron con drush

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

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

Drupal è formato da un nucleo principale (il "Core")e da moduli, ognuno dei quali aggiunge funzioni particolari 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 presenterò i moduli aggiuntivi di utilizzo più comune per la costruzione di app. Ogni volta che cito un modulo, viene proposta una pagina con una breve illustrazione di cosa fa e col link alla pagina del sito Drupal che contiene una descrizione completa, i requisiti e le istruzioni per installarlo e gli eventuali problemi noti. Intelligenze artificiali come Gemini possono aiutarti a scoprire i moduli che ti servono, anche se spesso suggeriscono moduli obsoleti o non compatibili con la versione di Drupal di tuo interesse. Qui puoi vedere l'elenco completo dei moduli utilizzati nelle diverse Guide di MieApp

Come installo un modulo?

Con l'attuale versione di Drupal (11), per installare un modulo:

  • Vai nella pagina del modulo sul sito di Drupal
  • La pagina può elencare più versioni dello stesso modulo: seleziona la più recente compatibile con la versione di Drupal che hai installato. Evita le versioni "alpha" perché sono instabili. Se non trovi una versione compatibile, devi cercare un altro modulo che faccia quel che ti serve.
  • A fianco di ogni versione è presentata la sua specifica istruzione di installazione. 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. Copia l'istruzione.
  • Apri pannello di controllo del tuo provider cloud o della tua installazione locale, apri il Terminale, posizionati nella cartella dove hai installato Drupal, incolla l'istruzione nel Terminale e clicca INVIO.
  • Al termine dell'installazione, apri 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.

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.

Per iniziare a costruire la tua app, devi entrare in Drupal come Amministratore, sapere come muoverti nel menù a te riservato e sistemare alcune configurazioni di base.  

Il primo Utente di Drupal

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

Le credenziali dell'Amministratore

L'Amministratore agisce attraverso le pagine esposte da Drupal nel web browser. Come tutti gli altri Utenti, l'Amministratore entra in Drupal cliccando il comando Entra o Login nella prima pagina di Drupal. Se per qualche motivo questo comando non è visibile nella prima pagina, aggiungi "user" all'indirizzo della app per accedere alla pagina di login:

https://NOMESITO/user

Hai definito le credenziali dell'Amministratore durante l'installazione di Drupal, tipicamente la username è "admin".

Se non ricordi la password di Amministratore, nella pagina di login clicca Reimposta la tua password: se la tua installazione di Drupal è in grado di spedire mail, ti arriverà un messaggio con un link che ti consente di impostare una nuova password. Se non funziona, da Terminale lancia Drush col comando:

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. 

Il menù di Amministrazione

Anche se l'Amministratore agisce attraverso le pagine esposte da Drupal come tutti gli altri Utenti, il modo in cui Drupal si presenta all'Amministratore è molto diverso da come lo vedono gli altri Utenti. Drupal infatti espone al solo Amministratore informazioni e comandi con cui configura come Drupal si presenta agli altri Utenti.  Il principale strumento a disposizione dell'Amministratore è il menù di amministrazione: 

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

L'uso di queste sezioni è illustrato nelle Guide che seguono. I moduli aggiuntivi possono aggiungere ulteriori comandi nelle sezioni.

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

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

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

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

In Impostazioni di base puoi:

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

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

Perché la app deve spedire mail?

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

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

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

L'indirizzo mail della app

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

La maggior parte dei sistemi di posta elettronica considerano sospetti i messaggi che hanno un mittente appartenente ad un dominio (es. "rossi@gmail.com" appartenente al dominio "gmail.com") diverso da quello della app che spedisce il messaggio (es. "vicinato.bottasini.eu" appartenente al dominio "bottasini.eu"). I messaggi sospetti vengono automaticamente spostati nella casella di posta indesiderata (spam) e quindi non vengono visti dal destinatario. Per evitare questo problema, l'indirizzo mail usato dalla app per spedire messaggi deve appartenere allo stesso dominio della app. 

Se la tua app è installata in cloud, normalmente il provider ti fornisce anche almeno un indirizzo mail nello stesso dominio in cui è installata la app (es. "app@bottasini.eu" per il dominio "bottasini.eu"): ti basta scrivere quell'indirizzo mail in Configurazione - Impostazioni di base - Indirizzo e-mail. Idem, se la tua app è installata su un server locale che fa parte di un dominio accessibile da internet ed il gestore della tua rete locale ti mette a disposizione un indirizzo mail nello stesso dominio.

Se la tua app è installata su un tuo computer che non è accessibile da internet, devi attivare un servizio di spedizione mail attraverso cui far transitare i messaggi: in questo modo i destinatari vedranno arrivare i messaggi della tua app come se fossero stati generati dal servizio esterno, che rende coerenti il dominio della app da cui arrivano ed il dominio dell'indirizzo mail del mittente. Quando avrò tempo sperimenterò uno di questi servizi. Se hai un account Gmail, puoi provare questa strada seguendo queste istruzioni. 

Configurare la app per la spedizione di mail

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

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

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

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

Costruire la app = configurare Drupal

La costruzione di una app con Drupal consiste nella configurazione di Drupal guidata da comandi, selezioni e campi da compilare, presentati dal menù di Amministrazione. La configurazione di Drupal è molto ricca e cresce con l'installazione di moduli aggiuntivi. Con MieApp voglio aiutarti a scoprire passo passo le configurazioni più importanti, senza doverti preoccupare se sbagli o dimentichi qualcosa, perché in ogni momento potrai tornare indietro e raffinare la tua opera. Non è quindi necessario avere tutto chiaro prima di partire a costruire, anzi la prima versione della app ti fornirà suggerimenti su come proseguire. 

Per guidarti nella costruzione della app, ti suggerisco di rispondere a queste domande:

  • Scopo: a cosa serve la app?
  • Dati: quali informazioni gestisce la app?
  • Persone: chi usa la app?
  • Autorizzazioni: cosa possono fare le persone sui dati?
  • Percorsi: come agiscono le persone nella app?
  • Automazioni: cosa fa la app in autonomia o al posto delle persone?

Risponderai a queste domande prima a parole e poi configurando uno o più aspetti di Drupal. Aiutiamoci con un esempio. I dettagli realizzati li vedremo nelle Guide che seguiranno, per ora basta capire il percorso logico proposto. 

Scopo

Descrivi in poche frasi cosa vuoi dalla app. Ad esempio immaginiamo di voler una app per "Gestire le prenotazioni di sale riunioni".

Dati

Elenca i tipi di informazioni che la app deve gestire. Ad esempio, la app prenotazioni sale deve gestire le Sale, le Prenotazioni e le Assegnazioni delle Sale in risposta alle Prenotazioni. Ricordati che, oltre ai dati relativi a cose, luoghi e processi, la app deve sempre gestire anche i dati personali degli Utenti che useranno la app.

Il modo più semplice ed intuitivo per rappresentare in Drupal i Dati che hai identificato è creare per ogni tipo di Dato uno o più Tipi di Contenuti. Ad esempio, per la app prenotazione sale configuriamo in Drupal un Tipo di Contenuto "Sala", caratterizzato da localizzazione, capienza e strumentazione disponibile; un Tipo di Contenuto "Prenotazione", caratterizzato dalla Sala richiesta e dalla data/ora richiesta di utilizzo; un tipo di Contenuto "Assegnazione", caratterizzato dalla Prenotazione cui risponde e da eventuali note sull'uso. Vedremo nella apposita Guida come è facile con Drupal configurare tutti i Tipi di Contenuti che servono alla tua app e come collegarli tra loro. Appena configuri un nuovi tipo di Contenuto,  Drupal ti mette subito a disposizione le pagine per creare, modificare, eliminare, mostrare e cercare i Contenuti di quel tipo. 

Più in dettaglio, ogni tipo di Contenuto è caratterizzato dai Campi che memorizzano le informazioni elementari che lo compongono. Proseguendo nell'esempio, vediamo da quali Campi sono formati i vari tipi di Contenuto.

Sala

CampoTipoDescrizione
Titolotestonome della Sala
Capienzanumeroquante persone può ospitare
Descrizionetestodescrizione della Sala, comprensiva delle attrezzature disponibili
Localizzazionecoordinatedove si trova la Sala

Prenotazione

CampoTipoDescrizione
Titolotestodescrizione breve della prenotazione
Quandodata e oraquando è richiesta la Sala
Salariferimento ad una Salaquale Sala è richiesta
Notatestonota relativa alla Sala

Assegnazione

CampoTipoDescrizione
Titolotestodescrizione breve della assegnazione
Quandodata e oraquando è concessa la Sala
Prenotazioneriferimento ad una Prenotazionea quale Prenotazione risponde l'Assegnazione
Notatestonota relativa all'Assegnazione

Drupal in realtà gestisce, oltre ai Contenuti, molti altri tipi di Entità tra cui Utenti, File, Commenti ecc. che scopriremo a tempo opportuno. 

Persone

Elenca i ruoli delle persone che usano la app. Se la app è usata solo da te, avrai solo due ruoli: l'Amministratore (cioè tu) e i Visitatori, cioè chiunque riesca ad arrivare alla tua app dalla rete locale o da internet. Se invece pensi di condividere l'uso della app con più persone, avrai almeno tre ruoli: l'Amministratore, i Visitatori e gli Utenti, cioè le persone che fanno login nella app per farsi riconoscere. A loro volta, gli Utenti potrebbero svolgere diversi ruoli: ad esempio, nella app prenotazioni sale potresti delegare l'assegnazione delle sale a Utenti Gestori ed avere quindi quattro ruoli: L'Amministratore, i Visitatori, gli Utenti Richiedenti e gli Utenti Gestori. 

Drupal gestisce le persone che interagiscono con la app come Utenti. L'Utente è un particolare tipo di Entità, per il quale Drupal ti mette a disposizione non solo le pagine di creazione, modifica e cancellazione, ma anche funzioni specifiche quali la registrazione, l'autoregistrazione, il login, il logout ed altre ancora. 

Per caratterizzare gli Utenti, Drupal utilizza i Ruoli. I ruoli predefiniti sono "Visitatore" (o Utente anonimo, cioè la persona che non ha fatto login), "Utente autenticato" (cioè la persona che ha fatto login) e "Amministratore" (cioè la persona che gestisce Drupal). Con una semplice configurazione, puoi facilmente aggiungere ulteriori Ruoli per caratterizzare diversi gruppi di Utenti autenticati: ad esempio, nella app prenotazione sale aggiungeremo i Ruoli "Richiedente" e "Gestore". 

Autorizzazioni

Per ogni tipo di dato e per ogni ruolo utente che hai identificato, ora specifica quali ruoli possono eseguire su quali tipi di dati le operazioni base di creazione, lettura, modifica e eliminazione. Una tabella come quella che segue può risultare utile per descrivere queste Autorizzazioni (non rappresento il ruolo Amministratore perché può sempre far tutto):

 Ruolo utente
Tipo di informazioneVisitatoreUtente RichiedenteUtente Gestore
Dati personali dell'Utente-Modifica i propri datiModifica i dati di tutti gli utenti
SalaVede tutte le SaleVede tutte le SaleCrea e modifica tutte le Sale
Prenotazione-Crea, vede, modifica e elimina (1) le proprie Prenotazioni Vede, modifica e elimina (1) tutte le Prenotazioni
Assegnazione-Vede le Assegnazioni create dai Gestori in risposta alle proprie Prenotazioni.
Delle Assegnazioni altrui vede solo l'effetto di occupazione delle Sale senza dettagli.
Crea, modifica e elimina tutte le Assegnazioni

(1) Una Prenotazione è eliminabile solo se non è stata ancora create l'Assegnazione corrispondente.

La gestione base delle Autorizzazioni in Drupal è fatta configurando i Permessi: un Permesso è una semplice opzione accesa / spenta che abilita / disabilita una funzione ad un ruolo utente. Per ogni tipo di Contenuto che hai configurato, Drupal mette a disposizione i corrispondenti Permessi di creazione, modifica e eliminazione. In Drupal troverai una tabella molto simile a quella sopra descritta, in cui accedere / spegnere i Permessi. Drupal mette a disposizione anche Permessi per la gestione degli Utenti e per molte altre funzioni. Spesso l'installazione di moduli aggiuntivi aggiunge nuovi Permessi. Vedremo più avanti che le Autorizzazioni gestite coi Permessi possono essere integrate con strumenti più sofisticati, quali ad esempio i "Gruppi" (comunità di Utenti e Contenuti), i Permessi dinamici dati dai Workflow e i Permessi basati su etichette condivise tra Utenti e Contenuti.

Percorsi

Per ogni ruolo utente, illustra il percorso dentro la app in termini di sequenza di pagine visitate e, per ogni pagina, di dati mostrati e di comandi disponibili. Tabelle come quelle che seguono possono risultare utile per descrivere i Percorsi dei diversi ruoli (non rappresento il ruolo Amministratore perché si muove liberamente in Drupal). Nelle tabelle ho sottolineato i dati che, se cliccati dall'utente, portano alla pagina di dettaglio del dato (es. "Elenco Prenotazioni" indica che, cliccando su una delle Prenotazioni elencate, si passa alla pagina coi dettagli di quella Prenotazione). In ogni pagina è anche mostrato un comando "Inizio" (non riportato in tabella) che consente di tornare rapidamente alla pagina inziale del percorso. 

Percorso Visitatore
PaginaInformazioni mostrateComandi disponibili
InizialeSpiegazione della app.
Istruzioni per iscriversi.
Registrazione
Login 
RegistrazioneModulo di iscrizioneInvio (viene creato l'Utente)
LoginModulo di inserimento credenzialiInvio (il Visitatore diventa Utente e passa al percorso Utente Richiedente o Gestore)
Percorso Utente Richiedente
PaginaInformazioni mostrateComandi disponibili
InizialeElenco delle sue Prenotazioni prive di Assegnazione 
Elenco delle sue Assegnazioni ricevute
Sale
Profilo
Logout (l'Utente diventa Visitatore e passa al percorso Visitatore)
SaleElenco delle Sale  
SalaCaratteristiche della Sala
Calendario Assegnazioni sulla Sala 
Prenota (va alla pagina Crea Prenotazione)
Crea PrenotazioneModulo di creazione di nuova Prenotazione Invio (viene creata la Prenotazione e va alla pagina Prenotazione)
PrenotazioneDati della Prenotazione, inclusa eventuale AssegnazioneModifica
Elimina (1)
AssegnazioneDati dell'Assegnazione, inclusa Prenotazione Rinuncia (esegue la procedura di eliminazione Assegnazione, vedi Automazioni)
ProfiloDati dell'UtenteModifica
Percorso Utente Gestore
Paginainformazioni mostrateComandi disponibili
InizialeElenco delle Prenotazioni prive di AssegnazioneGestione Sale
Gestione utenti 
Profilo
Logout (l'Utente diventa Visitatore e passa al percorso Visitatore)
Gestione SaleElenco delle SaleNuova Sala (va alla pagina Crea Sala)
Crea Salamodulo di creazione di una nuova SalaInvio (viene creata la Sala e va alla pagina Sala)
SalaDati della Sala
Elenco Prenotazioni prive di Assegnazione
Calendario Assegnazioni
Modifica
Elimina (2)
PrenotazioneDati della Prenotazione, incluso Utente richiedente ed eventuale AssegnazioneModifica
Elimina (1)
Assegna (se non già assegnata, va alla pagina Crea Assegnazione)
Crea AssegnazioneModulo di creazione nuova Assegnazione sulla Sala Invio (viene creata la Assegnazione e va alla pagina Assegnazione)
AssegnazioneDati dell'Assegnazione, inclusi Utente richiedente, Utente Gestore, Prenotazione e SalaAssegnazioni
Modifica
Elimina
AssegnazioniElenco di tutte le Assegnazioni, ricercabile per data, Utente richiedente, Utente Gestore, Prenotazione e Sala 
Gestione UtentiElenco degli Utenti 
UtenteDati dell'Utente
se Utente Richiedente:
Elenco delle sue Prenotazioni, con Sala e eventuale Assegnazione e Utente Gestore
se Utente Gestore:
Elenco delle sue Assegnazioni, con Utente Richiedente, Prenotazione e Sala
Modifica
Elimina

(1) Una Prenotazione è eliminabile solo se non esiste l'Assegnazione corrispondente
(2) Una Sala è eliminabile solo se non ci sono Assegnazioni o Prenotazioni su di essa

Drupal mette a disposizione nativamente una pagine di creazione per ogni tipo di Contenuto e una pagina di dettaglio per ogni Contenuto, coi comandi "Modifica" e "Elimina", limitate però ai soli Campi del Contenuto. Per creare pagine che elencano i Contenuti e per arricchire la pagina di un Contenuto con dati presi da altri Contenuti ad esso correlati, Drupal mette a disposizione le Viste, un potentissimo strumento cui dedicherò molte Guide. Con le Viste puoi costruire pagine specificando quali tipi di Contenuti mostrare, in che ordine, quali filtri applicare e come mescolare i loro dati con dati prese da Utenti o altre Entità o Contenuti. Ad esempio, nella app prenotazione sale con le Viste puoi configurare la pagina "Sala" in modo che mostri non solo i dati di una Sala, ma anche l'elenco delle sue Assegnazioni. Sempre con le Viste, in una pagina puoi aggiungere comandi che appaiono solo se il contesto lo consente o lo richiede: ad esempio, nella pagina "Sala" mostreremo il comando "Prenota" solo se l'Utente che guarda la pagina non è un Gestore e solo se quell'Utente non ha già inoltrato una prenotazione non ancora soddisfatta.

Oltre ai comandi mostrati nelle pagine, Drupal gestisce Menù di comandi mostrati in tutte le pagine o in gruppi di pagine, differenziabili per ruolo dell'utente. Ad esempio, nella app prenotazione sale il comando "Inizio" che riporta alla pagina di inizio del percorso sarà scritto in un menù per non doverlo ripetere nella configurazione di ogni pagina.

Le funzioni necessarie per gestire Contenuti, Utenti, Ruoli, Permessi, Viste, Menù e molti altri aspetti di Drupal sono disponibili nativamente in Drupal. Se la tua app richiede ulteriori funzioni non disponibili nella installazione base di Drupal, puoi cercarle tra le migliaia di Moduli aggiuntivi gratuiti. Ad esempio, se nella pagina "Sala" sopra descritta vogliamo mostrare le Assegnazioni non come mero elenco ma come un calendario navigabile per mese, installeremo il modulo aggiuntivo "Calendar View".  

Automazioni

Oltre ai comandi e ai dati forniti dagli utenti, è possibile assegnare a Drupal operazioni da eseguire al posto delle persone, ad esempio operazioni periodiche di pulizia, ricalcolo valori, spedizione mail agli utenti con l'elenco delle ultime novità, o anche operazioni cui gli utenti non sono autorizzati. Ad esempio, nella app prenotazione sale, col comando "Rinuncia" l'Utente richiedente rinuncia all'Assegnazione creata da un Gestore, ma non può eliminarla direttamente, perché non ha l'autorizzazione di eliminare Assegnazioni: il comando "Rinuncia" attiva quindi una procedura, eseguita da Drupal coi privilegi necessari, che elimina l'Assegnazione al posto dell'Utente.

A questo scopo disegneremo procedure ECA (Event - Condition - Action), che istruiscono Drupal su cosa fare quando accade quell'evento. Le ECA sono forse la cosa che si avvicina di più alla programmazione in Drupal, ma la loro configurazione non richiede la conoscenza di un linguaggio di programmazione e riusa tutti gli strumenti Drupal che nel frattempo avrai imparato a conoscere. Ad esempio, nella app prenotazione sale disegneremo una procedura ECA "Rinuncia" che, attivata dal click dell'Utente sul comando omonimo nella pagina "Assegnazione", ordina a Drupal di eliminare quell'Assegnazione, superando così i limiti delle Autorizzazioni dell'Utente.

Qualche altro esempio

Nelle Guide che seguono, applicheremo questo metodo ad un paio di esempi, il primo molto semplice e l'altro più complesso come evoluzione del primo:

  • Miei Libri: una app di uso personale per gestire la tua biblioteca e i prestiti agli amici
  • Prestiti tra Vicini: una app per gestire i prestiti di oggetti tra vicini 

La app "Miei Libri" è molto semplice e serve per tener traccia dei libri che possiedi e dei prestiti effettuati agli amici. Allo scopo potrebbe bastare in realtà un foglio elettronico, ma è un buon esercizio per iniziare a capire come funziona Drupal. Da questo semplice esempio costruiremo poi un esempio decisamente più complesso. Per la sua descrizione e realizzazione seguiamo il metodo che abbiamo visto .

Scopo

Gestire la mia biblioteca personale e i prestiti dei miei libri agli amici

Dati

I Libri. Gli Autori e le Categorie dei Libri. Gli Scaffali dove sono collocati i Libri. Gli Amici cui presti i Libri. I Prestiti dei Libri agli Amici.

LIBRO Ogni libro è rappresentato da un Contenuto di tipo "Libro", formato dai Campi:

CampoTipoDescrizione
Titolotestotitolo del libro
ISBNtestocodice ISBN del libro
Autoreriferimento ad AutoriAutori del libro
Categoriariferimento a CategorieCategorie del libro
Scaffaleriferimento a ScaffaliScaffale in cui è collocato il libro
StatobooleanoPrestabile | Non prestabile
NotatestoNota sul libro, es. sul suo stato di conservazione

AUTORE Ogni autore è rappresentato da un Contenuto di tipo "Autore" con questi Campi:

CampoTipoDescrizione
Cognometestocognome dell'autore
Nometestonome dell'autore
NotatestoNota sull'Autore, es. per facilitarne l'identificazione

CATEGORIA Ogni categoria è rappresentata da un Contenuto di tipo "Categoria" con questi Campi:

CampoTipoDescrizione
Titolotestotitolo della categoria
NotatestoNota sulla Categoria, es. sinonimi

SCAFFALE Ogni Scaffale è rappresentato da un Contenuto di tipo "Scaffale" con questi Campi:

CampoTipoDescrizione
Titolotestodescrizione breve dello scaffale
NotatestoNota sullo Scaffale

In una versione leggermente più complessa della app, potremmo organizzare gli Scaffali gerarchicamente in "Scaffale - Libreria", aggiungendo il tipo "Libreria" e aggiungendo allo Scaffale il Campo "Libreria" con riferimento alla Libreria.

AMICO Ogni amico è rappresentata da un Contenuto di tipo "Amico" con questi Campi:

CampoTipoDescrizione
Nometestonome dell'Amico
Notatestonota relativa all'Amico, es. sul suo comportamento rispetto ai prestiti

In una versione più complessa della app, potremmo rappresentare gli Amici come Utenti e non come Contenuti, consentendo loro di usare la app per chiedere i Libri in prestito. Questa è una delle evoluzioni previste nell'altra app di esempio.

PRESTITO Ogni prestito effettuato è rappresentato da un Contenuto di tipo "Prestito" con questi Campi:

CampoTipoDescrizione
TitolotestoBreve descrizione del prestito
Libroriferimento a LibriLibro in prestito
Amicoriferimento a AmiciAmico cui viene prestato il Libro
Periododataperiodo temporale del Prestito

Il periodo temporale del prestito serve anche per distinguere tra i prestiti in corso (privi di data di conclusione del periodo) e conclusi (con data di conclusione).

Persone

La app è usata solo dall'Amministratore, cioè da te. Gli Amici non sono quindi Utenti della app, ma dati gestiti.

Autorizzazioni

Essendo l'Amministratore l'unico utente della app e potendo l'Amministratore fare tutto, non c'è necessità di definire le Autorizzazioni.

Percorsi

Anche se come Amministratore puoi muovermi liberamente nella app, per facilitartene l'uso ti conviene definire comunque un percorso fatto di queste pagine e comandi, dedicate alla gestione della biblioteca (libri, autori, categorie e scaffali) e dei prestiti (amici e prestiti). Per semplicità, raccogliamo i comandi che portano alle pagine "Biblioteca", "Autori", "Categorie", "Scaffali", "Amici" e "Prestiti" nel Menù della app.

PaginaCosa mostraComandiCome costruirla
InizioElenco dei Prestiti in corso  Vista
BibliotecaElenco dei Libri filtrabile per Scaffale e CategoriaCrea LibroVista
Crea LibroModulo di creazione LibroInvio (crea il Libro e va alla sua pagina)nativa
LibroDati del Libro, incluso Autori, Categorie e Scaffale
Elenco dei Prestiti in corso
Archivio Prestiti (filtrato per Libro)
Crea Prestito
Modifica
Elimina (1)
nativa + vista allegata
AutoriElenco degli AutoriCrea AutoreVista
Crea AutoreModulo di creazione AutoreInvio (crea l'Autore e va alla sua pagina)nativa
AutoreDati dell'Autore
Elenco dei Libri di questo Autore
Modifica
Elimina
nativa + vista allegata
CategorieElenco delle CategorieCrea Categoriavista
Crea CategoriaModulo di creazione CategoriaInvio (crea la Categoria e va alla sua pagina)nativa
CategoriaDati della Categoria
Elenco dei Libri che sono in questa Categoria
Elenco degli Scaffali che hanno Libri in questa Categoria
Modifica
Elimina
nativa + vista allegata
ScaffaliElenco delle ScaffaliCrea Scaffalevista
Crea ScaffaleModulo di creazione ScaffaleInvio (crea lo Scaffale e va alla sua pagina)nativa
ScaffaleDati dello Scaffale
Elenco dei Libri che sono in questo Scaffale
Elenco delle Categorie dei Libri in questo Scaffale
Modifica
Elimina
nativa + vista allegata
Archivio PrestitiElenco dei Prestiti conclusi (filtrabile per Libro e Amico)  vista
Crea PrestitoModulo di creazione PrestitoInvio (crea il Prestito e va alla sua pagina)nativa
PrestitoDati del Prestito, incluso Libro e Amico nativa
AmicoDati dell'Amico
Elenco dei Prestiti in corso
Archivio Prestiti (filtrato per Amico)
Modifica
Elimina (1)
nativa + vista allegata
AmiciElenco degli AmiciCrea Amicovista
Crea AmicoModulo di creazione AmicoInvio (crea l'Amico e va alla sua pagina)nativa

(1) Un Libro o un Amico sono eliminabili se non ci sono Prestiti che lo riguardano

Automazioni

Non servono automazioni.

La app "Prestiti tra Vicini" è una sorta di evoluzione della app "Miei Libri" che abbiamo precedentemente visto, in cui i prestiti non riguardano più solo libri ma oggetti vari, gli amici cui prestare sono utenti della app perché possano a loro volta prestare i loro oggetti e lo scambio degli oggetti può avvenire non solo direttamente tra richiedente e proprietario dell'oggetto, ma attraverso gli operatori di una biblioteca o di un altro luogo aperto al pubblico. Anche per questa app seguiamo il metodo che abbiamo visto .

Scopo

Gestire i prestiti di oggetti tra vicini. Oltre a registrare le richieste di oggetti e la concessione dei prestiti, a maggior garanzia di tutti la app traccia le consegne, che possono avvenire direttamente tra richiedente e proprietario dell'oggetto oppure presso luoghi aperti al pubblico gestiti da operatori, quali una biblioteca o la sede di una associazione di volontariato. La app permette infine di esprimere una valutazione sull'esperienza di prestito, che viene utilizzata per statistiche sugli utenti e sugli oggetti.

Dati

Oltre ai dati personali degli Utenti, la app deve gestire i seguenti dati:

Oggettol'oggetto disponibile per il prestito (es. la falciatrice)
Ambitol'ambito di utilizzo di un Oggetto (es. il giardino, la cucina, la sartoria, il bricolage)
Richiestala richiesta di un Oggetto (es. la richiesta della falciatrice da parte di Franco per un certo periodo)
Concessionela concessione del prestito in risposta ad una Richiesta (es. la concessione della falciatrice per un certo periodo a Franco da parte di Gianna, proprietaria della falciatrice)
Consegnala consegna di un Oggetto (es. la consegna della falciatrice da parte di Gianna a un operatore della biblioteca)
Luogoil luogo dove è depositato l'oggetto o presso cui avviene la Consegna (es. la biblioteca, la casa del richiedente, la casa del proprietario dell'oggetto)
Abilitazionel'abilitazione di un operatore a gestire le consegne presso un Luogo (es. Carlo è abilitato alla biblioteca)
Valutazionela valutazione finale del prestito espressa dal richiedente o dal proprietario dell'oggetto (es. la valutazione di Gianna sul comportamento di Franco nel prestito della falciatrice) 
Notauna nota scambiata tra richiedente e proprietario per concordare la consegna e l'uso dell'oggetto e gestire eventuali problemi

Per ogni tipo di Dato creiamo un tipo di Contenuto specializzato:

OGGETTO Ogni Oggetto è rappresentato da un Contenuto di tipo "Oggetto". L'Oggetto viene creata nella app dall'Utente proprietario, che è quindi memorizzato nel Campo predefinito "Autore" dell'Oggetto. Gli altri Campi sono:

CampoTipoDescrizione
Titolotestonome breve dell'Oggetto
Descrizionetestodescrizione dell'Oggetto
Immaginefileimmagine descrittiva dell'Oggetto
Statoselezione"Disponibile" se l'Oggetto può essere richiesto in prestito. "Indisponibile" se l'Oggetto non può più essere richiesto, ad esempio perché in riparazione o ritirato definitivamente dalla app.
Documentifile (multivalore)Documenti che descrivono l'Oggetto, es Manuale d'uso e fotografie di dettaglio
Luogoriferimento a SediLuogo dove si trova in questo momento l'Oggetto. Può essere una Sede autorizzata alle consegne oppure "Presso il Proprietario" o "Presso il Richiedente".
Ambitiriferimento a Ambiti (multivalore)Ambito di utilizzo dell'Oggetto

AMBITO Ogni Ambito è rappresentato da un Contenuto di tipo "Ambito", formato dai Campi:

CampoTipoDescrizione
Titolotestonome breve dell'Ambito
SinonimitestoAltre parole che identificano l'Ambito
Statoselezione"Disponibile" se può essere usato per categorizzare gli Oggetti. "Indisponibile" in caso contrario, ad esempio perché sostituito da un nuovo Ambito.

RICHIESTA Ogni Richiesta è rappresentata da un Contenuto di tipo "Richiesta". La Richiesta viene creata nella app dall'Utente richiedente, che è quindi memorizzato nel Campo predefinito "Autore" della Richiesta. Gli altri Campi sono:

CampoTipoDescrizione
TitolotestoTitolo automatico, formato da "Richiesta n. CODICE" dove CODICE è il valore del Campo "Codice"
CodiceserialeNumero progressivo automatico, usato per creare il titolo
Oggettoriferimento a OggettiOggetto richiesto
NotatestoDescrizione della richiesta da parte del Richiedente
Statoworkflow"Aperta" quando viene creata.
"In corso" dopo che è stato concesso il prestito (cioè quando esiste la Concessione in risposta alla Richiesta).
"Conclusa" dopo la riconsegna dell'Oggetto al proprietario.

CONCESSIONE Ogni Concessione è rappresentata da un Contenuto di tipo "Concessione". La Concessione viene creata nella app dall'Utente proprietario dell'Oggetto, che è quindi memorizzato nel Campo predefinito "Autore" della Concessione. Gli altri Campi sono:

CampoTipoDescrizione
TitolotestoTitolo automatico, formato da "Concessione n. CODICE" dove CODICE è il valore del Campo "Codice"
CodiceserialeNumero progressivo automatico
Richiestariferimento a RichiesteRichiesta cui la Concessione risponde
NotatestoNota di risposta del Proprietario
Statoworkflow"Aperta" quando viene creata.
"In corso" quando l'Oggetto è stato consegnato
"Conclusa" quando l'Oggetto è tornato al proprietario

CONSEGNA Ogni Consegna è rappresentata da un Contenuto di tipo "Consegna". La Consegna viene creata nella app dall'Utente che consegna l'Oggetto, che è quindi memorizzato nel Campo predefinito "Autore" della Consegna. Gli altri Campi sono:

CampoTipoDescrizione
TitolotestoTitolo automatico, formato da "Consegna n. CODICE" dove CODICE è il valore del Campo "Codice"
CodiceserialeNumero progressivo automatico
Concessioneriferimento a ConcessioniConcessione che autorizza la Consegna
Destinatarioriferimento a UtentiUtente cui viene consegnato l'Oggetto
Luogoriferimento a LuoghiLuogo in cui viene spostato l'Oggetto con la consegna
Quandodata e oraData e ora in cui è avvenuta la consegna (viene caricato automaticamente quando la Consegna passa allo Stato "Avvenuta")
NotatestoNota del consegnante
Statoworkflow"Proposta" quando viene creata dal consegnante.
"Avvenuta" quando il destinatario dichiara di aver ricevuto l'Oggetto

LUOGO Ogni Luogo è rappresentato da un Contenuto di tipo "Luogo". Oltre ai Luoghi fisici, sono previsti i Luoghi logici "Presso il Proprietario" e "Presso il richiedente". I Campi sono:

CampoTipoDescrizione
Titolotestonome breve 
NotatestoDescrizione completa , compresi indirizzo e contatti 
TiposelezioneFisico | Logico (per distinguere i Luoghi fisici dai due luoghi logici)
Statoselezione"Attivo" se è possibile procedere a Consegne in questo Luogo. "Inattivo" se il Luogo non è più utilizzabile.
Posizionecoordinate(solo se Tipo =Fisico) Coordinate geografiche del Luogo, serve per rappresentarlo su mappa geografica

ABILITAZIONE Ogni Abilitazione è rappresentata da un Contenuto di tipo "Abilitazione", che incrocia un Operatore con un Luogo. I Campi sono:

CampoTipoDescrizione
TitolotestoTitolo automatico, formato da "Abilitazione n. CODICE" dove CODICE è il valore del Campo "Codice"
CodiceserialeNumero progressivo automatico
Luogoriferimento a LuoghiLuogo fisico per cui vale l'Abilitazione
Operatoreriferimento a UtentiOperatore per cui vale l'Abilitazione
NotatestoNota relativa all'Abilitazione
Statoselezione"Attiva" se l'Operatore può operare nella Sede, "Inattiva" in caso contrario, ad esempio perché l'Operatore non lavora più

VALUTAZIONE Ogni Valutazione è rappresentata da un Contenuto di tipo "Valutazione". La Valutazione viene creata nella app dall'Utente richiedente o proprietario che la esprime, che è quindi memorizzato nel Campo predefinito "Autore" della Valutazione. Gli altri Campi sono:

CampoTipoDescrizione
TitolotestoTitolo automatico, formato da "Valutazione n. CODICE" dove CODICE è il valore del Campo "Codice"
CodiceserialeNumero progressivo automatico
Concessioneriferimento a ConcessioniConcessione per cui viene espressa la Valutazione
ValoreselezioneValore della Valutazione secondo una scala predefinita 
NotatestoCommento alla Valutazione

NOTA Ogni Nota è rappresentata da un Contenuto di tipo "Nota". La Nota viene creata nella app dall'Utente richiedente o proprietario, che è quindi memorizzato nel Campo predefinito "Autore" della Nota. Gli altri Campi sono:

CampoTipoDescrizione
TitolotestoTitolo automatico, formato da "Nota n. CODICE" dove CODICE è il valore del Campo "Codice"
CodiceserialeNumero progressivo automatico
Richiestariferimento a RichiesteRichiesta nel cui ambito viene emessa la Nota. La Nota è collegata alla Richiesta e non alla Concessione, per consentire di scrivere Note anche quando la Concessione non è stata ancora emessa.
TestotestoTesto della Nota

UTENTE Ogni Utente della app è rappresentato da una Entità di tipo Utente, con i seguenti Campi aggiuntivi, utili a identificare con ragionevole certezza le persone che usano la app:

CampoTipoDescrizione
NometestoNome della persona
CognometestoCognome della persona
RitrattoimmagineFoto della persona
Persone 

Oltre ai ruoli di default (Visitatori e Amministratore), la app richiede per gli Utenti i seguenti ruoli: 

Vicinola persona che concede in prestito Oggetti e chiede in prestito gli Oggetti altrui
Operatorela persona abilitata a consegnare Oggetti in un Luogo
Gestorela persona che gestisce Ambiti, Luoghi e Utenti, abilita gli Operatori ai Luoghi, interviene su Richieste e Concessioni per risolvere problemi e fornisce supporto all'uso della app.
Autorizzazioni

I Visitatori possono solo iscriversi. Per gli altri Ruoli le Autorizzazioni sui diversi tipi di Dato sono:

 Ruolo utente
Tipo di datoVicinoOperatoreGestore
Dati personali dell'UtenteModifica i propri datiModifica i propri datiModifica i dati di tutti gli utenti
OggettoCrea e modifica i propri Oggetti. Vede tutti gli OggettiVede tutti gli OggettiVede e modifica tutti gli Oggetti
AmbitoVede tutti gli AmbitiVede tutti gli AmbitiCrea, vede, modifica e elimina tutti gli Ambiti
RichiestaCrea Richiesta su Oggetti altrui. Vede, modifica e elimina (1) le proprie Richieste. Vede le Richieste altrui sui propri Oggetti Vede, modifica e elimina tutte le Richieste
ConcessioneCrea Concessione per le Richieste sui propri Oggetti. Vede, modifica e elimina (2) le proprie Concessioni. Vede le Concessioni altrui in risposta alle proprie RichiesteVede tutte le ConcessioniVede, modifica e elimina tutte le Concessioni
ConsegnaCrea Consegna per Concessioni di cui è Richiedente o Proprietario. Vede, modifica e elimina (3) le proprie Consegne. Vede le Consegne altrui di cui è destinatarioLimitatamente ai Luoghi cui è abilitato:
Crea Consegna per Concessioni che passano per il Luogo. Vede, modifica e elimina (3) le Consegne create da Operatori del Luogo. Vede le Consegne che passano per il Luogo
Crea, vede, modifica e elimina tutte le Consegne
LuogoVede tutti i LuoghiVede i Luoghi cui è abilitatoCrea, vede, modifica e elimina tutti i Luoghi
Abilitazione Vede le Abilitazioni relative ai Luoghi cui è abilitatoCrea, vede, modifica e elimina tutte le Abilitazioni
ValutazioneCrea Valutazione per Concessione di cui è richiedente o proprietario. Modifica e elimina le proprie Valutazioni. Vede le Valutazioni per Concessioni di cui è richiedente o proprietario. Vede tutte le Valutazioni
NotaCrea Nota per Concessione di cui è richiedente o proprietario. Modifica e elimina le proprie Note. Vede le Note per Concessioni di cui è richiedente o proprietario Vede tutte le Note

(1) Una Richiesta può essere modificate o eliminata finché non viene creata la Concessione in sua risposta
(2) Una Concessione può essere modificata o eliminata finché non viene creata la prima Consegna
(3) La Consegna può essere modificata o eliminata finché non viene accettata dal destinatario

Queste Autorizzazioni richiedono, oltre alla configurazione dei Permessi base, anche l'utilizzo dei Workflow per le Autorizzazioni che variano nel tempo e un uso intelligente delle Viste, per riservare Richieste, Concessioni, Note e Valutazioni ai soli Utenti richiedente e proprietario, come vedremo in dettaglio nelle prossime Guide.

Percorsi

Per ogni Ruolo definiamo un percorso specifico. Per semplicità espositiva non elenco le pagine di creazione dei Contenuti attivate dai comandi "Crea" né i comandi standard di Modifica ed Elimina nelle pagine dei Contenuti né la pagine di gestione dei propri dati personali. Ogni pagina richiede almeno una Vista per essere realizzata:

Percorso Visitatore
PaginaInformazioni mostrateComandi disponibili
InizialeSpiegazione della app. Istruzioni per iscriversi.Registrazione
Login 
RegistrazioneModulo di iscrizioneInvio (viene creato l'Utente)
LoginModulo di inserimento credenzialiInvio (il Visitatore diventa Utente e passa al percorso Utente Richiedente o Gestore)
Percorso Vicino
PaginaInformazioni mostrateComandi disponibili
InizialeElenco delle sue Richieste aperte, inclusa l'eventuale Concessione
Elenco delle sue Concessioni aperte
Elenco delle Consegne che hanno l'Utente come destinatario
Archivio Richieste (filtrate per richiedente)
Archivio Concessioni (filtrate per proprietario)
Oggetti
Oggetti Elenco degli Oggetti disponibili, suddivisi per AmbitoTuoi Oggetti
Tuoi OggettiElenco dei suoi OggettiAggiungi Oggetto
OggettoDati dell'Oggetto
se l'Utente è il Proprietario:
Elenco delle Richieste aperte sull'Oggetto
Eventuale Concessione aperta sull'Oggetto
se l'Utente non è il Proprietario:
Chiedi in prestito (= crea Richiesta sull'Oggetto)
se l'Utente è il Proprietario:
Archivio Concessioni (filtrato per Oggetto)
Archivio Concessioni Elenco Concessioni concluse 
Archivio RichiesteElenco Richieste concluse 
Richiestase l'Utente è il richiedente o il proprietario:
Dati della Richiesta
Elenco delle Note sulla Richiesta
se è stata emessa la Concessione:
Dati della Concessione
Elenco delle Consegne sulla Concessione
Elenco delle Valutazioni sulla Concessione

solo se l'Utente è il richiedente o il proprietario: 


Aggiungi Nota
se l'Utente è il proprietario e non c'è Concessione:
Concedi prestito (= crea Concessione in risposta alla Richiesta) 
se l'Oggetto è presso l'Utente e la Richiesta non è conclusa:
Consegna (=crea Consegna sulla Concessione)
se la Richiesta è conclusa e l'utente non ha espresso la Valutazione:
Valuta /crea Valutazione)

Concessionesolo se l'Utente è il richiedente o il proprietario:
Dati della Concessione, compresa la Richiesta

 



 

Consegnasolo se l'Utente è il richiedente o il proprietario:
Dati della Consegna
solo se l'Utente è il richiedente o il proprietario:

se l'Utente è il destinatario della Consegna:
Accetta Consegna  (cambia lo stato della Consegna)
Valutazionesolo se l'Utente è il richiedente o il proprietario:
Dati della Valutazione
 
Notasolo se l'Utente è il richiedente o il proprietario:
Dati della Nota
 
Percorso Operatore
PaginaInformazioni mostrateComandi disponibili
InizialeElenco dei Luoghi cui è abilitato 
Luogo Elenco delle Concessioni con Oggetto depositati nel Luogo
Elenco delle Consegne aperte con il Luogo come destinazione  
Archivio Consegne
ConcessioneDati della Concessionese l'Oggetto è nel Luogo dove agisce l'Operatore:
Consegna (= crea Consegna)
ConsegnaDati della Consegnase l'Oggetto viene consegnato nel Luogo dove agisce l'Operatore:
Accetta (cambia stato alla Consegna)
Archivio ConsegneElenco Consegne concluse nel Luogo 
Percorso Gestore
PaginaInformazioni mostrateComandi disponibili
Iniziale Gestione Richieste
Gestione Utenti
Gestione Ambiti
Gestione Luoghi
Gestione RichiesteElenco delle Richieste, incluse Concessioni filtrabile per Ambito, Oggetto, Richiedente, Proprietario, stato 
Richiestacome se fosse il richiedente o il proprietario 
Concessionecome se fosse il richiedente o il proprietario 
Consegnacome se fosse il consegnante o il destinatario 
Gestione UtentiElenco degli UtentiNuovo Utente (=crea Utente)
UtenteDati dell'Utente
Se l'Utente mostrato è Operatore:
Elenco delle sue Abilitazioni
Modifica Ruolo
Gestione LuoghiElenco LuoghiNuovo Luogo (=crea Luogo)
LuogoDati Luogo
Elenco Abilitazioni nel Luogo
 
AbilitazioneDati Abilitazione 
Gestione AmbitiElenco AmbitiNuovo Ambito (crea Ambito)
AmbitoDati Ambito 

Automazioni

da scrivere

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Le informazioni che la tua app deve gestire sono rappresentate in Drupal dalle Entità e dalle loro specializzazioni (Contenuti, Utenti, Tassonomie, Commenti...). Prima di spiegarti come configurare le Entità che servono alla tua app, devo fare un minimo di teoria su Entità, Campi e Token. 

Con questa Guida iniziamo ad entrare nel merito di come costruire la tua app con Drupal. Come suggerito dal metodo che abbiamo visto, partiamo da come rappresentare in Drupal i dati necessari alla tua app.

Cos'è una Entità

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

APPROFONDIMENTO: In Drupal ci sono due famiglie di Entità: le Entità di contenuto (content entities) e le Entità di configurazione (configuration entities). Una Entità di contenuto è una entità che contiene le informazioni relative ad un oggetto, una persona, un documento ecc. Una Entità di configurazione contiene invece le informazioni relative ad una configurazione di Drupal. Incontreremo molte Entità di configurazione, tra cui le Viste, i Menù, i Formati di testo ecc. Ai fini di MieApp, se non specificato diversamente, con "Entità" intendo "Entità di contenuto".   

Tipi di Entità

Non tutte le Entità sono uguali. Ad esempio: l'Entità che rappresenta un Utente deve necessariamente contenere le credenziali (nome utente e password) che la persona usa per entrare nella app; solo per Entità di tipo Utente Drupal mette a disposizione le funzioni di login. Invece, una Entità che rappresenta un file ha necessariamente una dimensione in MB; solo per Entità di tipo File Drupal mette a disposizione funzioni di upload e download. 

Drupal gestisce nativamente diversi tipi di Entità, tra cui i Contenuti, gli Utenti, i Termini di Tassonomia, i File, i Media, i Commenti. I moduli aggiuntivi possono a loro volta aggiungere altri tipi di Entità; ad esempio, il modulo "Gruppi" aggiunge le Entità di tipo Gruppo. Alcuni tipi di Entità prevedono una ulteriore specializzazione, detta Bundle. I tipi di Entità predefiniti in Drupal e i corrispondenti Bundle sono:

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'Amministratore è l'Utente identificato dal numero "1" ed è l'unico Utente ad avere quel numero; nulla vieta che esista un Contenuto o un File identificati da "1". Il numero univoco è assegnato automaticamente all'Entità nel momento in cui viene creata e non può essere modificato, neppure dall'Amministratore. Se l'Entità viene eliminata, il suo identificativo non viene riciclato. L'identificativo è memorizzato in un apposito Campo dell'Entità, il cui nome varia leggermente col tipo di Entità: ID per i Contenuti, UID per gli Utenti, TID per i Termini di Tassonomia ecc.

La pagina dell'Entità

Ad ogni Entità corrisponde una pagina che la mostra. L'indirizzo che richiama la pagina differisce in base al tipo di Entità. Ad esempio, un Contenuto con ID=1234 è mostrato nella pagina /node/1234 mentre l'Utente con UID=5678 è mostrato nella pagina  /user/5678

🟦 I Campi

Campi delle Entità

Le informazioni contenute in 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. Ad esempio, il Campo "Nome utente" delle Entità di tipo Utente contiene un testo che è la username con cui la persona fa login. 

Campi predefiniti

Come abbiamo visto, ogni Entità ha un Campo numerico che contiene il suo identificativo univoco. Oltre a questo Campo, ogni tipo di Entità ha altri Campi predefiniti. Ad esempio:

  • gli Utenti hanno sempre i Campi Nome utente, Password, Email. 
  • i Termini di Tassonomia hanno sempre i Campi Genitore, Profondità e Peso che servono a collocare il Termine nella gerarchia della Tassonomia 
  • i Contenuti hanno sempre un Campo testuale Titolo, un Campo logico Pubblicato (indica se il Contenuto è visibile o nascosto) e i seguenti Campi compilati automaticamente da Drupal, ma modificabili dall'Amministratore: Autore (l'Utente che ha creato il Contenuto), Creato il (Data e ora di creazione del Contenuto) e Modificato (Data e ora di ultima modifica del Contenuto).

Aggiungere Campi

L'Amministratore può aggiungere Campi ai Bundle. Ad esempio, è possibile aggiungere agli Utenti un Campo testuale per memorizzare il nome della persona e un Campo selezione per il sesso. La possibilità di aggiungere Campi è fondamentale per la costruzione delle app con Drupal, perché permette di costruire Entità adatte alle specifiche esigenze della app, senza dover lavorare sulle tabelle del database di Drupal. Le modalità di aggiunta, modifica e eliminazione di Campi differisce da Bundle a Bundle e sono illustrate nelle Guide a mano a mano che servono. Ad esempio, per aggiungere un Campo agli Utenti si usa il comando Configurazione - Impostazione profilo - Gestisci Campi. 

Nome interno e nome esterno (etichetta) del Campo

Ogni Campo ha un nome esterno e un nome interno. Il nome esterno è l'etichetta che l'Amministratore assegna al Campo e col quale il Campo viene richiesto e mostrato. Il nome interno è quello con cui Drupal identifica il Campo. Per default, il nome interno è composto da field_ seguito dal nome interno, in caratteri minuscoli. Ad esempio, se il Campo ha nome esterno "Cognome", viene identificato da Drupal col nome interno field_cognome. 

Mentre il nome esterno può essere il medesimo per più Campi e può essere modificato in ogni momento, il nome interno non può essere più modificato una volta confermato e quindi occorre porre qualche attenzione quando si accetta il nome interno proposto automaticamente da Drupal. Non ci possono essere due Campi (anche di tipi di Entità diversi) con lo stesso nome interno: Drupal segnala questa situazione come errore e si rifiuta di salvare il nome. L'importanza dei nomi interni dei Campi sarà evidente nella costruzione delle Viste.

Tipi di Campi

Drupal mette a disposizione molto tipi di Campi, elencati quando si aggiunge un Campo ad un Bundle:

Alcuni moduli aggiuntivi aggiungono ulteriori tipi di Campi, ad esempio Campi che memorizzano coordinate geografiche, colori, indirizzi di rete ecc.  

Ogni tipo di Campo ha una propria configurazione specifica. Ad esempio: il Campo di tipo Data e ora, che memorizza un istante temporale preciso al secondo, può essere configurato in modo da memorizzare la data senza orario, oppure in modo da memorizzare un intervallo tra due date; il Campo di tipo Selection List deve essere configurato specificando quali valori elencare; il Campo di tipo Caricamento File prevede due sottotipi - Immagine e File - per ognuno dei quali è possibile specificare quali tipi di file accettare (es. pdf, txt, doc per il sottotipo File), la dimensione massima accettata e in quale cartella del server salvarli.     

Formato dei Campi testuali

In particolare, per i Campi di tipo testo esistono due sottotipi: Testo semplice e Testo formattato. Nella configurazione dei Campi di tipo Testo formattato occorre specificare quale formato può accettare: un Formato è una specifica configurazione, che elenca le formattazioni ammesse (es. grassetto, sottolineato, font) e le trasformazioni che sono effettuate sul testo (es. trasformazione di indirizzi internet in link cliccabili). I Formati disponibili sono elencati e modificabili in Configurazione - Formati testo e editor. 

Per ogni Formato, l'Amministratore specifica i Ruoli Utente che possono utilizzarlo, se attivare l'editor visuale, quali comandi dell'editor visuale mettere a disposizione, quali trasformazioni attivare ecc. Per motivi di sicurezza, conviene assegnare agli utenti "base" un Formato con i comandi strettamente necessari (es. il grassetto), riservando a utenti più esperti e fidati un Formato con comandi più evoluti, ad esempio di caricamento immagini. Se per un Campo assegniamo ad un ruolo Utente più di un Formato, l'Utente potrà decidere di volta in volta quale Formato usare per compilare il Campo.

Riferimenti tra Entità

Nella costruzione di app, rivestono particolare importanza i Campi di tipo Riferimento (reference), perché questi Campi definiscono le relazioni tra Entità. Ad esempio, nella app "Miei Libri" per legare un Prestito ad un Libro, aggiungiamo al Contenuto di tipo "Prestito" un Campo riferimento che rimanda ad un Contenuto di tipo "Libro": quando un utente scrive in quel Campo, Drupal guida la sua compilazione mostrando i Libri presenti nella app e non accetta valori che non identifichino un Libro. Nelle Guide che seguono, spesso indicherò questa relazione come "Prestito → Libro" perché, se conosco il Prestito, posso arrivare al Libro.

Campi obbligatori e multivalore

Quando si aggiunge un Campo ad un Bundle, è possibile specificare se la compilazione del Campo è obbligatoria o meno. E' anche possibile specificare quanti valori possono essere memorizzati nel Campo: uno, un numero predefinito (esempio 3) o un numero illimitato. Ad esempio, se specifichiamo che il Campo "Allegato" di tipo File può accettare fino a tre valori, potremo salvare in quel Campo tre file, senza necessità di aggiungere al Bundle tre Campi "Allegato 1", "Allegato 2" e "Allegato 3". 

🟦 I Token

Cosa sono i Token

Un Token è una piccola stringa di testo racchiusa tra parentesi quadrate, ad esempio [node:title] o [current-user:name], che funziona come un segnaposto: quando Drupal incontra un Token, sostituisce quella stringa di testo col dato corrispondente. Ad esempio, se un testo contiene la stringa [current-user:name], quando quel testo viene mostrato la stringa viene sostituita col nome dell'utente corrente che sta usando la app; perciò se il testo è "Ciao [current-user:name]", all'utente di nome Mario viene mostrato come "Ciao Mario", mentre all'utente Carlo viene mostrato come "Ciao Carlo".
Il valore di alcuni Token dipende dal contesto: ad esempio [node:title] viene sostituito col valore del Campo "titolo" del Contenuto (=nodo) mostrato in quel momento.

Token disponibili 

In Drupal sono disponibili decine di Token predefiniti, tra cui i due usati come esempio. L'elenco di questi Token è disponibile sul sito di Drupal. L'installazione di moduli aggiuntivi può aggiungere ulteriori Token. E se installi il modulo aggiuntivo "Twig Tweak", potrai anche accedere ad ulteriori Token di sistema, per qualche motivo tecnico non presenti nel Core.

In più, ad ogni Campo che aggiungiamo ad un Bundle viene associato un nuovo Token, formato dal nome del Bundle seguito dal nome interno del Campo. Ad esempio, se aggiungiamo agli Utenti un Campo "Telefono", viene associato il Token [user:telefono]. 

Per vedere tutti i Token presenti in un certo momento in Drupal bisogna installare il modulo aggiuntivo "Token". Dopo la sua attivazione, in Estendi - Token - Help puoi vedere tutti i Token disponibili. 

I Token sono raggruppati in una gerarchia, che consente di "scendere" da un Bundle ai suoi Campi. Ad esempio sotto la voce "Nodi" (=Contenuti) trovi i Token corrispondenti ai Campi dei Contenuti (non suddivisi per tipo di Contenuto).

I Token non corrispondenti a Campi sono anch'essi presentati gerarchicamente. Ad esempio, i Token relativa all'utente corrente sono raggruppati sotto "Current user" e quelli relativi alla app sotto "Site".

Come si usano i Token

Vedremo in diverse Guide che i Token si usano per:

Il motivo per cui descrivo i Token in questo punto di MieApp è che servono già a partire dalla prossima Guida.

In generale, i Token sono utilizzati in Campi testuali o comunque in punti in cui Drupal chiede di digitare un testo. Non è necessario conoscere a memoria i Token e neppure tornare ogni volta alla pagina sopra indicata che elenca tutti i Token: nei punti in cui Drupal accetta Token, viene mostrato un comando "Token" che mostra la gerarchia dei Token, oppure viene mostrato un elenco ridotto ai soli Token disponibili in quel punto (ad esempio, nella costruzione delle Viste, i Token disponibili sono mostrati sotto Sfoglia i Token disponibili o Replacement patterns).

Una volta trovato il Token desiderato, occorre copiarlo (selezionandolo e cliccando col pulsante destro il comando "Copia" oppure con la combinazione CTRL C) e incollarlo nella casella testuale dove intendiamo usarlo (comando "Incolla" o CTRL V).

In base al contesto in cui vengono utilizzati, i Token si presentano tra parentesi quadre es: [node:title] oppure tra doppia parentesi graffe es: {{ node.title.value }}. Non è necessario comprendere il motivo di questa differenza, perché Drupal provvede a mostrare i Token nella forma utile al contesto. 

Cosa sono i Contenuti

I Contenuti sono il tipo di Entità più generico e quindi più utilizzato per gestire informazioni nelle app. Prima di poter caricare Contenuti devi descrivere il loro tipo: il Tipo di Contenuto fa da modello o "stampo" per la creazione di Contenuti di quel tipo; il Tipo di Contenuto infatti definisce quali Campi sono richiesti, stabilisce come mostrarli, quali Utenti possono inserire Contenuti di quel tipo ecc.

Appena installato, Drupal gestisce un paio di Tipi di contenuto molto semplici - la "pagina" e l'"articolo" - pensati più per i siti informativi che per una app e quindi non ne parlerò. Vediamo invece come creare i Tipi di Contenuto che servono alla tua app.  

Quali Tipi di Contenuti mi servono?

Come suggerito, nella costruzione della app conviene partire dai dati che deve gestire. Non considerando i dati relativi agli Utenti, per i quali c'è un tipo apposito di Entità (gli Utenti, appunto), per tutti gli altri dati la prima ipotesi è quella di gestirli con diversi Tipi di Contenuto. Ad esempio, per la app "Miei Libri" servono i Tipi di Contenuto "Libro" per rappresentare il libro prestato, "Amico" per rappresentare l'amico cui presto il libro e "Prestito" per rappresentare il prestito effettuato di un libro ad un amico. Per la app "Prestiti tra Vicini", più complessa della precedente, servono più Tipi di Contenuto: "Oggetto" (l'oggetto prestato), "Ambito" (l'ambito di utilizzo dell'Oggetto.es "giardino"), "Richiesta" (la richiesta di prestito di un oggetto da parte di un vicino), "Concessione" (la concessione di prestito da parte del proprietario dell'oggetto), "Nota" (una nota a corredo di una Richiesta, scritta dal richiedente o dal proprietario), "Consegna" (la ricevuta di avvenuta consegna dell'Oggetto), "Valutazione" (la valutazione finale sull'esperienza di prestito), "Luogo" (un luogo aperto al pubblico dove può avvenire lo scambio degli oggetti) e "Abilitazione" (l'abilitazione di un operatore ad agire in un Luogo); non serve "Amico" perché le persone cui prestare gli Oggetti sono Utenti della app.

Più Tipi di Contenuto crei, più la costruzione della app si complica: se ti accorgi che due Tipi di Contenuti hanno gli stessi Campi o quasi, ti conviene fare un supplemento di analisi per capire se puoi gestire entrambi con un solo Tipo di Contenuto, eventualmente prevedendo che qualche Campo non sia sempre utilizzato. Viceversa, se Utenti diversi modificano Campi diversi dello stesso Tipo di Contenuto, poiché i Permessi di un Utente si applicano all'intero Contenuto e non ai singoli Campi, per consentire ad ogni Utente di modificare solo i Campi cui ha diritto, spesso la soluzione più semplice è dividere il Tipo di Contenuto in due Tipi collegati tra loro da un Campo riferimento: ad esempio, nella app "Prestiti tra vicini" il "prestito" viene appunto rappresentato da due Tipi di Contenuto, uno scritto dall'Utente che chiede in prestito l'Oggetto ("Richiesta") e l'altro è scritto dall'Utente proprietario dell'Oggetto richiesto ("Concessionario"). Richiesta e Concessione sono collegati dal Campo di tipo riferimento della Concessione, che richiama la Richiesta cui la Concessione risponde. 

Creare un nuovo Tipo di Contenuto

Ecco come Amministratore puoi creare un nuovo Tipo di Contenuto ed aggiungervi i Campi che lo contraddistinguono:

Titoli automatici

Il Campo Titolo è presente ed obbligatorio per tutti i Contenuti e serve di solito per identificare visivamente il Contenuto stesso. 

In alcuni casi l'uso del campo Titolo è intuitivo: ad esempio, nella app "Miei Libri" il Campo Titolo di un Libro è usato proprio per memorizzare il suo titolo scritto in copertina. In altri casi, non è intuitivo cosa scrivere nel Titolo: ad esempio, per le Richieste della app "Prestiti tra vicini" conviene riportare informazioni già presenti negli altri Campi (es. "Richiesta di Carlo Rossi per la Falciatrice XYZ di Elena Verdi") oppure limitarsi ad un semplice "Richiesta n. X", rinviando alla lettura dei Campi per sapere di cosa si tratta. In questi casi, può essere comodo lasciare a Drupal la compilazione automatica del Titolo.

Per automatizzare la compilazione del Titolo servono i moduli aggiuntivi "Automatic Entity Label,  "Token" e "Serial". Installati ed attivati questi moduli, per istruire Drupal a riempire automaticamente il Titolo di un Tipo di Contenuto:

Con la stessa modalità è possibile compilare automaticamente Titolo più ricchi: ad esempio si potrebbe generare il Titolo "Richiesta n. X di Y" dove Y è il nome dell'Utente richiedente, semplicemente cercando e selezionando nell'esempio precedente il Token [node:author]. Poiché il Titolo di un Contenuto è mostrato nella pagina del Contenuto stesso con un carattere grande, suggerisco di non comporre titoli automatici troppo lunghi.  

Riusare i Campi 

In una app possono servono decine di Campi. Per ridurne la proliferazione, è possibile "riciclare" un Campo su più Tipi di Contenuto. 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. 

Eliminare un Campo

Se un Campo non 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 impedire il funzionamento di una Vista: se decidi di procedere lo stesso, la Vista non viene cancellata ma disabilitata, per consentirti di modificarla e rimetterla in linea senza quel Campo.

L'eliminazione di un Campo riusato ne comporta la scomparsa da 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 nasconderlo all'Utente.

Cambiare il tipo di un Campo

Se hai scoperto che invece che un Campo numerico intero serve un Campo numerico con virgola, oppure che risulta più semplice gestire un Campo di tipo data come un Campo testo, devi sapere 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 informatiche e molta attenzione. Quando mi è capitato di doverlo fare, ho scelto questa 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 idati.

Con la Guida precedente hai creato uno o più Tipi di Contenuto dove memorizzare i dati della tua app. Vediamo ora i comandi base disponibili all'Amministratore per popolare la app di Contenuti. Questi comandi sono sufficienti per la app "Miei Libri" perché l'unico Utente è proprio l'Amministratore. Nelle Guide successive vedremo invece come predisporre per gli Utenti comandi semplificati per gestire i Contenuti, come ad esempio nella app "Prestiti tra Vicini". 

Creare nuovi Contenuti

Creato un Tipo di Contenuto, per creare un Contenuto di quel tipo utilizza il comando Contenuto - Aggiungi contenuto e seleziona il Tipo di Contenuto. Ti viene mostrata la pagina di creazione in cui compilare i Campi del nuovo Contenuto. La pagina di creazione è anche richiamabile col link:

/node/add/tipo_contenuto

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

/node/add/richiesta

Se l'ordine con cui i Campi sono mostrati nella pagina di creazione non ti soddisfa, col comando Struttura - Tipi di contenuto - Gestione visualizzazione form a fianco del Tipo di Contenuto richiami 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. 

Precaricare i Campi di un nuovo Contenuto

In alcune situazioni può risultare utile precaricare il valore di uno o più Campi del nuovo Contenuto, per ridurre gli errori di digitazione. Il Campo può essere precaricato con un valore fisso o dinamico.

PRECARICARE UN VALORE FISSO

In Struttura - Tipi di Contenuto seleziona Gestione Campi del Tipo di Contenuto, clicca Modifica sul Campo, attiva Set default value e digita o seleziona il valore di default: nella pagina di creazione di un nuovo Contenuto, il Campo apparirà precaricato con quel valore, che l'Utente potrà modificare.

PRECARICARE UN VALORE DINAMICO

Questa soluzione consente di precaricare un Campo di un nuovo Contenuto tenendo conto del contesto in cui avviene la creazione. Ad esempio, nella app "Prestiti tra Vicini" il tipo di Contenuto "Richiesta" ha un Campo riferimento "Oggetto" che richiama l'Oggetto chiesto in prestito; volendo presentare all'Utente un comando "Chiedi in prestito" mentre sta guardando uno specifico Oggetto, è utile precaricare nel Campo "Oggetto" della nuova Richiesta l'identificativo di quell'Oggetto, evitando così che l'Utente debba selezionarlo nuovamente, magari sbagliandosi.

Per ottenere questo risultato, serve il modulo aggiuntivo Entity Prepopulate. Installato ed attivato il modulo, devi (a) predisporre il Campo "Oggetto" della Richiesta a ricevere via link l'identificativo dell'Oggetto e (b) scrivere l'identificativo dell'Oggetto nel link di richiamo della pagina di creazione della Richiesta.

a. Predisporre il Campo a ricevere un valore via link

Per predisporre  il Campo "Oggetto" della Richiesta a ricevere via link l'identificativo dell'Oggetto:

  • vai in Struttura - Tipi di contenuto - Richiesta - Gestisci Campi - Oggetto - Modifica
  • nella sezione Entity Prepopulate digita il Token [current-page:query:oggetto]

Il Token [current-page:query:oggetto] (messo a disposizione dal modulo "Entity Prepopulate") consente di recuperare dal link che richiama la pagina il valore associato all'argomento "oggetto". Come sempre, non è necessario ricordare il Token a memoria, perché è tra quelli elencati nella pagina di configurazione del Campo. Non è necessario che l'argomento si chiami come il Campo, funzionerebbe lo stesso se al posto di "oggetto" scrivessimo "id", "ogg" o una qualunque altra parola.

b. Scrivere nel link il valore del Campo  

Abbiamo già visto che il link per richiamare la pagina di creazione di una Richiesta è:

/node/add/richiesta

Per precaricare nel Campo "oggetto" della nuova Richiesta uno specifico Oggetto, scriviamo il suo identificativo (es. 371) nel link nel seguente modo:

/node/add/richiesta?oggetto=371

Vedremo più avanti come costruire questi link, deducendo automaticamente dal contesto l'identificativo da scrivere nel link.

Con la stessa tecnica, possiamo precaricare nel link più Campi, concatenandoli in questo modo:

/node/add/tipo_contenuto?campo1=valore1&campo2=valore2&campo3=valore3

Il carattere ? inizia l'elenco delle coppie argomento=valore ed il carattere & separa le diverse coppie tra loro.

Cercare i Contenuti

Come Amministratore, nella sezione Contenuto trovi un semplice modulo per la ricerca dei Contenuti inseriti. Gli altri Utenti useranno il motore di ricerca di Drupal o - meglio - le Viste che tu metterai a loro disposizione.  

Come viene mostrato un Contenuto

Ogni Contenuto inserito è visibile alla pagina:

/node/ID

dove ID è l'identificativo del Contenuto.

Se l'ordine con cui i Campi sono mostrati nella pagina di visualizzazione non ti soddisfa, vai in Struttura - Tipi di contenuto e seleziona  Gestione visualizzazione a fianco del Tipo di Contenuto: oltre a modificare l'ordine, puoi anche nascondere Campi o le loro etichette e, per alcuni tipi di Campi, modificare la modalità (Widget) con cui è mostrato il valore. Per nascondere un Campo basta trascinarlo sotto Disattivati. 

Vedremo più avanti come migliorare ed arricchire la pagina di visualizzazione dei Contenuti.

Modificare un Contenuto

Per modificare un Contenuto, vai nella sua pagina di visualizzazione e clicca Modifica. Puoi anche andare direttamente alla pagina di modifica con questo link:

/node/ID/edit

Eliminare un Contenuto

Per eliminare un Contenuto, vai alla sua pagina di visualizzazione e clicca Elimina. Puoi anche andare direttamente alla pagina di eliminazione con questo link:

/node/ID/delete

Un Contenuto eliminato non è più recuperabile.

Nascondere un Contenuto

Se vuoi rendere invisibile un Contenuto senza eliminarlo (ad esempio per ripresentarlo più avanti), vai in Modifica del Contenuto e disattiva il Campo Pubblicato.

Se la tua app prevede altri Utenti oltre a te, queste Guide ti spiegano come aggiungere, modificare, disabilitare le altre persone all'uso della app.

Chi sono i Visitatori

La tua app è potenzialmente visibile a tutte le persone che conoscono l'indirizzo della app, a maggior ragione se hai installato Drupal in cloud. 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 cosa possono fare i Visitatori, considerando anche la possibilità che alcuni di loro abbiano intenzioni malevoli.

Cosa possono fare i Visitatori

Di default, Drupal concede ai Visitatori il permesso di vedere tutti i Contenuti pubblicati. Se la tua app è semplicemente un distributore di informazioni pubbliche, questa impostazione è adeguata. Ma se la tua app contiene informazioni riservate a te e  alle persone che hai autorizzato, allora devi modificare questa impostazione:

Salvo esigenze particolari, ai Visitatori non devono essere concessi i Permessi di creazione, modifica o cancellazione di nuovi contenuti: di default non sono concessi, ma verifica la situazione osservando in Persone - Permessi le caselle attive nella colonna Utente anonimo. 

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 vuoi aggiungere istruzioni alla pagina di login, ad esempio per invitare i Visitatori 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):

Chi userà la tua app?

Con l'installazione di Drupal, viene creato l'Utente Amministratore. Se sei l'unica persona che utilizzerà la app che vuoi costruire, non ti servono altri Utenti, altrimenti dovrai gestire un Utente per ogni persona che la userà, per evitare che più persone si presentino alla app come se fossero il medesimo Utente, prassi contraria alla privacy ed alla sicurezza informatica.

Persone e Utenti

Non tutte le persone di cui tratterà la tua app sono necessariamente Utenti della app stessa. Ad esempio, nella app "Miei Libri" le persone cui presti i tuoi Oggetti non sono Utenti della app, di cui molto probabilmente ignorano persino l'esistenza, ma le gestiremo come Contenuti. Se, come invece è previsto nella app "Prestiti tra Vicini", le persone devono operare nella app, allora devono essere gestiti come Utenti. 

Creare gli Utenti

Per ogni persona cui intendi far usare la tua app devi creare un Utente, assegnando 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
  • 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

Autoregistrazione degli Utenti

 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 che consente al Visitatore di autoregistrarsi fornendo il proprio indirizzo mail. La app invia al Visitatore una mail con un link da cliccare per completare la registrazione: solo a quel punto il Visitatore può scegliere il proprio nome utente e la propria password.

ATTENZIONE: Se consenti ai Visitatori di iscriversi da sé, devi necessariamente attivare la spedizione di mail da parte della app, altrimenti la app non potrà inviare la mail al Visitatore e quindi la procedura di registrazione non può essere completata.

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 e senza perdere le informazioni ad esso associate (es. i suoi Prestiti). Per bloccare un Utente:

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

Cambio della password di un Utente

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

Se un Utente ha dimenticato la propria password e quindi non può entrare nella app per impostarne una nuova, può usare il comando Reimposta la tua password disponibile nella pagina di login, purché tu abbia attivato la spedizione mail dalla app.

Se invece non hai attivato la spedizione mail, dovrai impostare da te stesso la nuova password all'Utente, entrando in Modifica sull'Utente stesso. Drupal non ti consente di conoscere l'attuale password di un Utente, ma puoi impostarne una nuova senza conoscere la precedente.

Utenti di prova

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

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

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

Contatti con gli Utenti

Drupal offre un semplice sistema attraverso cui gli Utenti della tua app possono contattare te (o un'altra persona a tua scelta) senza necessità che gli Utenti conosca il tuo indirizzo:

I messaggi composti dagli Utenti attraverso il comando Contatti ti vengono inviati via mail  Quindi questa funzione richiede che la app sia in grado di spedire mail.

Ruoli degli Utenti

Oltre al Ruolo base di utente autenticato, è possibile assegnare altri Ruoli agli Utenti, che definiscono cosa possono fare. Come Amministratore puoi definire nuovi Ruoli, cui affidare compiti specifici nella app. Ad esempio, nella app "Prestiti tra Vicini" vogliamo distinguere tra Utenti che si scambiano Oggetti (Ruolo "Vicino"), Utenti che consegnano Oggetti presso le Sedi autorizzate (Ruolo "Operatore") e Utenti che supportano l'Amministratore nella gestione della app (Ruolo "Gestore").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. 

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

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.  

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 

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. 
Creato l'Utente come precedentemente spiegato, per nominarlo Amministratore basta attivare per esso il ruolo Amministratore.

Deleghe parziali di Amministrazione

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

Col modulo aggiuntivo "Administer Users by Role" puoi delegare la sola 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 "Prestiti tra Vicini" delego la gestione degli Utenti al Ruolo "Gestore", escludendo che un Gestore possa intervenire sugli altri Gestori. Per le istruzioni vedi la documentazione del modulo.

Col modulo aggiuntivo "Delegate Permission" puoi delegare singole funzioni di Amministratore.

Monitorare le visite alla app

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

Una volta installato e attivato:

Monitorare specifiche azioni

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

Definite le Entità gestite dalla app e i Ruoli degli Utenti nella app, vediamo come proteggere le Entità rispetto agli interventi degli 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 (Create Read Update 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. 

Visualizzazione (Read): esiste un solo Permesso Visualizza contenuti pubblicati, che vale per tutti i Tipi di Contenuto: negando questo Permesso ad un Ruolo si impedisce a tutti gli Utenti con quel Ruolo di vedere qualunque Contenuto. Due tipici casi in cui negare questo Permesso: (1) negare ai Visitatori l'accesso a tutti i Contenuti, per riservarli ai soli Utenti registrati (2) negare agli Utenti registrati l'accesso indiscriminato a tutti i Contenuti, per poi concederlo selettivamente agendo sui Permessi delle Viste o coi Worklow o con altri moduli, come vedremo più avanti. Ad esempio, nelle app "Miei Libri" e "Prestiti tra Vicini" spengo il Permesso Visualizza contenuti pubblicati per il Ruolo Utente Anonimo, per impedire ai Visitatori la visualizzazione delle informazioni contenute nelle app ai Visitatori.

Creazione (Create): esiste un Permesso Crea nuovo contenuto per ogni Tipo di Contenuto, che può essere concesso o negato ai singoli Ruoli. Ad esempio, nella app "Prestiti tra vicini" per limitare ai soli Gestori il potere di stabilire le Sedi in cui avvengono consegne di Oggetti e di abilitare gli Operatori nelle Sedi, concediamo il Permesso Crea nuovo contenuto su "Sede" e "Abilitazione" solo al Ruolo "Gestore" e lo neghiamo ai Vicini e agli Operatori.

Modifica (U):  esistono due Permessi per ogni Tipo di Contenuto: il Permesso Modifica i propri contenuti consente all'Utente di modificare i Contenuti che ha creato, mentre il  Permesso Modifica tutti i contenuti consente all'Utente di modificare anche i Contenuti creati da altri Utenti. Ad esempio, nella app "Prestiti tra Vicini" per consentire ad un Gestore di modificare le informazioni relative a Sedi e Abilitazioni inserite da altri Gestori, concediamo il Permesso Modifica tutti i contenuti su "Sede" e "Abilitazione" al Ruolo Gestore; nella stessa app, per impedire a un Vicino di intervenire su un Prestito altrui mantenendo il controllo sui propri Prestiti, al Ruolo "Vicino" sul tipo "Prestito" concediamo il Permesso Modifica i propri contenuti ma neghiamo il Permesso Modifica tutti i contenuti. Vedremo coi Workflow come gestire casi più complessi, in cui il Permesso di modifica varia nel tempo.

Eliminazione (D): come per la modifica, esistono due Permessi per ogni Tipo di Contenuto: il Permesso Elimina i propri contenuti e il Permesso Elimina tutti i contenuti.

Come concedere e negare Permessi ai Ruoli

La pagina Persone - Permessi presenta una tabella, in cui le colonne corrispondono ai Ruoli e le righe ai Permessi: attivando la casella si concede il Permesso al Ruolo, disattivandola lo si nega. 

Limiti delle protezioni basate su Ruoli e Permessi

La protezione base offerta da Ruoli e Permessi può risultare insufficiente alla app che stai costruendo, perché:

  • esiste un solo Permesso di visualizzazione per tutti i Contenuti, quindi non è possibile nascondere uno specifico tipo di Contenuto ad uno specifico Ruolo
  • i Permessi assegnati ad un Ruolo su un tipo di Contenuto valgono per tutti Contenuti di quel tipo e per tutti gli Utenti che hanno quel Ruolo; non è possibile diversificare i Permessi per singolo Contenuto o singolo Utente
  • I Permessi sono staticamente assegnati dall'Amministratore e non possono essere modificati né dagli Utenti né dagli eventi che occorrono nella app
  • Ruoli e Permessi non consentono di suddividere gli Utenti in gruppi che condividono un insieme di Contenuti, nascondendole agli altri Utenti con gli stessi Ruoli; perciò non consentono di usare la medesima installazione di una app per diversi comunità o clienti (app multitenant).

Se per la app che stai costruendo questi limiti possono costituire un problema (ad esempio, lo sono per la app "Prestiti tra Vicini"), nelle prossime Guide troverai altri metodi per proteggere i Contenuti in modo più flessibile. 

Abbiamo visto che è possibile mettere in relazione una Entità A con un'altra Entità B aggiungendo all'Entità A un Campo di tipo riferimento che richiama l'Entità B  (A → B). Se l'Entità B viene eliminata, quel Campo si svuota e l'Entità A, pur continuando ad esistere, perde una delle sue informazioni. Ad esempio, nella app "Prestiti tra Vicini" la Richiesta ha un Campo riferimento di nome "Oggetto" in cui si richiama l'Oggetto chiesto in prestito: se l'Oggetto richiesto viene eliminato, si perde l'informazione su cosa è stato chiesto.

Per impedire questa situazione, nei Ruoli e Permessi possiamo negare a tutti i Ruoli il Permesso di eliminare gli Oggetti. Questa soluzione può risultare eccessivamente vincolante, perché impedisce di eliminare Oggetti inseriti erroneamente nella app. 

In realtà, quel che vorremmo realmente impedire è l'eliminazione di una Entità solo se è già stata richiamata da un'altra Entità. A questo scopo possiamo installare ed attivare il modulo aggiuntivo Entity Reference Integrity. che aggiunge in Configurazione - Entity Reference Integrity la possibilità di proteggere i Contenuti dall'eliminazione se già richiamati da altre Entità. Attivata questa protezione, se un Utente tenta di eliminare un Contenuto (ad esempio un Oggetto) richiamato da altri Contenuti (es. in una Richiesta) l'operazione viene bloccata e viene mostrato all'Utente l'elenco dei Contenuti (Richieste) che lo richiamano. Questo metodo è molto robusto, perché incarica Drupal di impedire ogni eliminazione che distrugga relazioni tra Contenuti. Di contro, è un metodo rigido, perché:

  • si applica a tutti i Contenuti, indipendentemente dal tipo di Contenuto e 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.

Una soluzione più flessibile consiste nell'aggiungere agli Oggetti un Campo "Attivo" di tipo booleano o selezione, con valori possibili "Si" e "No" e default "Si": invece che eliminare un Oggetto, mettiamo il suo Campo "Attivo" a "No" e, nella creazione o modifica di una Richiesta, escludiamo con un apposito filtro la possibilità di selezionare gli Oggetti con Attivo = "No" nella compilazione del Campo "Oggetto".

Abbiamo visto che la protezione base offerta da Permessi e Ruoli è statica: i Permessi assegnati ad un Utente su una Entità non variano nel tempo, salvo che l'Utente cambi Ruolo. 

Ci sono però casi in cui i Permessi devono cambiare a fronte di eventi che accadono: pensiamo ad esempio ad un documento che può essere modificato dal suo autore fintanto che non viene firmato dall'autore stesso oppure validato dal suo superiore. Anche nella app "Prestiti tra vicini" troviamo diversi esempi di Permessi che variano in funzione di eventi: una Richiesta di prestito può essere modificata o eliminata dal richiedente fintanto che il proprietario dell'Oggetto richiesto non concede il prestito; a sua volta, la Concessione di un oggetto in prestito può essere modificata o eliminata fintanto che l'oggetto non è stato fisicamente consegnato.

Per configurare Permessi dinamici che variano a fronte di eventi che accadono nella app si possono usare i Workflow.

Cos'è un Workflow

Un Workflow è uno strumento messo a disposizione dal modulo aggiuntivo Workflow, che quindi deve essere installato ed attivato.

Con un Workflow è possibile rappresentare il "ciclo di vita" di un Contenuto, come una sequenza di "stati" attraverso cui il Contenuto passa dalla creazione all'eliminazione finale. Il passaggio da uno stato al successivo è provocato da un evento. Ogni stato definisce i Permessi di visualizzazione, modifica ed eliminazione dei diversi Ruoli e dell'Autore su quel Tipo di Contenuto e i passaggi da uno stato all'altro autorizzati per il Ruolo.  

ARRIVATO QUI 

In particolare, lo stato del Workflow può assegnare (ma non può togliere) i Permessi di visualizzazione, modifica ed eliminazione, mentre non può intervenire sul Permesso di creazione. Perché un Workflow sia efficace, occorre quindi togliere dai Permessi base (gestiti in Persone - Permessi) i Permessi di modifica e eliminazione del Ruolo sul Tipo di Contenuto, lasciando (se necessario) il Permesso di creazione e il Permesso generale di visualizzazione dei Contenuti.

L'evento che cambia lo stato può essere:

  • La modifica manuale dello stato da parte dell'Utente. Come vedremo in dettaglio tra poco, lo stato di un Contenuto è memorizzato in un Campo di tipo "workflow" del Contenuto stesso. Il modo più semplice per cambiare lo stato di un Contenuto consiste quindi nel modificare il valore di quel Campo. Poiché il Campo workflow è un Campo come gli altri, ne consegue che un Utente può cambiare lo stato di un Contenuto fintanto che ha il Permesso di modifica su quel Contenuto. Se, in seguito al cambio di stato, l'Utente perde il Permesso di modifica del Contenuto, l'Utente non potrà più neppure modificarne ulteriormente lo stato.
  • L'esecuzione di una procedura lanciata dall'Utente. Per consentire ad un Utente di cambiare lo stato su un Contenuto per il quale non ha (più) il Permesso di modifica, si può predisporre una procedura ECA ed esporre all'Utente un comando che lancia quella procedura: la procedura sarà eseguita coi privilegi di Amministratore e supererà quindi la limitazione imposta all'Utente.
  • L'esecuzione automatica di una procedura. Una procedura ECA che modifica lo stato di un Contenuto può anche essere lanciata automaticamente da Drupal come risposta ad un evento che occorre nella app. Ad esempio, nella app "Prestiti tra vicini" quando viene scritta nella app la prima Consegna di un Oggetto nell'ambito di un prestito, parte automaticamente una procedura che cambia lo stato della Concessione da "aperta" a "in corso". Analogamente, quando viene scritta la Consegna con cui l'Oggetto torna al proprietario, parte un'altra procedura che cambia lo stato della Concessione da "in corso" a "conclusa".

Solo il primo tipo di evento viene rappresentato nel disegno del Workflow, perché gli altri sono eseguiti come eccezioni rispetto ai Permessi descritti nel Workflow.

Attivazione di un Workflow

Per attivare un Workflow su un tipo di Contenuto occorre:

  • descrivere il Workflow
  • abilitare gli Utenti all'uso del Workflow
  • applicare il Workflow al tipo di Contenuto

Descrivere un Workflow

Per descrivere un Workflow, vai in Configurazione - Workflow e ne definisci gli stati, i passaggi tra gli stati e i Permessi dei diversi Ruoli in ogni stato:

Come esempio, disegniamo il Workflow delle Richieste per la app "Prestiti tra vicini". Alla creazione, una Richiesta è "aperta" ed è modificabile e eliminabile. Mentre è "aperta" può essere modificata o anche eliminata. Diventa "in corso" - e non più modificabile ed eliminabile - quando il proprietario dell'Oggetto richiesto crea la Concessione in risposta alla Richiesta. Diventa "conclusa" quando l'Oggetto è tornato al proprietario. 

Puoi vedere altri esempi di Workflow nella pagina dedicata alla app. 

Abilitare gli Utenti al workflow

Descritto un Workflow, in Persone - Permessi appare un nuovo Permesso che, se attivato su un Ruolo, autorizza gli Utenti con quel Ruolo a partecipare al Workflow. Inoltre occorre coordinare i Permessi base con quelli aggiunti dal Workflow, tipicamente togliendo da Persone - Permessi i Permessi che sono poi concessi dal Workflow, tenendo conto che:

Applicare il Workflow alle Entità

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

Nella app di esempio "Vicinato", aggiungiamo al Tipo di Contenuto "Richiesta" uno Campo Workflow di nome "Stato", specificando il Workflow "Richiesta". Analogamente aggiungiamo un Campo Workflow a Consegna e Valutazione, sempre di nome "Stato" e specificando per ognuno il Workflow corrispondente.

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

Cambiare lo stato di una Entità

Per cambiare lo stato di una Entità, l'Utente modifica il valore del Campo Workflow: Drupal presenta all'Utente solo gli stati per cui è prevista nel Workflow una transizione dallo stato corrente dell'Entità. Per cambiare il valore del Campo Workflow, l'Utente deve avere il Permesso di modificare l'Entità. 

Se però nel nuovo stato in cui l'Utente porta l'Entità l'Utente stesso non ha più il Permesso di modifica, non potrà più neppure cambiarne lo stato. Ad esempio, nella app "Vicinato" un Partecipante può modificare una propria Valutazione fintanto che il Campo Stato vale "Bozza"; dopo che il Campo Stato è passato a "Firmata", la Valutazione diventa immodificabile anche per lui.

Lo stato può essere modificato anche da Drupal, mediante procedure automatiche che modificano il valore del Campo Workflow. Vedremo ad esempio come costruire la procedura che cambia automaticamente lo Stato di Richieste quando vengono accettate le Consegne di inizio e fine prestito. Le procedure automatiche possono essere costruire in modo da superare i Permessi e quindi forzare un cambio di stato non (più) possibile agli Utenti. 

GUIDA CHE TRATTA Taxonomy Access Control Lite e su Content Access

 Content Access: una volta installato ed attivato, consente di definire per ogni tipo di Contenuto (ed eventualmente per ogni singola Contenuto) i permessi di visualizzazione, modifica e cancellazione di ogni Ruolo Utente, considerando l'Autore come un Ruolo a se stante. Utilizzato insieme al modulo ACL, dovrebbe consentire di assegnare i permessi al singolo Utente e non solo per Ruoli. E' infine possibile automatizzare l'assegnazione dei permessi mediante procedure ECA, grazie al modulo ECA Content Access. Ad esempio. possiamo costruire una procedura ECA che renda non più modificabile da nessuno (neppure da parte del Proprietario e del Richiedente) una Richiesta ed un Prestito conclusi, dopo un certo periodo di tempo dalla data di restituzione.

GUIDA CHE TRATTA I GRUPPI

Modellate le informazioni che la app deve gestire e caricati i primi Contenuti, vediamo ora come presentarli agli utenti della app con le Viste di Drupal.

Cosa sono le Viste

Le informazioni che abbiamo memorizzato in Drupal possono essere mostrate agli Utenti con "viste" differenti sulle Entità, da mostrare in base alle esigenze specifiche dell'Utente che sta usando la app ed allo scopo per cui le sta guardando. Lo strumento con cui ottenerle da Drupal si chiama (non a caso) Viste (Views). Le Viste sono costruite dall'Amministratore specificando:

  • quali Entità estrarre dal database di Drupal, senza necessità di conoscere il linguaggio di interrogazione del database (SQL)
  • come presentarle all'Utente, senza necessità di conoscere il linguaggio di costruzione delle pagine web (HTML)

Le Viste sono fornite dal modulo Views installato di default in Drupal. 

A cosa servono le Viste

Le Viste sono utilizzate non solo per presentare le Entità all'Utente, ma anche per aggiungere comandi personalizzati sulle Entità, mostrare informazioni correlate all'Entità mostrata, cercare nelle Entità, fornire i dati per le operazioni automatiche sulle Entità ecc. In pratica, gran parte dello sforzo di costruzione di una app consiste nella costruzione di Viste. Imparare a preparare le Viste è quindi fondamentale per costruire le app con Drupal. Personalmente, ho un approccio molto "Vista-centrico" alla costruzione delle app e tendo ad usare le Viste un po' per tutto. Dedicherò quindi un buon numero di Guide, partendo dalle più semplici ad alcune più complesse, seguendo come esempio didattico i percorsi previsti per la app Prestiti tra vicini. E' molto probabile che la tua prima app necessiti di Viste abbastanza semplici, ma ritengo utile presentarti un insieme di tecniche di utilizzo delle Viste che potrebbero esserti utili in futuro.

Come primo esempio, costruiamo una semplice Vista che elenca i Libri nella app di esempio "Miei Libri", che realizza la pagina "Biblioteca" prevista nella app.

Creare una nuova Vista

Ecco come creare una nuova Vista:

1. Creare la Vista: In Struttura - Viste clicca  Aggiungi nuova vista e digita il nome della nuova vista (es. "Biblioteca")

2. Selezionare cosa mostrare: In Mostra seleziona che tipo di Entità mostrare nella Vista (es. contenuto di tipo "Libro")

3. Descrivere la Vista: Attiva l'opzione Descrizione e descrivi a tua memoria futura cosa fa la Vista (es. "Elenco dei miei Libri") 

4.Definire il link con cui richiamare la Vista: In Percorso digita il link con cui sarà richiamata la Vista (es. "/biblioteca")

5. Scegliere come mostrare le Entità: Attiva la creazione di una Pagina, mostra il risultato come Tabella.. In Elementi da visualizzare scegli quanti elementi mostrare per pagina (es. 20) e attiva Usare un paginatore. Salva.

La tua prima Vista è già pronta al link da te indicato (https://TUOSITO/biblioteca) e elenca le Entità da te scelte (in questo caso i Libri)

L'editor della Vista e le sue sezioni

Salvata la Vista, si apre automaticamente l'editor della Vista (Views UI), composto da diverse sezioni, ognuna delle quali configura un aspetto della Vista. Imparare a costruire le Viste consiste essenzialmente nell'imparare cosa scrivere o selezionare nelle diverse sezioni dell'editor. Ecco una rapida spiegazione delle diverse sezioni, che saranno dettagliate a mano a mano che ci serviranno per costruire le Viste di esempio.

(*) Questa sezione cambia nome e contenuto in base al tipo di Visualizzazione: si chiama Impostazione pagina se si è scelto di creare una pagina.

Nell'editor troviamo precaricate le scelte già effettuate al momento della creazione della Vista; per l'esempio sopra riportato: 

  • nella sezione Visualizzazioni compare una Visualizzazione di tipo Pagina e, come Formato ritroviamo Tabella
  • nella sezione Impostazioni pagina - Percorso compare il link di richiamo della Vista ("/biblioteca")
  • nella sezione Criteri del filtro compaiono due Filtri, uno che limita la Vista ai soli Contenuti "pubblicati" e l'altro che la limita ai soli Contenuti di tipo "Libro".
  • nella sezione Campi compare il Campo "Titolo" dei Libri
  • nella sezione Paginazione compare l'esistenza di un paginatore ogni 20 elementi

Se abbiamo già caricato nella app qualche Libro di prova, sotto Anteprima possiamo già vedere come si presenterà la Biblioteca: una tabella che elenca 20 Libri per pagina, con i comandi per cambiare pagina. 

Vediamo ora come migliorare questo primo risultato, mostrando altre informazioni sui Libri e riordinando i contenuti.

Come elencare le Entità (sezione Formato)

La sezione Formato della Vista definisce come mostrare l'elenco delle Entità. I Formati disponibili nativamente sono Tabella (una riga per ogni Entità, una colonna per ogni Campo mostrato), Responsive grid (griglia di Entità), Elenco non formattato (una riga per ogni Campo di ogni Entità) ecc. I moduli aggiuntivi possono aggiungere nuovi formati, ad esempio vedremo più avanti come presentare Entità georeferenziate su una mappa. 

FORMATO TABELLA

Il formato Tabella è quello più intuitivo. Può però risultare di difficile consultazione su uno schermo piccolo, come quello degli smartphone, nel caso che vogliamo mostrare molte informazioni (quindi molte colonne) per ogni Entità. Per risolvere questo problema ci sono diverse soluzioni.

Aggregare più Campi in una sola colonna: Entrando nelle Impostazioni del Formato, è possibile selezionare per ogni Campo la Colonna in cui mostrarlo, che può essere la colonna del Campo stesso oppure la colonna di un altro Campo, riducendo così il numero di colonne della tabella; in questo caso, possiamo anche specificare il Separatore, cioè il carattere o la sequenza di caratteri che separano i diversi Campi aggregati nella stessa colonna: ad esempio, possiamo digitare uno spazio bianco oppure la sequenza "<br>" che è un codice HTML che introduce un ritorno a capo tra i Campi.

Classificare i Campi per priorità: Entrando nelle Impostazioni del Formato, è possibile selezionare per ogni Campo il valore Responsive: i Campi per i quali selezioniamo "Alto"  sono sempre mostrati, indipendentemente dalle dimensioni dello schermo, mentre quelli con "Medio" o "Basso" sono mostrati solo se le dimensioni dello schermo lo consentono.

Questi metodi lavorano Vista per Vista. Se invece si vuole una soluzione che lavora automaticamente su tutte le Viste, si può installare il modulo aggiuntivo "Responsive Tables Filter". Una volta attivato, in Configurazione - Responsive Tables è possibile selezionare una dei metodi di restringimento delle tabelle, tipicamente Stack. Attivato il metodo, ci pensa Drupal automaticamente a impilare verticalmente i Campi se lo schermo è stretto. Ecco un esempio dell'effetto di questo modulo:

Tabella mostrata su uno schermo largo:

La stessa tabella su uno schermo stretto:

FORMATO ELENCO

Da Scrivere

Aggiungere Campi nelle sezioni

La configurazione di molte sezioni dell'editor delle Viste consiste nell'aggiunta e nella configurazione di Campi. Le modalità di identificazione, selezione e configurazione di un Campo sono sempre le stesse e quindi sono spiegate qui, una volta per tutte:

1. Aggiungere Campi ad una sezione della Vista: Clicca Aggiungi a fianco della sezione. Appare una finestra Aggiungi Campi, che elenca tutti i Campi disponibili per quella sezione.

2. Selezionare un Campo ed aggiungerlo alla sezione: Nella finestra  Aggiungi Campi seleziona in Categoria il tipo di Entità cui appartiene il Campo (es. se stai cercando il nome utente degli Utenti, in Categoria seleziona Utente). In Cerca digita una parte del nome del Campo (es: "nome"); se ci sono più Campi con lo stesso nome, verifica nella colonna Descrizione che il Campo sia quello desiderato. Identificato il Campo, per selezionarlo accendi la casella a fianco del Campo e clicca Aggiungi e configura campi. 

3. Collegare il Campo all'Entità principale della Vista: Nella finestra di configurazione del Campo, seleziona la Relazione che permette di raggiungere il Campo. Se il Campo è uno dei Campi dell'Entità principale su cui stai costruendo la Vista, non selezionare nulla. Sul concetto di Relazione torneremo in una prossima Guida, quindi per ora non preoccuparti se non è chiaro.

4. Completare la configurazione del Campo: In base alla sezione in cui stai lavorando ed al Campo selezionato, la finestra di configurazione può chiedere altre informazioni, che spiegheremo più avanti, caso per caso; alla fine clicca Salva

5. Riordinare i Campi nella sezione: l'ordine con cui i Campi sono elencati nella sezione è importante, perché Drupal li considera in quell'ordine. Ad esempio, nella sezione Criteri di ordinamento, se i Campi "Nome" e "Cognome" sono elencati in quest'ordine, le Entità saranno ordinate prima per nome e poi per cognome (quindi "Andrea Doria" verrà prima di "Carlo Bianchi"). Per riordinare i Campi elencati in una sezione, clicca Rearrange a fianco della sezione.

Quali Campi mostrare (sezione Campi)

La sezione Campi elenca i Campi da mostrare o comunque da considerare.  Ad esempio, nella Vista "Biblioteca" della app "Miei Libri" possiamo aggiungere nella sezione i Campi "Autore", "Categoria" e "Scaffale" con la modalità sopra descritta. Di default, i Campi di tipo riferimento sono mostrati come link all'Entità richiamata; quindi il Campo "Autore" è mostrato come un link alla pagina che mostra i dettagli dell'Autore, facilitando così la navigazione nella app. 

Se per un Campo accendiamo l'opzione Escludi dalla visualizzazione, il Campo non sarà mostrato ma diventa disponibile per altri scopi, ad esempio per costruire un Campo Globale - Testo personalizzato in cui mostrarlo insieme ad altre informazioni.

Se l'ordine con cui i Campi sono mostrati non ti soddisfa, nella sezione Campi clicca Rearrange e riordinali. 

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

La sezione Criteri di ordinamento elenca i Campi secondo cui le Entità devono essere ordinate nella Vista. Ad esempio, volendo ordinare i Libri nella Biblioteca per titolo del Libro, aggiungiamo nella sezione il Campo Contenuto - Titolo e specifichiamo ascendente. 

Se ci sono più Campi nella sezione, vengono usati da Drupal nell'ordine in cui sono elencati. Ad esempio, se vogliamo ordinare i Libri per Autore e poi per titolo, aggiungiamo anche il Campo "Autore" e poi nella sezione spostiamo il Campo "Autore" sopra il Campo "Titolo".

Filtrare le Entità (sezione Criteri del filtro)

La sezione Criteri del filtro elenca i Filtri con cui selezionare le Entità da elencare nella Vista. Ogni Filtro è formato da tre parti:

  • il Campo su cui agisce il Filtro (es. "Stato")
  • l'operatore con cui svolgere il confronto (es. è uguale a)
  • il valore da confrontare col contenuto del Campo (es. "Prestabile")

Per aggiungere un Filtro si aggiunge il Campo e poi si configura il Filtro selezionando l'operatore e specificando il valore (se previsto dall'operatore).

Quando si costruisce una nuova Vista, di default Drupal mette il Filtro "Contenuto pubblicato = Si", che evita di mostrare Contenuti nascosti.


Filtri Esposti (sezione Criteri del filtro)

I Filtri impostati nella sezione Criteri del filtro non possono essere modificati dall'Utente che sta usando la app.Se però attiviamo l'opzione Esponi questo filtro, per permettere ai visitatori di modificarlo, il Filtro viene mostrato all'Utente, perché possa modificarne il valore ed eventualmente anche l'operatore, ma non il Campo su cui agisce. Ad esempio, nella Vista "Biblioteca" possiamo esporre il Filtro che limita la Vista ai soli Libri prestabili, per consentire all'Utente di scegliere se vedere anche i Libri ritirati dal prestito.

Cercare nella Vista (sezione Criteri del filtro)

Nella sezione Criteri del filtro è disponibile il Campo speciale Globale - Combina filtri dei campi, che consente di aggiunge alla Vista una funzione di ricerca sulle Entità elencate.

1. Aggiungere la ricerca nella Vista: Nella sezione Criteri del filtro aggiungi il Campo Globale - Combina filtri dei campi ed attiva l'opzione Esponi questo filtro, per permettere ai visitatori di modificarlo: all'Utente viene mostrata una caselle in cui digitare le parole da cercare

2. Regolare la ricerca: Come operatore seleziona Contiene ogni parola, in modo da poter stringere la ricerca digitando più parole

3. Scegliere dove cercare: In Scegli i campi da combinare per il filtraggio seleziona i Campi testuali in cui cercare. I Campi devono essere presenti nella sezione Campi

Ad esempio, nella Vista "Biblioteca" possiamo aggiungere il Campo Globale - Combina filtri dei campi, specificando come operatore l'opzione Contiene ogni parola e come Campi in cui cercare selezionare il titolo, l'Autore e la Categoria.

Paginare la Vista (sezione Paginazione)

Se le Entità elencate sono molte, conviene dividere l'elenco in pagine, configurando la sezione Paginazione: in questa sezione seleziona Risultati paginati, paginatore ridotto oppure Risultati paginati, paginatore completo e regola la pagina specificando quante Entità mostrare in ogni pagina.

Proteggere la Vista (sezione Accesso)

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

  • Permesso: la Vista elenca le Entità tenendo conto dei Permessi degli Utenti sulle Entità. 
  • Ruolo: la Vista elenca le Entità solo agli Utenti che hanno uno o più Ruoli specificati  
  • Senza restrizioni: la Vista elenca le Entità a qualunque Utente, compresi i Visitatori

Il risultato dipende dalla combinazione tra questa impostazione, i Permessi attribuiti ai diversi Ruoli ed eventuali Permessi gestiti da moduli aggiuntivi. Salvo necessità più complesse, la soluzione più semplice è selezionare qui la protezione per Ruolo.

Aggiungere informazioni per l'Utente (sezione Intestazione o Piè di pagina)

Nella sezione Intestazione possiamo aggiungere Campi che mostrano informazioni all'Utente sopra l'elenco delle Entità, non riferite ad una specifica Entità. In questa sezione è disponibile il Campo speciale Globale - Area di testo in cui digitare un testo fisso da mostrare. E' anche disponibile il Campo Globale - Riassunto del risultato - Mostra il riassunto del risultato, che mostra il numero di Entità mostrate, accompagnato da un testo a piacere.

Ad esempio, per mostrare il numero di Libri elencati nella Vista "Biblioteca" aggiungiamo il Campo Globale - Riassunto del risultato e in Visualizzazione digitiamo "Ci sono @total Libri. Clicca su un Libro per i dettagli", dove @total viene automaticamente sostituito dal numero di Libri elencati.

Per mostrare le informazioni sotto l'elenco, inserisci il Campo nella sezione Piè di pagina.

Aggiungere relazioni nella Vista (sezione Relazioni)

Abbiamo visto che i Campi Riferimento consentono di costruire relazioni tra Entità. Data una Entità A con un Campo riferimento che richiama l'Entità B, se conosciamo l'Entità A possiamo arrivare all'Entità B. Indichiamo visivamente questa relazione come A→B. Si noti che le relazioni non sono simmetriche, cioè non è detto che, conoscendo B, si possa risalire con certezza ad A.

Possiamo usare la relazione A→B per aggiungere ad una Vista che elenca A anche le informazioni contenute nei Campi di B. Per far ciò dobbiamo aggiungere alla sezione Relazioni della Vista il Campo di A che regge la relazione con B. 

Come esempio, vediamo come costruire per la app "Prestiti tra vicini" una Vista che elenca le Richieste di prestito, accompagnate dalle informazioni sull'Oggetto richiesto e sul Vicino richiedente. Ciò è possibile perché la Richiesta ha un Campo riferimento "Oggetto" che richiama l'Oggetto (Richiesta→ Oggetto) e, come tutti i Contenuti, un Campo predefinito "Autore" che richiama l'Utente che ha creato la Richiesta (Richiesta→ Autore). 

Creata la Vista "Richieste" come abbiamo visto, aggiungiamo nella sezione Relazioni 

  • il Campo "Oggetto" della Richiesta; in titolo amministrativo possiamo rinominare la relazione come "Oggetto richiesto" per ricordarci qual è l'Entità richiamata dalla relazione
  • il Campo Utente - Nome - Il nome dell'utente o dell'autore, rinominandolo "Richiedente" 

Usare le relazioni nella Vista

Aggiunto nella sezione Relazioni il Campo dell'Entità A che regge la relazione A→B, per usare in un'altra sezione della Vista un Campo dell'Entità B basta aggiungere quel Campo specificando la relazione nella finestra di configurazione del Campo. Il Campo apparirà come "(Relazione) Campo" dove "Relazione" è il nome che abbiamo attribuito al Campo nella sezione Relazioni.

Tornando all'esempio, nella sezione Campi della Vista "Richieste" aggiungiamo:

  • il Campo "Titolo", lasciando vuoto Relazione perché vogliamo il titolo del Prestito e cambiando Etichetta come "Prestito"
  • il Campo "Titolo", selezionando nella configurazione come Relazione "Oggetto richiesto", che apparirà come "(Oggetto richiesto) Titolo" e cambiando Etichetta come "Oggetto"
  • il Campo "Immagine", selezionando come Relazione "Oggetto richiesto", che apparirà come "(Oggetto richiesto) Immagine"
  • il Campo "Nome", selezionando come Relazione "Richiedente", che apparirà come "(Richiedente) Nome"
  • il Campo "Cognome", selezionando come Relazione "Richiedente", che apparirà come "(Richiedente) Cognome" e cambiando Etichetta come "Richiedente"
  • il Campo "Stato", lasciando vuoto Relazione perché il Campo è del Prestito

Come abbiamo visto, aggreghiamo nella colonna "Richiedente" i Campi "(Richiedente) Nome" e "(Richiedente) Cognome" e nella colonna "Oggetto" i Campi "(Oggetto richiesto) Titolo" e "(Oggetto richiesto) Immagine". La Vista "Richieste" appare così:

RichiestaOggettoRichiedenteStato
Richiesta n.27

Trapano a batteria

Carlo RossiAperta
Richiesta n.30

Trituratore per rami

Giovanna BianchiAperta
Richiesta n.31

Spargisemi per prato

Sergio NeriIn corso

 Relazioni concatenate

Nella sezione Relazioni è possibile aggiungere relazioni concatenate tra loro, cioè relazioni che consentono di passare da una Entità A all'Entità B, dall'Entità B all'Entità C e così via. In questo caso, la relazione A→B deve precedere la relazione B→C altrimenti non è possibile selezionare B quando si inserisce la seconda.  

Ad esempio, possiamo aggiungere alla Vista "Richieste" le relazioni Oggetto →  Autore per risalire al Proprietario dell'Oggetto e Oggetto →  Ambito per suddividere le Richieste per Ambito di utilizzo degli Oggetti richiesti. Queste relazioni devono essere collocate dopo la relazione che mette a disposizione l'Oggetto, cioè la relazione Richiesta → Oggetto. Nella sezione Relazioni devono apparire in questo ordine:

  • il Campo "Oggetto" della Richiesta; rinominato "Oggetto richiesto" 
  • il Campo Utente - Nome - Il nome dell'utente o dell'autore, rinominato "Richiedente"
  • il Campo Utente - Nome - Il nome dell'utente o dell'autore, selezionando come Relazione "Oggetto richiesto" e rinominandolo "Proprietario" 
  • il Campo "Ambito" dell'Oggetto, selezionando come Relazione "Oggetto richiesto" e rinominandolo "Ambito d'uso"  

Ai Campi già elencati nella sezione Campi aggiungiamo:

  • il Campo "Titolo", selezionando come Relazione "Ambito d'uso", che apparirà come "(Ambito) Titolo" e cambiando Etichetta come "Ambito"
  • il Campo "Nome", selezionando come Relazione "Proprietario", che apparirà come "(Proprietario) Nome"
  • il Campo "Cognome", selezionando come Relazione "Proprietario", che apparirà come "(Proprietario) Cognome" e cambiando Etichetta come "Proprietario"

Aggreghiamo nella colonna "Oggetto" il Campo "(Ambito) Titolo" e i Campi "(Proprietario) Cognome" e "(Proprietario) Cognome" nella colonna "Proprietario". 

Come abbiamo visto, aggiungiamo la ricerca estesa ai Campi "(Richiesta) Titolo", "(Oggetto) Titolo", "(Ambito) Titolo", "(Proprietario) Nome", "(Proprietario) Cognome", "(Richiedente) Nome", "(Richiedente) Cognome", consentendo così all'Utente di cercare una Richiesta partendo da una qualunque delle informazioni ad essa associata.  

La Vista "Richieste" appare così:

 

Cerca Applica  
     
RichiestaOggettoProprietarioRichiedenteStato
Richiesta n.27

Trapano a batteria
Casa

Angela VerdiCarlo RossiAperta
Richiesta n.30

Trituratore per rami
Giardino

Carlo RossiGiovanna BianchiAperta
Richiesta n.31

Spargisemi per prato
Giardino

Carlo RossiSergio NeriIn corso

Relazioni inverse

Data una relazione A→ B, è anche possibile utilizzarla in senso inverso, per risalire da B ad A. Per usare una relazione in senso inverso, nella sezione Relazioni non aggiungiamo il Campo:

Contenuto - Contenuto referenziato da NOMECAMPO

ma aggiungiamo il Campo:

Contenuto - Contenuto che usa NOMECAMPOO

Vedremo più avanti alcuni casi di utilizzo di relazioni inverse.

Campi speciali

Oltre ai Campi che fanno parte delle Entità, nelle Viste sono disponibili Campi speciali che mettono a disposizione informazioni di sistema o svolgono funzioni particolari. Questi Campi sono solitamente elencati sotto la Categoria Globale. Ecco alcuni dei Campi speciali disponibili nativamente o installando moduli aggiuntivi:

nella sezioneCampo specialea cosa serverichiede il modulo
CampiGlobale - Testo personalizzatomostra un testo fisso o dipendente da altri Campi (attraverso i Token, vedi sotto) 
Globale - Visualizzarichiama un'altra Vista dentro la VistaViews Field View
Viste - Views Conditional mostra un valore A o un valore B in base al valore di un altro CampoViews Conditional
Globale  - Simple Math Fieldmostra il risultato di un calcolo basato sui valori di altri CampiViews Simple Math 
Intestazione o Piè di paginaGlobale - Area di testomostra un testo fisso o dipendente da altri Campi (attraverso i Token, vedi sotto) 
Globale - Riassunto del risultatomostra il numero di entità elencate dalla Vista, accompagnato da un testo a piacere 
Globale - Area della Vistarichiama un'altra Vista dentro la Vista 
Globale - Linkaggiunge un link Views Link Area

Campi e Token

Ogni Campo elencato nella sezione Campi di una Vista (compresi quelli speciali) mette a disposizione del resto della Vista un Token, che contiene il valore di quel Campo. Il Token può essere utilizzato per riciclare il valore in altri Campi, per costruire comandi sulle Entità, per attivare logiche "se allora" ecc.

Ogni Campo nella sezione Campi "vede" i Token dei Campi che lo precedono ma non "vede" i Token dei Campi che lo seguono, quindi è importante l'ordine con cui i Campi sono elencati. I Token "visibili" in un Campo sono elencati sotto Replacement patterns del Campo stesso e da lì possono essere copiati ed incollati dove servono. Per capire a quale Campo corrisponde un Token, basta ricordare che i Token sono elencati nello stesso ordine dei Campi cui si riferiscono; anche la forma del Token aiuta a comprendere a quale Campo corrisponde. Anche i Campi elencati nella sezione Filtri contestuali generano Token e sono riconoscibili dalla loro specifica forma. Ecco una piccola guida al riconoscimento dei Token:

Al Campocorrisponde il Token
Campo predefinito dell'Entità{{ title }} {{ created }} ecc.
Campo dell'Entità elencato nella sezione Campi{{ field_NOMEINTERNODELCAMPO}} es. {{ field_stato_richiesta }} 
Campo speciale Globale - Testo personalizzato{{ nothing }}
Campo elencato nella sezione Filtri contestuali{{ raw_arguments.NOMEINTERNODELCAMPO }} es. {{ raw_arguments.nid }}
Campo condizionato Viste - Views Conditional  {{ views_conditional_field }}
Campo speciale di calcolo Globale- Simple Math{{ fields.field_views_simple_math_field }} 
Campo che appare più volte nella sezionecome sopra ma con aggiunto _1,   _2  ecc. Ad esempio il primo Campo Titolo presente nella sezione Campi ha Token {{ title }}, il secondo {{ title_1 }}, il terzo {{ title_2 }} ecc.

Token globali

Nelle sezioni Intestazione e Piè di pagina sono disponibili intere famiglie di Token che forniscono informazioni "globali" (cioè non dipendenti dalle Entità elencate dalla Vista), utilizzabili nel Campo Globale - Area di testo ed elencati sotto Token globali disponibili per la sostituzione:

[site:ATTRIBUTO] Informazione relativa al sito, es. [site:name] restituisce il nome del sito
Informazione relativa alla Vista stessa, es. restituisce il numero di righe della Vista
[current-user:CAMPO] Informazione relativa all'Utente corrente, es. [current-user:name] restituisce il nome dell'Utente corrente- Questa famiglia di Token non è elencata sotto Token globali disponibili per la sostituzione 

Creare una nuova Vista come variazione di una Vista esistente

A mano a mano che costruisci le diverse Viste che compongono la tua app, è probabile che ti accorga che una nuova Vista che ti serve è uguale ad un'altra, salvo per qualche dettaglio. Ad esempio, nella app "Vicinato" vogliamo avere due Viste sugli Attrezzi molto simili tra loro: la Vista "Magazzino", che elenca tutti gli Attrezzi prestabili, e la Vista "Tuoi Attrezzi", che elenca tutti gli Attrezzi dell'Utente corrente inclusi quelli ritirati dal prestito. Sempre nella app "Vicinato", vogliamo diverse Viste sulle Richieste, filtrate per utente, attrezzo, stato ecc.  

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

  • fare una copia della Vista di partenza
  • aggiungere una Visualizzazione nella Vista di partenza

Spieghiamo entrambi i metodi, evidenziandone pro e contro.

Copiare una Vista

Per creare una nuova Vista come copia di una Vista esistente:

PRO: è semplice e ed azzera la possibilità di rovinare la Vista di partenza con le modifiche apportate nella Vista copia. CONTRO: ogni miglioramento apportato nella Vista di partenza o nella Vista copia non si propaga automaticamente all'altra Vista.  

Aggiungere una Visualizzazione alla Vista

Invece che creare la nuova Vista come copia autonoma della Vista di partenza, possiamo creare una nuova Visualizzazione dentro la Vista di partenza:

PRO: ogni miglioramento apportato in una Visualizzazione può essere facilmente propagato automaticamente alle altre Visualizzazioni, selezionando nella casella Per "Tutte le visualizzazioni". CONTRO: una variazione pensata per una Visualizzazione rischia di essere applicata anche alle altre rovinandone il comportamento, se non si sta attenti alla selezione della casella Per.

Chi è l'Utente corrente

Se la tua app è utilizzata da altri Utenti oltre all'Amministratore, in ogni momento ci potrebbero essere più Utenti che contemporaneamente richiamano le medesime Viste. Alcune di essere mostrano le medesime informazioni a tutti gli Utenti, ad esempio la Vista "Magazzino" della app "Vicinato" elenca tutti gli Attrezzi prestabili a tutti i Partecipanti. Altre Viste devono mostrare informazioni differenti (o non mostrarne affatto) ai diversi Utenti, ad esempio la Vista "Tuoi Attrezzi" deve mostrare all'Utente solo gli Attrezzi di sua proprietà, compresi quelli ritirati dal prestito. In questi casi, nella costruzione della Vista dobbiamo considerare non solo le informazioni delle Entità elencate (gli Attrezzi), ma anche le informazioni della Entità Utente corrente, cioè dell'Utente che sta usando la Vista.

Filtrare le Entità sull'Utente corrente

La modalità più frequente per considerare l'Utente corrente in una Vista è filtrare le Entità usando una relazione che le lega all'Utente corrente. Ad esempio, abbiamo già visto come risalire da una Entità al suo Autore (Entità → Autore). Se l'Entità su cui è costruita la Vista ha altri Campi riferimento che richiamano Utenti, possiamo utilizzare anche queste altre relazioni.

Prendiamo come esempio la Vista "Tuoi Attrezzi" della app "Vicinato", che vogliamo elenchi solo gli Attrezzi di proprietà dell'Utente corrente. La costruiamo come variazione della Vista "Magazzino, aggiungendo alla sezione Relazioni la relazione Attrezzo → Autore (l'Autore dell'Attrezzo è il suo Proprietario) e modificando i Filtri della sezione Criteri del filtro della Vista.   

Se l'Utente corrente non ha relazioni con le Entità della Vista

Il metodo sopra descritto non funziona se le Entità elencate nella Vista non hanno alcuna relazione con l'Utente. Però anche in questi casi Drupal conosce l'Utente corrente e ne rende disponibili le informazioni attraverso appositi Token. 

Nelle sezioni Intestazione e Piè di pagina sono disponibili i Token [current-user:CAMPO], dove CAMPO è il nome interno di un Campo dell'Entità Utente. I Token più utili sono [current-user:name] che restituisce il nome dell'Utente corrente e [current-user:uid] che restituisce il suo identificativo. 

Questi Token non sono purtroppo disponibili nelle altre sezioni della Vista. Per disporre delle informazioni relative all'Utente corrente anche nella sezione Campi, occorre installare ed attivare il modulo aggiuntivo Twig Tweaks. Questo modulo aggiunge alle Viste alcuni Token "di sistema", cioè non dipendenti dalle Entità elencate dalla Vista. In particolare, mette a disposizione i Token {{ drupal_token('current-user:CAMPO') }} ad esempio {{ drupal_token('current-user:uid') }}.

Filtri in AND logico tra loro

Nelle Guide precedenti abbiamo visto come selezionare le Entità da elencare in una Vista con i Filtri della sezione Criteri del filtro. Ad esempio, abbiamo visto che nella Vista "Tuoi Attrezzi" della app "Vicinato" sono necessari i seguenti Filtri:

I Filtri elencati nella sezione Criteri del filtro sono considerati in AND logico tra loro: una Entità è mostrata solo se soddisfa tutti i Filtri. Quindi i Filtri sopra elencati corrispondono a questa logica:

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

Filtri in OR logico tra loro

Nella costruzione di alcune Viste potremmo invece la necessità di mostrare Entità che soddisfano un Filtro oppure un altro Filtro. Ad esempio, nella app "Vicinato" ci potrebbe servire una Vista che mostri l'elenco delle Richieste all'Utente che chiede l'Attrezzo (Utente Richiedente) oppure all'Utente che presta l'Attrezzo (Utente Proprietario), ma nascondere l'elenco a tutti gli Utenti diversi dal Richiedente e dal Proprietario. Se in questa Vista aggiungiamo alla sezione Criteri del filtro un Filtro "Utente corrente = Richiedente" e un Filtro "Utente corrente = Proprietario" non vedremo nessuna Richiesta, perché i due Filtri sono in AND logico tra loro ma nessuno Utente è contemporaneamente Proprietario dell'Attrezzo e Richiedente dello stesso Attrezzo.

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

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

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

In realtà le Viste supportano nativamente sia Filtri in AND logico tra loro (è il default) sia in OR logico tra loro, sia in combinazione più complesse di AND e OR. Torniamo all'esempio della Vista che deve elencare le Richieste al Richiedente e al Proprietario ma non agli altri Utenti. Per ottenere questo effetto occorre combinare i Filtri in questo modo:

(Tipo di contenuto=Richiesta) AND ((Utente corrente = Richiedente) OR (Utente corrente = Proprietario))

La combinazione ((Utente corrente = Richiedente) OR (Utente corrente = Proprietario)) è soddisfatta se l'Utente corrente è il Richiedente oppure è il Proprietario, ma non è soddisfatta se l'Utente corrente non è né Richiedente né Proprietario. Vediamo come descrivere questo caso (il passaggio specifico è quello in grassetto):

In questa Guida vediamo come filtrare il risultato di una Vista agendo sul link con cui la Vista viene richiamata. 

Filtri della sezione Filtri contestuali

Nelle Guide precedenti abbiamo visto come filtrare le Entità elencate da una Vista grazie ai Filtri elencati nella sezione Criteri del Filtro. Abbiamo anche visto che un Filtro è formato da tre parti: 

  • il Campo su cui agisce il Filtro (es. "Stato")
  • l'operatore con cui svolgere il confronto (es. è uguale a)
  • il valore da confrontare col contenuto del Campo (es. "Prestabile")

E' possibile aggiungere alla Vista Filtri anche nella sezione Filtri contestuali. Questi ulteriori Filtri (che chiameremo Filtri contestuali) agiscono in AND logico coi Filtri elencati nella sezione Criteri del filtro: per essere elencata dalla Vista, una Entità deve soddisfare sia i Filtri della sezione Criteri del filtro sia i Filtri contestuali.

Mentre un Filtro della sezione Criteri del filtro prende il valore da confrontare col Campo dalla configurazione stessa della Vista (se è un Filtro "nascosto") oppure dalla scelta effettuata dall'Utente (se è un Filtro "esposto"), un Filtro contestuale prende il valore dal link con cui viene richiamata la Vista. Diversamente dai Filtri della sezione Criteri del filtro, quindi, un Filtro contestuale consente di cambiare il risultato della Vista agendo esternamente su di essa, passandole uno o più valori di confronto attraverso il link di richiamo.

Vediamo come esempio come modificare la Vista "Tuoi Attrezzi" della app "Vicinato" che abbiamo costruito nelle Guide precedenti, perché filtri gli Attrezzi non in base all'Utente corrente ma in base ad un Utente indicato nel link di richiamo della Vista. A questo scopo togliamo dalla sezione Criteri del filtro il Filtro che limita la Vista ai soli Attrezzi il cui Proprietario coincide con l'Utente corrente ed aggiungiamo nella sezione Filtri contestuali il Campo Utente - ID Utente con Relazione "Proprietario". Richiamando la Vista col link 

/tuoi-attrezzi/316

il Filtro della sezione Filtri contestuali limiterà la Vista ai soli Attrezzi di proprietà dell'Utente con identificativo 316.

Se nella sezione Filtri contestuali sono elencati più Campi, i corrispondenti valori devono essere scritti nel link nello stesso ordine con cui sono elencati nella sezione e separati da /. Ad esempio, se nella Vista sopra descritta aggiungiamo il Filtro contestuale Contenuto - ID Contenuto con Relazione "Categoria" (che corrisponde al numero che identifica univocamente una Categoria) e la richiamiamo col link:

/tuoi-attrezzi/316/12

la Vista elencherà solo gli Attrezzi dell'Utente con identificativo 316 e classificati con la Categoria con identificativo 12. 

Nella terminologia Drupal, i valori trasmessi ai Filtri contestuali attraverso il link sono chiamati argomenti (arguments) e talvolta sono chiamati argomenti i Filtri stessi: quando nelle spiegazioni di Drupal si legge "argomento" è molto probabile che si stia parlando di Filtri contestuali.

I valori letti nel link e usati nei Filtri contestuali sono disponibili nella Vista grazie ai Token {{ raw_arguments.NOMEINTERNODELCAMPO }} es. {{ raw_arguments.nid }}. Questi Token sono elencati nella configurazione degli altri Campi della Vista sotto Replacement patterns.

Non solo numeri

Anche se è il caso più comune, non è necessario usare come argomenti gli identificativi numerici delle Entità: in realtà si possono usare come Filtri contestuali anche gli altri Campi delle Entità. Se, nell'ultimo esempio, al posto del Filtro contestuale Contenuto - ID Contenuto con Relazione "Categoria" scriviamo il Filtro contestuale  Contenuto - Title con Relazione "Categoria" (che corrisponde al nome della Categoria), possiamo richiamare la Vista specificando nel link il nome della Categoria, es:

/tuoi-attrezzi/316/Giardino

Valori di default per i Filtri contestuali

Se una Vista ha uno più Filtri nella sezione Filtri contestuali e la Vista viene richiamata con un un link che contiene un numero di argomenti inferiore al numero dei Filtri, l'elenco mostrato dalla Vista può essere diverso da quello atteso: i Filtri contestuali sono in AND logico tra loro e quindi l'assenza di un argomento può far fallire uno dei Filtri e quindi la Vista potrebbe non mostrare nessuna Entità. Inoltre il link non contiene il nome del Campo cui applicare l'argomento, quindi non è neppure possibile "saltare" un argomento, ma occorre sempre passare un numero di argomenti pari al numero di Filtri contestuali. 

Se un argomento manca nel link, nella configurazione del filtro contestuale possiamo decidere come deve comportarsi la Vista scegliendo una delle opzioni elencate in Quando il valore del filtro NON è nell'URL: 

 

Se scegli Mostra tutti i risultati per il campo specifico il Filtro viene ignorato. Se scegli Fornire il valore di default devi specificare dove prendere il valore mancante; tra le opzioni più comunemente usate: ID del contenuto dell'URL (utile per i Blocchi, lo vedremo a suo tempo), Fisso (un valore fisso), Parametro query (es. se costruiamo il link come /tuoi-attrezzi?categoria=12 e indichiamo qui "categoria" come parametro, il valore viene preso dal nome del parametro e non dalla sua posizione), ID Utente degli utenti autenticati (ID dell'Utente corrente).

Filtrare per intervalli di valori

Diversamente dai Filtri della sezione Criteri del filtro, per i Filtri contestuali non è possibile scegliere l'operatore con cui eseguire il confronto: il valore ricevuto dal link deve essere uguale al valore del Campo utilizzato come Filtro nella sezione Filtri contestuali.  Questa rigidità può essere parzialmente risolta installando ed attivando il modulo aggiuntivo "Views Contextual Range Filter", che aggiunge la possibilità di passare ad un Filtro contestuale un intervallo di valori anziché un unico valore. Ad esempio, se volessimo una Vista che elenca i Prestiti erogati nell'anno 2025 da tutti gli Utenti della app "Vicinato", potremmo mettere nella sezione Filtri contestuali il Campo "Data" del Prestito e poi richiamare la Vista col link:

/prestiti-conclusi/2025-01-01--2025-12-31

dove il doppio trattino -- separa il valore minimo e massimo dell'intervallo, realizzando così l'operatore "tra" E' anche possibile passare alla Vista un intervallo aperto, ad esempio per elencare i Prestiti dal 1 gennaio del 2026:

/prestiti-conclusi/2026-01-01--

realizzando così l'operatore "maggiore di" (e ovviamente anche "minore di").

Vedremo più avanti un uso particolare degli intervalli di valore sui Filtri contestuali per costruire comandi di navigazione "Precedente" "Successivo" su un insieme di Entità definito da una Vista.

Filtri contestuali e costruzione della app 

I Filtri contestuali sono molto utili nella costruzione di una app, perché consentono di creare Viste "flessibili", che forniscono elenchi diversi in base agli argomenti ricevuti nel link, evitando così di dover costruire più Viste molto simili tra loro. Ad esempio, nella app "Vicinato" possiamo costruire una Vista che, in base all'argomento che riceve dal link, mostra le Richieste concluse su tutti gli Attrezzi dell'Utente corrente oppure le Richieste concluse su uno specifico Attrezzo dell'Utente corrente: per ottenere questa flessibilità è sufficiente aggiungere nella sezione Filtri contestuali il Campo Contenuto - ID Contenuto con Relazione "Attrezzo" e, nella sua configurazione, in Quando il valore del filtro NON è nell'URL selezionare l'opzione Mostra tutti i risultati per il campo specifico.

Nelle prossime Guide utilizzeremo i Filtri contestuali per costruire comandi cliccabili dall'Utente che richiamano una Vista passandole l'argomento. Anche il comando sarà costruito con una Vista in una catena di Viste attivata dall'Utente: la prima Vista espone all'Utente un comando, che contiene il link di richiamo della seconda Vista con gli argomenti necessari; la seconda Vista viene richiamata dal click dell'Utente sul comando esposto dalla prima.

Un'altra applicazione molto importante dei Filtri contestuali nella costruzione della app sono le Viste EVA, cioè Viste che vengono richiamate dentro la pagina di una Entità: in questo caso, è Drupal che richiama automaticamente la Vista, passandole come argomento l'identificativo dell'Entità mostrata.

Avevamo visto in questa Guida che, ad ogni Entità, è associata una pagina di presentazione che ne mostra i Campi. Ad esempio, la pagina 

/node/12 

mostra il Contenuto con identificativo ID=12, mentre la pagina 

/user/23 

mostra l'Utente con identificativo UID=23. In questa Guida vediamo come aggiungere alla pagina di presentazione di una Entità anche informazioni prelevate da altre Entità, come variare le informazioni in base all'Utente che la sta guardando e come aggiungervi comandi, grazie alle Viste EVA.

EVA: una Vista dentro la pagina di una Entità

Una EVA (Entity Views Attachment) è una Vista che viene richiamata dentro la pagina di una Entità. Installato ed attivato il modulo aggiuntivo EVA: Entity Views Attachment, nell'editor delle Viste si rende disponibile il nuovo tipo di Visualizzazione di tipo EVA che consente appunto di creare una EVA. 

Nella costruzione della EVA occorre (1) specificare nella sezione Entity content settings il tipo di Entità in cui deve essere richiamata e (2) predisporre nella sezione Filtri contestuali il Campo che riceve l'identificativo dell'Entità dalla pagina dell'Entità. Campo e tipo di Entità devono essere coerenti: ad esempio, se in  Entity content settings la Vista è associata ad un Contenuto, nella sezione Filtri contestuali il Campo deve essere l'identificativo ID di Contenuto; se la Vista è invece associata ad Utenti, il Campo deve essere l'identificativo UID. 

Ecco quindi i passi salienti per creare una EVA:

Per il resto, la costruzione di una EVA è del tutto simile alla costruzione delle altre Viste.

Personalizzare e proteggere la presentazione dei Campi di una Entità

Un primo utilizzo delle EVA è la personalizzazione della pagina di un tipo di Entità, per aggiungervi informazioni prelevate da altre Entità e decidere cosa mostrare o nascondere ai diversi Utenti. 

Come esempio, vediamo la personalizzazione della pagina della Richiesta della app "Vicinato". Se non interveniamo con le EVA, la pagina standard mostra tutti i Campi della Richiesta a tutti i Partecipanti. Vogliamo invece mostrare i Campi solo al Proprietario dell'Attrezzo richiesto e al Richiedente, nascondendoli a tutti gli altri Utenti. Vogliamo inoltre aggiungere alla pagina della Richiesta alcune informazioni sull'Attrezzo e una sintesi delle altre informazioni conseguenti alla Richiesta, cioè le Note scambiate tra Richiedente e Proprietario, le Consegne effettuate dell'Attrezzo e le Valutazioni finali espresse dai due Utenti. 

Come primo passaggio nascondiamo i Campi della Richiesta a tutti gli Utenti e poi affidiamo ad una EVA il compito di mostrarli solo a Richiedente e Proprietario. Al di là del caso specifico, questo metodo è di utilità generale, quando appunto si voglia controllare la visualizzazione dei Campi di una Entità in base alle caratteristiche dell'Utente.

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

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

Posizionare le EVA nella pagina

Nella visualizzazione della pagina dell'Entità, ogni EVA è trattata come se fosse un Campo aggiuntivo dell'Entità stessa e può quindi essere posizionato a piacere rispetto ai Campi non nascosti ed alle eventuali altre EVA. Come abbiamo già visto per i Campi veri e propri, per ordinare le EVA tra loro e rispetto ai Campi non nascosti dell'Entità:

Cosa sono i comandi

Una app costruita con Drupal si presente come un insieme di pagine, che mostrano informazioni e comandi. Un comando è semplicemente un testo che, cliccato dall'Utente, richiama un link. Il link può essere l'indirizzo di visualizzazione, creazione, modifica o eliminazione di una Entità, di esecuzione di una Vista o di una procedura. In base al particolare tema grafico utilizzato, il comando può presentarsi come un semplice link o come un pulsante. In questa Guida vediamo come aggiungere comandi nella pagina di una Entità o all'interno di una Vista.

Aggiungere comandi nella pagina di una Entità

Nella pagina che mostra una Entità, Drupal mostra nativamente i comandi "Modifica" e "Elimina" agli Utenti che hanno i Permessi per queste operazioni. Per aggiungere ulteriori comandi utili alla nostra app possiamo utilizzare le Viste EVA che, come abbiamo visto, consentono appunto di mostrare informazioni aggiuntive nella pagina dell'Entità. 

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

Aggiungere comandi in una Vista 

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

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

Vediamo esempi concreti e come realizzarli per entrambi i casi.

COMANDI SOPRA O SOTTO L'ELENCO DELLE ENTITA'

Un comando collocato sopra o sotto l'elenco delle Entità mostrato da una Vista è tipicamente utilizzato per aggiungere una nuova Entità all'elenco o per passare ad un altra pagina della app. Ad esempio, vediamo come aggiungere il comando "Aggiungi Attrezzo" alla Vista "Tuoi Attrezzi", che elenca gli Attrezzi di proprietà dell'Utente corrente nella app "Vicinato".

Per aggiungere alla Vista un comando senza scrivere codice HTML, suggerisco di installare ed attivare il modulo aggiuntivo Views Linkarea, che mette a disposizione un nuovo Campo speciale Globale - Link - Provide an internal or external link, che può essere aggiunto nella sezione Intestazione per mostrare un comando sopra l'elenco delle Entità (oppure nella sezione Piè di pagina per mostrarlo sotto l'elenco).

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

COMANDI SULLA SINGOLA ENTITA' ELENCATA

Per aggiungere su ogni singola Entità elencata nella Vista un comando che agisce su quella Entità, puoi aggiungere nella sezione Campi un Campo Globale - Testo personalizzato -  Fornisce testo o link personalizzato e configurarlo perché richiami un'altra Vista o una procedura, passandole l'identificativo dell'Entità. Ad esempio, se volessimo mostrare a fianco degli Attrezzi elencati nella Vista "Tuoi attrezzi" della app "Vicinato" un comando "Richieste aperte" che, cliccato, elenca le Richieste aperte sull'Attrezzo:

 

In questa Guida aggrego per motivi didattici diversi metodi che consentono di personalizzare la visualizzazione del valore di un Campo in una Vista. Tutti questi metodi agiscono sui Campi elencati nella sezione Campi della Vista e non alterano il valore del Campo, ma solo la sua visualizzazione.

Mostrare un valore di default

Se un Campo non contiene un valore, non viene mostrato nulla. Se invece vuoi mostrare un valore di default, nella configurazione del Campo, sotto Comportamento se non ci sono risultati digita il valore in Testo per Nessun risultato

Accorciare e semplificare il valore mostrato

Se un Campo contiene un valore molto lungo, si può accorciarlo, evitando comunque di troncare a metà una parola: nella configurazione del Campo, sotto Risultati di riscrittura attiva Troncare questo campo a un numero massimo di caratteri, scegli in Massimo numero di caratteri il numero massimo di caratteri da mostrare e attiva Taglia solo ai limiti delle parole per non troncare le parole. Se vuoi semplificare il valore mostrato eliminando le formattazioni (es, grassetto), attiva anche Rimuovi i tag HTML

Comporre più Campi in un solo Campo

Per comporre il valore di più Campi in un solo Campo possiamo usare i Token associati ai Campi da comporre. Ad esempio, se le Entità elencate dalla Vista hanno un Campo "Nome" ed un Campo "Cognome" e vogliamo mostrarli concatenati come "Nome Cognome" in un solo Campo "Identità":

Campi condizionati

Se installiamo ed attiviamo il modulo aggiuntivo "Views Conditional", si rende disponibile nelle Viste il Campo speciale Views Conditional - Viste - Output data based off of certain criteria  che mostra un valore tra due possibili alternative, in base al valore di un Campo.  Ad esempio, vogliamo anteporre alla concatenazione nome + cognome dell'esempio precedente il titolo "sig." o "sig.ra" in base al Campo Sesso dell'Entità.

La configurazione di questo Campo speciale (che chiamerò per brevità Campo condizionato) prevede questi parametri:

Concatenazione di Campi condizionati

Un limite del Campo condizionato è che permette di scegliere solo tra due valori. Questo limite può essere superato concatenando più Campi condizionati. Come tutti gli altri Campi di Drupal, anche al Campo condizionato corrispondente un Token, di nome {{ views_conditional_field }} che può essere utilizzato come parametro nella impostazione di un successivo Campo condizionato, il cui valore dipenderà quindi dal valore del primo Campo condizionato.  La concatenazione può estendersi a tre o più Campi condizionati, i cui Token saranno {{ views_conditional_field }}, {{ views_conditional_field_1 }}, {{ views_conditional_field_2 }} ecc.

Nelle Guide precedenti abbiamo visto come richiamare una o più Viste nella pagina di una Entità. Abbiamo anche visto come richiamare una Vista alternativa quando una Vista non dà alcun risultato. In questa Guida generalizziamo la costruzione di Viste complesse che richiamano altre Viste e vediamo anche come richiamare Viste dentro Campi testuali di una Entità.

Richiamare una Vista sopra o sotto l'elenco di una Vista

Data una Vista che elenca Entità di un certo tipo (Vista "primaria"), è possibile arricchirla richiamando sopra o sotto l'elenco una o più Viste "secondarie", anche basate su Entità differenti:

Per richiamare una Vista secondaria sotto l'elenco delle Entità della Vista primaria, il Campo Globale - Area della vista va aggiunto nella sezione Piè di pagina anziché nella Intestazione. 

Richiamo condizionato di una Vista

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

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

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

Richiamare una o più Viste dentro una Vista

Un metodo più generale per presentare più Viste in una sola pagina della app consiste nel creare una Vista primaria che funge da contenitore di una o più Viste secondarie, richiamate nella sezione Campi della Vista primaria. 

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

Come esempio, vediamo la costruzione della pagina "Cruscotto" della app "Vicinato". Questa pagina mostra all'Utente corrente un insieme di informazioni di diverso tipo che lo riguardano:

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

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

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

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

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

Ecco i dettagli:

Catene di Viste e loro limitazioni

A loro volta, le Viste secondarie richiamate dalla Vista primaria potrebbero richiamare ulteriori Viste, creando così una catena di Viste. Anche se Drupal non pone limiti alla lunghezza di questa catena, è necessario considerare tre potenziali problemi, che inducono a limitare la catena a due o tre richiami:

  • la Vista primaria non viene presentata fino a quando non sono state completate le operazioni che preparano le Viste sottostanti, quindi la app potrebbe rallentare significativamente
  • Per lo stesso motivo, potrebbe capitare che la complessità delle interrogazioni del database mandino in errore la app
  • occorre evitare richiami "ricorsivi", cioè una Vista A che richiama una Vista B che a sua volta richiama la Vista A

 Il primo problema è teoricamente risolvibile abilitando la Cache della Vista (vedi Guida) ed evitando così che Drupal debba ogni volta ricostruire tutte le Viste richiamate. Questa soluzione però rischia di presentare all'Utente informazioni non aggiornate e quindi è attuabile solo se la Vista contiene informazioni che cambiano poco nel tempo. 

Richiamare Viste in un testo

Se installiamo ed attiviamo il modulo aggiuntivo "Insert View", possiamo richiamare una o più Viste in un qualunque Campo testuale di una qualunque Entità. Il modulo mette infatti a disposizione il Token: 

[view:NAME=DISPLAY=ARGS] 

in cui:

  • NAME è il nome ad uso interno della Vista, nome elencato in Struttura - Viste; è l'unico parametro obbligatorio per questo Token.
  • DISPLAY è il nome della Visualizzazione della Vista, nome mostrato nella sezione Altro della Vista come Nome ad uso interno. Se la Vista ha una sola Visualizzazione, si può omettere questo parametro
  • ARGS sono gli eventuali valori passati ai Filtri contestuali della Vista, separati da /. Se la Vista non prevede Filtri contestuali, su può omettere questo parametro dal Token 

Se scriviamo questo Token nel testo di un Campo testuale, quando l'Entità viene visualizzata il Token viene sostituito dal contenuto della Vista.

Questo metodo consente di costruire agevolmente pagine in cui sono mescolati testi fissi, immagini e informazioni elencate da Viste, per formare ad esempio un documento complesso basato sulle informazioni contenute nelle Entità della app. Per funzionare, il Campo testuale deve essere configurato con un Formato che accetti il Token [view]. 

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.

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

da scrivere

Quando l'Utente compila un Campo Riferimento, gli viene normalmente mostrata una casella in cui digitare il titolo delle Entità. A mano a mano che l'Utente digita caratteri nella casella, Drupal gli presenta un elenco di Entità il cui titolo contiene i caratteri digitati. Questa modalità di compilazione di un Campo Riferimento è utile se le Entità richiamabili nel Campo sono molto numerose e se è ragionevole supporre che l'Utente conosca - almeno parzialmente - i loro titolo. 

Se invece il numero di Entità richiamabili è piccolo, può essere più comodo per l'Utente presentargli un elenco in cui selezionare direttamente l'Entità, cioè senza che ne debba conoscere a priori il titolo e digitarne i caratteri.  A questo scopo risulta utile una particolare Visualizzazione delle Viste, chiamata Entity Reference, (dalla versione 11 di Drupal questa Visualizzazione è stata aggiunta al Core e quindi non serve più installare un modulo aggiuntivo, segnale del successo di questa funzione). Il metodo prevede due passaggi:

  • Creare una Vista con Visualizzazione Entity Reference
  • Applicare la Vista al Campo Riferimento

Come semplice esempio, vediamo nella app "Vicinato" come elencare le Categorie nel Campo Riferimento "Categoria" dell'Entità di tipo "Attrezzo".

Creare una Vista con Visualizzazione Entity Reference

Per creare questa Vista, prima creiamo una Visualizzazione "normale" (tipicamente Elenco non formattato) e poi aggiungiamo alla Vista una Visualizzazione di tipo Entity Reference. Questo doppio passaggio si rende necessario perché la Visualizzazione Entity Reference non viene proposta all'atto della creazione della Vista. Una volta creata la Visualizzazione Entity Reference, dovremo specificare su quale campo eseguire la selezione. Ecco come:

Applicare la Visualizzazione al Campo Riferimento

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

Tabelle pivot

Supponiamo di avere un tipo di Contenuto "Vendita", formato dai seguenti Campi:

  • Regione
  • Prodotto
  • Fatturato

nel quale viene memorizzato il fatturato di un Prodotto in una Regione. Vogliamo aggregare i fatturati in una tabella, dove ogni riga corrisponde una Regione, ogni colonna corrisponde ad un Prodotto e nella cella è mostrato il valore del fatturato di quel Prodotto in quella Regione:

 BiscottiGelatiCaramelleCioccolatoTotale
Piemonte10.0002.0005.0002.00019.000
Lombardia35.00012.00022.0008.00077.000
Liguria6.0001.0002.0001.00010.000
Veneto21.0009.00015.0006.00051.000
Trentino Alto Adige12.0001.0007.0009.00029.000
Friuli Venezia Giulia7.0002.0002.0003.00014.000
Totale91.00027.00053.00029.000200.000

Viste pivot

Per ottenere una tabella del genere con una Vista, dopo aver creato i singoli Contenuti di tipo Vendita (ad esempio, un Contenuto con Regione="Lombardia", Prodotto="Gelati" e Fatturato=12.000, un altro Contenuto con Regione="Veneto", Prodotto="Cioccolato" e Fatturato=6.000 ecc.), è necessario installare e attivare il modulo aggiuntivo "Views Pivot Table". Questo modulo mette a disposizione il display di nome Pivot table (crosstab). che, opportunamente configurato, aggrega i Contenuti come desiderato e provvede anche a calcolare i totali per riga e per colonna.

Ecco come ottenere la tabella sopra descritta:

  • crea la Vista "Vendite" sul tipo di Contenuto "Vendita"
  • nella sezione Campi aggiungi i Campi "Prodotto", "Regione" e "Fatturato"
  • nella sezione Formato seleziona Pivot table (crosstab)
  • nella Impostazioni del Formato:
    • come Row Field seleziona il Campo "Regione"
    • come Column Field seleziona il Campo "Prodotto"
    • come Value Field seleziona il Campo "Fatturato"
    • per aggiungere i totali, sotto Totale attiva le opzioni Add a total column e Add a total row (funziona solo se il Campo selezionato come Value Field è numerico)
  • nella sezione Paginazione seleziona di mostrare tutte le Vendite (altrimenti la tabella sarà limitata alle sole Vendite mostrate nella pagina corrente)
  • nella sezione Criteri di ordinamento ordina per Regione e per Prodotto

Se c'è più di un Contenuto con la medesima coppia Regione - Prodotto, nell'incrocio viene mostrato l'elenco dei fatturati, separati da un carattere configurabile, oppure la loro somma (solo se il Campo indicato come Value Field è numerico).

Mostrare più Campi nella Vista Pivot 

La configurazione di Pivot table (crosstab) consente di selezionare un solo Campo come Value Field da mostrare nell'incrocio. Per superare questo limite e mostrare più Campi nella tabella, possiamo usare come Value Field un Campo Globale - Testo personalizzato in cui aggregare i Campi che vogliamo vedere. 

Ad esempio, se il Contenuto "Vendita" ha anche un Campo "Venditore" col nome del venditore che ha ottenuto quel Fatturato con quel Prodotto in quella Regione, possiamo mostrare nell'incrocio Regione - Prodotto l'elenco dei Venditori col rispettivo Fatturato. Ecco come modificare la Vista "Vendite":

  • nella sezione Campi aggiungi i Campi "Prodotto", "Regione" "Fatturato" e "Venditore"
  • sempre nella sezione Campi aggiungi un Campo Globale - Testo personalizzato nel cui parametro Testo richiamare i Token corrispondenti ai Campi "Venditore" e "Fatturato"
  • nella Impostazioni del Formato:
    • come Row Field seleziona il Campo "Regione"
    • come Column Field seleziona il Campo "Prodotto"
    • come Value Field seleziona il Campo Globale - Testo personalizzato 

Il risultato è questo:

 BiscottiGelatiCaramelleCioccolato
PiemonteRossi 10.000Rossi 2.000Rossi 5.000Rossi 2.000
LombardiaRossi 25.000
Bianchi 10.000
Rossi 12.000Bianchi 12.000
Neri 10.000
Neri 8.000
LiguriaBianchi 6.000Rossi 1.000Bianchi 2.000Bianchi 1.000
VenetoVerdi 21.000Verdi 9.000Bianchi 10.000
Verdi 5.000
Bianchi 6.000
Trentino Alto AdigeVerdi 2.000
Neri 10.000
Verdi 1.000Verdi 7.000Verdi 5.000
Bianchi 4.000
Friuli Venezia GiuliaVerdi 7.000Verdi 2.000Bianchi 2.000Bianchi 3.000

Sinottici

Se come Row Field o Column Field scegliamo un Campo che contiene una data (un Campo Data vero e proprio, oppure un Campo testuale che contiene una stringa che rappresenta un anno, es. "2026"), possiamo utilizzare il formato Pivot table (crosstab) per creare un sinottico, cioè una tabella che mostra eventi relativi a entità differenti, allineandoli temporalmente. 

Un esempio vivo è disponibile in questo mio sito realizzato con Drupal, dedicato alla storia dei partiti politici: la tabella è un sinottico che mostra la partecipazione delle forze politiche ai diversi governi di una legislatura. 

Ecco alcuni dettagli per i più curiosi. Dietro questo sinottico ci sono questi tipi di Contenuti:

  • Orientamento: rappresenta un orientamento politico, caratterizzato da un ordine (dall'estrema sinistra all'estrema destra) e da un colore
  • Soggetto: rappresenta un soggetto politico, caratterizzato da un nome, un s
  • imbolo e un Campo "Orientamento" col riferimento ad un orientamento politico
  • Personaggio: rappresenta un personaggio politico, caratterizzato da nome e ritratto
  • Governo: rappresenta un governo, caratterizzato da un nome, un periodo temporale e un Campo "Presidente" col riferimento ad un Personaggio
  • Tipo Evento: rappresenta un tipo di Evento, caratterizzato da un nome (Maggioranza | Appoggio esterno | Astensione | Opposizione) e da un simbolo
  • Evento: rappresenta una partecipazione di un Soggetto ad un Governo, caratterizzato da un Campo "Soggetto" col riferimento al soggetto politico, un Campo "Governo" col riferimento al governo e un Campo "Tipo" col riferimento al tipo di Evento

Il sinottico è una Vista basata sul tipo di Contenuto "Evento" con questa configurazione:

  • nella sezione Relazioni ci sono i Campi:
    • "Soggetto" che richiama il soggetto politico dell'Evento
    • "Governo" che richiama il governo dell'Evento
    • "(Governo) Presidente" che richiama il Personaggio presidente del Governo
    • "(Soggetto) Orientamento" che richiama l'Orientamento del Soggetto
    • "Tipo" che richiama il tipo di Evento
  • nella sezione Campi ci sono i Campi:
    • "(Soggetto) Titolo" che contiene il nome del soggetto politico
    • "(Soggetto) Simbolo" che contiene il simbolo del soggetto politico
    • "(Orientamento) Colore" che contiene l'immagine colorata dell'orientamento politico del soggetto
    • "(Governo) Titolo" che contiene il nome del Governo
    • "(Governo) Inizio" che contiene l'anno-mese di inizio del Governo 
    • "(Presidente) Ritratto" che contiene il ritratto del presidente del Governo
    • un Campo Globale che assembla "(Orientamento) Colore -  (Soggetto) Simbolo - (Soggetto) Titolo"
    • un Campo Globale che assembla "(Presidente) Ritratto - (Governo) Titolo -  (Governo) Inizio"
    • "(Tipo) Simbolo" che contiene il simbolo che caratterizza il tipo di Evento
  • nella sezione Formato è selezionato Pivot table (crosstab) con queste Impostazioni:
    • Row Field = il primo Campo Globale con le informazioni del Soggetto politico
    • Column Field = il secondo Campo Globale con le informazioni del Governo
    • Value Field =  il Campo "(Tipo) Simbolo"
  • nella sezione Criteri di ordinamento ci sono i Campi:
    • "(Ordinamento) Ordine" per ordinare le righe dei Soggetti per orientamento politico
    • "(Governo) Inizio" per ordinare le colonne dei Governi per anno-mese

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

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

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

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

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

Per modificare una o più Richieste:

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

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

In questa Guida vediamo come svolgere calcoli nella tua app, in tre modi diversi:

  • mostrare in una Vista un valore calcolato sulla base degli altri Campi della Vista
  • mostrare in una Vista un valore calcolato su un Campo di tutte le Entità elencate nella Vista
  • memorizzare nel Campo di una Entità un valore calcolato sulla base di Campi dell'Entità stessa o di altre Entità correlate all'Entità 

Calcolare un Campo sulla base di altri Campi

Per questa esigenza possiamo installare e attivare il modulo aggiuntivo "Views Simple Math Field", che aggiunge alle Viste il Campo speciale Globale - Simple Math Field - Views field that performs simple math expressions. Nella configurazione del Campo è possibile scrivere una formula, che calcola un valore sulla base del valore degli altri Campi presenti nella Vista. Nella formula si possono inserire operatori matematici, logici e di confronto ed altre operazioni complesse. 

Ad esempio, se all'Entità "Richiesta" della app di esempio "Vicinato" aggiungiamo un Campo data "Inizio" ed un Campo data "Fine" in cui memorizzare le date di inizio e fine del prestito, in una Vista possiamo elencare a fianco di ogni Prestito un Campo Simple Math Field "Durata" che mostra la durata in giorni del prestito. Ecco come:

Un Campo Simple Math è trattato come un qualunque altro Campo, quindi ad esso corrisponde il Token  {{ field_views_simple_math_field }} che ne contiene il valore calcolato e che può essere a sua volta usato nei Campi successivi.

Calcolare un valore basato su un Campo di tutte le Entità elencate 

Per calcolare un valore come somma o media di un Campo delle Entità elencate in una Vista occorre installare e attivare il modulo aggiuntivo "Views Aggregator Plus". Questo modulo aggiunge il nuovo formato Table with aggregation options, che consente di modificare in modo significativo una Vista, qui però ci limitiamo a sfruttarne la capacità di aggiungere in fondo ad una Vista il valore calcolato su uno dei Campi elencati. Ad esempio, alla Vista prima esemplificata aggiungiamo la media della durata dei prestiti:

Memorizzare in un Campo un valore calcolato

Il valore calcolato in un Campo Simple Math è mostrato all'Utente, ma non viene salvato nell'Entità ed è quindi disponibile solo dentro la Vista. Se invece vuoi salvare in un Campo dell'Entità un valore calcolato in base agli altri Campi dell'Entità stessa o di altre Entità, ci sono due modi:

  • aggiungere all'Entità un Campo di tipo Computed, messo a disposizione dal modulo aggiuntivo "Computed Field"; ma la configurazione di questo Campo richiede di saper programmare in PHP e quindi non rientra negli scopi di MieApp.
  • costruire una procedura ECA che, al salvataggio dell'Entità, esegue il calcolo partendo dagli altri Campi dell'Entità e memorizza il risultato in un ulteriore Campo dell'Entità stessa. 

Memorizzare in un Campo di una Entità il risultato di una elaborazione complessa consente di disporre immediatamente di quel risultato senza doverlo ricalcolare ogni volta che l'Entità viene mostrata. Tornando all'esempio svolto nei paragrafi precedenti di questa Guida, le date di inizio e fine di una Richiesta della app "Vicinato" sono desumibili dalle Consegne effettuate e una Vista EVA potrebbe mostrarle all'interno della pagina del Prestito. Ma questa soluzione sarebbe molto onerosa per mostrare tali date ad ogni Richiesta elencata in una Vista. In casi come questi, è più conveniente aggiungere alla Richiesta due Campi data, in cui una procedura ECA attivata quando lo stato della Richiesta diventa "conclusa" scrive le due date, identificate analizzando una tantum l'elenco delle Consegne associate alla Richiesta.

Georeferenziare una Entità

Le Entità selezionate con una Vista possono essere visualizzate non solo come un elenco o una tabella o una griglia, ma possono anche essere dislocate su una mappa geografica, grazie al modulo aggiuntivo "Geofield Map". Installato ed attivato questo modulo, avremo a disposizione il nuovo tipo di Campo Geofield in cui memorizzare le coordinate geografiche dell'Entità. Una volta aggiunto il Campo ad un tipo di Entità, il modo più semplice per scrivervi le coordinate è cercare la posizione geografica dell'Entità su una mappa e cliccarvi sopra.

Mappa → Geofield 

Con Geofield Map è possibile utilizzare Google Maps oppure Leaflet. Google Maps mette a disposizione di Geofield Map molte più opzioni, ma richiede una configurazione più complessa, in particolare occorre richiedere a Google un codice da inserire nel modulo, pone limiti sulla quantità di visualizzazioni (nella versione gratuita) e può porre problemi di riservatezza. Leaflet ha meno funzioni, ma utilizza le mappe gratuite di Openstreetmap, che non richiedono registrazioni o pagamenti e non condivide con terzi le informazioni della tua app. Per gli scopi di MieApp (e forse per la maggior parte delle tue app) Leaflet è più che adeguato. Le istruzioni che seguono fanno quindi riferimento a Leaflet. Anche se Geofield Map può utilizzare Leaflet per georeferenziare le Entità, non consente però poi di mostrarle in una Vista con una mappa Leaflet: per far ciò è necessario installare ed attivare anche il modulo aggiuntivo "Leaflet". 

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

Mostrare più Entità su una mappa

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

Geofield → Mappa 

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

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

Georeferenziare le Entità tramite indirizzo

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

Indirizzo → Geocoder → Geofield  

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

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

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

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

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

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

Nella sezione Relazioni:

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

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

predisponi la Vista ad essere richiamata filtrandola su uno specifico Attrezzo

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

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

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

Nella sezione Campi aggiungi

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

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

presenta la Vista come un calendario

Nella sezione Formato seleziona Full Calendar Display. Nelle Impostazioni:

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

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

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

🟥 Grafici

Da SCRIVERE

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

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

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

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

🟦 Le ECA

Cosa sono le ECA

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

ECA è lo strumento che più si avvicina alla stesura di un programma in Drupal, ma non richiede la conoscenza di un linguaggio di programmazione; quindi non avevo mentito quando, all'inizio di MieApp, ti ho detto che avremmo costruito app senza una riga di codice 😉.

In questa Guida e nelle seguenti vedremo come disegnare dentro il web browser una ECA, cioè una sequenza grafica di Azioni, controllate da Condizioni, che Drupal svolge quando occorre un Evento (da qui il nome del modulo).

Tra gli Eventi che possono attivare una ECA ci sono il click dell'Utente su un comando, il salvataggio di una Entità, il login di un Utente, l'esecuzione periodica del Cron di Drupal ecc. 

Tra le Azioni che puoi eseguire in una ECA ci sono: la creazione di nuove Entità, la modifica dei valori dei loro Campi, la ripetizione di una sequenza di Azioni sulle Entità selezionate elencate da una Vista, la spedizione di mail, il logout forzato di un Utente ecc.

Tra le Condizioni che controllano l'esecuzione delle Azioni ci sono la verifica del valore contenuto in un Campo, il confronto tra un Campo data e la data di sistema, la verifica dell'identità dell'Utente che sta eseguendo la procedura ecc.

A cosa servono le ECA

La risposta breve: un po' a tutto. Una risposta meno breve: a far fare a Drupal tutte le operazioni ripetitive o complesse che non intendi fare tu o far fare ai tuoi Utenti. Una risposta più completa: a inserire nella tua app tutte le automazioni che servono al suo corretto funzionamento, fungendo da "collante" tra operazioni eseguite dagli Utenti (o che gli Utenti si dimenticano di eseguire).

La stesura di una ECA (o più facilmente, di un insieme di ECA) può talvolta essere un'ottima alterativa alla installazione di un modulo aggiuntivo che non fa esattamente quel che ci serve o che è troppo complesso da configurare.  

Cosa installare (e cosa no) per costruire le ECA

Per poter costruire ed usare procedure ECA devi installare e attivare il modulo ECA.

Insieme ad esso vengono installati (ma non attivati) un buon numero di sotto moduli, ognuno dei quali mette a disposizione alcune degli Eventi, Condizioni ed Azioni che ci serviranno per la costruzione della nostra app. Questa struttura a piccoli moduli facilita agli sviluppatori della comunità Drupal la scrittura di nuove funzionalità ed infatti il cosiddetto "ecosistema ECA" cresce continuamente. In prima battuta, ti consiglio di attivarli tutti. 

Se l'attivazione di un sotto modulo ECA si blocca con l'avviso che manca un altro modulo, molto probabilmente si tratta di un sotto modulo che aggiunge ad ECA la capacità di interagire col modulo mancante: ad esempio, il sotto modulo "ECA Project Browser" richiede la presenza del modulo "Project Browser" e quindi non serve installarlo fino a quando non deciderai che ti serve proprio "Project Browser". 

Ti consiglio inoltre di non attivare il sotto modulo "ECA Workflow" perché, nonostante il nome, lavora col modulo "Workflows" del Core di Drupal che, come abbiamo visto, è una versione ridotta del ben più potente ed interessante modulo aggiuntivo "Workflow". E quest'ultimo non ha bisogno di sotto moduli per lavorare con ECA... c'è un po' di confusione di nomi con questi due moduli ma tu segui i miei consigli e via!   

Insieme al modulo ECA devi anche installare ed attivare uno dei moduli che ti mettono a disposizione un editor grafico con cui disegnare le procedure. Ad oggi io ho sempre usato il modulo BPMN.IO e quindi nelle prossime guide userò questo; però ce n'è almeno un altro, più recente e che mi riprometto di studiare: Modeler. 

L'editor grafico

Installato ed attivato il modulo aggiuntivo BPMN.IO che aggiunge l'editor grafico, possiamo iniziare a costruire le ECA disegnandole direttamente nel web browser. Il disegno segue una versione semplificata e ridotta dello standard BPMN (Business Process Model and Notation). Non è importante che tu conosca questo standard, perché in questa Guida ti fornirò le informazioni essenziali, mentre nelle Guide seguenti costruiremo insieme alcuni esempi.

Per entrare nell'editor, vai in Configurazione - ECA e clicca Add new model. Ti appare un foglio da disegno vuoto, racchiuso da due barra di icone (a sinistra e sotto il foglio) e da una barra di pulsanti in alto. Nella figura che segue, ti mostro anche le due finestre di configurazione che appaiono quando clicchi su un elemento disegnato nel foglio: 

I comandi per spostare , zoomare, riordinare e scaricare il disegno e quelli con cui selezionare uno o più elementi del disegno sono intuitivi e non li spiego. Mi soffermo invece sui comandi di disegno vero e proprio, evidenziati in grassetto nella figura.

Disegnare una ECA

Disegnare una ECA con l'editor grafico consiste nell'aggiungere al foglio da disegno uno o più elementi collegati da frecce e nella loro configurazione. Gli elementi sono:

Ci sono due modi per aggiungere elementi al disegno:

  • cliccare sull'icona corrispondente all'elemento nella barra di sinistra e  trascinare l'elemento nel foglio (solo per cerchi, rettangoli e rombi)
  • cliccare su un elemento già inserito nel disegno: nel menù grafico che appare sulla sua destra, cliccare sul nuovo elemento che si vuole aggiungere al disegno; in questo menù sono presenti anche il comando per cancellare l'elemento (bidone) e per colorare l'elemento (pennello)

Configurare un elemento

Un elemento aggiunto al disegno non serve a nulla se non si specifica quale funzione svolge ed quali sono i parametri necessari al suo funzionamento. Quando aggiungi un elemento nel disegno o clicchi su un elemento già disegnato, si apre la finestra Choose element template, in cui devi selezionare la funzione (template) svolta dall'elemento: le funzioni disponibili dipendono dal tipo di elemento (Evento, Condizione, Azione) e da quali moduli ECA hai attivato. Le funzioni sono elencate raggruppate per modulo. Selezionata una funzione, si apre la finestra di configurazione, in cui devi indicare i parametri richiesti dalla funzione. Se hai sbagliato a selezionare la funzione, nella finestra di configurazione clicca l'icona "bidone" per eliminarla dall'elemento e tornare a selezionare un'altra funzione. 

I Token nelle procedure

Ogni elemento può creare o valorizzare un Token. Un Token creato o valorizzato da un elemento può essere usato per configurare gli elementi seguenti, nell'ordine indicato dalle frecce. Un Token quindi memorizza e trasporta lungo la ECA un valore, che può essere un testo, un numero, una data, una Entità o anche una lista di Entità. Ad esempio, se un elemento crea un Token di nome "attrezzo" e vi memorizza una Entità, nella configurazione di un elemento successivo potremo:

  • usare il Token, digitandone il nome (senza parentesi): attrezzo
  • usare il valore del Token (cioè l'Entità memorizzata in esso) digitiamone il nome tra parentesi quadre: [attrezzo]

Oltre ai Token creati lungo la ECA, per la configurazione degli elementi hai anche a disposizione i Token corrispondenti ai Campi delle Entità: per identificarli e copiarli nella configurazione degli elementi clicca il pulsante Token in alto a destra: ti viene mostrata la gerarchia dei Token da cui puoi copiare ed incollare i Token. Nella gerarchia, i Token sono però mostrati con un nome generico, che indica il tipo di Entità: ad esempio, il Token del Campo che contiene il nome dell'Autore di un Contenuto è [node:author], perché node è nome generico dei Contenuti. Quando incolli il Token nella configurazione di un elemento, devi invece specificare da quale Entità prelevare il valore del Campo sostituendo il nome generico col nome del Token in cui è memorizzata l'Entità: se l'Entità è memorizzata nel Token "attrezzo", nella configurazione modificherai [node:author] in [attrezzo:author]. 

Documentare una ECA

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

 

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

 

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

Eseguire la ECA

Dopo che hai salvato la ECA col pulsante Salva, la procedura è pronta e resta in attesa che accada uno degli Eventi che hai inserito nel suo disegno. Quando infatti accade uno di essi, partendo da quell'elemento Drupal percorre il disegno seguendo le frecce ed esegue le funzioni associate agli elementi via via incontrati. L'esecuzione termina quando il percorso arriva su in un elemento da cui non partono altre frecce o che non richiama un'altra ECA (vedi Azione Custom Event). 

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

Gli Eventi

Per essere eseguita, la ECA deve contenere almeno un Evento. Se una ECA contiene più Eventi, verrà eseguita quando accade uno qualunque di essi, quindi la medesima ECA può rispondere a diversi Eventi. I tipi di Eventi sono molti. Ecco una breve spiegazione di quelli che, nella mia esperienza, sono più utili nella costruzione di una app:

Le Azioni

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

Le Condizioni (e i gateway)

Quando due elementi sono collegati da una freccia, Drupal li esegue sequenzialmente secondo il verso della freccia stessa. Applicando una Condizione alla freccia possiamo consentire o impedire l'esecuzione del secondo elemento (e di tutti quelli che lo seguono) sulla base dell'esito (positivo o negativo) di un confronto tra un valore dedotto da un Token ed un secondo valore (fisso o preso da un altro Token). Se da un elemento escono più frecce, applicando diverse Condizioni a ciascuna di esse possiamo far proseguire l'esecuzione in una parte della ECA oppure in un'altra. Quindi è come se le Condizioni facessero apparire o sparire le frecce in base ai valori assunti dei Token durante l'esecuzione. 

Non è strettamente obbligatorio, però inserire un gateway (rombo) prima di un gruppo di frecce soggette a diverse Condizioni che dipartono da un medesimo elemento facilita la comprensione del disegno:

 

Le Condizioni sono applicate alle frecce, non al gateway. Oltre che come elemento che "divide" la ECA in tanti percorsI alternativi, il gateway è usato anche come elemento che "raccoglie" percorsi precedentemente separati, come illustrato nell'esempio.

Ecco una breve spiegazione dei tipi di Condizioni che, nella mia esperienza, sono più utili nella costruzione di una app:

 

In una app capita spesso di dover applicare le stesse Azioni su un insieme di Entità. Prendiamo come semplice esempio la costruzione di un comando che aggiorna il prezzo di rivendita di tutti i prodotti, calcolato come costo di acquisto per una percentuale di ricarico. Possiamo costruire questo comando grazie alla capacità di un Token di memorizzare una lista di Entità e facendo collaborare le ECA con le Viste:

  1. Costruiamo una Vista che elenca tutte le Entità di tipo "Prodotto" di cui vogliamo aggiornare il prezzo. Questa Vista non viene mostrata all'Utente, ma serve solo per selezionare le Entità su cui agirà la ECA.
  2. Disegniamo una ECA che, lanciata da un click dell'Utente, richiama la Vista memorizzando in un Token l'elenco dei Prodotti e, per ogni Prodotto elencato nel Token, esegue una seconda ECA che aggiorna il campo Prezzo dell'Entità passatole dalla prima ECA.  Entrambe le ECA sono disegnate nello stesso foglio e salvate insieme dall'editor grafico.

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

  • l'Evento Endpoint access attiva la ECA quando l'Utente clicca il link /eca/aggiornaprezzi (mostrato all'Utente come comando "Aggiorna Prezzi")
  • l'Azione Views: Execute query richiama la Vista che elenca i Prodotti e memorizza le Entità selezionate dalla Vista nel Token "prodotti"
  • l'Azione Trigger a custom event (entity-aware) attiva la ECA "Aggiorna Prezzo" su ognuna delle Entità memorizzate nel Token "prodotti"

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

  • l'Evento Custom event (entity aware) attiva la ECA quando viene eseguita un'Azione Trigger a custom event (entity-aware) che richiama "Aggiorna Prezzo" e memorizza l'Entità nel Token entity
  • l'Azione Tamper: Math calcola il prezzo memorizzandolo nel Token "prezzo"
  • l'Azione Entity: set field value scrive il valore [prezzo] nel Campo "Prezzo" della Entità [entity] e la salva

Quando termina l'esecuzione della seconda ECA, Drupal torna automaticamente all'Azione Trigger a custom event (entity-aware) della prima ECA, che attiva nuovamente la seconda ECA passandole stavolta l'Entità successiva e così via, fino all'esaurimento delle Entità memorizzate in "prodotti".

Anche se nel disegno non si vedono frecce che vanno dalla prima alla seconda ECA e viceversa, grazie al coordinamento dell'Azione Trigger a custom event (entity-aware) della prima ECA con l'Evento Custom event (entity aware).della seconda abbiamo realizzato un ciclo tra le due ECA, che viene ripetuto su tutte le Entità selezionate dalla Vista.

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

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

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

MODIFICARE RICHIAMANDO CRON DA FUORI E ATTIVANDO LA ECA SEMPRE MA CON FILTRI AL SUOO INTERNO BASATI SU PERMANENT STATE.

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

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

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

 

Abbiamo visto in Guide precedenti come aggiungere comandi a pagine e Viste. Nella maggior parte dei casi, quei comandi richiamano altre pagine ed altre Viste, costruendo così un percorso all'interno della nostra app. Abbiamo però anche già incontrato un caso in cui il comando avrebbe dovuto modificare una Entità, anche superando i permessi dell'Utente che lo clicca. 

In questa Guida vediamo come costruire una ECA che esegue un comando cliccato dall'Utente. Una ECA di questo tipo è formata dai seguenti elementi:

Come esempio, costruiamo per la app "Vicinato" il comando "Accetta una consegna", con cui un Utente accetta la Consegna dell'Attrezzo proposta da un altro Utente. L'esempio è abbastanza complesso e applichiamo in essa molte delle tecniche che abbiamo visto nelle Guide precedenti, compreso l'uso di Viste dentro le ECA. L'accettazione di una Consegna ha infatti una serie di effetti sulla Consegna stessa, sulla Richiesta cui si riferisce e sull'Attrezzo prestato:

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

Ecco come costruirla passo per passo:

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

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

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

 

temi

dove trovarli e come installarli (composer)

configurazioni

 

 

 

Operazioni di manutenzione della app

🟨 Cron

Cos'è Cron?

DA SCRIVERE

Come lo eseguo?

DA SCRIVERE RICHIAMANDOLO DA DENTRO O PER MAGGIORE PRECISIONE DISABILITANDO L'AUTOESECUZIONE E ASSEGNANDOLA AD UN CRON ESTERNO

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.

Nel Terminale

composer require drush/drush

vendor/bin/drush cr

composer update

Da web browser

https://INDIRIZZOAPP/upgrade.php

 

 

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.

Modulo Backup and Migrate

Occorre definire il percorso private:// in settings.php

 

 

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: