web-dev-qa-db-fra.com

Accès à des champs individuels dans les modèles de vues Drupal 8

J'ai du mal à faire quelque chose qui, à mon avis, devrait être relativement simple. Drupal 8 vues.

J'ai un type de contenu appelé pays. Je souhaite afficher les 3 derniers nœuds de pays sur ma page d'accueil dans un bloc de vues. Chaque pays est affiché avec la classe "views-row" sur le conteneur div. J'utilise des vues - view - unformatted - countries - block_1.tpl pour modéliser la sortie.

Je voudrais sortir quelque chose comme le balisage suivant:

<a class="view-row-1" href="/link/to/node">
    <img src="source-of-teaser-image.png">
    <h3>Title of node</h3>
</a>

<a class="view-row-2" href="/link/to/node">
    <img src="source-of-teaser-image.png">
    <h3>Title of node</h3>
</a>

<a class="view-row-3" href="/link/to/node">
    <img src="source-of-teaser-image.png">
    <h3>Title of node</h3>
</a>

Le problème que j'ai est d'accéder à des champs individuels dans le modèle. Si j'utilise un mode d'affichage, je peux accéder à des champs individuels. Si je sélectionne "afficher les champs" dans la vue, je peux ajouter un champ pour "compteur de résultats de vue" et "chemin", ce qui me permettrait d'ajouter la classe "view-row-N" et de lier la balise a au noeud. , mais je ne peux pas accéder aux champs individuellement. J'ai la variable {{row.content}}, mais toute tentative de creuser davantage dans la variable (par exemple, row.content.field_name) ne me donne rien et l'appel d'un {{dump (row.content)}} bloque le site Web.

Je ne peux pas sortir ceci comme mode d'affichage pour 2 raisons. Je n'ai pas accès aux champs "compteur de résultats de vue" ou "chemin" dans un mode d'affichage et, même si j'avais ces variables, certains champs seraient imbriqués dans d'autres (l'image et le titre sont imbriqués dans le)

Je pense que cela devrait être aussi simple que

<a class="view-row-{{ row.content.view_result_counter }}" href="{{ row.content.path }}">

etc mais j'ai essayé tout ce que je peux penser. Suis-je complètement sur le mauvais chemin? Twig et moi ne nous entendons pas si loin ...

7
Kaizen9001

J'ai imaginé un moyen d'utiliser kint.

Dans vos affichages-view-unformatted.html.twig, utilisez le code suivant pour afficher vos champs individuels:

{% for row in rows %}

{{ row.content['#view'].style_plugin.render_tokens[ loop.index0 ]['{{ YOUR_FIELD_NAME }}'] }}

{% endfor %}
9
Ibrahim Samir

Je ne sais pas si c'est ce que vous attendez, mais vous pouvez remplacer le modèle de champ:

  1. Activer le débogage Twig: https://www.drupal.org/node/1903374
  2. Inspectez votre page dans le navigateur (si le site est en mode débogage, il existe des commentaires en HTML avec des chemins vers les modèles pour chaque élément). Par exemple, il s'agit d'un modèle de champ: core/themes/stable/templates/views/views-view-fields.html.twig
  3. Copier le modèle requis dans votre dossier de thèmes
  4. Ajouter ou modifier le balisage.

Vous pouvez déboguer un modèle en utilisant {{ dump(variable) }} ou {{ kint(variable) }}

0
fadehelix

La solution est simple: utilisez le modèle de champs de vues.

J'ai créé un nouveau modèle sous le dossier themes/templates:

views-view-fields--VIEW-NAME.html.twig

Et maintenant, vous pouvez accéder aux valeurs de vos champs comme ceci:

{{ fields.field_NAME.content }}
0
Viswa

L'utilisation du contenu/mode d'affichage fonctionne dans votre cas.

1/Dans "views-view-unformatted.html.twig", vous pouvez utiliser "loop.index" dans la boucle "pour" pour obtenir l'index de la ligne actuelle et l'ajouter à la variable "row_classes".

2/Dans le modèle de brindille pour le nœud, vous pouvez utiliser quelque chose comme:

<a href="{{ path('entity.node.canonical', {'node': node.id}) }}">
    {{ content.field_img }}
    {{ node.getTitle()}}
</a>

3/Vous obtiendrez probablement du code HTML supplémentaire, mais vous pouvez vous en débarrasser en supprimant les modèles pertinents.

0
progzy

Dans votre cas, vous devriez utiliser vues-vue-champs - pays - block_1.html.twig au lieu de vues-vue-non formaté - pays - block_1.html. fichier de brindille. 

Le modèle de champs de vues itérera sur toutes les lignes du résultat. Vos vues-view-champs - pays - block_1.html.twig devraient contenir le code ci-dessous -

<div>
  <a class="view-row" href="{{variable-to-print-path }}">
   <img src="{{ image-path }}">
   <h3>{{ fields.title.content</h3>
  </a>
</div>

Vous pouvez vérifier le tableau de champs en utilisant la fonction kint comme - {{kint (champs)}}

Vérifiez le chemin de l'image et la variable du chemin d'ancrage à partir de la sortie de la fonction kint. 

Si vous voulez faire cela dans views-view-unformatted - countries - block_1.html. Twig, vous pouvez accéder aux valeurs de champ comme ci-dessous - 

{% for row in rows %}
  {% set photo = file_url(row['content']['#row']._entity.field_page_photo.entity.fileuri) %}          
  <li><img src={{ photo }} class="img-responsive img-circle"></li>
{% endfor %}
0
Renuka Kulkarni