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;