Помощь начинающим веб
разработчикам

Создаем кастомный формат отображения ноды

28.07.2015

Иногда возникают ситуации, когда совершенно не хватает стандартных форматов отображения нод. По умолчанию нам доступны лишь несколько форматов:

  • Полное содержимое (Full content)
  • Тизер (Teaser)
  • РСС (RSS)
Формат отображения нод по умолчанию

В данной статье мы с вами разберем, как создать свой формат и как всегда разберем его на конкретном примере.

Первое, что нам необходимо - это определиться с задачей. В качестве примера создадим страницу, которая будет выводить ноды какого-либо типа материала (в моем случае это - article) в новом созданном формате.

Итак, приступим. Вы, наверное уже догадались, что мы будем писать модуль, как создать основу для модуля читаем здесь. Мой модуль будет называться custom_format_node

Файл custom_format_node.info
  1. name = Custom Format Node
  2. description = Данный модуль создает кастомный формат отображения ноды
  3. package = Other
  4. core = 7.x
  5. version = 7.x-1.0
Файл custom_format_node.module
  1. <?php
  2.  
  3. /**
  4. * Implements hook_entity_info_alter().
  5. */
  6. function custom_format_node_entity_info_alter(&$entity_info) {
  7. $entity_info['node']['view modes']['custom_format_node'] = array(
  8. 'label' => t('Custom format node'),
  9. 'custom settings' => TRUE,
  10. );
  11. }

После активации модуля вы увидите новый формат отображения

Создали свой формат отображения ноды

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

Данный формат ничем не отличается от присутствующих по умолчанию форматов вывода

Теперь создадим страницу, которая будет отображать ноды в данном формате. Я сделаю это программно, вы же можете использовать для этих целей views.

  1. <?php
  2. /**
  3.  * Implements hook_menu()
  4.  */
  5. function custom_format_node_menu(){
  6. $items = array();
  7.  
  8. $items['custom-format-node'] = array(
  9. 'title' => 'Свой формат отображения ноды',
  10. 'page callback' => 'custom_format_node_page',
  11. 'access callback' => TRUE
  12. );
  13.  
  14. return $items;
  15. }
  16.  
  17. /**
  18.  * Формируем контент страницы
  19.  * Тип материала Article
  20.  */
  21.  
  22. function custom_format_node_page() {
  23.  
  24. $nodes = node_load_multiple(array(), array('type' => 'article'));
  25. $output = node_view_multiple($nodes, $view_mode = 'custom_format_node');
  26.  
  27. return $output;
  28. }

Теперь не забываем чистить кеш и смотрим, что у нас получилось. Переходим по адресу

  1. http://sitename/custom-format-node

и видим

Свой формат отображения ноды

А теперь, что бы продемонстрировать все преимущества данного формата, давайте для данного формата вывода создадим свой tpl файл, по шаблону

  1. node--[type]--[format].tpl.php

где:

  • [type] – тип материала
  • [format] – наш формат вывода

для этого пишем:

  1. <?php
  2. /**
  3.  * Implements hook_preprocess_node().
  4.  */
  5. function custom_format_node_preprocess_node(&$vars) {
  6. if($vars['view_mode'] == 'custom_format_node') {
  7. $vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__custom_format_node';
  8. }
  9. }

После чего в папке с вашей темой создаем файл

  1. node--article--custom_format_node.tpl.php

Хочу заметить, что в моем случае данный файл будет отличаться от базового node.tpl.php, только дополнительным враппером с классом CSS.

Чистим кеш и смотрим результат.

Свой формат отображения ноды

Кстати, тоже самое можно сделать с использованием модуля entity_view_mode.

Полный код модуля:

  1. <?php
  2.  
  3. /**
  4.  * Implements hook_entity_info_alter().
  5.  */
  6. function custom_format_node_entity_info_alter(&$entity_info) {
  7. $entity_info['node']['view modes']['custom_format_node'] = array(
  8. 'label' => t('Custom format node'),
  9. 'custom settings' => TRUE,
  10. );
  11. }
  12.  
  13. /**
  14.  * Implements hook_menu()
  15.  */
  16. function custom_format_node_menu(){
  17. $items = array();
  18.  
  19. $items['custom-format-node'] = array(
  20. 'title' => 'Свой формат отображения ноды',
  21. 'page callback' => 'custom_format_node_page',
  22. 'access callback' => TRUE
  23. );
  24.  
  25. return $items;
  26. }
  27.  
  28. /**
  29.  * Формируем контент страницы
  30.  * Тип материала Article
  31.  */
  32.  
  33. function custom_format_node_page() {
  34.  
  35. $nodes = node_load_multiple(array(), array('type' => 'article'));
  36. $output = node_view_multiple($nodes, $view_mode = 'custom_format_node');
  37.  
  38. return $output;
  39. }
  40.  
  41. /**
  42.  * Implements hook_preprocess_node().
  43.  */
  44. function custom_format_node_preprocess_node(&$vars) {
  45. if($vars['view_mode'] == 'custom_format_node') {
  46. $vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__custom_format_node';
  47. }
  48. }

На этом, думаю можно закончить.

Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (1)

Profile picture for user Mist
A.K.
30.01.2016

Спасибо. Как раз такая надобность возникла на одном из сайтов.

Добавить комментарий

- Оповестить о новом комментарии.
- Все комментарии
- Только мои комментарии