Здравствуйте коллеги, подскажите как решить простую задачу в шаблоне ноды на Drupal 8: необходимо множественное поле файла разложить по элементам и вывести в нужном мне виде со своей обёрткой. Прошу показать пример того как это делать.
В Drupal 7 в шаблоне ноды я делал это так:
$items = field_get_items('node', $node, "field_page_file");
if (!empty($items)) { ?>
<h4>Прикреплённые файлы</h4>
<div class="container-fluid <?= "field-page-file" ?>">
<div class="row">
<div class="table-responsive">
<table class="table table-striped">
<?php foreach ($items as $key => $value) {
$file = file_load($value['fid']);
//print_r($file); die;
$filepath = file_create_url($file->uri);
$filename = $file->filename;
if (!empty($node->{"field_page_file"}['und'][$key]['description']))
$filename = $node->{"field_page_file"}['und'][$key]['description'];
$icon = theme('file_icon', array('file' => $file));
$filesize = format_size($file->filesize); ?>
<tr>
<td>
<?= $icon ?>
</td>
<td>
<div class="padding-top-10">
<a href="<?= $filepath ?>"><?= $filename ?></a>
</div>
</td>
<td>
<div class="padding-top-10">
<h5>Размер: <?= $filesize ?></h5>
</div>
</td>
</tr>
<?php } ?>
</table>
</div>
</div>
</div>
field_page_file - имя поля
Т.е. я выводил файлы построчно в сетке bootstrap 3, расставляя название файла, размер файла, иконку и ссылку на скачивание в нужном мне месте.
Ответы
Нашёл ответ на свой вопрос здесь: https://drupal.stackexchange.com/questions/263569/how-to-print-the-file-description-to-my-twig-template
Включаем Debug-режим и разбираем массив с файлом в ноде таким вот образом:
{% if node.field_myfile is not empty %}
<div class="container">
<div class="row">
{% for file in node.field_myfile %}
<div class="col-md-12">{{ file.description }}</div>
{% endfor %}
</div>
</div>
{% endif %}
field_myfile - имя вашего поля
Т.е. мы делаем проверку, если поле не пустое - выводим метку. Другие поля можно взять из дебага:
Вот мой пример полностью:
{% if node.field_files is not empty %}
<div class="row std-mn-bottom">
<div class="col-lg-12">
<h3 class="text-center">Документы для скачивания</h3>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="table-responsive">
<table class="table customTable">
<tbody>
{% for file in node.field_files %}
<tr>
<td>
<a href="{{ file_url(file.entity.uri.value) }}" class="downloadLink"><i class="fas fa-file downloadLink__ico"></i>
<span class="downloadLink__text">
{% if file.description is not empty %}
{{ file.description }}
{% else %}
{{ file.entity.label }}
{% endif %}
</span>
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
{% endif %}
Для начала стоит включить дебаг для twig https://www.drupal.org/docs/8/theming/twig/debugging-twig-templates
После этого станет видно, какой темплейт относится к какому полю.
После этого переопределяете темплейт поля с файлом - копируете из базовой темы в свою и называете своим именем. Скорее всего нужно будет скопировать файл в свою тему web/core/themes/classy/templates/field/field.html.twig и переименовать в соответствии со своим полем. Там же достаточно подробно написано про переменные.
Обычно этого достаточно для темизации, можете выводить в данный файл информацию в необходимом виде.
Спасибо за наводку. Это было бы хорошим решением - вынести темизацию поля в отдельный шаблон, который можно подключить к различным типам материала. Я включил режим отладки, но не вижу в шаблонах этого файла.
Там есть нода. Может покажете как в именно ноде вывести пример, который описан выше (в формате D8)?
Разобрался,мой итоговый код со всеми проверками выглядит так: