Иногда возникают ситуации, когда совершенно не хватает стандартных форматов отображения нод. По умолчанию нам доступны лишь несколько форматов:
- Полное содержимое (Full content)
- Тизер (Teaser)
- РСС (RSS)
В данной статье мы с вами разберем, как создать свой формат и как всегда разберем его на конкретном примере.
Первое, что нам необходимо - это определиться с задачей. В качестве примера создадим страницу, которая будет выводить ноды какого-либо типа материала (в моем случае это - article) в новом созданном формате.
Итак, приступим. Вы, наверное уже догадались, что мы будем писать модуль, как создать основу для модуля читаем здесь. Мой модуль будет называться custom_format_node
Файл custom_format_node.info
name = Custom Format Node description = Данный модуль создает кастомный формат отображения ноды package = Other core = 7.x version = 7.x-1.0
<?php /** * Implements hook_entity_info_alter(). */ function custom_format_node_entity_info_alter(&$entity_info) { 'label' => t('Custom format node'), 'custom settings' => TRUE, ); }
После активации модуля вы увидите новый формат отображения
Данный формат ничем не отличается от присутствующих по умолчанию форматов вывода, вы так же можете отображать или скрывать поля для данного формата, и он так же будет доступен и в views.
Теперь создадим страницу, которая будет отображать ноды в данном формате. Я сделаю это программно, вы же можете использовать для этих целей views.
<?php /** * Implements hook_menu() */ function custom_format_node_menu(){ 'title' => 'Свой формат отображения ноды', 'page callback' => 'custom_format_node_page', 'access callback' => TRUE ); return $items; } /** * Формируем контент страницы * Тип материала Article */ function custom_format_node_page() { $output = node_view_multiple($nodes, $view_mode = 'custom_format_node'); return $output; }
Теперь не забываем чистить кеш и смотрим, что у нас получилось. Переходим по адресу
http://sitename/custom-format-node
и видим
А теперь, что бы продемонстрировать все преимущества данного формата, давайте для данного формата вывода создадим свой tpl файл, по шаблону
node--[type]--[format].tpl.php
где:
- [type] – тип материала
- [format] – наш формат вывода
для этого пишем:
<?php /** * Implements hook_preprocess_node(). */ function custom_format_node_preprocess_node(&$vars) { if($vars['view_mode'] == 'custom_format_node') { $vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__custom_format_node'; } }
После чего в папке с вашей темой создаем файл
node--article--custom_format_node.tpl.php
Хочу заметить, что в моем случае данный файл будет отличаться от базового node.tpl.php, только дополнительным враппером с классом CSS.
Чистим кеш и смотрим результат.
Кстати, тоже самое можно сделать с использованием модуля entity_view_mode.
Полный код модуля:
<?php /** * Implements hook_entity_info_alter(). */ function custom_format_node_entity_info_alter(&$entity_info) { 'label' => t('Custom format node'), 'custom settings' => TRUE, ); } /** * Implements hook_menu() */ function custom_format_node_menu(){ 'title' => 'Свой формат отображения ноды', 'page callback' => 'custom_format_node_page', 'access callback' => TRUE ); return $items; } /** * Формируем контент страницы * Тип материала Article */ function custom_format_node_page() { $output = node_view_multiple($nodes, $view_mode = 'custom_format_node'); return $output; } /** * Implements hook_preprocess_node(). */ function custom_format_node_preprocess_node(&$vars) { if($vars['view_mode'] == 'custom_format_node') { $vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__custom_format_node'; } }
На этом, думаю можно закончить.
Комментарии (1)
Спасибо. Как раз такая надобность возникла на одном из сайтов.