Lavoriamo con Drupal 8 o 9 e per realizzare nuovi content-type o ,semplicemente, delle stupende pagine usiamo i template Twig che dalla versione 8 di Drupal sono lo standard (in Drupal 7 o precedente i template si scrivevano direttamente in PHP).
Se dobbiamo rendere un campo in base a com’è stato configurato nel sul content-type usiamo la semplice funzione in un template Drupal Twig:
{{ content.fieldname }}
ed il campo viene reso perfettamente da Drupal.
Spesso, però, non dobbiamo rendere il campo così com’è ma potremmo volere prelevare solamente il suo valore per testarlo o renderlo in HTML con dei tag diversi da come verrebbero resi di default da Drupal.
Quindi nei successivi paragrafi vengono analizzate le principali tipologie di campi di Drupal a partire dai campi semplici a quelli di tipo “Entity reference” per ricavare i dati che potrebbero servirci durante lo sviluppo di un sito.
Campi Drupal
Introduzione
Come ipotesi generale per ogni campo che analizzeremo consideriamo che la variabile “node” restituisca il nodo attuale e che “fieldname” sia il nome (il machine name) del campo da analizzare.
Inoltre consideriamo sempre il primo elemento di ogni campo anche se è definito come campo multiplo (consideriamo l’elemento “0” dell’array del campo).
Per capirci meglio se “fieldname” è un campo multiplo di 3 elementi allora:
{{ node.fieldname[0] }} {# è il primo elemento #}
{{ node.fieldname[1] }} {# è il secondo elemento #}
{{ node.fieldname[2] }} {# è il terzo elemento #}
mentre se consideriamo tutto l’array avremmo un oggetto di tipo FieldItemList o un suo derivato (una super classe come EntityReferenceFieldItemList o FileFieldItemList)
{{ node.fieldname }} {# FieldItemList! #}
Gruppo campi “General”
Per questo tipo di campi il Namespace è unico ed è Drupal\Core\Field\Plugin\Field\FieldType
Boolean
Class: BooleanItem
{# value: restituisce il valore "1" oppure "0" #}
{{ node.fieldname[0].value }}
{# getPossibleOptions(): restituisce un array di 2 elementi la cui chiavi sono:
"0" ed "1" ed i valori sono "On" ed "Off"
o quelli definiti durante la creazione del campo
array {
0 => "On",
1 => "Off"
}
#}
{{ node.fieldname[0].getPossibleOptions() }}
{# getPossibleValues(): restituisce un array con i possibili valori
array {
0 => 0,
1 => 1
}
#}
{{ node.fieldname[0].getPossibleValue() }}
Date
Class: DateTimeItem
{{ node.fieldname[0].value }}
Timestamp
Class: TimestampItem
{{ node.fieldname[0].value }}
Class: EmailItem
{{ node.fieldname[0].value }}
Link
Class: LinkItem
{# node.uri: restituisce l'uri dell'url #}
{{ node.fieldname[0].value.uri }}
{# value.title: restituisce il title del link #}
{{ node.fieldname[0].value.title }}
{# value: restituisce un array con chiavi url e title #}
{{ node.fieldname[0].value }}
Gruppo campi “Number”
Namespace: Drupal\options\Plugin\Field\FieldType
{{ node.fieldname[0].value }}
List (float) e List (integer)
Class: ListFloatItem e ListIntegerItem
{# value: restituisce il valore float o integer #}
{{ node.fieldname[0].value }}
{#
# getPossibleValues(): Restituisce un array di possibili valori
# array { 0 => "0.1", 1 => "0.55",2 => "18" }
#}
{{ node.fieldname[0].getPossibleValues() }}
{#
# getPossibleOptions(): Restituisce un array di possibili valori con le label per la visualizzazione
# array { 0.1 => "un decimo", 0.55 => "zero and 55", 18 => "eighteen" }
#}
{{ node.fieldname[0].getPossibleOptions() }}
Number (decimal, float, int)
Class: DecimalItem, FloatItem, IntegerItem
{# value: resituisce il valore numerico decimale, float o int in base al tipo di campo #}
{{ node.fieldname[0].value }}
Gruppi campi “Text”
Namespace: Drupal\options\Plugin\Field\FieldType
List (text)
Class: ListStringItem
{# value: restituisce la chiave selezionata #}
{{ node.fieldname[0].value }}
{#
# getPossibleValues(): Restituisce un array di possibili valori
# array { 0 => "0.1", 1 => "0.55",2 => "18" }
#}
{{ node.fieldname[0].getPossibleValues() }}
{#
# getPossibleOptions(): Restituisce un array di possibili valori con le label per la visualizzazione
# array { 0.1 => "un decimo", 0.55 => "zero and 55", 18 => "eighteen" }
#}
{{ node.fieldname[0].getPossibleOptions() }}
Text (formatted, long, summary, plain)
Class: TextItem, TextLongItem, TextWithSummaryItem, StringItem, StringLongItem
{# value: restituisce il testo con i tag html, se disponibili #}
{{ node.fieldname[0].value }}
{# summary: restituisce il riassunto del campo se tale campo lo prevede #}
{{ node.fieldname[0].summary }}
Gruppo campi “Reference”
Namespace: Drupal\Core\Field\Plugin\Field\FieldType
Class: EntityReferenceItem o la estende (come in File ed Image)
Ogni campo del gruppo “Reference” sarà quindi un oggetto Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem o di una classe che lo estende:
{# è un oggetto EntityReferenceItem #}
{{ node.fieldname[0].entity }}
Per aver quindi l’entità associata al campo bisogna utilizzare:
{{ node.fieldname[0].entity }}
Se vogliamo l’id dell’entity:
{{ node.fieldname[0].entity.id }}
Content
Namespace entity: Drupal\node\Entity
Class entity: Node
Dato che l’oggetto associato all’entity è di tipo “Node” possiamo avere tutti i dati ad esso relativi:
{# nid.value: restituisce il node id #}
{{ node.fieldname[0].entity.nid.value }}
{# title.value: restituisce il titolo del nodo #}
{{ node.fieldname[0].entity.title.value }}
{# body.value: restituisce il body #}
{{ node.field_test_ref_content[0].entity.body.value }}
{# | view: rende il campo #}
{{ node.field_test_ref_content[0].entity.body | view }}
{# created.value: restituisce la data di creazione #}
{{ node.field_test_ref_content[0].entity.created.value }}
{# | view: rende l'intero nodo se applicato all'entity #}
{{ node.field_test_ref_content[0].entity | view }}
Custom Block
Namespace entity: Drupal\block_content\Entity
Class entity: BlockContent
Troviamo i dati principali del blocco con:
{# id.value: restituisce l'id del blocco #}
{{ node.fieldname[0].entity.id.value }}
{# info.value: restituisce la descrizione del blocco #}
{{ node.fieldname[0].entity.info.value }}
{# body.value: restutuisce l'html del body del blocco #}
{{ node.fieldname[0].entity.body.value }}
{# body.summary: restituisce il riassunto del blocco #}
{{ node.fieldname[0].entity.body.summary }}
{# | view: rende il blocco #}
{{ node.fieldname[0].entity | view }}
Taxonomy term
Namespace entity: Drupal\taxonomy\Entity
Class entity: Term
I dati del campo Taxonomy term li troviamo con:
{# id.value: restituisce l'id del term #}
{{ node.fieldname[0].entity.id.value }}
{# name.value: restituisce il nome del term #}
{{ node.fieldname[0].entity.name.value }}
{# description.value: restituisce la descrizione del term #}
{{ node.fieldname[0].entity.description.value }}
{# | view: rende il taxonomy term #}
{{ node.fieldname[0].entity | view }}
Media
Namespace entity: Drupal\media\Entity
Class entity: Media
Media è un campo complesso che a sua volta ha ancora altri campi di cui uno è quello principale che lo distingue tra i vari “Media types” (vedere /admin/structure/media per i tipi esistenti e come crearne altri).
I dati principali del campo Media si trovano con:
{# mid.value: restituisce il media id #}
{{ node.fieldname[0].entity.mid.value }}
{# bundle(): restituisce il bundle ovvero il nome del Media type #}
{{ node.fieldname[0].entity.bundle() }}
{# name.value: restituisce il nome del campo Media #}
{{ node.fieldname[0].entity.name.value }}
{# | view: rende il Media #}
{{ node.fieldname[2].entity | view }}
Supponendo che il Media type sia “Image” allora il campo principale che imposta Drupal avrà il machine name “field_media_image” mentre “Audio” avrà il campo “field_media_audio_file” e “Document” avrà “field_media_document“.
Per gli altri Media types vedere la relativa pagina su Drupal.
Nel caso di “Image” troviamo il campo “field_media_image” con
{{ node.fieldname[0].entity.field_media_image }}
Tale campo è un oggetto di tipo “ImageItem” e quindi riusciamo a trovare tutti i campi di nostro interesse come width, height, alt, il nome del file, l’uri, l’url, il mime type e la dimensione in byte come spiegato sotto nel paragrafo File ed Image.
File
Class: FileItem (estende EntityReferenceItem)
La classe FileItem aggiunge alcune caratteristiche in più rispetto ad EntityReferenceItem che possono esser riassunte in questo template Drupal Twig:
{# description: restituisce la descrizione #}
{{ node.fieldname[0].description }}
{# getUploadLocation(): restituisce l'uri della dir dove fare l'upload (public://2021-02) #}
{{ node.field_test_ref_file[0].getUploadLocation() }}
{# file_url: restituisce il path relativo dove poter fare l'upload (/sites/default/files/2021-02) #}
{{ file_url(node.field_test_ref_file[0].getUploadLocation()) }}
Namespace entity: Drupal\file\Entity
Class entity: File
{# getFilename(): restituisce il nome del file #}
{{ node.fieldname[0].entity.getFilename() }}
{# getFileUri(): restituisce l'uri interno (public://2021-01/test.txt o private://2021-01/test.txt) #}
{{ node.fieldname[0].entity.getFileUri() }}
{# getMimeType(): restituisce il mime type #}
{{ node.fieldname[0].entity.getMimeType() }}
{# getSize(): restituisce la dimensione in byte #}
{{ node.fieldname[0].entity.getSize() }}
{# file_url(): restituisce l'url relativo alla base url del sito #}
{{ file_url(node.fieldname[0].entity.getFileUri()) }}
Image
Class: ImageItem (estende FileItem, estende EntityReferenceItem)
La classe ImageItem aggiunge alcune caratteristiche in più rispetto a FileItem e ad EntityReferenceItem che possono esser riassunte con questo template Drupal twig:
{# alt: restituisce il testo alternativo #}
{{ node.fieldname[0].alt }}
{# title: restituisce il titolo dell'immagine #}
{{ node.fieldname[0].title }}
{# width: restituisce la larghezza in pixel dell'immagine #}
{{ node.fieldname[0].width }}
{# height: restituisce l'altezza in pixel dell'immagine #}
{{ node.fieldname[0].height }}
Namespace entity: Drupal\file\Entity
Class entity: File
Dato che la Classe ed il Namespace sono identici all’entity del tipo File valgono le stesse chiamate Twig: getFilename(), getFileUri(), getMimeType() e getSize().
Riferimenti
- Drupal;
- Twig su Drupal;
- sito ufficiale;
- api versione 2 per Drupal 8.7 o superiori;
- api versione 1 per Dupal 8 ma minore di 8.7;
- HTML;
- PHP;
- Drupal Content Types;
- Drupal Content Types personalizzati;



