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

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

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

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

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

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

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

  1. Рассказать об этом Друпалу

    <?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,
      );
    }
    
  2. Объявить тему, которую мы указали в качестве обработчика дисплея

    <?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;
    }
    
  3. Кладем скопированный шаблон из /modules/node/node.tpl.php в /путь-до-вашего-модуля-example/templates/node--custom-display.tpl.php. Меняем скопированный шаблон. Готово.

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

  1. Рассказываем Друпалу о новом дисплее

    <?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,
      );
    }
    
  2. Указать обработчик дисплея

    <?php
    /**
     * Implements hook_view().
     */
    function example_view($node, $view_mode, $langcode = NULL) {
      if ('custom_display' == $view_mode) {
        $node->content['#theme'] = 'example_custom_display_view';
      }
    }
    
  3. Объявить тему, которую мы указали в качестве обработчика дисплея

    <?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 - многочисленные примеры кода.
    Вообще этот модуль можно пихать в каждый пост, потому как он содержит бездонную базу примеров.

Другие посты