Scorrere il campo del contenuto a più valori nel modello Twig


23

Devo prendere il controllo del rendering di un field_admin_tagscampo in un node.html.twigmodello.

Questo FUNZIONA:

  • {{ content.field_admin_tags }} - Rende tutto (etichetta + tutti i valori dei campi)
  • {{ content.field_admin_tags.0 }} - Esegue il rendering solo del primo valore nel campo e nessuna etichetta

PROBLEMA: non ho alcun controllo sul markup che circonda i tag, ad es <ul><li>...</li></ul>.

Quindi la mia idea era quella di iterare sull'array di rendering .

Ma NON funziona:

{% for tag in content.field_admin_tags %}
  {{ tag }}
{% endfor %}

Ottengo: Exception: Object of type Drupal\node\Entity\Node cannot be printed.

Penso che sto ripetendo le chiavi / i valori dell'array di rendering rispetto agli elementi all'interno del campo (se stampo una "X" in ogni ciclo, ottengo 20 X mentre ho solo due o tre valori in questo campo) .

Mi piacerebbe iterare content.field_admin_tags.0, content.field_admin_tags.1ecc

Qualche idea su come risolvere questo problema? Grazie.


1
Il numero su do drupal.org/node/2776307
gagarine

Risposte:


15

Puoi risolvere questo problema in un ramoscello di campo. Lì puoi usare il ciclo esistente per scorrere gli elementi del campo:

node.html.twig

{{ content.field_admin_tags }}

campo - campo-admin-tags.html.twig

<ul{{ attributes }}>
  {% for item in items %}
    <li>{{ item.content }}</li>
  {% endfor %}
</ul>

Questo esempio sostituisce <div>con <ul>. Non rimuovere {{ attributes }}o ignorare il modello di campo, vedere Cosa può interrompere Quickedit e come posso risolverlo?


Questo è chiamato dal modello genitore con{{ content.field_admin_tags }}
aydow il

23

D'accordo con 4k4 il modello di campo è il posto migliore, se lo vuoi davvero nel modello di entità (ad esempio nodo) puoi fare qualcosa del genere:

{% for key, item in content.field_tags if key|first != '#' %}
  <div class="item-{{ key + 1 }}">{{ item }}</div>
{% endfor %}

Ma onestamente penso che sia un po 'brutto, il modello di campo è il posto giusto.


1
D'accordo, è un po 'brutto. ;) Grazie per lo snippet di codice, comunque.
AngularChef,

Funziona perfettamente con diversi tipi di entità
Christophe CARON,

11

Se, come me, stai cercando un modo per scorrere i paragrafi sul modello di ramoscello di un nodo, ecco come farlo:

Supponiamo di avere un nodo con un campo di paragrafo multivalore, quindi un editor di contenuti può creare più paragrafi e si desidera scorrere attraverso ciascun paragrafo sul modello di ramoscello dei nodi (ad esempio per aggiungere un wrapper attorno a ciascun paragrafo):

{% for key,value in node.my_paragraph_field.value %}
    {{ content.my_paragraph_field[key] }}
{% endfor %}

AGGIORNAMENTO: avevo bisogno di trovare un altro modo per stampare tutti i paragrafi senza usare il contenuto. La variabile content contiene tutto ciò che hai impostato nella sezione "Gestisci display" del nodo, ma il mio attuale metodo di lavoro è di non usare mai "Gestisci display" né layout poiché puoi effettivamente accedere a tutti i dati nel file ramoscello del nodo, e quasi tutti impostazioni che faresti su "Gestisci display", come applicare uno stile di immagine o impostare un formato data, ... puoi farlo direttamente in un ramoscello.

Per me questo è un vantaggio perché so che tutto ciò che vedo proviene dal file ramoscello e non ho bisogno di cercare alcune impostazioni di campo oscure che potrebbero aggiungere classi da qualche parte. Quindi tutto ciò che vedo proviene da un solo punto (il file ramoscello dei nodi) e non una combinazione del file ramoscello e della schermata di gestione.

Ad ogni modo, usando il fantastico modulo Twig Tweak, ecco come stampare un campo paragrafo multi valore nel file ramoscello di un nodo senza dover usare la variabile content:

{% for item in node.field_paragraphs %}
    {{ drupal_entity('paragraph', item.target_id) }}
{% endfor %}

1

Ho trovato la #itemsproprietà utile quando si costruiscono anelli di lunghezza sconosciuta in Twig:

print number of values within field:
{{ content.field_admin_tags['#items']|length }}

---

{# remember length in variable (minus 1 because it starts from 0): #}
{% set numTagsIndex = content.field_admin_tags['#items']|length - 1 %}

{# loop until the max value is reached: #}
{% for i in 0..numTagsIndex %}
  {{ content.field_admin_tags[i] }}
{% endfor %}

0

Se si desidera posizionare wrapper aggiuntivi attorno ai campi all'interno del campo paragrafo o per qualche motivo è necessario un valore del campo di riferimento di paragrafo specifico, è possibile effettuare le seguenti operazioni:

{% for key,value in node.paragraph_field_name.value %}

<div class="example-wrapper">
{{ content.paragraph_field_name[key]['#paragraph'].field_content.value }}
</div>

{% endfor %}

In questo modo {{kint(content.paragraph_field_name[key])}}, vedrai che i campi sono accessibili all'interno della parte ['#paragraph'] dell'array.

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.