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.
Важно - нижнее подчеркивание в названии типа отображения и материала заменяется на тире.
Комментарии
Наверное удобно для тех кто любит в лишний раз в tpl.php чего-нибудь дописать, но по мне так проще через DS сделать
Почти не одна темизация не обходится без дописываний в tpl.php, а использовать очень тяжеловесный DS только ради пары новых типов отображений не очень правильно. Но у каждого свои вкусы...
Хоть и статья старая но увы данный способ работает не совсем корректно или я делаю что не так.
отбросим function MODULENAME_preprocess_node(&$vars) и пытаемся изменить вывод для отображения gallery_teaser средствами drupal. (например скроем вывод поля body, остальное пусть показывается). Дальше сохраняем и смотрим на тип вывода gallery_teaser, так понимаю адрес должен быть www.сайт.ru/node/123/gallery_teaser или я тут ошибаюсь? В общем видим что отображение берется из того что настроено по умолчанию.
Добрый день!
Не совсем верно, данный хук только добавляется тип отображения и ничего более. Для того что бы создать новую страницу для ноды, необходимо воспользоваться хуком hook_menu и описать путь node/%node/gallery_teaser.
В вашем случае страница www.сайт.ru/node/123/gallery_teaser это тоже самое что www.сайт.ru/node/123, просто Drupal вообще не учитывает 3-й аргумент.
hook_menu немного избыточен, нашлось более простое решение hook_entity_view_mode_alter или просто готовый модуль view mode page, правда им не пользовался еще.
Подскажите, если у меня есть свои добавленные типы отображения ноды и сделаны шаблоны для них по вашему рецепту, то как мне в таком случае осуществить переключение между ними в ноде без перезагрузки страницы? Это возможно? Например, я нажимаю ссылку "Упростить ноду" и у меня подгружается определённый шаблон, вместо текущего.