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.

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

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

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

Devo leggere tutte queste Guide?

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

Come leggerle

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

Posso trasformare le Guide in un libro da leggere?

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

Il "vocabolario" di Drupal

Come tutti i software, anche Drupal ha un suo vocabolario. 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 variano leggermente tra installazione locale sul tuo computer e in cloud, i dettagli sono spiegati nelle Guide che seguono:

 

Cosa devi fare

sul tuo computer

in cloud

1

installa le componenti software necessarie a Drupal

utilizza una delle procedure disponibili gratuitamente su internet per installare e configurare il web server, il gestore di database, l'interprete php, il Terminale e Composer

ci pensa il provider

2

prepara lo spazio dove installare Drupal

crea una cartella gestita dal web server dove installare Drupal

crea un sito virtuale usando i comandi del provider; l'indirizzo della app coincide con l'indirizzo del sito virtuale.
Il provider mette a disposizione una procedura di installazione automatica di Drupal?

3

prepara l'indirizzo con cui richiamare la app

modifica la configurazione del web server per puntare direttamente alla cartella

NO

SI

4

prepara il database necessario a Drupal

crea un database utilizzando il gestore di database

ci pensa la procedura

5

installa Drupal nello spazio che hai preparato

scarica e installa Drupal usando composer e lancia la procedura di installazione

6

configura Drupal per il primo utilizzo

completa la procedura di installazione con le informazioni base richieste

fornisci alla procedura solo alcune informazioni

7

installa drush

utilizza composer per 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

installa le componenti software necessarie a Drupal

2

prepara lo spazio dove installare Drupal

3

prepara l'indirizzo con cui richiamare la app

4

prepara il database necessario a Drupal

5

installa Drupal nello spazio che hai preparato

6

configura Drupal per il primo utilizzo

7

installa drush

1.Installa 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.Prepara 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.Prepara 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.Prepara il database

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

installa le componenti software necessarie a Drupal

ci pensa il provider

2

prepara lo spazio dove installare Drupal

crea un sito virtuale usando i comandi del provider.

3

prepara l'indirizzo con cui richiamare la app

; l'indirizzo della app coincide con l'indirizzo del sito virtuale
 Il provider mette a disposizione una procedura di installazione automatica di Drupal?NOSI

4

prepara il database necessario a Drupal

crea un database utilizzando il gestore di database

ci pensa la procedura

5

installa Drupal nello spazio che hai preparato

scarica e installa Drupal usando composer e lancia la procedura di installazione

6

configura Drupal per il primo utilizzo

completa la procedura di installazione con le informazioni base richieste

fornisci alla procedura solo alcune informazioni

7

installa drush

installa drush utilizzando composer

1. Installa le componenti software necessarie → scegli il servizio cloud giusto

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

Il provider mette a disposizione la procedura di installazione automatica per Drupal?

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

La procedura di installazione automatica di Drupal crea il database (passo 4), installa Drupal (passo 5), lo configura per il primo utilizzo (passo 6) fornendole solo alcune informazioni base, tra cui la lingua ("italiano"), la username dell'Amministratore (di solito si sceglie "admin"), la password dell'Amministratore (a tua scelta), l'email dell'Amministratore e del sito (normalmente, la tua email). 

4. Prepara il database

Se non hai usato la procedura di installazione automatica di Drupal, devi preparare 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. Installa 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

6. Configura 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.Installa 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. 

Descrivi la tua app

Anche se potrai cambiare idea lungo il percorso, è comunque importante partire avendo in mente una prima idea di cosa vuoi dalla tua app. Ti suggerisco di provare a descriverla rispondendo a queste domande:

  • Scopo: descrivi con poche parole lo scopo della app
  • Azioni: elenca le principali azioni che si possono eseguire nella app
  • Informazioni: identifica le informazioni necessarie per l'esecuzione delle azioni. 
  • Utenti: identifica le persone che useranno la app.
  • Protezioni: definisci quali azioni sulle Informazioni possono essere eseguite dai diversi Utenti 
  • Percorsi: descrivi a parole o con un diagramma il percorso offerto agli Utenti, come sequenza di comandi e pagine. 
  • Automazioni: elenca le azioni che la app deve eseguire senza necessità di comandi da parte degli Utenti.

Troverai un paio di esempi di descrizione nelle Guide che seguono.

Traduci la descrizione in configurazioni di Drupal

Descritta (anche sommariamente) la app, vediamo come utilizzare gli strumenti messi a disposizione da Drupal per tradurre la descrizione in configurazioni. 

Dalle informazioni ai Contenuti

Il modo più semplice ed intuitivo per rappresentare in Drupal le Informazioni che hai identificato è creare per ogni tipo di Informazione uno o più Tipi di Contenuti. Ad esempio, se la tua app deve gestire la tua biblioteca personale, potresti aver bisogno di memorizzare Autori, Libri, Categorie e Scaffali: per disporre rapidamente di una prima versione della app, ti basta aggiungere in Drupal un Tipo di Contenuto "Autore" caratterizzato da nome e cognome, "Categoria" caratterizzato semplicemente da un titolo, "Scaffale" caratterizzato da una descrizione (es. "Libreria Sala, quarto dall'alto") e "Libro" caratterizzato da titolo, anno di edizione, editore, uno o più Autori ed una o più Categorie ed uno Scaffale. Vedremo nella apposita Guida come è facile con Drupal e come, definiti questi Tipi, inserire nella app i Contenuti e collegarli tra loro.

In realtà, Drupal gestisce anche entità diverse dai semplici Contenuti, quali ad esempio File, Commenti, Utenti ecc. ma lo scopriremo a tempo opportuno. 

Dalle persone agli Utenti e Ruoli

In particolare, se prevedi che la tua app sia utilizzata da altri oltre a te, per la gestione degli utenti della app Drupal mette a disposizione il tipo predefinito "Utente", per il quale hai a disposizione le funzioni di creazione, modifica, cancellazione, autoregistrazione, login, logout ed altre ancora. Crea un Utente diverso per ogni persona fisica, altrimenti non potrai distinguere chi fa cosa.

Drupal distingue tra i Visitatori (chi usa la tua app senza registrarsi), gli Utenti autenticati (chi usa la tua app dopo essersi registrato) e l'Amministratore (cioè tu). Se hai bisogno di differenziare ulteriormente gli Utenti autenticati in tipi con diversi poteri, crea un Ruolo per ogni tipo. Ad esempio, se la tua app    

 Sempre negli esempi già visti, potremo creare i Ruoli "Vicino", "Gestore" e "Operatore". Fin qui i Ruoli sono semplicemente delle etichette da applicare agli Utenti per categorizzarli, ma vedremo da poco come Drupal usa i Ruoli per definire cosa gli Utenti possono fare nella app deve gestire un gruppo di lavoro, potresti definire i Ruoli "Collaboratore" e "Responsabile" per distinguere chi produce Contenuti da chi li valida o autorizza.

Dalle protezioni ai Permessi

Configurati i tipi di Contenuti e i Ruoli Utente, Drupal ti mette a disposizione una gestione dei Permessi con la quale abilitare i diversi Ruoli a creare, modificare, cancellare i diversi Tipi di Contenuti e a utilizzare altre funzioni non relative ai Contenuti (es. creazione di Utenti). Vedremo più avanti che la protezione offerta dai Permessi può essere integrata con strumenti più sofisticati, grazie all'installazione di moduli aggiuntivi (es. coi Gruppi è possibile creare comunità di Utenti e Entità con Ruoli che valgono solo all'interno del Gruppo). 

Da percorsi alle Viste e Menù  

Per la presentazione dei Contenuti e degli Utenti. Drupal mette a disposizione le Viste, un potentissimo strumento cui dedicherò molte Guide. Con le Viste puoi predisporre le pagine della tua app indicando quali tipi di Contenuti o Utenti mostrare, in che ordine, quali filtri applicare e mescolando informazioni prese da diverse entità. Ad esempio, potrai costruire una pagina "BIblioteca" che elenca tutti i tuoi Libri con un filtro sulla Categoria e una ricerca per Autore, una pagina "Autore" che mostra i dati di un Autore e i suoi libri ed una pagina "Scaffalatura" che elenca tutti gli scaffali e, cliccando su uno di essi, l'elenco dei libri ivi collocati. Con le Viste puoi anche aggiungere comandi che appaiono solo se il contesto lo richiede (es. un comando "Prendi in prestito questo Oggetto" che appare solo se l'Oggetto mostrato non appartiene all'Utente che lo sta guardando). 

Oltre alle Viste, Drupal ti permette di configurare più Menù di comandi, che a loro volta richiamano azioni o Viste.

Dalle azioni ai Moduli

Le funzioni necessarie per gestire Contenuti, Utenti, Ruoli, Permessi, Viste, Menù e molti altri aspetti di Drupal che presenteremo via via che ci serviranno sono già in Drupal. Se la tua app richiede azioni non disponibili nella installazione base di Drupal, puoi cercare tra le migliaia di Moduli aggiuntivi messi a disposizione gratuitamente dalla comunità quello che fa per te. Ad esempio, ci sono Moduli per rappresentare i Contenuti su mappa geografica, per spedire mail agli Utenti, per condividere i Contenuti sui social, per aggiungere nuovi tipi di protezioni ecc. In MieApp presenterò Moduli aggiuntivi che mi capita più spesso di utilizzare nella costruzione di app.  

Dalle automazioni alle ECA

Per far eseguire automaticamente a Drupal azioni in modo periodico o come conseguenza di una azione di un Utente, puoi disegnare procedure ECA (Event - Condition - Action), che spiegano a Drupal quali azioni eseguire quando accade un certo evento sotto certe condizioni. Le ECA sono forse la cosa che si avvicina di più alla programmazione in Drupal, ma non richiede conoscenza di linguaggi specialistici ed usa tutti gli altri strumenti Drupal che nel frattempo avrai imparato a conoscere.

Qualche esempio

Nelle Guide che seguono, applicherò 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.

Usiamo il metodo che abbiamo visto per descrivere la app e costruirla come configurazione di una installazione Drupal.

Descrizione della app

Scopo della app è gestire la mia biblioteca personale e i prestiti effettuati agli amici. Le Azioni previste sono il caricamento dei libri nella app, comprensivo del loro posizionamento negli scaffali e la gestione dei prestiti. Le Informazioni da gestire nella app sono quindi i Libri, le Categorie dei Libri, gli Autori dei libri, gli Scaffali su cui sono collocati i Libri, gli Amici cui presto i Libri, i Prestiti di Libri agli Amici. L'unico Utente della app sono io (gli amici non sono Utenti perché non hanno accesso alla app). Non ci sono Protezioni particolari, perché io posso fare tutto. I Percorsi principali sono due: la "biblioteca" (elenchi coordinati di libri, autori e scaffali) e i "prestiti" (elenchi dei prestiti con gestione degli Amici). Non prevedo Automazioni.

Dalle Informazioni ai Contenuti

Definiamo per ogni Informazione quale tipo di Contenuto la memorizza (Istruzioni per creare Tipi di Contenuti).

Libro: ogni libro è rappresentato da un Contenuto di tipo "Libro" così definito:

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
NotatestoNota sul libro, es. sul suo stato di conservazione

Autore: ogni autore è rappresentato da un Contenuto di tipo "Autore" così definito:

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" così definito:

CampoTipoDescrizione
Titolotestotitolo della categoria
NotatestoNota sulla Categoria, es. sinonimi

Scaffale: ogni Scaffale è rappresentato da un Contenuto di tipo "Scaffale" così definito:

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" così definito:

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

Prestito: ogni prestito effettuato è rappresentato da un Contenuto di tipo "Prestito" così definito:

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

Dalle persone agli Utenti e Ruoli

Non sono previsti Utenti diversi da te, che sei Amministratore. Quindi non c'è necessità di definire altri Ruoli oltre quelli predefiniti in Drupal.

Dalle protezioni ai Permessi

L'unico utente è l'Amministratore, che bypassa tutte le protezioni, quindi non c'è necessità di definire Permessi particolari, salvo proibire ai Visitatori di vedere i Contenuti della app.

Da percorsi alle Viste e Menù

Per la navigazione dentro la app prevediamo le seguenti pagine, cui corrispondono Viste (Istruzioni per costruire le VIste). Ogni pagina mostra Contenuti e comandi. Cliccando su un Contenuto mostrato (Libro, Categoria, Scaffale, Autore, Prestito, Amico) si passa alla pagina di dettaglio di quel Contenuto.

PaginaContenutiComandi
Bibliotecaelenco dei libri, ricercabile per titolo, nota, autore, categoria, scaffaleAggiungi libro
Librodati del Libro ed elenco dei suoi PrestitiModifica Libro
Aggiungi prestito sul libro
Autoredati dell'Autore ed elenco dei suoi LibriModifica Autore
Vai a Autori
Autorielenco degli AutoriAggiungi Autore
Categoriadati della Categoria e elenco dei suoi LibriModifica Categoria
Vai a Categorie
Categorieelenco delle CategorieAggiungi Categoria
Scaffaledati dello Scaffale e elenco dei suoi LibriModifica Scaffale
Vai a Libreria
Libreriaelenco degli ScaffaliAggiungi Scaffale
Prestitodati del Prestito Modifica Prestito
Vai a Prestiti
Prestitielenco dei Prestiti 
Amicodati dell'Amico e elenco dei suoi PrestitiModifica Amico
Vai a Amici
Amicielenco degli AmiciAggiungi Amico

Per accelerare la navigazione, mettiamo nel menù principale i comandi "Biblioteca" "Amici" "Prestiti" che portano direttamente alle omonime pagine.

Dalle azioni ai Moduli

Le funzioni base per gestire tutti i Contenuti sono già disponibili in Drupal. Per aggiungere alla pagina di un Contenuto gli elenchi di altri Contenuti collegati ad esso dobbiamo installare il modulo aggiuntivo EVA.

Dalle automazioni alle ECA

Non si prevedono azioni automazioni da parte di Drupal. 

Sono solo due esempi, da cui potresti trarre spunto per le tue app.

La app "Miei Libri"

ScopoLa app mi aiuta a tenere traccia dei prestiti di miei oggetti che ho concesso ad amici
Azioni
 
Io carico nella app gli oggetti che intendo prestare, i prestiti che ho concesso e l'esito del prestito
Utenti
 
io sono l'unico utente della app, i miei amici non hanno accesso alla app.
Informazioni
 
Un Oggetto è identificato da un codice, un nome, una descrizione. 
Un Amico, cui presto uno o più Oggetti
Un Prestito di un Oggetto ad un Amico, con data di inizio e fine prestito e una mia valutazione finale sul prestito.
Protezioni
 
io posso fare tutto su tutte le informazioni.
Percorsiquando entro nella app, mi viene mostrato l'elenco dei Prestiti aperti e un menù coi comandi per caricare nuovi Oggetti e nuovi Prestiti e cercare nei Prestiti per Oggetto o Amico..
Automazioninessuna automazione

La app "Prestiti tra Vicini"

ScopoLa app aiuta i vicini di casa a prestarsi a vicenda i propri oggetti, tracciando le consegne e l'esito dei prestiti a maggiore garanzia di tutti.
Azioni
 
Ogni vicino carica nella app gli oggetti che mette a disposizione degli altri, cerca un oggetto che gli serve e lo chiede in prestito; il proprietario dell'oggetto può concederlo in prestito. 
La consegna può avvenire direttamente tra richiedente e proprietario oppure attraverso una sede aperta al pubblico (es. la biblioteca comunale) col coinvolgimento degli operatori di sede. 
La app registra tutte le consegne di un oggetto per tracciarne la posizione. 
Al termine di un prestito, richiedente e proprietario possono esprimere una valutazione sull'esperienza.
Oltre ai prestiti, occorre gestire gli utenti.
Utenti
 
La app è utilizzata da tre categorie di utenti: 
i Vicini che si prestano vicendevolmente gli oggetti;
gli Operatori che consegnano gli oggetti presso le sedi;
i Gestori che gestiscono la app, autorizzano gli operatori nelle diverse sedi e risolvono i problemi. 
Informazioni
 

Un Oggetto è identificato da un codice, un nome, una descrizione, una immagine ed altri documenti (es. manuale d'uso), il luogo dove si trova e un Ambito di utilizzo (es. giardino, edilizia, idraulica, cucina, cucito). 
Un Prestito è definito dall'Oggetto richiesto, dal Vicino richiedente e da qualche altra informazione (es. quando serve e per cosa). 
Una Consegna si riferisce ad un Prestito e registra l'utente che consegna l'Oggetto, l'utente che lo riceve, il luogo e la data di consegna. 
Una Valutazione si riferisce ad un Prestito e registra l'esito espresso dal richiedente o dal proprietario dell'Attrezzo. 
Ogni Sede è definita da una posizione geografica e dagli orari di apertura. 
Una Abilitazione si riferisce ad una Sede ed un Operatore abilitato a operare in quella Sede.
Ogni Utente è caratterizzato da nome, cognome, credenziali di accesso, ruolo nella app

Nota: rispetto alla app "Miei Libri" gli Amici non sono più una Informazione, ma Utenti veri e propri della app.

Protezioni
 
L'Oggetto è caricato e modificato solo dal Vicino suo proprietario; è visibile a tutti gli utenti. 
Il Prestito è attivato da un Vicino e concesso dal proprietario dell'Oggetto; è visibile solo a loro due, ai Gestori e agli Operatori. 
La Consegna è preparata dall'utente che ha in mano l'Oggetto e confermata dall'utente che lo riceve; è visibile solo al proprietario e al richiedente, ai Gestori e agli Operatori della Sede in cui è l'Oggetto. 
La Valutazione è espressa dal richiedente o dal proprietario del Prestito, visibile ad entrambi e ai Gestori, è modificata solo dal Vicino che la esprime. 
Le Sedi e le Autorizzazioni sono caricate e modificate dai Gestori e viste da tutti. 
Ogni Utente gestisce i propri dati personali. Solo i Gestori vedono i dati di tutti gli Utenti e attribuiscono i ruoli.
PercorsiAl Vicino è presentato un Cruscotto che mostra: l'elenco dei Prestiti aperti che ha richiesto e i comandi per consultare quelli chiusi e cercare altri Oggetti da richiedere e dall'altro; l'elenco dei Prestiti aperti che ha concesso e i comandi per consultare quelli chiusi e i propri Oggetti; le Consegne in attesa di sua conferma. 
All'Operatore è presentato un Cruscotto, che elenca le Sedi per cui è autorizzato e, per ogni Sede elenca gli Oggetti presenti, le Consegne aperte e gli Operatori autorizzati. 
Al Gestore è presentato un menù coi comandi per la gestione degli utenti, per la gestione di Sedi ed Autorizzazioni e per cercare su tutti i Prestiti. A tutti gli utenti è presentato un comando per la gestione dei propri dati personali.
AutomazioniDa definire

 

Qui riporto come configurare Drupal per costruire la app "Prestiti tra Vicini".

Le Entità

Le Entità necessarie alla app sono gli Utenti e diversi Tipi di Contenuto.

Utente: un Utente della app è rappresentato da una Entità di tipo Utente, cui aggiungiamo con Configurazione - Impostazione profilo - Gestisci Campi i seguenti Campi utili a identificare con ragionevole certezza le persone che usano la app:

CampoTipoDescrizione
NometestoNome della persona
CognometestoCognome della persona
RitrattoimmagineFoto della persona

Oggetto: un Oggetto che può essere prestato è rappresentato da un Contenuto di tipo "Oggetto". L'Oggetto viene creato nella app dall'Utente suo proprietario, che è quindi memorizzato nel Campo predefinito "Autore" dell'Oggetto. Gli altri Campi del Tipo di Contenuto "Oggetto" sono:

CampoTipoDescrizione
Titolotestonome breve dell'Oggetto
Descrizionetestodescrizione dell'Oggetto
Immaginefileimmagine descrittiva dell'Oggetto
Statoselezione"Richiedibile" se l'Oggetto può essere richiesto in prestito. "Ritirato" 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".
Ambitoriferimento a AmbitiAmbito di utilizzo dell'Oggetto

Ambito: un Ambito di utilizzo degli Oggetti (es. "Giardino", "Edilizia", "Idraulica", "Cucina", "Sartoria", "Bricolage") è rappresentato da un Contenuto di tipo "Ambito", formato dai seguenti Campi:

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

Sede: una Sede in cui è possibile consegnare gli Oggetti è rappresentato da un Contenuto di tipo "Sede". Oltre alle Sedi vere e proprie, per uniformare il caso della consegna diretta tra proprietario e richiedente al caso di consegna in una Sede, sono presenti nel database due Contenuti di tipo "Sede" che corrispondono al luogo dove si trova il proprietario dell'Oggetto ("#Proprietario") e il richiedente ("#Richiedente"). I Campi del tipo "Sede" sono:

CampoTipoDescrizione
Titolotestonome breve 
NotatestoDescrizione completa , compresi indirizzo e contatti 
SedebooleanoSi | No (Se No, indica il luogo dove si trova il  Proprietario o il  Richiedente)
Statoselezione"Attiva" se è possibile procedere a Consegne nella Sede. "Inattiva" se la Sede non è più utilizzabile.
Posizionecoordinate(solo se Sede =Si) Coordinate geografiche della Sede, serve per rappresentarla su mappa geografica

Abilitazione: per ogni Operatore abilitato ad agire in una Sede, esiste un Contenuto di tipo "Abilitazione", formato dai seguenti Campi:

CampoTipoDescrizione
TitolotestoTitolo automatico, formato da "Abilitazione n. CODICE" dove CODICE è il valore del Campo "Codice"
CodiceserialeNumero progressivo automatico
Sederiferimento a SediSede 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ù

Richiesta: una Richiesta di prestito su un Oggetto avanzata da un Utente è 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 del Tipo di Contenuto "Richiesta" sono:

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

Concessione: una Concessione di prestito di un Oggetto in risposta ad una Richiesta è 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 Richiesta. Gli altri Campi del Tipo di Contenuto "Concessione" sono:

CampoTipoDescrizione
TitolotestoTitolo automatico, formato da "Concessione n. CODICE" dove CODICE è il valore del Campo "Codice"
CodiceserialeNumero progressivo automatico
Richiestariferimento a RichiesteRichiesta cui il Prestito 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: il passaggio di un Oggetto da un Utente ad un altro Utente è registrato nella app 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 del Tipo di Contenuto "Consegna" 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 SediSede in cui avviene 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 con apposito comando di aver fisicamente ricevuto l'Oggetto

Nota: una Nota serve per aggiungere alle informazioni inizialmente scritte nei Campi "Nota" di Richiesta o di Concessione ulteriori informazioni scambiate tra proprietario e richiedente durante il prestito, ad esempio per concordare tempi e modi delle consegne o fornire informazioni sull'uso dell'Oggetto, senza esporre indirizzi personali. Ogni Nota è rappresentata da un Contenuto di tipo "Nota". Chi scrive la Nota è registrato come "Autore" della Nota. Gli altri Campi del tipo "Nota" sono:

CampoTipoDescrizione
TitolotestoTitolo automatico, formato da "Nota n. CODICE" dove CODICE è il valore del Campo "Codice"
CodiceserialeNumero progressivo automatico
Richiestariferimento a RichiesteRichiesta cui si riferisce la Nota (il riferimento è alla Richiesta, perché la Concessione potrebbe non essere stata ancora creata)
TestotestoTesto della Nota
Allegatifile multivaloreAllegati alla Nota

Valutazione: la Valutazione finale sull'esperienza di prestito è rappresentata da un Contenuto di tipo "Valutazione". il passaggio di un Oggetto da un Utente ad un altro Utente è registrato nella app 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 del Tipo di Contenuto "Consegna" 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 SediSede in cui avviene 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

I Ruoli Utente

RuoloCosa può fare
VicinoCarica nella app e gestisce i propri Oggetti. 
Chiede in prestito Oggetti altrui e li riceve in consegna. 
Concede in prestito i propri Oggetti e li consegna. 
Scrive Note relative ai prestiti che lo coinvolgono come proprietario o richiedente
Valuta l'esperienza di prestito.
OperatoreRiceve e consegna Oggetti coi Vicini.
GestoreGestisce gli Utenti.
Supporta gli Utenti all'uso della app.
Interviene su Richieste, Concessioni e Valutazioni per risolvere problemi.
Gestisce le Sedi di consegna.
Abilita gli Operatori nelle Sedi.
Gestisce l'anagrafica degli Ambiti per la categorizzazione degli Oggetti.

Le Protezioni

Ai Visitatori sono negati tutti i Permessi sui Contenuti, compresa la visualizzazione. 

Tipo di Contenuto

Vicino

Operatore

Gestore

UtenteCrea il proprio profilo (autoregistrazione)
Modifica il proprio profilo
Visualizza tutti (solo nome)
Modifica il proprio profilo
Visualizza tutti (solo nome)
Crea profili altrui
Modifica tutti
Visualizza tutti
OggettoCrea nuovo 
Modifica i propri
Visualizza tutti 
Visualizza tutti
 
Modifica tutti
Visualizza tutti
 
SedeVisualizza tutteVisualizza tutteCrea nuova
Modifica tutte
Visualizza tutte
Abilitazione Visualizza tutteCrea nuova
Modifica tutte
Visualizza tutte
RichiestaCrea nuova
Modifica o elimina le proprie se in Stato Aperta
Visualizza se Richiedente o Proprietario
Visualizza se Consegna in Sede abilitata Modifica tutte
Visualizza tutte
ConcessioneCrea nuova su Richiesta di proprio Oggetto
Modifica o elimina le proprie se in Stato Aperta
Visualizza se Richiedente o Proprietario
Visualizza se Consegna in Sede abilitata Modifica tutte
Visualizza tutte
ConsegnaCrea nuova su Concessione se Richiedente o Proprietario
Modifica o elimina le proprie se in Stato Proposta
Mette in Stato Avvenuta se Destinatario
Crea nuova per Sede abilitata
Modifica o elimina le proprie se Stato Proposta
Mette in Stato Avvenuta se Sede abilitata
Modifica tutte
Visualizza tutte
NotaCrea nuova su Richiesta se Richiedente o Proprietario
Modifica e elimina le proprie
Vede quelle su Richiesta se Richiedente o Proprietario
  
ValutazioneCrea nuova su Richiesta se Richiedente o Proprietario
Modifica e elimina le proprie
Vede quelle su Richiesta se Richiedente o Proprietario
  

Queste Protezione si ottengono a tre livelli:

  • Regolando i in Persone - Permessi i Permessi base, tipicamente negando i Permessi che sono poi assegnati dai Workflow
  • Assegnando ulteriori Permessi con i Workflow
  • Proteggendo i singoli Contenuti con le Viste, in base alle loro relazioni coi singoli Utenti 

OGGETTO 

Permessi base: 

 VicinoOperatoreGestore
CreaSINOSI
Modifica propriSINOSI
Modifica tuttiNONOSI
Elimina propriNONOSI
Elimina tuttiNONOSI

 

RICHIESTA
Permessi base

 VicinoOperatoreGestore
CreaSINOSI
Modifica propriNO
(ci pensa il Workflow)
NOSI
Modifica tuttiNONOSI
Elimina propriNO
(ci pensa il Workflow)
NOSI
Elimina tuttiNONOSI

  WORKFLOW

 VicinoOperatoreGestore
Modifica NO
(ci pensa il Workflow)
NOSI
Modifica tuttiNONOSI
Elimina propriNO
(ci pensa il Workflow)
NOSI
Elimina tuttiNONOSI

 

 

Operazione

Protezione

Autore

Vicino

Operatore

Gestore

Crea

Permessi
base

 

SI

NO

SI

Modifica

Permessi
base

SI

NO

NO

SI

Workflow

    

Elimina

Permessi
base

NO

NO

NO

SI

Workflow

    

Vede

Permessi base

SI

SI

SI

SI

Viste

    

AMBITO

Operazione

Protezione

Autore

Vicino

Operatore

Gestore

Crea

Permessi
base

 

SI

NO

SI

Modifica

Permessi
base

SI

NO

NO

SI

Workflow

    

Elimina

Permessi
base

NO

NO

NO

SI

Workflow

    

Vede

Permessi base

SI

SI

SI

SI

Viste

    

Permessi base:

 

Autore

Vicino

Operatore

Gestore

Vede

SI

SI

SI

SI

Crea

-

NO

NO

SI

Modifica

NO

NO

NO

SI

Elimina

NO

NO

NO

SI

Workflow: nessuna protezione

Viste: nessuna protezione

SEDE

Permessi base:

 

Autore

Vicino

Operatore

Gestore

Vede

SI

SI

SI

SI

Crea

-

NO

NO

SI

Modifica

NO

NO

NO

SI

Elimina

NO

NO

NO

SI

Workflow: nessuna protezione

Viste: nessuna protezione

ABILITAZIONE

Permessi base:

 

Autore

Vicino

Operatore

Gestore

Vede

SI

SI

SI

SI

Crea

-

NO

NO

SI

Modifica

NO

NO

NO

SI

Elimina

NO

NO

NO

SI

Workflow: nessuna protezione

Viste: nessuna protezione

RICHIESTA

Operazione

Protezione

Autore

Vicino

Operatore

Gestore

Crea

Permessi
base

 

SI

NO

SI

Modifica

Permessi
base

NO

NO

NO

SI

Workflow

SI se Aperta
NO in altri stati

NO

NO

SI

Elimina

Permessi
base

NO

NO

NO

SI

Workflow

SI se Aperta
NO in altri stati

NO

NO

SI

Vede

Permessi base

SI

SI

SI

SI

Viste

SI (è il Richiedente)

SI se Proprietario
NO altri utenti

SI

SI

 

Permessi base:

 

Autore

Vicino

Operatore

Gestore

Vede

SI

SI

SI

SI

Crea

-

SI

NO

SI

Modifica

NO

NO

NO

SI

Elimina

NO

NO

NO

SI

Workflow:

 

Autore

Vicino

Operatore

Gestore

Modifica

SI (se Aperta)
NO (se altri stati)

NO

NO

NO

Elimina

SI (se Aperta)
NO (se altri stati)

NO

NO

NO

Viste:

 

Autore

Vicino

Operatore

Gestore

Vede

SI (è il richiedente)

SI se proprietario 
NO tutti gli altri

SI

SI

 

 

Autore

Vicino

Operatore

Gestore

 

Modifica

 

 

Modifica
Elimina

 

 

 

 

Modifica
Elimina

 

 

 

 

Modifica
Elimina

Viste:

 

Tipo di Contenuto

Vicino

Operatore

Gestore

UtentePermessi base: 
Crea: se stesso. 
Modifica: se stesso. 
Elimina: no. 
Vede: se stesso, degli altri solo il nome
Permessi base: 
Crea: se stesso. 
Modifica: se stesso. 
Elimina: no. 
Vede: se stesso, degli altri solo il nome
Permessi base: 
Crea: tutti
Modifica: tutti
Elimina: tutti
OggettoPermessi base: 
Crea: si
Modifica: i propri 
Elimina: no
Permessi base: 
Crea: no
Modifica: no
Elimina: no
Permessi base: 
Crea: no
Modifica: tutti
Elimina: tutti
SedePermessi base: 
Crea: no
Modifica: no
Elimina: no
Permessi base: 
Crea: no
Modifica: no
Elimina: no
Permessi base: 
Crea: si
Modifica: tutti
Elimina: tutti
AbilitazionePermessi base: 
Crea: no
Modifica: no
Elimina: no
Permessi base: 
Crea: no
Modifica: no
Elimina: no
Permessi base:
Crea: si
Modifica: tutti
Elimina: tutti
Richiesta

Permessi base:
Crea: si
Modifica: no
Elimina: no
Workflow:

 

Autore

Vicino

Operatore

Gestore

Aperta

Vede
Modifica
Elimina

Vede

Vede

Vede
Modifica
Elimina

In corso

Vede

Vede

Vede

Vede
Modifica
Elimina

Conclusa

Vede

Vede

Vede

Vede
Modifica
Elimina

Viste:
Vede  solo se Richiedente o Proprietario

Permessi base:
Crea: si
Modifica: le proprie
Elimina: noPermessi base:
Visualizza tutte
Workflow:
Visualizza se Consegna in Sede abilitata 
Modifica tutte
Visualizza tutte
ConcessioneCrea nuova su Richiesta di proprio Oggetto
Modifica o elimina le proprie se in Stato Aperta
Visualizza se Richiedente o Proprietario
Visualizza se Consegna in Sede abilitata Modifica tutte
Visualizza tutte
ConsegnaCrea nuova su Concessione se Richiedente o Proprietario
Modifica o elimina le proprie se in Stato Proposta
Mette in Stato Avvenuta se Destinatario
Crea nuova per Sede abilitata
Modifica o elimina le proprie se Stato Proposta
Mette in Stato Avvenuta se Sede abilitata
Modifica tutte
Visualizza tutte
NotaCrea nuova su Richiesta se Richiedente o Proprietario
Modifica e elimina le proprie
Vede quelle su Richiesta se Richiedente o Proprietario
  
ValutazioneCrea nuova su Richiesta se Richiedente o Proprietario
Modifica e elimina le proprie
Vede quelle su Richiesta se Richiedente o Proprietario
  

 

 

 

 

 

Permessi base

Visualizza tutti i Contenuti SI per tutti i Ruoli tranne per i Visitator

Tipo di Contenuto

Vicino

Operatore

Gestore

OggettoCrea SI
Modifica NO 
 
Visualizz
 
Modifica SI

 
Sede  Crea SI
Modifica SI
Abilitazione  Crea SI
Modifica SI
RichiestaCrea SI
Modifica NO
Elimina NO
Visualizza se Consegna in Sede abilitata Modifica tutte
Visualizza tutte
ConcessioneCrea nuova su Richiesta di proprio Oggetto
Modifica o elimina le proprie se in Stato Aperta
Visualizza se Richiedente o Proprietario
Visualizza se Consegna in Sede abilitata Modifica tutte
Visualizza tutte
ConsegnaCrea nuova su Concessione se Richiedente o Proprietario
Modifica o elimina le proprie se in Stato Proposta
Mette in Stato Avvenuta se Destinatario
Crea nuova per Sede abilitata
Modifica o elimina le proprie se Stato Proposta
Mette in Stato Avvenuta se Sede abilitata
Modifica tutte
Visualizza tutte
NotaCrea nuova su Richiesta se Richiedente o Proprietario
Modifica e elimina le proprie
Vede quelle su Richiesta se Richiedente o Proprietario
  
ValutazioneCrea nuova su Richiesta se Richiedente o Proprietario
Modifica e elimina le proprie
Vede quelle su Richiesta se Richiedente o Proprietario
  
  •  

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

Cos'è una Entità

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

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 avere in sé le credenziali (nome utente e password) perché la persona possa entrare nella app e solo su Entità di questo tipo Drupal mette a disposizione le funzioni di login; l'Entità che rappresenta un file ha necessariamente una dimensione e per essa sono disponibili funzioni di upload e download. Drupal gestisce nativamente diversi tipi di Entità (Contenuti, Utenti, Termini di Tassonomia, File, Media, Commenti ecc.) e i  moduli aggiuntivi possono a loro volta aggiungere altri tipi di Entità (es. Gruppi). 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, mentre nulla vieta che vi sia 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. 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 ne mostra il contenuto. L'indirizzo con cui richiamare la pagina differisce in base al tipo di Entità. Ad esempio, per i Contenuti è

/node/ID 

dove ID è l'identificativo del Contenuto, mentre per gli Utenti è:

/user/UID

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

Campi predefiniti

Come abbiamo già visto, ad ogni Entità è associato un identificativo univoco, memorizzato in un Campo predefinito, sempre presente in tutti i tipi di Entità. Oltre a quel Campo, ogni tipo di Entità ha altri Campi predefiniti. Ad esempio:

  • gli Utenti hanno i Campi predefiniti Nome utente, Password, Email. 
  • i Termini di Tassonomia hanno Campi Genitore, Profondità e Peso che servono a collocare il Termine nella gerarchia della Tassonomia 
  • i Contenuti hanno un Campo Titolo (compilato dall'Utente), un Campo Pubblicato (che indica se il Contenuto è visibile o nascosto) ed i seguenti Campi predefiniti compilati automaticamente da Drupal ma modificabili dall'Amministratore: Autore (Riferimento all'Utente che ha creato il Contenuto), Creato il (Data e ora di creazione del Contenuto) 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 lavorare sulle tabelle del database di Drupal. 

Le modalità di aggiunta, modifica e eliminazione di Campi differisce da Bundle a Bundle. Ad esempio, per aggiungere un Campo agli Utenti si utilizza il comando Configurazione - Impostazione profilo - Gestisci Campi. Per gli altri Bundle, spiegherò come fare nelle specifiche Guide dedicate a tipi di Contenuti, Tassonomie ecc.  

Nome interno ed nome esterno (etichetta) del Campo

Ogni Campo ha un nome esterno ed un nome interno. Il nome esterno è l'etichetta che l'Amministratore assegna al Campo e col quale il Campo viene richiesto agli Utenti. Il nome interno è quello con cui Drupal identifica il Campo ed è per default composto da field_ seguito dall'etichetta in caratteri minuscoli; ad esempio, il Campo con nome esterno "Cognome" è identificato in Drupal col nome interno field_cognome

Mentre il nome esterno può essere il medesimo per più Campi e può essere modificato in ogni momento, il nome interno non può essere più modificato una volta confermato e quindi occorre porre qualche attenzione se accettare o meno il nome automaticamente proposto da Drupal. Non ci sono regole particolari per i nomi interni, se non che non ci possono essere due Campi omonimi (anche di tipi di Entità diversi): Drupal segnala come errore una omonimia e rifiuta di salvarla. Poiché è normale avere decine di Campi in una app, suggerisco di inserire nel nome interno del Campo anche il nome del tipo di Entità cui appartiene: ad esempio, per il Campo "Stato" del tipo di Entità "Prestito" può essere risultare utile digitare come nome interno "field_stato_prestito". L'importanza dei nomi interni dei Campi sarà evidente nella costruzione delle Viste.

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.

Tipi di Campi

Drupal mette a disposizione molto tipi di Campi, elencati quando si aggiunge un Campi ad un tipo di Entità:

Alcuni moduli aggiuntivi aggiungono ulteriori tipi di Campi, ad esempio coordinate geografiche. 

Ogni tipo di Campo ha una propria configurazione specifica. Ad esempio: il Campo di tipo Data e ora (che per semplicità chiamerò "data") può essere configurato perché accetti solo la data senza orario o per accogliere un periodo anziché una sola data; il Campo di tipo Selection List deve essere configurato specificando quali valori elencare; il Campo di tipo Caricamento File (nel seguito "File") prevede due sottotipi: Immagine e File, per ognuno dei quali sono configurabili i tipi di file caricabili.    

Formato dei Campi testuali

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

Per ogni Formato l'Amministratore può scegliere quali Ruoli di Utente possono utilizzarlo, se attivare o meno l'editor visuale, quali comandi dell'editor visuale mettere a disposizione, quali trasformazioni attivare ecc. Per motivi di sicurezza, di solito si assegnano Formati più completi e potenti agli Utenti con maggiori privilegi nella app, assegnando agli Utenti "base" un formato meno ricco di funzionalità. 

Quando si aggiunge un Campo testuale a un Bundle, si possono specificare uno o più Formati per quel Campo: quando compila quel Campo per una Entità di quel Bundle, l'Utente potrà scegliere uno dei Formati ammessi per quel Campo e autorizzati per i suoi Ruoli. 

Riferimenti tra Entità

Tra i vari tipi di Campi, riveste una particolare importanza il tipo Riferimento (reference), perché consente di costruire una relazione tra due o più Entità. Ad esempio, nella app "Miei Libri" posso definire il tipo di Contenuto "Oggetto" ed il tipo di Contenuto "Prestito" e aggiungere a quest'ultimo un Campo di tipo Riferimento che rimanda agli Oggetti; posso rappresentare questa relazione come "Prestito → Oggetto" perché, partendo dal Prestito, posso arrivare a identificare con certezza l'Oggetto prestato; e quando compilo il Campo "Oggetto" di un Prestito, Drupal guida la compilazione elencando automaticamente gli Oggetti presenti nella app.

🟦 I Token

Cosa sono i Token

Ad ogni Campo delle Entità è associato un Token. Ad esempio, al titolo dei Contenuti è associato il Token [node:title] (node è il nome "storico"  dei Contenuti in Drupal), mentre all'email degli Utenti è associato il Token [user:mail]. Ciò vale sia per i Campi predefiniti sia per i Campi aggiunti.

Oltre ai Token associati alle Entità, esistono Token corrispondenti a informazioni di sistema, tra cui quelli relativi alla installazione stessa di Drupal (es. [site:name] corrisponde al nome del sito), alla data e ora di sistema (es.[current-date:medium] corrisponde alla data e ora correnti nel formato "medio")  e all'utente che sta usando la app (es. [current-user:last-login] corrisponde a data e ora in cui l'utente ha fatto login).

Quando Drupal incontra da qualche parte nella app il nome di un Token, lo sostituisce col suo valore. I Token servono quindi per riusare i valori dei Campi delle Entità e le altre informazioni in essi contenuti. Il Token è quindi un concetto molto simile alla "variabile" nei linguaggi di programmazione o alla "incognita" in matematica. 

A cosa servono i Token

Vedremo che i Token si usano in molti punti della costruzione di una app, ad esempio per:

Il motivo per cui descrivo ora i Token è proprio perché serviranno già a partire dalla prossima Guida.

Elenco dei Token disponibili 

L'elenco dei Token messi a disposizione dal Core di Drupal sono elencati sul sito di Drupal. Spesso l'installazione di nuovi moduli aggiunge ulteriori Token. Infine, come abbiamo appena visto, ad ogni Campo aggiunto alle Entità corrisponde un nuovo Token. Per vedere tutti i Token disponibili nella tua installazione di Drupal ti raccomando di installare il modulo aggiuntivo "Token". Dopo la sua attivazione, con Estendi - Token - Help per vedere tutti i Token disponibili. 

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

Non è necessario ricordare a memoria i Token e neppure tornare ogni volta a questa pagina perché, in ogni punto in cui Drupal accetta Token, viene mostrato un comando "Token" che richiama la gerarchia dei Token (ad esempio ciò accade nella pagina di configurazione dei titoli automatici delle Entità o nella configurazione delle procedure automatiche), oppure viene mostrato un elenco ridotto ai soli Token disponibili in quel punto (ad esempio, ciò accade nella costruzione delle Viste, sotto Sfoglia i Token disponibili o Replacement patterns).

Se installi il modulo aggiuntivo "Twig Tweak", potrai anche accedere ad ulteriori Token di sistema.

Come si usano i Token

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

Una volta trovato il Token desiderato, se ne copia il nome (selezionandolo e cliccando col pulsante destro il comando "Copia" oppure con la combinazione CTRL C) e lo si incolla nella casella dove serve (comando "Incolla" o CTRL V).

Cosa sono i Contenuti

I Contenuti sono il tipo di Entità più generico e quindi più utilizzato per gestire informazioni nelle app. Prima di poter 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, per iniziare a costruire la tua app conviene partire dalle Informazioni che deve gestire. Non considerare gli Utenti, perché per essi c'è un tipo di Entità predefinito, ma concentriamoci sugli oggetti fisici (es. attrezzi, documenti, stanze) o astratti (es. progetti, processi, categorie) che hai previsto per la tua app. Per ognuno di essi potresti creare un Tipo di Contenuto specializzato.

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" e "Concessione" (le due parti di un prestito), "Messaggio" (un messaggio scambiato tra chi chiede in prestito e il proprietario dell'Oggetto), "Consegna" (la ricevuta di avvenuta consegna dell'Oggetto), "Valutazione" (la valutazione finale sull'esperienza di prestito), "Sede" (una sede pubblica in cui può avvenire lo scambio degli Oggetti) e "Abilitazione" (l'abilitazione di un utente ad agire in una Sede); non serve "Amico" perché le persone cui prestare gli Oggetti sono Utenti della app e quindi c'è una Entità per rappresentarli.

Ovviamente 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 suoi 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 rappresentato da due Tipi di Contenuto, uno dei quali (la 'Richiesta") è scritto dall'Utente che chiede in prestito l'Oggetto e l'altro (la "Concessione") è scritto dall'Utente proprietario dell'Oggetto richiesto; la Concessione contiene un Campo riferimento che rimanda alla Richiesta che l'ha suscitata.

Costruire un nuovo Tipo di Contenuto

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

 

Riusare i Campi 

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

Titoli automatici

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

Spesso l'uso del campo Titolo è intuitivo: ad esempio, nella app "Miei Libri" il Titolo di un Libro è proprio il suo titolo scritto in copertina. In altri casi no: ad esempio, nella stessa app il Titolo di una Richiesta potrebbe essere una frase del tipo "Richiesta di Carlo Rossi per la Falciatrice XYZ di Elena Verdi" oppure semplicemente "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:

Poiché il Titolo di un Contenuto è mostrato nella pagina del Contenuto stesso con un carattere grande, suggerisco di non comporre titoli automatici troppo lunghi.  

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 pregiudicare il funzionamento di una Vista o un'altra configurazione che lo utilizza. 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 un Campo numerico intero ti serve invece con numerico con la virgola, oppure che ti risulta più semplice gestire un Campo di tipo data come un Campo testo, sappi che in Drupal non c'è un meccanismo per cambiarne il tipo salvando i dati già inseriti. Ci sono moduli sperimentali che promettono di farlo, ma contengono sempre avvertenze. I più esperti propongono interventi diretti sul database, che richiedono competenze 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 informazioni. 

Con la Guida precedente hai creato uno o più Tipi di Contenuto dove memorizzare le informazioni della tua app. Vediamo ora i comandi base disponibili all'Amministratore per iniziare a popolare la app di Contenuti. Questi comandi sono sufficienti per la app "Miei Libri" perché l'unico Utente è proprio l'Amministratore. Nelle Guide successive vedremo come preparare e mettere a disposizione degli Utenti alcune funzioni di gestione dei Contenuti, come previsto nella app "Prestiti tra Vicini". 

Creare nuovi Contenuti

Costruito un Tipo di Contenuto, per creare un Contenuto di quel tipo usa 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 stessa pagina è richiamabile col link:

/node/add/tipo_contenuto

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

/node/add/prestito

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 molte situazioni può risultare utile precaricare il valore di uno o più Campi di un Contenuto, per evitare all'Utente digitazione inutili ed errori. Il Campo può essere precaricato con un valore fisso (scritto nella configurazione del Campo) oppure con un valore dinamico (scritto nel link di lancio della pagina di creazione del Contenuto).

PRECARICARE UN VALORE FISSO

In Struttura - Tipi di Contenuto seleziona Gestione Campi del Tipo di Contenuto, clicca Modifica sul Campo, attiva Set default value e digita o seleziona il valore di default: nella pagina di creazione di un nuovo Contenuto di quel tipo il Campo apparirà precaricato con quel valore, che l'Utente potrà modificare. Se il Campo è di tipo Riferimento, per poter selezionare come default una specifica Entità richiamata in quel Campo devi averla già caricata nella app.

PRECARICARE UN VALORE DINAMICO

Questa soluzione consente di precaricare un Campo di un nuovo Contenuto tenendo conto del contesto in cui avviene la creazione. Ad esempio, nella app "Prestiti tra Vicini" il tipo di Contenuto "Prestito" 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, precaricheremo nel Campo "Oggetto" del nuovo Prestito l'identificativo di quell'Oggetto, evitando così che l'Utente debba selezionarlo nuovamente.

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

a. Configurare il Campo a ricevere un valore via link

Per predisporre  il Campo "Oggetto" del Prestito a ricevere via link l'identificativo del Prestito:

  • vai in Struttura - Tipi di contenuto - Prestito - 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 della pagina corrente 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 proprio 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 un Prestito è:

/node/add/prestito

Per precaricare nel Campo "oggetto" del nuovo Prestito uno specifico Oggetto, scriviamo il suo identificativo (es. 371) nel link nel seguente modo:

/node/add/prestito?oggetto=371

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

.c. Precaricare dinamicamente più campi

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

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

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

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 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 può essere modificata o eliminata fintanto che non è stata effettuata la prima Consegna dell'Oggetto; una Consegna può essere modificata o eliminata fintanto che non è fisicamente avvenuto il passaggio dell'Oggetto e così via. 

Per configurare Permessi che variano a fronte 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 Tipo di 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.  

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:

ARRIVATO QUI 

Applicare il Workflow alle Entità

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

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

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

Cambiare lo stato di una Entità

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

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

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

GUIDA CHE TRATTA Taxonomy Access Control Lite e su Content Access

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

GUIDA CHE TRATTA I GRUPPI

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

Cosa sono le Viste

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

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

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

A cosa servono le Viste

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

Come primo esempio, costruiamo una Vista che semplicemente elenchi un tipo di Entità che hai disegnato e caricato nella tua app. Esemplifico il caso costruendo la Vista "Magazzino" della app Vicinato, che elenca gli Attrezzi messi a disposizione per il prestito.

Creare una nuova Vista

Ecco come creare una nuova Vista:

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

L'editor della Vista e le sue sezioni

Salvata la Vista, si apre automaticamente l'editor della Vista (Views UI), composto da diverse sezioni, ognuna delle quali configura un aspetto della Vista. Imparare a costruire le Viste consiste essenzialmente nell'imparare cosa scrivere nelle diverse sezioni. Le spiegherò a mano a mano che ci serviranno per costruire le Viste di esempio.

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

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

  • nella sezione Visualizzazioni compare una Visualizzazione di tipo Pagina e, come Formato ritroviamo Tabella
  • nella sezione Impostazioni pagina - Percorso compare il link di richiamo della Vista ("/magazzino")
  • nella sezione Criteri del filtro compare un Filtro che limita la Vista ai soli Contenuti di tipo "Attrezzo"
  • nella sezione Campi compare il Campo "Titolo" degli Attrezzi
  • nella sezione Paginazione compare l'esistenza di un paginatore ogni 20 elementi

Se abbiamo caricato nella app qualche Attrezzo di prova, sotto Anteprima possiamo già vedere come si presenterà il Magazzino: una tabella che elenca 20 Attrezzi per pagina, con i comandi per cambiare pagina sotto di essa. Vediamo ora come migliorare questo primo risultato, mostrando altre informazioni sugli Attrezzi e riordinando i contenuti.

Come elencare le Entità (sezione Formato)

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

Formato Tabella

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

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

Nelle ultime versioni di Drupal è stata introdotta le tabelle "responsive", che si adattano alle dimensioni dello schermo. Per le Viste in formato tabellare è stata introdotta la possibilità di classificare i Campi per "priorità" selezionandola in Impostazioni - Responsive: i Campi con priorità "alta" saranno mostrati sempre, mentre quelli di priorità "media" e "bassa" saranno mostrati solo se le dimensioni dello schermo lo consentono.

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

Schermo largo:

Schermo stretto:

Aggiungere Campi nelle sezioni

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

Quali Campi mostrare (sezione Campi)

La sezione Campi elenca i Campi da mostrare o comunque considerare per ogni Entità elencata.  A titolo di esempio, vediamo come aggiungere alla Vista "Magazzino" il Campo "Immagine" dell'Attrezzo:

Nello stesso modo, aggiungiamo il Campo "Descrizione" dell'Attrezzo e, nella sua configurazione, attiviamo Escludi dalla visualizzazione per non mostrarlo all'Utente, perché ci servirà tra poco per eseguire ricerche nel Magazzino, senza appesantire la visualizzazione. In questa Guida vedremo diversi metodi per modificare la visualizzazione del valore di un Campo..

Modificare l'ordine dei Campi (sezione Campi)

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

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

La sezione Criteri di ordinamento elenca i Campi secondo cui le Entità devono essere ordinate nella Vista. Ad esempio, volendo ordinare il Magazzino per titolo dell'Attrezzo: 

Se si aggiungono più Campi nella sezione Criteri di ordinamento, essi vengono considerati dall'alto verso il basso.

Filtrare le Entità (sezione Criteri del filtro)

La  sezione Criteri del filtro elenca i Filtri che definiscono quali Entità elencare nella Vista. Un Filtro è formato di tre parti:

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

Di default c'è sempre il Filtro "Contenuto pubblicato = Si", che evita di mostrare Contenuti nascosti. Nella Vista "Magazzino" troviamo anche il Filtro Tipo di Contenuto = Attrezzo che avevamo impostato nel momento della creazione della Vista. Per limitare la Vista ai soli Attrezzi prestabili, aggiungiamo un Filtro sul Campo "Stato" dell'Attrezzo, imponendo che sia uguale a "Prestabile".


Filtri Esposti (sezione Criteri del filtro)

I Filtri impostati nella sezione Criteri del filtro sono per default nascosti all'Utente. Se si attiva Esponi questo filtro, per permettere ai visitatori di modificarlo, il Filtro viene mostrato all'Utente, perché possa modificarne il valore ed eventualmente anche l'operatore, ma non il Campo su cui agisce. Ad esempio, potremmo esporre il Filtro che limita la Vista ai soli Attrezzi con Stato = Prestabile, per consentire all'Utente di scegliere se vedere anche gli Attrezzi ritirati dal prestito.

Cercare nella Vista (sezione Criteri del filtro)

Il Campo speciale Globale - Combina filtri dei campi disponibile nella sezione Criteri del filtro consente di aggiunge alla Vista una funzione di ricerca sulle Entità elencate. Ecco come:

Paginare la Vista (sezione Paginazione)

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

Proteggere la Vista (sezione Accesso)

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

Il risultato reale dipende dalla combinazione tra l'impostazione di questa sezione, i Permessi attribuiti ai diversi Ruoli ed alla presenza di eventuali ulteriori moduli di protezione dei contenuti e può quindi portare a dinieghi o visualizzazioni non previste. Salvo necessità più complesse, la soluzione più semplice è selezionare qui la protezione per Ruolo. Proteggiamo la Vista "Magazzino" selezionando Ruolo - Utente autenticato.

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

Nella sezione Intestazione possiamo aggiungere Campi che mostrano informazioni all'Utente sopra l'elenco delle Entità, quindi non riferite ad una specifica Entità ma al loro insieme. Ad esempio, per mostrare il numero di Attrezzi elencati dalla Vista:

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

 

Relazioni tra Entità

Nella Guida precedente abbiamo visto come creare una Vista che elenca un tipo di Entità (es. gli Attrezzi della app Vicinato) con i loro Campi. Vediamo ora come mostrate nella stessa Vista informazioni prese dai Campi di altre Entità collegate alle Entità principali della Vista da relazioni. 

Una Entità A è in relazione con una Entità B se l'Entità A ha un Campo Riferimento che richiama l'Entità B. Rappresentiamo questa relazione come A → B perché, conoscendo l'Entità A, possiamo arrivare all'Entità B leggendo il contenuto del Campo di A. 

Aggiungere relazioni nella Vista (sezione Relazioni)

Utilizzeremo la relazione A→B per aggiungere ad una Vista che elenca le Entità di tipo A anche le informazioni contenute nei Campi delle Entità di tipo B. Per utilizzare una relazione in una Vista occorre aggiungere nella sezione Relazioni della Vista il Campo di A che regge la relazione con B. Ad esempio, nella Vista "Magazzino" della app "Vicinato" che abbiamo creato nella Guida precedente e che elenca gli Attrezzi, possiamo utilizzare la relazione Attrezzo → Autore (retta dal Campo predefinito "Autore" dell'Attrezzo) per aggiungere informazioni sul Proprietario (=Autore) dell'Attrezzo. Ecco come:

Usare le relazioni nella Vista

Aggiunta nella sezione Relazioni il Campo dell'Entità A che regge la relazione A→B, per usare in un'altra sezione della Vista un Campo dell'Entità B basta aggiungere quel Campo nella sezione, specificando quella relazione nella finestra di configurazione del Campo. Ad esempio, per aggiungere nella sezione Campi della Vista "Magazzino" il nome del Proprietario a fianco di ogni Attrezzo:

Relazioni concatenate

Nella sezione Relazioni è possibile aggiungere più relazioni, ognuna corrispondente ad un Campo riferimento dell'Entità principale della Vista. E' anche possibile costruire relazioni concatenate tra loro, cioè relazioni che consentono di passare da una Entità A all'Entità B e, da questa, ad una Entità C e così via. 

Ad esempio, nella app "Vicinato" una Consegna ha un Campo "Richiesta" che la collega ad una Richiesta (Consegna → Richiesta). A sua volta, la Richiesta ha un Campo "Attrezzo" che rimanda all'Attrezzo richiesto (Richiesta → Attrezzo). Quindi, percorrendo la catena Prestito → Richiesta → Attrezzo è possibile conoscere l'Attrezzo consegnato, senza necessità di replicare l'informazione nella Consegna. 

Se stiamo costruendo una Vista che elenca le Consegne e vogliamo mostrare per ciascuno di essi la Richiesta corrispondente e l'Attrezzo prestato, nella sezione Relazioni aggiungeremo prima la relazione Consegna → Richiesta e poi la relazione Richiesta → Attrezzo, specificando che quest'ultima è basata sulla relazione che la precede: l'ordine in cui sono elencate le relazioni nella sezione Relazioni è quindi importante.

Vediamo come si fa:

Relazioni inverse

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

Contenuto - Contenuto referenziato da field_cantante_disco

ma aggiungiamo il Campo:

Contenuto - Contenuto che usa field_cantante_disco

Campi speciali

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

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

Campi e Token

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

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

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

Token globali

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

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

Creare una nuova Vista come variazione di una Vista esistente

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

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

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

Spieghiamo entrambi i metodi, evidenziandone pro e contro.

Copiare una Vista

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

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

Aggiungere una Visualizzazione alla Vista

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

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

Chi è l'Utente corrente

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

Filtrare le Entità sull'Utente corrente

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

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

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

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

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

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

Filtri in AND logico tra loro

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

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

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

Filtri in OR logico tra loro

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

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

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

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

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

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

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

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

Filtri della sezione Filtri contestuali

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

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

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

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

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

/tuoi-attrezzi/316

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

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

/tuoi-attrezzi/316/12

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

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

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

Non solo numeri

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

/tuoi-attrezzi/316/Giardino

Valori di default per i Filtri contestuali

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

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

 

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

Filtrare per intervalli di valori

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

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

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

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

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

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

Filtri contestuali e costruzione della app 

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

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

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

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

/node/12 

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

/user/23 

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

EVA: una Vista dentro la pagina di una Entità

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

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

Ecco quindi i passi salienti per creare una EVA:

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

Personalizzare e proteggere la presentazione dei Campi di una Entità

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

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

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

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

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

Posizionare le EVA nella pagina

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

Cosa sono i comandi

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

Aggiungere comandi nella pagina di una Entità

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

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

Aggiungere comandi in una Vista 

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

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

Vediamo esempi concreti e come realizzarli per entrambi i casi.

COMANDI SOPRA O SOTTO L'ELENCO DELLE ENTITA'

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

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

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

COMANDI SULLA SINGOLA ENTITA' ELENCATA

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

 

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

Mostrare un valore di default

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

Accorciare e semplificare il valore mostrato

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

Comporre più Campi in un solo Campo

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

Campi condizionati

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

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

Concatenazione di Campi condizionati

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

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

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

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

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

Richiamo condizionato di una Vista

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

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

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

Richiamare una o più Viste dentro una Vista

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

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

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

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

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

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

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

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

Ecco i dettagli:

Catene di Viste e loro limitazioni

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

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

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

Richiamare Viste in un testo

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

[view:NAME=DISPLAY=ARGS] 

in cui:

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

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

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

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

La cache della Vista

Può capitare che una Vista mostri un elenco non aggiornato delle Entità in essa richiamate. Supponendo di non aver commesso errori nella costruzione della Vista, il problema può nascere dal fatto che, per motivi di maggiore efficienza, Drupal presenti una "fotografia" datata delle informazioni, prelevandola dalla propria "cache" (memoria temporanea), anziché andarle a pescare in tempo reale nel database. Ciò può più facilmente accadere quando la Vista è particolarmente complessa, come ad esempio in Viste che richiamano altre Viste. Se la nostra app gestisce informazioni quasi statiche, questo non è un problema, ma può diventarlo in app (come quella di esempio) in cui invece le informazioni variano da un momento all'altro e vogliamo che gli Utenti abbiano sempre una visione aggiornata su quanto accade nella app. 

Per evitare che una Vista presenti informazioni non aggiornate occorre modificare nella sua configurazione il meccanismo di caching: nella sezione Altro - Caching della Vista seleziona una delle modalità previste:

  • Basato su tag: la Vista viene aggiornata ogni volta che cambiano le informazioni su cui è basata; questa modalità è teoricamente la migliore, ma in alcune situazioni può comunque non aggiornare la Vista al variare delle informazioni.
  • Basata sul tempo: la Vista viene aggiornata ad intervalli temporali predefiniti; questa modalità non è adeguata se la app deve sempre presentare informazioni senza ritardi
  • Nessuna: la Vista viene aggiornata ogni volta che l'Utente la richiama; questa modalità garantisce che le informazioni siano sempre aggiornate, ma può rallentare il funzionamento della app

La cache di Drupal

In base a come Drupal è stato installato, può capitare che una nuova Vista (o più facilmente una nuova Visualizzazione di una Vista) non venga mostrata all'Utente, nonostante sia stata correttamente costruita e nonostante sia visibile nella sezione Anteprima della Vista stessa. In questi casi, prima di disperarsi si può provare a svuotare la cache di Drupal, forzandolo così ad aggiornare tutte le pagine della app: basta dare il comando Configurazione - Prestazioni - Svuota tutta la cache.

da scrivere

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

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

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

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

Creare una Vista con Visualizzazione Entity Reference

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

Applicare la Visualizzazione al Campo Riferimento

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

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

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

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

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

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

Per modificare una o più Richieste:

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

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

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

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

Calcolare un Campo sulla base di altri Campi

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

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

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

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

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

Memorizzare in un Campo un valore calcolato

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

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

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

Georeferenziare una Entità

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

Mappa → Geofield 

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

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

Mostrare più Entità su una mappa

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

Geofield → Mappa 

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

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

Georeferenziare le Entità tramite indirizzo

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

Indirizzo → Geocoder → Geofield  

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

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

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

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

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

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

Nella sezione Relazioni:

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

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

predisponi la Vista ad essere richiamata filtrandola su uno specifico Attrezzo

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

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

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

Nella sezione Campi aggiungi

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

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

presenta la Vista come un calendario

Nella sezione Formato seleziona Full Calendar Display. Nelle Impostazioni:

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

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

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

🟥 Grafici

Da SCRIVERE

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

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

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

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

🟦 Le ECA

Cosa sono le ECA

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

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

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

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

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

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

A cosa servono le ECA

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

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

Cosa installare (e cosa no) per costruire le ECA

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

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

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

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

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

L'editor grafico

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

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

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

Disegnare una ECA

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

Ci sono due modi per aggiungere elementi al disegno:

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

Configurare un elemento

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

I Token nelle procedure

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

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

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

Documentare una ECA

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

 

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

 

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

Eseguire la ECA

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

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

Gli Eventi

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

Le Azioni

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

Le Condizioni (e i gateway)

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

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

 

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

Ecco come costruirla passo per passo:

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

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

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

 

temi

dove trovarli e come installarli (composer)

configurazioni

 

 

 

Operazioni di manutenzione della app

Nel Terminale

composer require drush/drush

vendor/bin/drush cr

composer update

Da web browser

https://INDIRIZZOAPP/upgrade.php

 

 

🟨 Cron

Cos'è Cron?

DA SCRIVERE

Come lo eseguo?

DA SCRIVERE

Se Cron va in errore...

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

Perché devo aggiornare il Core ed i moduli aggiuntivi?

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

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

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

Come aggiornare Drupal?

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

da scrivere

arrivato qui 

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

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

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

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

COSTRUIRE UNA TASSONOMIA

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

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

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

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

APPLICARE LA TASSONOMIA AI CONTENUTI

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

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

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

 

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

PRIMA DI PROSEGUIRE

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

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

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

Definizione dei menu

Definizione della prima pagina per ruolo

oltre le viste: il motore di ricerca

 

 

 

DA AGGIORNARE

 

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

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

IL MODULO VIEWS TREE

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

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

CREAZIONE DELLA VISTA

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

IMPOSTAZIONE DELLA RELAZIONE

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

VISUALIZZAZIONE AD ALBERO

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

Aggiungi quindi il Campo "ID Termine":

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

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

Nella sezione Campi hai quindi :
 

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

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

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

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

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

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

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

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