Itérer à travers le champ de contenu à valeurs multiples dans le modèle Twig

23

J'ai besoin de prendre le contrôle du rendu d'un field_admin_tagschamp dans un node.html.twigmodèle.

Cela marche:

  • {{ content.field_admin_tags }} - Rend tout (étiquette + toutes les valeurs de champ)
  • {{ content.field_admin_tags.0 }} - N'affiche que la première valeur du champ et aucune étiquette

PROBLÈME: je n'ai aucun contrôle sur le balisage entourant les balises, par exemple <ul><li>...</li></ul>.

Mon idée était donc de parcourir le tableau de rendu .

Mais cela ne fonctionne PAS:

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

Je reçois: Exception: Object of type Drupal\node\Entity\Node cannot be printed.

Je pense que j'itère sur les clés / valeurs du tableau de rendu par rapport aux éléments à l'intérieur du champ (si j'imprime un "X" dans chaque boucle, j'obtiens 20 X alors que je n'ai que deux ou trois valeurs dans ce champ) .

Je voudrais itérer content.field_admin_tags.0, content.field_admin_tags.1etc.

Une idée de comment résoudre ce problème? Merci.

AngularChef
la source
1
Le problème sur do drupal.org/node/2776307
gagarine

Réponses:

15

Vous pouvez résoudre ce problème dans une branche de champ. Là, vous pouvez utiliser la boucle existante pour parcourir les éléments de champ:

node.html.twig

{{ content.field_admin_tags }}

champ - field-admin-tags.html.twig

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

Cet exemple remplace <div>par <ul>. Ne supprimez pas {{ attributes }}ou ne contournez pas le modèle de champ, voir Qu'est - ce qui peut briser quickedit et comment le corriger?

4k4
la source
Ceci est appelé à partir du modèle parent avec{{ content.field_admin_tags }}
aydow
23

D'accord avec 4k4, le modèle de champ est le meilleur endroit, si vous le voulez vraiment dans le modèle d'entité (par exemple, le nœud), vous pouvez faire quelque chose comme ceci:

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

Mais honnêtement, je pense que c'est un peu moche, le modèle de champ est le bon endroit.

Jeff Burnz
la source
1
D'accord, c'est un peu moche. ;) Merci pour l'extrait de code, cependant.
AngularChef
Fonctionne parfaitement avec différents types d'entités
Christophe CARON
11

Si vous, comme moi, cherchez un moyen de parcourir les paragraphes du modèle de brindille d'un nœud, voici comment le faire:

Supposons que vous ayez un nœud avec un champ de paragraphe à plusieurs valeurs, afin qu'un éditeur de contenu puisse créer plusieurs paragraphes et que vous souhaitiez parcourir chaque paragraphe sur le modèle de brindille de nœuds (par exemple pour ajouter un wrapper autour de chaque paragraphe):

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

MISE À JOUR: J'avais besoin de trouver une autre façon d'imprimer tous les paragraphes sans utiliser de contenu. La variable de contenu contient tout ce que vous avez configuré dans la section `` Gérer l'affichage '' du nœud, mais ma méthode de travail actuelle consiste à ne jamais utiliser `` Gérer l'affichage '' ni les mises en page car vous pouvez réellement accéder à toutes les données du fichier de brindille du nœud, et presque tous les réglages que vous feriez sur "Gérer l'affichage", comme appliquer un style d'image, ou définir un format de date, ... vous pouvez le faire directement en brindille.

Pour moi, c'est un avantage car je sais que tout ce que je vois provient du fichier twig, et je n'ai pas besoin de rechercher des paramètres de champ obscurs qui peuvent ajouter des classes quelque part. Donc, tout ce que je vois vient d'un seul endroit (le fichier de brindille des nœuds) et non d'une combinaison du fichier de brindille et de l'écran d'affichage de gestion.

Quoi qu'il en soit, en utilisant le module génial Twig Tweak, voici comment imprimer un champ de paragraphe à valeurs multiples dans le fichier twig d'un nœud sans avoir à utiliser la variable de contenu:

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

J'ai trouvé la #itemspropriété utile lors de la construction de boucles de longueur inconnue dans 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 %}
Chris Ruppel
la source
0

Si vous souhaitez placer des wrappers supplémentaires autour des champs à l'intérieur du champ de paragraphe ou avez besoin pour une raison quelconque d'une valeur de champ de référence de paragraphe particulière, vous pouvez effectuer les opérations suivantes:

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

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

{% endfor %}

En faisant cela {{kint(content.paragraph_field_name[key])}}, vous verrez que les champs sont accessibles à l'intérieur de la partie ['# paragraph'] du tableau.

Brent Schuddinck
la source