Come posso accedere ai dati dei campi in Twig?


15

Ho un campo elenco per un tipo di blocco personalizzato che assomiglia a questo:

left|Align left
right|Align right

Posso accedere alla chiave in Twig facendo qualcosa del genere:

{% block content %}
  {{ content.field_align }}  {# outputs 'right' #}
{% endblock %}

Tuttavia, se faccio un semplice confronto, viene emesso FALSE.

{{ kint(content.field_align == 'right') }}

Il seguente codice ritorna TRUE.

{{ kint(content.field_align['#items'].getValue()|first.value == 'right') }}

Esiste una versione più breve per ottenere la stringa "reale" in modo da poter utilizzare i filtri di stringa di Twigs e tenerlo in ordine?


Risposte:


16

content contiene le matrici di rendering in base ai formattatori configurati.

Se si desidera accedere ai valori effettivi, si desidera accedervi tramite l'oggetto entità. Di solito, questo è già disponibile per il tuo modello, ad esempio node. Nel tuo caso, è un po 'speciale perché il block_content è reso nel contenuto del blocco senza il suo modello, quindi devi renderlo disponibile da solo in yourtheme_preprocess_block($variables)questo modo:

if (isset($variables['elements']['content']['#block_content'])) {
  $variables['block_content'] = $variables['elements']['content']['#block_content'];
}

Quindi, è possibile accedere a un valore di campo con block_content.field_name.property. Quindi nel tuo caso block_content.field_align.value,. La proprietà è valueper la maggior parte dei tipi di campo, per i riferimenti, è possibile utilizzare target_idper l'ID o entityper l'oggetto entità referenziato. Sì, puoi accedere direttamente ai campi su questo, ma assicurati di verificare sempre l'esistenza di un riferimento, altrimenti potresti finire con errori fatali o eccezioni. Per accedere all'etichetta di un termine di riferimento, ad esempio, è possibile accedervi come block_content.field_tags.entity.name.value.

Se non si specifica il delta di campo, il valore predefinito è il primo. Se si desidera accedere a un delta diverso, è possibile utilizzare entity.field_name.1.valuee così via. Puoi anche passare su di essi.

Tutto questo viene mappato direttamente su PHP, puoi anche farlo $block_content->field_tags->entity->name->valuein pre-elaborazione e in altri luoghi in cui hai il block_content.


Grazie per la tua risposta! Mentre lo sto facendo dal modello di ramoscello di blocco in cui l'oggetto nodo non è disponibile (sottotitolo "Classy"), avrei bisogno di preelaborare i valori e iniettarli in qualche modo?
estrar

Spiacenti, ho perso la parte block_content. Aggiornato la risposta.
Berdir,

Perfetto! Potrei ottenere i valori facendo questo: block_content.field_name.value Grazie per avermi aiutato a capire!
estrar

6

Ecco un modo alternativo, unico modello, che ti consente di eseguire il rendering di un array di rendering e di controllarne il valore (consente di controllare la variabile come se stessi stampandola, perché la stampa in Drupal 8 Twig rende automaticamente le variabili che sono array di rendering):

{{ kint(content.field_align|render == 'right') }}

Oppure un'altra opzione per salvare il rendering extra se si stampa la variabile in un secondo momento:

{% set field_align = content.field_align|render %}
{{ kint(field_align == 'right') }}

{{ field_align }}

Molto utile e buono a sapersi! Grazie per l'input.
estrar

2

In questo caso è possibile utilizzare il modulo Valore campo Twig . Permette di ottenere dati parziali dagli array di rendering dei campi. Per es. content.field_name | field_value -get valore del campo. Puoi usarlo nell'istruzione IF

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.