Перейти к основному содержанию

Drupal 7: Добавление новых типов отображения ноды

Опубликовано 21.05.2013 Теги: drupal 7

Если не хватает стандартных отображений ноды, можно воспользоваться готовыми модулями Display Suite и Entity view mode. Но эти модули довольно больше и сложные, их использование не всегда рационально. Для добавления своего типа отображения существует хук hook_entity_info_alter

Добавим новый тип отображения gallery_teaser:

/**
 * Implements hook_entity_info_alter().
 */
function MODULENAME_entity_info_alter(&$entity_info) {
  $entity_info['node']['view modes']['gallery_teaser'] = array(
    'label' => t('Gallery teaser'),
    'custom settings' => TRUE,
  );
}

После активации модуля в настройках отображения появится Gallery teaser.

Так же данный тип отображения можно использовать в Views.

Теперь нужно сделать, чтобы данный тип отображения поддерживал стандартные шаблоны типа node--[type]--[viewmode].tpl.php

/**
 * Implements hook_preprocess_node().
 */
function MODULENAME_preprocess_node(&$vars) {
  /**
   * Example template name - node--article--gallery-teaser
   * Use underscores in template suggestions, dashes in the filename.
   */
  if ($vars['view_mode'] == 'gallery_teaser') {
    $vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__gallery_teaser';
  }
}

Теперь в шаблоне node--article--gallery-teaser.tpl.php можно редактировать внешний вид ноды с типом отображения Gallery mode.

Важно - нижнее подчеркивание в названии типа отображения и материала заменяется на тире.

Github

Комментарии

Аватар пользователя qvazari
qvazari
Опубликовано 4.08.2013

Наверное удобно для тех кто любит в лишний раз в tpl.php чего-нибудь дописать, но по мне так проще через DS сделать

  • ответить
Аватар пользователя Alexander Schedrov
Alexander Schedrov
Опубликовано 4.08.2013

Почти не одна темизация не обходится без дописываний в tpl.php, а использовать очень тяжеловесный DS только ради пары новых типов отображений не очень правильно. Но у каждого свои вкусы...

  • ответить
Аватар пользователя Andrey
Andrey
Опубликовано 8.10.2014

Хоть и статья старая но увы данный способ работает не совсем корректно или я делаю что не так.
отбросим function MODULENAME_preprocess_node(&$vars) и пытаемся изменить вывод для отображения gallery_teaser средствами drupal. (например скроем вывод поля body, остальное пусть показывается). Дальше сохраняем и смотрим на тип вывода gallery_teaser, так понимаю адрес должен быть www.сайт.ru/node/123/gallery_teaser или я тут ошибаюсь? В общем видим что отображение берется из того что настроено по умолчанию.

  • ответить
Аватар пользователя Alexander Schedrov
Alexander Schedrov
Опубликовано 13.10.2014

Добрый день!

Не совсем верно, данный хук только добавляется тип отображения и ничего более. Для того что бы создать новую страницу для ноды, необходимо воспользоваться хуком hook_menu и описать путь node/%node/gallery_teaser.

В вашем случае страница www.сайт.ru/node/123/gallery_teaser это тоже самое что www.сайт.ru/node/123, просто Drupal вообще не учитывает 3-й аргумент.

  • ответить
Аватар пользователя Andrey
Andrey
Опубликовано 14.10.2014

hook_menu немного избыточен, нашлось более простое решение hook_entity_view_mode_alter или просто готовый модуль view mode page, правда им не пользовался еще.

  • ответить
Аватар пользователя Владимир
Владимир
Опубликовано 21.03.2015

Подскажите, если у меня есть свои добавленные типы отображения ноды и сделаны шаблоны для них по вашему рецепту, то как мне в таком случае осуществить переключение между ними в ноде без перезагрузки страницы? Это возможно? Например, я нажимаю ссылку "Упростить ноду" и у меня подгружается определённый шаблон, вместо текущего.

  • ответить
Содержание этого поля является приватным и не предназначено к показу. Если у вас есть Gravatar аккаунт, связанный с введенным адресом email, то он будет использован для отображения вашего аватара.

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • Для публикации фрагментов кода, используйте тег <code>...</code>.

Категории блога

  • Drupal 7 (35)
  • Drupal 8 (1)
  • PHP (6)
  • jQuery (3)
  • Linux (6)
  • Интернет (1)
  • JavaScript (1)
  • Дизайн (1)
  • События (19)
  • Разное (1)

Архив блога

  • декабрь 2017 (1)
  • август 2017 (1)
  • июль 2017 (1)
  • июнь 2017 (1)
  • май 2017 (1)
  • апрель 2017 (1)
  • март 2017 (2)
  • сентябрь 2016 (2)
  • июнь 2016 (1)
  • январь 2016 (1)
  • сентябрь 2015 (2)
  • май 2015 (1)
  • февраль 2015 (3)
  • ноябрь 2014 (1)
  • октябрь 2014 (1)
  • сентябрь 2014 (1)
  • июль 2014 (1)
  • июнь 2014 (1)
  • май 2014 (1)
  • январь 2014 (1)
  • декабрь 2013 (3)
  • ноябрь 2013 (2)
  • сентябрь 2013 (2)
  • август 2013 (2)
  • июнь 2013 (3)
  • май 2013 (4)
  • апрель 2013 (2)
  • март 2013 (3)
  • февраль 2013 (1)
  • декабрь 2012 (3)

Связь с автором

Alex Schedrov Twitter Icon Alex Schedrov Facebook Icon Alex Schedrov Drupal Icon Alex Schedrov Github Alex Schedrov RSS Icon
© Schedrov Alexander, 2011—2021