Как создать свой дисплей для ноды

mbaev 15.11.2016, 09:15

Иногда, нам не хватает стандартных дисплеев и необходимо создать свои. Дополнительный дисплей позволяет показывать еще один набор полей с настройками, отличными от других дисплеев.

Например, в дисплее Full мы можем отображать все поля, в дисплее Teaser - обрезанное поле Body, а в кастомном только поля, созданные нами.

По умолчанию Друпал имеет три дисплея:

  • Full content (full)
  • Teaser (teaser)
  • RSS (rss)

Модуль Token предоставляет дисплей Tokens (token).

Способ первый создание дисплея под контролем модуля node

Для создания нового дисплея нужно выполнить несколько шагов:

  1. Рассказать об этом Друпалу
    1. /**
    2.  * Implements hook_entity_info_alter().
    3.  */
    4. function example_entity_info_alter(&$entity_info) {
    5.   $entity_info['node']['view modes']['custom_display'] = array(
    6.     'label' => t('My custom display'),
    7.     'custom settings' => FALSE,
    8.   );
    9. }
  2. Объявить тему, которую мы указали в качестве обработчика дисплея
    1. /**
    2.  * Implements hook_theme().
    3.  */
    4. function example_theme($existing, $type, $theme, $path) {
    5.   $registry['node__custom_display'] = array(
    6.     'render element' => 'content',
    7.     'base hook'      => 'node',
    8.     'template'       => 'node--custom-display',
    9.     'path'           => drupal_get_path('module', 'example') . '/templates',
    10.   );
    11.   return $registry;
    12. }
  3. Кладем скопированный шаблон из /modules/node/node.tpl.php в /путь-до-вашего-модуля-example/templates/node--custom-display.tpl.php. Меняем скопированный шаблон. Готово.

Способ второй полный контроль

  1. Рассказываем Друпалу о новом дисплее
    1. /**
    2.  * Implements hook_entity_info_alter().
    3.  */
    4. function example_entity_info_alter(&$entity_info) {
    5.   $entity_info['node']['view modes']['custom_display'] = array(
    6.     'label' => t('My custom display'),
    7.     'custom settings' => FALSE,
    8.   );
    9. }
  2. Указать обработчик дисплея
    1. /**
    2.  * Implements hook_view().
    3.  */
    4. function example_view($node, $view_mode, $langcode = NULL) {
    5.   if ('custom_display' == $view_mode) {
    6.     $node->content['#theme'] = 'example_custom_display_view';
    7.   }
    8. }
  3. Объявить тему, которую мы указали в качестве обработчика дисплея
    1. /**
    2.  * Implements hook_theme().
    3.  */
    4. function example_theme($existing, $type, $theme, $path) {
    5.   $registry['example_custom_display_view'] = array(
    6.     'render element' => 'content',
    7.     'base hook'      => 'node',
    8.     'template'       => 'example-custom-display-view',
    9.     'path'           => drupal_get_path('module', 'example') . '/templates',
    10.   );
    11.   return $registry;
    12. }

Существует еще пара-тройка способов добиться того же результата, но в большинстве случаев двух, вышеуказанных будет достаточно.

Полезные ссылки

  • Entity view modes - динамическое создание дисплеев.

  • Display Suite - создание сеток (раскладок, лайоутов) без кодинга и раскидывание филдов по сетке. Здесь все про этот модуль Display Suite for Drupal 7 . А вот еще один полезный пост о нём Знакомство с Display Suite .

  • Examples for Developers - многочисленные примеры кода.
    Вообще этот модуль можно пихать в каждый пост, потому как он содержит бездонную базу примеров.