Иногда, нам не хватает стандартных дисплеев и необходимо создать свои. Дополнительный дисплей позволяет показывать еще один набор полей с настройками, отличными от других дисплеев.
Например, в дисплее Full мы можем отображать все поля, в дисплее Teaser - обрезанное поле Body, а в кастомном только поля, созданные нами.
По умолчанию Друпал имеет три дисплея:
- Full content (full)
- Teaser (teaser)
- RSS (rss)
Модуль Token предоставляет дисплей Tokens (token).
Способ первый создание дисплея под контролем модуля node
Для создания нового дисплея нужно выполнить несколько шагов:
Рассказать об этом Друпалу
<?php /** * Implements hook_entity_info_alter(). */ function example_entity_info_alter(&$entity_info) { $entity_info['node']['view modes']['custom_display'] = array( 'label' => t('My custom display'), 'custom settings' => FALSE, ); }
Объявить тему, которую мы указали в качестве обработчика дисплея
<?php /** * Implements hook_theme(). */ function example_theme($existing, $type, $theme, $path) { $registry['node__custom_display'] = array( 'render element' => 'content', 'base hook' => 'node', 'template' => 'node--custom-display', 'path' => drupal_get_path('module', 'example') . '/templates', ); return $registry; }
Кладем скопированный шаблон из
/modules/node/node.tpl.php
в/путь-до-вашего-модуля-example/templates/node--custom-display.tpl.php
. Меняем скопированный шаблон. Готово.
Способ второй полный контроль
Рассказываем Друпалу о новом дисплее
<?php /** * Implements hook_entity_info_alter(). */ function example_entity_info_alter(&$entity_info) { $entity_info['node']['view modes']['custom_display'] = array( 'label' => t('My custom display'), 'custom settings' => FALSE, ); }
Указать обработчик дисплея
<?php /** * Implements hook_view(). */ function example_view($node, $view_mode, $langcode = NULL) { if ('custom_display' == $view_mode) { $node->content['#theme'] = 'example_custom_display_view'; } }
Объявить тему, которую мы указали в качестве обработчика дисплея
<?php /** * Implements hook_theme(). */ function example_theme($existing, $type, $theme, $path) { $registry['example_custom_display_view'] = array( 'render element' => 'content', 'base hook' => 'node', 'template' => 'example-custom-display-view', 'path' => drupal_get_path('module', 'example') . '/templates', ); return $registry; }
Существует еще пара-тройка способов добиться того же результата, но в большинстве случаев двух, вышеуказанных будет достаточно.
Полезные ссылки
- Entity view modes - динамическое создание дисплеев.
- Display Suite - создание сеток (раскладок, лайоутов) без кодинга и раскидывание филдов по сетке. Здесь все про этот модуль Display Suite for Drupal 7 . А вот еще один полезный пост о нём Знакомство с Display Suite .
- Examples for Developers - многочисленные примеры кода.
Вообще этот модуль можно пихать в каждый пост, потому как он содержит бездонную базу примеров.