I Contenuti

Cosa sono. Creare nuovi tipi di contenuti. Riusare i Campi. Titoli automatici dei Contenuti.
Dal Vocabolario: Tipo di contenuto, Contenuto, Token
Aggiornata il:

Cosa sono i Contenuti

I Contenuti sono il tipo di Entità meno "specializzato" e quindi più utilizzato per gestire informazioni nelle app. Prima di poter gestire in Drupal un qualsiasi Contenuto, è necessario definirne il tipo: il Tipo di Contenuto fa da modello o "stampo" per la creazione di Contenuti di quel tipo. Il Tipo di Contenuto elenca i Campi che formano il Contenuto, stabilisce come mostrarli, quali Utenti possono inserire Contenuti di quel tipo ecc.

Appena installato, Drupal offre di default un paio di Tipi di contenuto molto semplici - la "pagina" e l'"articolo" - pensati più per i siti informativi che per una app.  

Quali Tipi di Contenuti servono

La costruzione di una app in Drupal parte proprio dalla identificazione dei Tipi di Contenuto che servono alla app. Per scoprire i Tipi di Contenuto che ci servono, occorre esaminare non solo quali tipi di oggetti, documenti, luoghi ecc. la app deve gestire, ma è opportuno considerare anche "oggetti" più astratti, come procedure, progetti, gruppi di lavoro ecc. Vediamo qualche criterio di massima che può guidare alla traduzione dei concetti in Contenuti.

Criterio della semplicità. Più Tipi di Contenuto definiamo, più la costruzione della app si complica. Lo vedremo in dettaglio quando costruiremo le Viste che mostrano i Contenuti agli Utenti. Se l'analisi evidenza che due Tipi di Contenuti corrispondenti a due concetti apparentemente distinti hanno in realtà gli stessi Campi o quasi, conviene fare un supplemento di analisi per capire se possiamo gestire entrambi con un solo Tipo di Contenuto, eventualmente prevedendo che uno o più Campi non siano sempre mostrati. 

Criterio dell'unità. Come abbiamo già visto parlando di Entità (e i Contenuti sono un caso particolare di Entità), in Drupal un Contenuto è gestito come un'unità, quindi i Permessi di modifica e cancellazione non possono essere dati agli Utenti sui singoli Campi ma solo sull'intero Contenuto. Se per un Tipo di Contenuto ci accorgiamo che alcuni Campi sono gestiti da un gruppo di Utenti e gli altri Campi sono gestiti da altri Utenti, per consentire ad ognuno di intervenire autonomamente sui Campi di propria pertinenza, la soluzione più semplice è quella di creare un Tipo di Contenuto distinto per ogni gruppo di Utenti e di collegare questi Tipi di Contenuto tra loro mediante Campi Riferimento. 

Criterio del tempo. Per lo stesso motivo, mentre è possibile (con qualche sforzo, come vedremo) modificare nel tempo i Permessi degli Utenti su un Tipo di Contenuto, non è possibile modificare nel tempo i Permessi sui singoli Campi. Quindi se alcuni Campi di un Tipo Contenuto sono sempre modificabili ed altri non devono essere modificabili prima di una certa data o di un certo evento, la soluzione più semplice è spostare questi ultimi in un Tipo di Contenuto a parte, per il quale i Permessi cambiano nel tempo.

Ad esempio, nella app "Buoni Vicini" per rappresentare i concetti di Attrezzo, Categoria, Sede creiamo gli omonimi Tipi di Contenuto, cui aggiungiamo il Tipo "Assegnazione" per associare gli Utenti Operatori alle Sedi. La rappresentazione del "prestito" è più complessa, perché le informazioni relative ad un prestito sono gestite da diversi Utenti (il richiedente, il proprietario, l'operatore) e le protezioni delle informazioni variano nel tempo. Applicando i criteri sopra suggeriti, il concetto di "prestito" viene spacchettato nei seguenti Tipi di Contenuto:

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

Come costruire un nuovo Tipo di Contenuto

Ecco come Amministratore puoi costruire un nuovo Tipo di Contenuto:

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

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

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

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

Riusare i Campi 

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

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

Titoli automatici

Il Campo Titolo è presente ed obbligatorio per tutti i Contenuti, ma in alcuni caso non è molto significativo. Nella app di esempio, mentre il Campo Titolo di Attrezzi, Categoria, Sede è utile per identificare l'attrezzo stesso, per Richieste, Prestiti, Ricevute, Valutazioni e Messaggi il Titolo non corrisponde ad una informazione significativa e ho scelto quindi di lasciarlo costruirei automaticamente da Drupal come il nome del Tipo di Contenuto seguito da un codice identificativo univoco, es. "Richiesta n. 253", Oltre a evitare all'Utente di doversi inventare un titolo non significativo, ciò consente all'Utente di identificare senza ambiguità il Contenuto, ad esempio nei Messaggi scambiati con gli altri Utenti. 

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

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

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

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

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

Eliminare un Campo

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

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

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

Cambiare il tipo di un Campo

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

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

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

I Contenuti di Buoni Vicini

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

ATTREZZO

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

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

CATEGORIA

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

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

SEDE

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

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

ASSEGNAZIONE

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

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

RICHIESTA

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

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

PRESTITO

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

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

RICEVUTA

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

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

VALUTAZIONE

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

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

MESSAGGIO

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