SlideShare a Scribd company logo
Render API.
The Render API
           in Drupal 7
Ефим Web-Evt Евтушенко
E-mail: WebEvt@gmail.com
Skype: Web-Evt
Обзор доклада
 Что такое Render API
 Зачем это нужно
 Как это работает? Концепция “render arrays”
 Ключевые свойства render array
 Как происходит рендеринг страницы
 Render API в темировании
Что такое Render API
 Система, позволяющая преобразовать
структурированные массивы данных в строку
 Произошла от системы рендеринга в Drupal 6
Forms API
 Формирует весь отдаваемый контент в Drupal
7
 Основная функция – drupal_render()
/**
 * Drupal 6 page callback
 * @return string
 */
function mymodule_drupal6_page() {
  $items = mymodule_get_items();
  $output = theme('mymodule_items', $items);
  $output .= theme('pager');
  return $output;
}

/**
 * Drupal 7 page callback
 * @return array
 */
function mymodule_drupal7_page() {
  $items = mymodule_get_items();
  $output[] = array(
     '#theme' => 'mymodule_items', '#items' => $items
  );
  $output[] = array(
     '#theme' => 'pager'
  );
  return $output;
}
Зачем это нужно
 Модули могут получить доступ и внести
изменения в отдаваемый контент
 Единая система формирования контента
 Повторное использование callback функций
генерации контента (page-, block-)
Концепция “render arrays”
 Render array – ассоциативный массив
данных, построенный по определенному
принципу
 Рендеринг – преобразование массива render
array в HTML код
 Страница Drupal представляет собой огромный
массив – render array
 Рендеринг данных происходит только на
самой последней стадии
$page = array(
  '#show_messages' => TRUE,
  '#theme' => 'page',
  '#type' => 'page',
  'content' => array(
     'system_main' => array(
       /* ... */
     ),
     'another_block' => array(
       /* ... */
     ),
     '#sorted' => TRUE,
  ),
  'sidebar_first' => array(
     // ...
  ),
  'footer' => array(
     // ...
  ),
  // ...
);
Ключевые свойства render array
#type
#theme
#theme_wrappers
#attached
#cache
#pre_render / #post_render
#prefix / #suffix
#markup
#access
#printed
Render array - #type
 #type: элемент, описанный в
hook_element_info().
Например, link, radio, checkbox, ..
 Вы должны описать все необходимые
свойства используемого элемента (например, #title и
#options для элемента checkboxes)
Render array - #theme
 #theme: имя вызываемой функции
темирования
 Функция должна отрендерить все дочерние
элементы
Render array - #theme_wrappers
 #theme_wrappers: массив функций
темирования
 Обрабатывается после #theme
 Это позволяет дополнительно обернуть
дочерние элементы нужными нам тегами
 Используется для форм, филдсетов, ..
Пример: #theme_wrappers
<form …>
  <input type=“checkbox”../>
  <input type=“text”../>
</form>


<form …>
  <div class=“extra-container”>
   <input type=“checkbox”../>
   <input type=“text”../>
  </div>
</form>
Render array - #attached
 #attached: присоединить ресурс к элементу
 Типы ресурсов: JS, CSS, library, …
 Можно присоединить любую функцию
function mymodule_attached_example_page() {
  // .. some code
  // attach JS and CSS files
  $build['#attached'] = array(
     'js' => array(
       drupal_get_path('module', 'taxonomy') . '/taxonomy.js'
     ),
     'css' => array(
       drupal_get_path('module', 'taxonomy') . '/taxonomy.css'
     ),
  );
  // attach library
  $build['#attached']['library'][] = array(
     'system', 'drupal.ajax'
  );
  // attach external resource
  $build['#attached']['js'][] = array(
     'http://code.jquery.com/jquery-1.4.2.min.js' => array(
       'type' => 'external'
     )
  );
  // attach function
  $build['#attached']['drupal_add_http_header'] = array(
     array(
       'Content-Type', 'application/rss+xml; charset=utf-8'
     ),
  );
  return $build;
}
Render array - #attached
 #attached: присоединить ресурс к элементу
 Типы ресурсов: JS, CSS, library, …
 Можно присоединить любую функцию
 Нет необходимости загружать ресурсы через
hook_init()
 При кэшировании не теряются ресурсы
Render array - #cache
 #cache: настройки кэширования элемента
 Возможность кэширования отдельных частей
страницы
 Свойства:
   keys / cid – ключ кэша
   granularity – кэш по роли, юзеру, странице
   expire – время жизни
   bin – хранилище (таблица cache по умолчанию)
function mymodule_cache_example_page() {
  // .. some code
  $build[] = array(
     '#theme' => 'mymodule_items',
     '#items' => array('item1', 'item2’),
     '#cache' => array(
       // Drupal will create a cache id with drupal_render_cid_create()
       'keys' => array('render_example', 'cache', 'demonstration’),
       // Cache granularity settings: element has diffecrent cache versions for each page and role
       'granularity' => DRUPAL_CACHE_PER_PAGE | DRUPAL_CACHE_PER_ROLE,
       // Custom cache storage
       'bin' => 'cache_mymodule',
       // Clear cache after next general cache wipe
       'expire' => CACHE_TEMPORARY
     )
  );
  $build[] = array(
     '#theme' => 'mymodule_items2',
     '#items' => array('item1', 'item2’),
     // Set up caching properties
     '#cache' => array(
       // These properties are ignored in favor of cid property
       //'keys' => array('render_example', 'cache', 'demonstration'),
       //'granularity' => DRUPAL_CACHE_PER_PAGE | DRUPAL_CACHE_PER_ROLE,
       'cid' => 'mymodule_items',
       // Default cache storage
       'bin' => 'cache',
       // Cache can be cleared only by calling cache_clear_all($cid)
       'expire' => CACHE_PERMANENT
     )
  );
  return $build;
}
Рендер
 drupal_render() – выполняет рендеринг
массива; принимает единственный аргумент –
массив render array
 render() – алиас, дополнительно
проверяющий, что получен действительно
render array
 drupal_render_children() – рендеринг дочерних
элементов
Как работает drupal_render()
 Проверка свойства #access и #printed
 Проверка кэша
 Загрузка свойств по-умолчанию (если указан #type)
 Вызов #pre_render функций
 Вызов функции темирования #theme
 Вызов функций темирования #theme_wrappers
 Вызов #post_render функций
 Обработка #attached ресурсов (JS, CSS)
 Кэшировать данные (если указан #cache)
 Возвратить #prefix . $output . #suffix
Рендер страницы
 Все элементы страницы (page) собраны в
одном массиве render array
 hook_page_build() дает возможность добавить
элементы на страницу
 hook_page_alter() дает возможность изменить
существующие элементы на странице
// index.php
menu_execute_active_handler();

// menu.inc: menu_execute_active_handler()
drupal_deliver_page($page_callback_result, $default_delivery_callback);

// common.inc: drupal_deliver_html_page($page_callback_result)
print drupal_render_page($page_callback_result);

// common.inc: drupal_render_page($page_callback_result)
// invoke hook_page_build

block_page_build($page);

// invoke hook_page_alter

drupal_render($page);
Render API и темирование
 drupal_render() / render() – отрендерить
элемент
 hook_page_alter() – возможность изменить
любой элемент на странице
 hide() / show() – скрыть/показать элемент
Пример: render() и hide()
<!-- node.tpl.php -->
<!-- .. some code .. -->
<div class="content"<?php print $content_attributes;?>>
<?php
 // We hide the comments and links now so that we can render them later.
  hide($content['comments']);
  hide($content['links']);
  print render($content);
  ?>
</div>
<?php print render($content['links']); ?>
<?php print render($content['comments']); ?>
Render API и темирование
 render() – отрендерить элемент
 hide() / show() – скрыть/показать элемент
 hook_page_alter() – возможность изменить
любой элемент на странице
 2 вида функций темирования:
    properties-as-variable
    element-as-variable
/**
 * Implements hook_theme().
 */
function mymodule_theme() {
  return array(
     // Properties-as-variable
     'mymodule_items' => array(
       'variables' => array(
         'items' => array(),
         'title' => ''
       )
     ),
     // Element-as-variable
     'mymodule_element' => array(
       'render element' => 'element'
     ),
  );
}
/**
 * Properties-as-variable theme implementation
 */
function theme_mymodule_items($vars) {
  $items =& $vars['items'];
  $title =& $vars['title'];
  // ...
}
/**
 * Element-as-variable theme implementation
 */
function theme_mymodule_element($vars) {
  $element =& $vars['element'];
  // ...
}
Выводы
 Забудьте про theme(), используйте render
arrays
 Render API позволяет сделать код более:
   прозрачным и понятным
   быстрым
   удобным
Ссылки
 Drupal API
http://api.drupal.org
 Render Arrays in Drupal 7
http://drupal.org/node/930760
 Examples module
http://drupal.org/project/examples
Спасибо за внимание!
           Вопросы?


Ефим Web-Evt Евтушенко
E-mail: WebEvt@gmail.com
Skype: Web-Evt
Render API.

More Related Content

PPT
The render api
PPTX
Реализация шаблонов корпоративных приложений в Magento
PDF
Написание DSL в Perl
PDF
Entity. Anton Shubkin and Yaroslav Ponomarev
PPT
Yserver
PPTX
Yii 2. Что нового?
PDF
YiiConf 2012 - Alexander Makarov - Yii2, что нового
PPT
Therenderapi 120913041852-phpapp02
The render api
Реализация шаблонов корпоративных приложений в Magento
Написание DSL в Perl
Entity. Anton Shubkin and Yaroslav Ponomarev
Yserver
Yii 2. Что нового?
YiiConf 2012 - Alexander Makarov - Yii2, что нового
Therenderapi 120913041852-phpapp02

What's hot (20)

PPT
Yii development
PPTX
Индексирование в Magento
PPT
Drupal 7 deploy database updates
PDF
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
PDF
UWDC 2013, Yii2
PPT
PPT
Толстая модель. История разработки ORM
PPT
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
PPT
Form api в drupal 7
PDF
UWDC 2013, Как мы используем Yii
PDF
Разработка и deploy Drupal сайтов с помощью Features.
PDF
DevConf 2012 - Yii, его разработка и Yii2
PDF
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
PPT
Ubercart -nemnogo_primerov_iz_zhizni
PPTX
I tmozg js_school_jquery
PDF
Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"
PDF
Making Scalable JavaScript Application
PPTX
Yii2
PPTX
Meet Magento Belarus debug Pavel Novitsky (rus)
PPT
Enterprise Patterns in Magento
Yii development
Индексирование в Magento
Drupal 7 deploy database updates
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
UWDC 2013, Yii2
Толстая модель. История разработки ORM
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
Form api в drupal 7
UWDC 2013, Как мы используем Yii
Разработка и deploy Drupal сайтов с помощью Features.
DevConf 2012 - Yii, его разработка и Yii2
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
Ubercart -nemnogo_primerov_iz_zhizni
I tmozg js_school_jquery
Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"
Making Scalable JavaScript Application
Yii2
Meet Magento Belarus debug Pavel Novitsky (rus)
Enterprise Patterns in Magento
Ad

Similar to Render API. (20)

PPT
Drupal Vs Other
PPT
Drupal и возможности его применения
ODP
Семинар-практикум по Drupal
PPT
идеология Drupal 8 уже в drupal 7 вячеслав касихин
PPTX
Comfortable drupal project development. Useful modules (Andriy Yun, studio de...
PPT
Работа с материалами (nodes) в Drupal 7
PDF
Андрей Юн Удобная разработка Drupal проекта. Полезные модули
PPT
Easy authcache 2 кэширование для pro. Родионов Игорь
PPT
Easy authcache 2 кеширование для pro родионов игорь
PDF
сравнение Drupal и 1с битрикс
PDF
Yaremchuk - Корпоративные сайты
PDF
Ubercart7 views catalog ru
PPT
JavaScript-библиотека
PPTX
Drupal Camp Kyiv 2013. Удобная разработка drupal проекта. Полезные модули.
PPTX
Создаем Drupal дистрибутив: от идеи до сопровождения.
PPTX
Поисковая оптимизация сайта на Drupal 7
PDF
Yury Glushkov.What should we build a website.Drupal Camp Kyiv 2011
PPTX
Panels
PDF
Руслан Исай. Drupal - это для программистов
PPT
Drupal 7 и history.js или как ajax инфицировать сайт
Drupal Vs Other
Drupal и возможности его применения
Семинар-практикум по Drupal
идеология Drupal 8 уже в drupal 7 вячеслав касихин
Comfortable drupal project development. Useful modules (Andriy Yun, studio de...
Работа с материалами (nodes) в Drupal 7
Андрей Юн Удобная разработка Drupal проекта. Полезные модули
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2 кеширование для pro родионов игорь
сравнение Drupal и 1с битрикс
Yaremchuk - Корпоративные сайты
Ubercart7 views catalog ru
JavaScript-библиотека
Drupal Camp Kyiv 2013. Удобная разработка drupal проекта. Полезные модули.
Создаем Drupal дистрибутив: от идеи до сопровождения.
Поисковая оптимизация сайта на Drupal 7
Yury Glushkov.What should we build a website.Drupal Camp Kyiv 2011
Panels
Руслан Исай. Drupal - это для программистов
Drupal 7 и history.js или как ajax инфицировать сайт
Ad

More from DrupalForumZP2012 (19)

PPT
OpenSource и Вы
ODP
Создание собственных сущностей с использованием Entity API
PPTX
Архитектурные отличия тем для Drupal 7 от Drupal 6. Краткий обзор RDFa и рабо...
PPTX
Препроцессор Less.
PPTX
Управление отображением содержимого.
PPT
Работа с пользователями.
PPTX
Управление содержимым.
PPTX
Поиск уязвимостей в коде.
PPT
Черные дыры разработки. Как мода убивает эффективность.
PPT
Системы управления версиями (VCS). Знакомство с Git.
PPT
Drupal commerce VS Ubercart 3.x.
PPT
Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах.
PPTX
Электронные платежные системы: Тенденции в отрасли и способы реализации.
PPT
Drupal as service.
PPT
Drupal and NodeJS.
PPT
Drupal Apps.
PPT
10 странностей Друпала или почему клиенты не любят Друпал.
PPT
Модуль GetLocations. Google Maps API ver.3 и Drupal.
PPT
Rules. Обзор, примеры, API.
OpenSource и Вы
Создание собственных сущностей с использованием Entity API
Архитектурные отличия тем для Drupal 7 от Drupal 6. Краткий обзор RDFa и рабо...
Препроцессор Less.
Управление отображением содержимого.
Работа с пользователями.
Управление содержимым.
Поиск уязвимостей в коде.
Черные дыры разработки. Как мода убивает эффективность.
Системы управления версиями (VCS). Знакомство с Git.
Drupal commerce VS Ubercart 3.x.
Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах.
Электронные платежные системы: Тенденции в отрасли и способы реализации.
Drupal as service.
Drupal and NodeJS.
Drupal Apps.
10 странностей Друпала или почему клиенты не любят Друпал.
Модуль GetLocations. Google Maps API ver.3 и Drupal.
Rules. Обзор, примеры, API.

Render API.

  • 2. The Render API in Drupal 7 Ефим Web-Evt Евтушенко E-mail: WebEvt@gmail.com Skype: Web-Evt
  • 3. Обзор доклада  Что такое Render API  Зачем это нужно  Как это работает? Концепция “render arrays”  Ключевые свойства render array  Как происходит рендеринг страницы  Render API в темировании
  • 4. Что такое Render API  Система, позволяющая преобразовать структурированные массивы данных в строку  Произошла от системы рендеринга в Drupal 6 Forms API  Формирует весь отдаваемый контент в Drupal 7  Основная функция – drupal_render()
  • 5. /** * Drupal 6 page callback * @return string */ function mymodule_drupal6_page() { $items = mymodule_get_items(); $output = theme('mymodule_items', $items); $output .= theme('pager'); return $output; } /** * Drupal 7 page callback * @return array */ function mymodule_drupal7_page() { $items = mymodule_get_items(); $output[] = array( '#theme' => 'mymodule_items', '#items' => $items ); $output[] = array( '#theme' => 'pager' ); return $output; }
  • 6. Зачем это нужно  Модули могут получить доступ и внести изменения в отдаваемый контент  Единая система формирования контента  Повторное использование callback функций генерации контента (page-, block-)
  • 7. Концепция “render arrays”  Render array – ассоциативный массив данных, построенный по определенному принципу  Рендеринг – преобразование массива render array в HTML код  Страница Drupal представляет собой огромный массив – render array  Рендеринг данных происходит только на самой последней стадии
  • 8. $page = array( '#show_messages' => TRUE, '#theme' => 'page', '#type' => 'page', 'content' => array( 'system_main' => array( /* ... */ ), 'another_block' => array( /* ... */ ), '#sorted' => TRUE, ), 'sidebar_first' => array( // ... ), 'footer' => array( // ... ), // ... );
  • 9. Ключевые свойства render array #type #theme #theme_wrappers #attached #cache #pre_render / #post_render #prefix / #suffix #markup #access #printed
  • 10. Render array - #type  #type: элемент, описанный в hook_element_info(). Например, link, radio, checkbox, ..  Вы должны описать все необходимые свойства используемого элемента (например, #title и #options для элемента checkboxes)
  • 11. Render array - #theme  #theme: имя вызываемой функции темирования  Функция должна отрендерить все дочерние элементы
  • 12. Render array - #theme_wrappers  #theme_wrappers: массив функций темирования  Обрабатывается после #theme  Это позволяет дополнительно обернуть дочерние элементы нужными нам тегами  Используется для форм, филдсетов, ..
  • 13. Пример: #theme_wrappers <form …> <input type=“checkbox”../> <input type=“text”../> </form> <form …> <div class=“extra-container”> <input type=“checkbox”../> <input type=“text”../> </div> </form>
  • 14. Render array - #attached  #attached: присоединить ресурс к элементу  Типы ресурсов: JS, CSS, library, …  Можно присоединить любую функцию
  • 15. function mymodule_attached_example_page() { // .. some code // attach JS and CSS files $build['#attached'] = array( 'js' => array( drupal_get_path('module', 'taxonomy') . '/taxonomy.js' ), 'css' => array( drupal_get_path('module', 'taxonomy') . '/taxonomy.css' ), ); // attach library $build['#attached']['library'][] = array( 'system', 'drupal.ajax' ); // attach external resource $build['#attached']['js'][] = array( 'http://code.jquery.com/jquery-1.4.2.min.js' => array( 'type' => 'external' ) ); // attach function $build['#attached']['drupal_add_http_header'] = array( array( 'Content-Type', 'application/rss+xml; charset=utf-8' ), ); return $build; }
  • 16. Render array - #attached  #attached: присоединить ресурс к элементу  Типы ресурсов: JS, CSS, library, …  Можно присоединить любую функцию  Нет необходимости загружать ресурсы через hook_init()  При кэшировании не теряются ресурсы
  • 17. Render array - #cache  #cache: настройки кэширования элемента  Возможность кэширования отдельных частей страницы  Свойства:  keys / cid – ключ кэша  granularity – кэш по роли, юзеру, странице  expire – время жизни  bin – хранилище (таблица cache по умолчанию)
  • 18. function mymodule_cache_example_page() { // .. some code $build[] = array( '#theme' => 'mymodule_items', '#items' => array('item1', 'item2’), '#cache' => array( // Drupal will create a cache id with drupal_render_cid_create() 'keys' => array('render_example', 'cache', 'demonstration’), // Cache granularity settings: element has diffecrent cache versions for each page and role 'granularity' => DRUPAL_CACHE_PER_PAGE | DRUPAL_CACHE_PER_ROLE, // Custom cache storage 'bin' => 'cache_mymodule', // Clear cache after next general cache wipe 'expire' => CACHE_TEMPORARY ) ); $build[] = array( '#theme' => 'mymodule_items2', '#items' => array('item1', 'item2’), // Set up caching properties '#cache' => array( // These properties are ignored in favor of cid property //'keys' => array('render_example', 'cache', 'demonstration'), //'granularity' => DRUPAL_CACHE_PER_PAGE | DRUPAL_CACHE_PER_ROLE, 'cid' => 'mymodule_items', // Default cache storage 'bin' => 'cache', // Cache can be cleared only by calling cache_clear_all($cid) 'expire' => CACHE_PERMANENT ) ); return $build; }
  • 19. Рендер  drupal_render() – выполняет рендеринг массива; принимает единственный аргумент – массив render array  render() – алиас, дополнительно проверяющий, что получен действительно render array  drupal_render_children() – рендеринг дочерних элементов
  • 20. Как работает drupal_render()  Проверка свойства #access и #printed  Проверка кэша  Загрузка свойств по-умолчанию (если указан #type)  Вызов #pre_render функций  Вызов функции темирования #theme  Вызов функций темирования #theme_wrappers  Вызов #post_render функций  Обработка #attached ресурсов (JS, CSS)  Кэшировать данные (если указан #cache)  Возвратить #prefix . $output . #suffix
  • 21. Рендер страницы  Все элементы страницы (page) собраны в одном массиве render array  hook_page_build() дает возможность добавить элементы на страницу  hook_page_alter() дает возможность изменить существующие элементы на странице
  • 22. // index.php menu_execute_active_handler(); // menu.inc: menu_execute_active_handler() drupal_deliver_page($page_callback_result, $default_delivery_callback); // common.inc: drupal_deliver_html_page($page_callback_result) print drupal_render_page($page_callback_result); // common.inc: drupal_render_page($page_callback_result) // invoke hook_page_build block_page_build($page); // invoke hook_page_alter drupal_render($page);
  • 23. Render API и темирование  drupal_render() / render() – отрендерить элемент  hook_page_alter() – возможность изменить любой элемент на странице  hide() / show() – скрыть/показать элемент
  • 24. Пример: render() и hide() <!-- node.tpl.php --> <!-- .. some code .. --> <div class="content"<?php print $content_attributes;?>> <?php // We hide the comments and links now so that we can render them later. hide($content['comments']); hide($content['links']); print render($content); ?> </div> <?php print render($content['links']); ?> <?php print render($content['comments']); ?>
  • 25. Render API и темирование  render() – отрендерить элемент  hide() / show() – скрыть/показать элемент  hook_page_alter() – возможность изменить любой элемент на странице  2 вида функций темирования:  properties-as-variable  element-as-variable
  • 26. /** * Implements hook_theme(). */ function mymodule_theme() { return array( // Properties-as-variable 'mymodule_items' => array( 'variables' => array( 'items' => array(), 'title' => '' ) ), // Element-as-variable 'mymodule_element' => array( 'render element' => 'element' ), ); } /** * Properties-as-variable theme implementation */ function theme_mymodule_items($vars) { $items =& $vars['items']; $title =& $vars['title']; // ... } /** * Element-as-variable theme implementation */ function theme_mymodule_element($vars) { $element =& $vars['element']; // ... }
  • 27. Выводы  Забудьте про theme(), используйте render arrays  Render API позволяет сделать код более:  прозрачным и понятным  быстрым  удобным
  • 28. Ссылки  Drupal API http://api.drupal.org  Render Arrays in Drupal 7 http://drupal.org/node/930760  Examples module http://drupal.org/project/examples
  • 29. Спасибо за внимание! Вопросы? Ефим Web-Evt Евтушенко E-mail: WebEvt@gmail.com Skype: Web-Evt