Вы здесь

Drupal 8: как правильно разобрать поле ноды в шаблоне? (нужен пример)

0

Здравствуйте коллеги, подскажите как решить простую задачу в шаблоне ноды на 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, расставляя название файла, размер файла, иконку и ссылку на скачивание в нужном мне месте.

Версия Drupal: 
8.x
Категория: 
Field API
Вопрос задан 30.05.2019 - 12:56

Ответы

0

Нашёл ответ на свой вопрос здесь: 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 %} 
Ответ дан 31.05.2019 - 14:13
0

Для начала стоит включить дебаг для twig https://www.drupal.org/docs/8/theming/twig/debugging-twig-templates
После этого станет видно, какой темплейт относится к какому полю.

После этого переопределяете темплейт поля с файлом - копируете из базовой темы в свою и называете своим именем. Скорее всего нужно будет скопировать файл в свою тему web/core/themes/classy/templates/field/field.html.twig и переименовать в соответствии со своим полем. Там же достаточно подробно написано про переменные.

Обычно этого достаточно для темизации, можете выводить в данный файл информацию в необходимом виде.

Ответ дан 30.05.2019 - 13:49
Аватар пользователя shu
shu
173

Спасибо за наводку. Это было бы хорошим решением - вынести темизацию поля в отдельный шаблон, который можно подключить к различным типам материала. Я включил режим отладки, но не вижу в шаблонах этого файла.

Там есть нода. Может покажете как в именно ноде вывести пример, который описан выше (в формате D8)?

Комментарий оставлен 31.05.2019 - 13:50

Разобрался,мой итоговый код со всеми проверками выглядит так:

{% 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 %} 
Комментарий оставлен 31.05.2019 - 14:56