Cosa sono i Contenuti
I Contenuti sono il tipo di Entità meno "specializzato" e quindi più utilizzato per gestire informazioni nelle app. Prima di poter gestire in Drupal un qualsiasi Contenuto, è necessario definirne il tipo: il Tipo di Contenuto fa da modello o "stampo" per la creazione di Contenuti di quel tipo. Il Tipo di Contenuto elenca i Campi che formano il Contenuto, stabilisce come mostrarli, quali Utenti possono inserire Contenuti di quel tipo ecc.
Appena installato, Drupal offre di default un paio di Tipi di contenuto molto semplici - la "pagina" e l'"articolo" - pensati più per i siti informativi che per una app.
Quali Tipi di Contenuti servono
La costruzione di una app in Drupal parte proprio dalla identificazione dei Tipi di Contenuto che servono alla app. Per scoprire i Tipi di Contenuto che ci servono, occorre esaminare non solo quali tipi di oggetti, documenti, luoghi ecc. la app deve gestire, ma è opportuno considerare anche "oggetti" più astratti, come procedure, progetti, gruppi di lavoro ecc. Vediamo qualche criterio di massima che può guidare alla traduzione dei concetti in Contenuti.
Criterio della semplicità. Più Tipi di Contenuto definiamo, più la costruzione della app si complica. Lo vedremo in dettaglio quando costruiremo le Viste che mostrano i Contenuti agli Utenti. Se l'analisi evidenza che due Tipi di Contenuti corrispondenti a due concetti apparentemente distinti hanno in realtà gli stessi Campi o quasi, conviene fare un supplemento di analisi per capire se possiamo gestire entrambi con un solo Tipo di Contenuto, eventualmente prevedendo che uno o più Campi non siano sempre mostrati.
Criterio dell'unità. Come abbiamo già visto parlando di Entità (e i Contenuti sono un caso particolare di Entità), in Drupal un Contenuto è gestito come un'unità, quindi i Permessi di modifica e cancellazione non possono essere dati agli Utenti sui singoli Campi ma solo sull'intero Contenuto. Se per un Tipo di Contenuto ci accorgiamo che alcuni Campi sono gestiti da un gruppo di Utenti e gli altri Campi sono gestiti da altri Utenti, per consentire ad ognuno di intervenire autonomamente sui Campi di propria pertinenza, la soluzione più semplice è quella di creare un Tipo di Contenuto distinto per ogni gruppo di Utenti e di collegare questi Tipi di Contenuto tra loro mediante Campi Riferimento.
Criterio del tempo. Per lo stesso motivo, mentre è possibile (con qualche sforzo, come vedremo) modificare nel tempo i Permessi degli Utenti su un Tipo di Contenuto, non è possibile modificare nel tempo i Permessi sui singoli Campi. Quindi se alcuni Campi di un Tipo Contenuto sono sempre modificabili ed altri non devono essere modificabili prima di una certa data o di un certo evento, la soluzione più semplice è spostare questi ultimi in un Tipo di Contenuto a parte, per il quale i Permessi cambiano nel tempo.
Ad esempio, nella app "Buoni Vicini" per rappresentare i concetti di Attrezzo, Categoria, Sede creiamo gli omonimi Tipi di Contenuto, cui aggiungiamo il Tipo "Assegnazione" per associare gli Utenti Operatori alle Sedi. La rappresentazione del "prestito" è più complessa, perché le informazioni relative ad un prestito sono gestite da diversi Utenti (il richiedente, il proprietario, l'operatore) e le protezioni delle informazioni variano nel tempo. Applicando i criteri sopra suggeriti, il concetto di "prestito" viene spacchettato nei seguenti Tipi di Contenuto:
- la Richiesta, creata dal Partecipante "richiedente", contiene i Campi relativi all'Attrezzo richiesto e ai dettagli della richiesta
- il Prestito, creato dal Partecipante "proprietario" dell'Attrezzo richiesto, contiene il riferimento alla Richiesta cui risponde e i dettagli sulle condizioni del prestito, tra cui la modalità di consegna (diretta o presso una Sede scelta dal proprietario)
- la Ricevuta, creata dal richiedente o dal proprietario o da un Operatore, in base alla modalità di consegna indicate nel Prestito: contiene il riferimento al Prestito cui si riferisce, i dettagli sulla consegna e ha come Autore l'Utente che l'ha emessa e che quindi dichiara di aver ricevuto fisicamente l'Attrezzo; tutte le Ricevute hanno gli stessi Campi indipendentemente dall'Autore e dalla motivazione (ingresso e uscita dell'Attrezzo dalla Sede, consegna e restituzione dell'Attrezzo alle parti), quindi è possibile rappresentarle tutte con un solo Tipo di Contenuto, aggiungendo un Campo "Motivazione".
- la Valutazione, creata dal richiedente o dal proprietario, può essere espressa solo dopo la restituzione dell'Attrezzo, quando il Prestito non più modificabile e richiede quindi un Contenuto a se stante, contenente la valutazione e il riferimento al Prestito
Come costruire un nuovo Tipo di Contenuto
Ecco come Amministratore puoi costruire un nuovo Tipo di Contenuto:
| crea il nuovo tipo di Contenuto | Vai in Struttura - Tipi di contenuto - Aggiungi un tipo di contenuto, digita il nome per il nuovo Tipo (es. "Attrezzo") ed una breve descrizione |
| configura i Campi predefiniti del nuovo tipo di Contenuto | Digita il Titolo, cioè il nome del Campo testo che lo identifica visivamente. Disattiva Promosso alla prima pagina, opzione che lo colloca nella prima pagina del sito (poco utile nella costruzione di una app). Disattiva Sempre in cima agli elenchi, opzione che lo colloca in cima agli elenchi (come sopra). Disattiva Crea una nuova revisione, opzione che genera diverse Versioni del Contenuto (salvo che la app abbia una specifica necessità di tener traccia delle modifiche apportate ad un Contenuto). Disattiva Visualizzare informazioni sull'autore e sulla data, opzione che mostra Autore e data di pubblicazione del Contenuto (da valutare se serve per la app). |
| aggiungi un Campo al nuovo tipo di Contenuto | Vai in Struttura - Tipi di contenuto e clicchiamo Gestione campi a fianco del Tipo di Contenuto. Clicca Create new field. Seleziona uno dei tipi di Campo tra quelli proposti: ![]() |
| configura il Campo | nella pagina seguente, digita l'etichetta con cui il Campo deve essere mostrato all'Utente, specifica se la compilazione del Campo è obbligatoria e quanti valori il Campo può accettare; ad esempio, un singolo Campo "Allegati" di tipo File può accettare più documenti, senza necessità di definire più campi "Allegato 1", "Allegato 2" ecc. |
Ora costruisci nella tua installazione Drupal i Tipi di Contenuto che servono alla tua app !
Riusare i Campi
In una app di media complessità, servono normalmente decine di Campi. Per ridurne la proliferazione, è possibile "riciclare" un Campo su più Tipi di Contenuto (e anche su altri tipi di Entità). Definito il Campo la prima volta in un Tipo di Contenuto, per riusarlo in un altro Tipo di Contenuto non cliccare Create new field ma clicca Riutilizzare un campo esistente e seleziona il Campo che intendi riusare.
| ATTENZIONE: Il riuso di Campi è raccomandabile solo se è probabile che non eliminerai quel Campo in una futura revisione della app, perché l'eliminazione di un Campo da un tipo di Entità ha conseguenze anche sulle altre Entità che lo usano. |
Titoli automatici
Il Campo Titolo è presente ed obbligatorio per tutti i Contenuti, ma in alcuni caso non è molto significativo. Nella app di esempio, mentre il Campo Titolo di Attrezzi, Categoria, Sede è utile per identificare l'attrezzo stesso, per Richieste, Prestiti, Ricevute, Valutazioni e Messaggi il Titolo non corrisponde ad una informazione significativa e ho scelto quindi di lasciarlo costruirei automaticamente da Drupal come il nome del Tipo di Contenuto seguito da un codice identificativo univoco, es. "Richiesta n. 253", Oltre a evitare all'Utente di doversi inventare un titolo non significativo, ciò consente all'Utente di identificare senza ambiguità il Contenuto, ad esempio nei Messaggi scambiati con gli altri Utenti.
Per automatizzare la compilazione del titolo usiamo i moduli aggiuntivi "Automatic Entity Label, "Token" e "Serial". Installati ed attivati questi moduli:
| aggiungi al Tipo di Contenuto un Campo di tipo "Numero Seriale" | in Struttura - Tipi di Contenuto seleziona Gestisci campi a fianco del Tipo di Contenuto di cui vuoi automatizzare i titoli ed aggiungi un Campo di tipo Numero Seriale |
| attiva la compilazione automatica del Titolo | in Struttura - Tipi di Contenuto seleziona Modifica a fianco del Tipo di Contenuto e clicca Automatic label |
| nascondi il titolo all'Utente quando modifica l'Entità | seleziona Automatically generate the label and hide the label field |
| definisci come comporre il Titolo | in Pattern for the label componi lo schema per la generazione dei titoli, utilizzando sia testo fisso (es. "Richiesta n.") sia i Token che recuperano i valori degli altri Campi del Contenuto: per vedere i Token disponibili, clicca Sfoglia i token disponibili e naviga in Nodi fino a trovare il Campo che vuoi sia riprodotto nel Titolo. |
Questo è solo un esempio di titolo automatico, perché con la stessa modalità si possono creare titoli più ricchi di significato, ad esempio "Richiesta su NOMEATTREZZO di PROPRIETARIO". Per semplificare l'identificazione del Contenuto, conviene comporre titoli automatici diversi per ogni Contenuto. Poiché il Titolo di un Contenuto è di default mostrato nella pagina del Contenuto con un carattere più grande, suggerisco di non comporre titoli troppo lunghi.
| ATTENZIONE: Nella composizione di un titolo automatico non è possibile utilizzare l'identificativo del Contenuto (Token [node:nid]) perché, nel momento in cui si sta creando il nuovo Contenuto, quel valore non è stato ancora assegnato da Drupal. Ecco perché negli esempi precedenti ho preferito basare il titolo su un Campo Numero Seriale. I Campi di questo tipo non devono essere riusati né devono essere "nascosti" trascinandoli sotto Disattivati, perché altrimenti cessano di funzionare: il Campo non viene comunque mostrato all'Utente. |
Eliminare un Campo
Se ci ripensi e decidi che un Campo non ti serve più, puoi eliminarlo. Drupal potrebbe avvisarti che l'eliminazione di quel Campo pregiudica il funzionamento di qualche parte della tua app, ad esempio potrebbe pregiudicare una Vista o un'altra configurazione in cui è utilizzato. Se decidi di procedere lo stesso, la Vista o il workflow non vengono cancellati ma vengono disabilitati, per consentirti di modificarle e rimetterle in linea senza quel Campo.
L'eliminazione di un Campo riusato ne comporta la scomparsa in tutti i tipi di Entità in cui è stata usato.
Se l'eliminazione di un Campo comporta troppo lavoro di sistemazione, potresti decidere di mantenerlo, limitandoti a nascondendolo nelle pagine di inserimento, modifica e visualizzazione dell'Entità cui appartiene.
Cambiare il tipo di un Campo
Se hai scoperto che un Campo numerico intero ti serve invece con numerico con la virgola, oppure che ti risulta più semplice gestire un Campo di tipo data come un Campo testo, sappi che in Drupal non c'è un meccanismo per cambiarne il tipo salvando i dati già inseriti. Ci sono moduli sperimentali che promettono di farlo, ma contengono sempre avvertenze. I più esperti propongono interventi diretti sul database, che richiedono competenze e molta attenzione. Quando mi è capitato di doverlo fare, ho scelto la strada più lunga ma più sicura:
- esportare in un file l'identificativo dell'Entità ed il valore del Campo, utilizzando il modulo Views Data Export
- aggiungere alle Entità un nuovo Campo del tipo desiderato
- importare dal file i valori nel nuovo Campo, utilizzando il modulo Feeds
- eliminare il Campo iniziale
Esamineremo qualche dettaglio di questa tecnica quando parleremo di importazione ed esportazione di informazioni.
I Contenuti di Buoni Vicini
Utilizziamo quanto descritto in questa Guida per costruire i Tipi di Contenuto necessari alla app di esempio "Buoni Vicini". Non è necessario creare un Tipo di Contenuto per rappresentare gli Utenti della app, perché ognuno di essi sarà realizzato come un Utente Drupal.
ATTREZZO
Ogni attrezzo fisico che può essere prestato è rappresentato da un Contenuto di tipo "Attrezzo". L'Attrezzo è aggiunto alla app dall'Utente suo Proprietario, che quindi è memorizzato come Autore dell'Attrezzo. I Campi dell'Attrezzo sono:
| Campo | Tipo | Descrizione |
| Titolo | testo | Descrizione breve dell'Attrezzo |
| Descrizione | testo formattato | Descrizione lunga dell'Attrezzo |
| Categoria | Riferimento a Categoria | Categoria cui appartiene l'Attrezzo (Attrezzo → Categoria) |
| Immagine | immagine | Immagine che raffigura l'Attrezzo |
| Allegati | File (più valori) | Documenti che descrivono l'Attrezzo |
| Stato | Elenco di testi | Prestabile | Ritirato |
CATEGORIA
Solitamente in Drupal per rappresentare una Entità che categorizza altre Entità (come le Categorie della app che categorizzano gli Attrezzi) si utilizzando le Tassonomie. Per motivi didattici, nella app di esempio rappresento anche le Categorie come un Tipo di Contenuto. Una categoria è quindi rappresentata nella app da un Contenuto di tipo "Categoria", formato dai seguenti Campi:
| Campo | Tipo | Descrizione |
| Nome (titolo) | testo | Nome della Categoria. Es. "Falciatrice" |
| Sinonimi | testo | Altri termini che identificano la Categoria. Es. "tagliabordi estirpatore" |
| Categoria Superiore | Riferimento a Categoria | Categoria superiore. Es. Giardinaggio. Questo Campo consente di costruire una gerarchia di Categorie. (Categoria → Categoria superiore) (Categoria → Categoria) |
SEDE
Ogni sede in cui può avvenire la consegna e la restituzione degli Attrezzi prestati è rappresentata da un Contenuto di tipo "Sede", formato dai seguenti Campi:
| Campo | Tipo | Descrizione |
| Titolo | testo | Nome della Sede |
| Indirizzo | testo formattato | Indirizzo completo della Sede |
| Contatti | testo formattato | Modalità di contatto e orari di apertura al pubblico per la consegna degli Attrezzi |
| Stato | elenco di selezione | Attiva | Inattiva |
| Coordinate | coordinate geografiche | Vedi Mappe |
ASSEGNAZIONE
L'assegnazione di un Operatore ad una Sede è rappresentata da un Contenuto di tipo "Assegnazione", formato dai seguenti Campi:
| Campo | Tipo | Descrizione |
| Titolo | testo | Generato automaticamente come "Appartenenza n. CODICE" |
| Codice | Seriale | Codice univoco generato automaticamente |
| Sede | Riferimento a Sede | Sede di assegnazione (Assegnazione → Sede) |
| Operatore | Riferimento a Utente | Operatore assegnato (Assegnazione → Utente) |
| Nota | testo formattato | Nota relativa all'assegnazione dell'Operatore alla Sede |
| Stato | elenco di selezione | Attiva | Inattiva |
RICHIESTA
Ogni Richiesta di prestito è rappresentata da un Contenuto di tipo "Richiesta". La Richiesta è aggiunta alla app dall'Utente Richiedente, che quindi è memorizzato come Autore del Contenuto. I Campi della Richiesta sono:
| Campo | Tipo | Descrizione |
| Titolo | testo | Generato automaticamente come "Richiesta n. CODICE" |
| Codice | Seriale | Codice univoco generato automaticamente |
| Attrezzo | Riferimento ad Attrezzo | Attrezzo chiesto in prestito (Richiesta → Attrezzo) |
| Testo | testo formattato | Descrizione della Richiesta |
| Stato | Workflow | Vedi Workflow |
PRESTITO
Ogni Prestito attivato in risposta ad una Richiesta è rappresentato da un Contenuto di tipo "Prestito" Il Prestito è aggiunto alla app dall'Utente Proprietario dell'Attrezzo richiesto, che quindi è memorizzato come Autore del Contenuto. l Campi del Prestito sono:
| Campo | Tipo | Descrizione |
| Titolo | testo | Generato automaticamente dalla app come "Prestito n. CODICE" |
| Codice | Seriale | Codice univoco generato automaticamente |
| Richiesta | Riferimento a Richiesta | Richiesta cui il Prestito risponde (Prestito → Richiesta) |
| Nota | testo formattato | Descrizione del Prestito |
| Sede di consegna | Riferimento a Sede | Sede in cui effettuare la consegna dell'Attrezzo (Prestito → Sede). Se lasciato vuoto, indica consegna diretta tra le parti. |
| Stato | Workflow | Vedi Workflow |
RICEVUTA
Ogni Ricevuta emessa per tracciare il passaggio dell'Attrezzo prestato tra i diversi Utenti della app è rappresentata da un Contenuto di tipo "Ricevuta". La Ricevuta è aggiunta alla app dall'Utente che riceve fisicamente l'Attrezzo, che quindi è memorizzato come Autore della Ricevuta. I Campi della Ricevuta sono:
| Campo | Tipo | Descrizione |
| Titolo | Testo | Generato automaticamente come "Ricevuta n. CODICE" |
| Codice | Seriale | Intero univoco generato automaticamente |
| Prestito | Riferimento a Prestito | Prestito cui si riferisce la Consegna (Ricevuta→ Prestito) |
| Data | Data | Data in cui l'Attrezzo viene preso in carico dall'Autore |
| Motivo | Elenco di testi | Motivo della Ricevuta: Ingresso in sede | Consegna | Restituzione | Uscita dalla sede |
| Nota | Testo formattato | Nota per situazioni particolari (es. consegna incompleta, delega) |
| Stato | Workflow | Vedi Workflow |
VALUTAZIONE
Ogni valutazione espressa su un Prestito è rappresentata da un Contenuto di tipo "Valutazione". La Valutazione è aggiunta alla app dal Proprietario o dal Richiedente, che quindi è memorizzato come Autore della Valutazione. I Campi della Valutazione sono:
| Campo | Tipo | Descrizione |
| Titolo | Testo | Generato automaticamente come "Valutazione n. CODICE" |
| Codice | Seriale | Intero univoco generato automaticamente |
| Prestito | Riferimento a Prestito | Prestito cui si riferisce la Valutazione (Valutazione → Prestito) |
| Valore | Elenco di selezione | Valore della Valutazione |
| Nota | Testo formattato | Nota che spiega la Valutazione |
| Stato | Workflow | Vedi Workflow |
MESSAGGIO
I Messaggi tra gli Utenti sono memorizzati con una apposita Entità, gestita dal modulo aggiuntivo Private Message.

