Темизация Drupal. Часть 4. Темизация Views

Submitted by Ромка on Вс, 03/01/2010 - 23:09

Ромка аватар

Views — один из самых востребованных модулей для Drupal — позволяет создавать списки документов (представления, view), отфильтрованные по любому сложному алгоритму. На выходе модуль возвращает массив данных, который выводится в шаблоне, соответствующем выбранному администратором типу отображения (display) данных. Каждое представление может быть отображено в виде таблицы, маркированного списка, решетки (grid) и т. п. Чтобы переопределить используемый для отображения представления шаблон, нужно в свойствах представления в блоке Basic settings найти параметр Theme information и посмотреть в нем имена шаблонов, которые могут быть использованы модулем для отображения текущего представления. Затем нужно в подпапке theme модуля Views найти шаблон, соответствующий выбранному типу отображения (например, views-view-table.tpl.php для табличного варианта отображения или views-view-list.tpl.php для списка), скопировать его в папку с текущей темой оформления и присвоить ему одно из имен, перечисленных в Theme information. Теперь созданный шаблон можно настроить для своих нужд.

Например, вот так выглядит шаблон views-view-table.tpl.php:

  1. <table class="<?php print $class; ?>">
  2. <?php if (!empty($title)) : ?>
  3. <caption><?php print $title; ?></caption>
  4. <?php endif; ?>
  5. <thead>
  6. <tr>
  7. <?php foreach ($header as $field => $label): ?>
  8. <th class="views-field views-field-<?php print $fields[$field]; ?>">
  9. <?php print $label; ?>
  10. </th>
  11. <?php endforeach; ?>
  12. </tr>
  13. </thead>
  14. <tbody>
  15. <?php foreach ($rows as $count => $row): ?>
  16. <tr class="<?php print implode(' ', $row_classes[$count]); ?>">
  17. <?php foreach ($row as $field => $content): ?>
  18. <td class="views-field views-field-<?php print $fields[$field]; ?>">
  19. <?php print $content; ?>
  20. </td>
  21. <?php endforeach; ?>
  22. </tr>
  23. <?php endforeach; ?>
  24. </tbody>
  25. </table>

Первые 14 строк этого шаблона выводят заголовок страницы и таблицы с данными, а самая интересная и важная часть шаблона сосредоточена в строках с 15 по 23 — здесь в цикле выводятся данные, выбранные запросом, заданным в настройках представления. Данные возвращаются в виде рекордсета, то есть структуры данных, которую можно представить как таблицу, строками которой являются выбранные объекты (например ноды), а ячейками — значения полей объекта (например поля "заголовок" или "автор" ноды).

Вот этот же кусок шаблона с комментариями:

  1. // Цикл по объекту $rows, содержащему все возвращенные данные
  2. // $row — одна строка
  3. <?php foreach ($rows as $count => $row): ?>
  4. <tr class="<?php print implode(' ', $row_classes[$count]); ?>">
  5. // Цикл по всем ячейкам внутри строки
  6. // $field — имя поля, например nid, title и т.д.
  7. // $content — значение поля
  8. <?php foreach ($row as $field => $content): ?>
  9. <td class="views-field views-field-<?php print $fields[$field]; ?>">
  10. <?php print $content; ?>
  11. </td>
  12. <?php endforeach; ?>
  13. </tr>
  14. <?php endforeach; ?>

Это достаточно универсальный и не очень удобный шаблон, так как он оборачивает одним и тем же html-кодом каждый элемент данных, в частном случае, когда вы заранее знаете имена всех полей, которые будете выводить, этот шаблон можно сильно упростить:

  1. <?php
  2. foreach ($rows as $count => $row) {
  3. print $row['field_name_1'] . "; " . $row['field_name_2'];
  4. }

Здесь нужно учитывать, что в качестве ключей массива $row нужно использовать имена соответствующих колонок с данными в БД, в случае с дефолтными полями это будут ключи типа nid, title, created, а в случае с данными, выбранными из CCK-полей нужно не забывать добавлять к именам приставку field_.

Список всех доступных в шаблоне полей можно вывести на экран вот так:

  1. foreach ($rows as $count => $row) {
  2. $fields = array();
  3. foreach ($row as $field => $content) {
  4. $fields[] = $field;
  5. }
  6. }
  7. print implode(", ", $fields);

Ссылки на другие части этой статьи:

  • Часть 1. Введение
  • Часть 2. Анатомия темы оформления
  • Часть 3. Forms API и темизация
  • Часть 4. Темизация Views

Содержание всех статей: http://romka.eu/blog/my-drupal-articles

15 Comments

в последнем блоке кода нужно

в последнем блоке кода нужно что-то исправить, иначе напечатается только последний $row. Надо делать так:

  1. <?php
  2. foreach ($rows as $count => $row) {
  3. $fields = array();
  4. foreach ($row as $field => $content) {
  5. $fields[] = $field;
  6. }
  7. print implode(", ", $fields);
  8. }
  9. ?>

а в остальном - понравилось содержание подборки статей.

Где бы еще найти такую же

Где бы еще найти такую же доходчивую информацию по темизации exposed фильтров во views?

Спасибо,

Указанный выше код подходит только под табличный стиль.
Где бы посмотреть пример для неформатированной или списочной вьюхи?

Стандартные файлы views печатают там всю строку сразу -<?php print $row; ?>,
а как разложить ее по полям?

Спасибо большое!

Спасибо за столь удобно изложенный материал! Устроился на работу - ваш сайт очень помог.

Группирование по двум полям.

Роман, благодарю за материал! Очень хорошо описано. Я вот создаю сайт и понадобилось сгруппировать результат запроса по двум полям. Задача -- расписание пар в университете. Нужно сгруппировать результат запроса сначала по дате, а потом -- по времени начала пары. Подскажите, пожалуйста, есть ли такой модуль, позволяющий группировать РЕЗУЛЬТАТЫ запроса не по одному, а по двум полям? Или нужно всё-таки писать свою темизацию? Или возможно вложить view во view и выкрутиться таким образом? Надеюсь на Вашу подсказку, а то я что-то запутался...

Спасибо!

Нигде этого не нашёл, кроме как у Вас, Роман! Огромное Вам спасибо! Удачи и миллион посетителей Вашему сайту!

А как скажем мне поvtнять

А как скажем мне поvtнять шаблон views-view-table.tpl.php для конкретного вида ??? Чтоб скажем для всех был один шаблон views-view-table.tpl.php, а для вида /user-article был другой шаблон views-view-table.tpl.php

Как сделать новости не на главной странице?

Здравствуйте, Роман!
У меня в меню основных, есть ссылка "Новости", ведущая на одну из страниц сайта (не на главную!).
Я бы хотел настроить ярлычок RSS, чтобы он указывал не http://доменное-имя-сайта/?q=rss.xml, а скажем:
http://доменное-имя-сайта/?q=node/44/rss.xml
Чтобы у посетителей, подписавшихся на информацию с сайта компании, появлялись заметки со страницы наших новостей? Не хочется главную страницу превращать в "новостную ленту".
Заранее благодарен.