Доступ к отдельным полям в шаблонах представлений Drupal 8

У меня проблемы с выполнением чего-то, что, по моему мнению, должно быть относительно простым Drupal 8 views.

У меня есть тип контента под названием "Страны". Я хотел бы отобразить 3 последних узла страны на моей домашней странице в блоке просмотров. Каждая страна отображается с классом views-row в блоке div. Я использую views - view - unformatted - countries - block_1.tpl для создания шаблона вывода.

Я хотел бы вывести что-то вроде следующей разметки:

<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>

У меня проблема с доступом к отдельным полям в шаблоне. Если я использую режим просмотра, я могу получить доступ к отдельным полям. Если я выберу «показать поля» в представлении, я могу добавить поле для «счетчика результатов просмотра» и «пути», что позволит мне добавить класс «view-row-N» и связать тег a с узлом. , но я не могу получить доступ к полям по отдельности. У меня есть переменная {{row.content}}, но любая попытка углубиться в эту переменную (например, row.content.field_name) ничего не дает, а вызов {{dump (row.content)}} приводит к сбою веб-сайта.

Я не могу вывести это как режим просмотра по двум причинам. У меня нет доступа к полям «счетчик результатов просмотра» или «путь» в режиме просмотра, и даже если бы у меня были эти переменные, некоторые поля были бы вложены внутри других (изображение и заголовок вложены внутри)

Я считаю, что это действительно должно быть так просто, как

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

и т.д., но я перепробовал все, что мог придумать. Я полностью на ложном пути? Мы с Твиг пока не ладим ...


person Kaizen9001    schedule 18.10.2016    source источник


Ответы (6)


Я нашел способ использовать кинт.

Внутри вашего views-view-unformatted.html.twig используйте следующий код для отображения ваших индивидуальных полей:

{% for row in rows %}

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

{% endfor %}
person Ibrahim Samir    schedule 31.03.2017
comment
+1 голос за этот ответ и вопрос - этот ответ (и вопрос) может помочь тем, кому нужна разметка (например, <script>) / js) для вывода в строках / полях результатов просмотра - они отфильтрованы по соображениям безопасности. Но некоторые люди разумно утверждали (на мой взгляд), что только авторизованные администраторы могут управлять просмотром в первую очередь! См. drupal.org/project/views/issues/853880 drupal.org/project/views/issues/417956 и drupal.org/forum/support/ после установки / 16.10.2009 / Еще раз спасибо. - person therobyouknow; 17.10.2018

В вашем случае работает режим содержимого / просмотра.

1 / В «views-view-unformatted.html.twig» вы можете использовать «loop.index» в цикле «for», чтобы получить индекс текущей строки и добавить его в переменную «row_classes».

2 / В шаблоне веточки для узла вы можете использовать что-то вроде:

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

3 / Вы, вероятно, получите дополнительный html, но вы можете избавиться от большей его части, переопределив соответствующие шаблоны.

person progzy    schedule 21.10.2016

Я не уверен, что вы этого ожидаете, но вы можете переопределить шаблон поля:

  1. Включите отладку Twig: https://www.drupal.org/node/1903374
  2. Осмотрите свою страницу в браузере (если сайт находится в режиме отладки, в html есть комментарии с путями к шаблонам для каждого элемента). Например, это шаблон поля: core / themes / stable / templates / views / views-view-fields.html.twig
  3. Скопируйте нужный шаблон в папку с вашей темой
  4. Добавить или изменить разметку.

Вы можете отлаживать шаблон, используя {{ dump(variable) }} или {{ kint(variable) }}

person fadehelix    schedule 21.10.2016

В вашем случае вы должны использовать views-view-fields - countries - block_1.html.twig вместо views-view-unformatted - countries - block_1.html. файл twig.

Шаблон полей просмотра будет повторяться по всем строкам результата. Ваши поля просмотра - страны - block_1.html.twig должны содержать код ниже -

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

Вы можете проверить массив полей, используя функцию kint, например - {{kint (fields)}}

Проверьте путь к изображению и переменную пути привязки из вывода функции kint.

Если вы хотите сделать это в просмотрах-просмотрах-неформатированных - странах - block_1.html. twig, то вы можете получить доступ к значениям поля, как показано ниже -

{% 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 %}
person Renuka Kulkarni    schedule 27.11.2017

Решение простое - использовать шаблон полей просмотра.

Я создал новый шаблон в папке themes / templates:

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

И теперь вы можете получить доступ к своим значениям полей следующим образом:

{{ fields.field_NAME.content }}
person Viswa    schedule 25.02.2019

Если вы хотите получить доступ к отдельным полям в шаблоне Views Twig вместе с информацией о строке, переопределите шаблон полей представлений в своей настраиваемой теме:

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

Чтобы получить индекс строки в том же файле, используйте:

{{ row.index }}

person Heena Suman    schedule 21.06.2020