web-dev-qa-db-fra.com

Rendre les champs et les étiquettes des nœuds dans le modèle de nœud

Je connais l'API de thème Drupal 8, y compris hook_preprocess_HOOK(), ainsi que toutes les suggestions de modèles de thème disponibles lorsque Twig le débogage est activé.

Cependant, ce que j'aimerais pouvoir faire, c'est contrôler tous les champs individuels et les étiquettes facultatives pour un nœud, à l'intérieur du modèle node - tool - full.html.twig. (Le nom de ma machine de type de contenu est outil.)

Je sais aussi que je peux simplement laisser de côté l'appel à {{ content }} dans le modèle Twig et appelez les champs individuellement comme ceci.

{{content.body}}
{{content.field_application_purpose}}
{{content.field_application_uses}}

Et bien sûr, si je veux un contrôle complet sur un champ, y compris le balisage rendu (par exemple, field_application_uses), je peux créer un autre modèle (champ - noeud - field-application-uses - tool.html.twig) puis envelopper le champ et son étiquette dans le balisage que je souhaite.

Jusqu'ici tout va bien.

Mais comment puis-je contrôler tout cela à partir du modèle de nœud, dans ce cas, node - tool - full.html.twig?

Mon nœud est traduisible, y compris l'étiquette de champ.

Ce que j'aimerais faire, au lieu d'avoir à créer des modèles de champ pour chaque champ sur le nœud/type de contenu/bundle, c'est quelque chose comme ça.

<article{{ attributes.addClass(classes) }}>
  ...
  <div class="application-purpose">
    <h3>{{ node.field-application_purpose.label}}</h3>
    <p>{{ node.field-application_purpose.value }}</p>
  </div>

  <div class="application-uses">
    <h3>{{ node.field_application_uses.label}}</h3>
    <p>{{ node.field_application_uses.value }}</p>
  </div>
  ...
</article>

L'extrait de modèle ci-dessus fonctionne pour la valeur, mais pas pour l'étiquette, et j'ai passé des heures à essayer de trouver où obtenir l'étiquette.

Dans field - node - field-application-uses - tool.html.twig, le label est disponible en tant que variable, mais comment puis-je le récupérer au niveau du modèle de noeud?

Idéalement, j'aimerais conserver tous les champs et leur balisage dans un seul modèle, le modèle de nœud, au lieu d'avoir à créer un modèle pour chaque champ.

5
Blue Waters

L'étiquette est dans la définition du champ, vous devez ajouter fieldDefinition avant label:

{{ node.field_myfield.fieldDefinition.label }}

Pour expliquer cela, le nœud est l'objet nœud. Le contenu est le tableau de rendu des champs, qui sont construits comme configurés dans le mode d'affichage. Dans le nœud, vous trouverez les valeurs brutes et les définitions de tous les champs du nœud. Dans le contenu, vous ne trouvez que les champs inclus dans le mode d'affichage et ils sont déjà formatés comme configurés dans le mode d'affichage. Vous trouvez également chacun des champs en tant qu'objet dans le contenu, mais vous ne pouvez pas être sûr que le champ est là, car si quelqu'un supprime ultérieurement le champ du mode affichage, votre code obtiendra une valeur nulle.

5
4k4

J'ai créé ce module qui vous permet d'imprimer l'étiquette et la valeur de champ individuellement: https://www.drupal.org/sandbox/sutharsan/276318

<strong>{{ content.field_name|field_label }}</strong>: {{ content.field_name|field_value }}

Faites-moi savoir si cela vous est utile je vais le promouvoir en projet complet.

2
Sutharsan