Render API.

1,945 views
1,848 views

Published on

Published in: Education
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,945
On SlideShare
0
From Embeds
0
Number of Embeds
344
Actions
Shares
0
Downloads
6
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Render API.

  1. 1. The Render API in Drupal 7Ефим Web-Evt ЕвтушенкоE-mail: WebEvt@gmail.comSkype: Web-Evt
  2. 2. Обзор доклада Что такое Render API Зачем это нужно Как это работает? Концепция “render arrays” Ключевые свойства render array Как происходит рендеринг страницы Render API в темировании
  3. 3. Что такое Render API Система, позволяющая преобразоватьструктурированные массивы данных в строку Произошла от системы рендеринга в Drupal 6Forms API Формирует весь отдаваемый контент в Drupal7 Основная функция – drupal_render()
  4. 4. /** * 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;}
  5. 5. Зачем это нужно Модули могут получить доступ и внестиизменения в отдаваемый контент Единая система формирования контента Повторное использование callback функцийгенерации контента (page-, block-)
  6. 6. Концепция “render arrays” Render array – ассоциативный массивданных, построенный по определенномупринципу Рендеринг – преобразование массива renderarray в HTML код Страница Drupal представляет собой огромныймассив – render array Рендеринг данных происходит только насамой последней стадии
  7. 7. $page = array( #show_messages => TRUE, #theme => page, #type => page, content => array( system_main => array( /* ... */ ), another_block => array( /* ... */ ), #sorted => TRUE, ), sidebar_first => array( // ... ), footer => array( // ... ), // ...);
  8. 8. Ключевые свойства render array#type#theme#theme_wrappers#attached#cache#pre_render / #post_render#prefix / #suffix#markup#access#printed
  9. 9. Render array - #type #type: элемент, описанный вhook_element_info().Например, link, radio, checkbox, .. Вы должны описать все необходимыесвойства используемого элемента (например, #title и#options для элемента checkboxes)
  10. 10. Render array - #theme #theme: имя вызываемой функциитемирования Функция должна отрендерить все дочерниеэлементы
  11. 11. Render array - #theme_wrappers #theme_wrappers: массив функцийтемирования Обрабатывается после #theme Это позволяет дополнительно обернутьдочерние элементы нужными нам тегами Используется для форм, филдсетов, ..
  12. 12. Пример: #theme_wrappers<form …> <input type=“checkbox”../> <input type=“text”../></form><form …> <div class=“extra-container”> <input type=“checkbox”../> <input type=“text”../> </div></form>
  13. 13. Render array - #attached #attached: присоединить ресурс к элементу Типы ресурсов: JS, CSS, library, … Можно присоединить любую функцию
  14. 14. 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;}
  15. 15. Render array - #attached #attached: присоединить ресурс к элементу Типы ресурсов: JS, CSS, library, … Можно присоединить любую функцию Нет необходимости загружать ресурсы черезhook_init() При кэшировании не теряются ресурсы
  16. 16. Render array - #cache #cache: настройки кэширования элемента Возможность кэширования отдельных частейстраницы Свойства:  keys / cid – ключ кэша  granularity – кэш по роли, юзеру, странице  expire – время жизни  bin – хранилище (таблица cache по умолчанию)
  17. 17. 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;}
  18. 18. Рендер drupal_render() – выполняет рендерингмассива; принимает единственный аргумент –массив render array render() – алиас, дополнительнопроверяющий, что получен действительноrender array drupal_render_children() – рендеринг дочернихэлементов
  19. 19. Как работает drupal_render() Проверка свойства #access и #printed Проверка кэша Загрузка свойств по-умолчанию (если указан #type) Вызов #pre_render функций Вызов функции темирования #theme Вызов функций темирования #theme_wrappers Вызов #post_render функций Обработка #attached ресурсов (JS, CSS) Кэшировать данные (если указан #cache) Возвратить #prefix . $output . #suffix
  20. 20. Рендер страницы Все элементы страницы (page) собраны водном массиве render array hook_page_build() дает возможность добавитьэлементы на страницу hook_page_alter() дает возможность изменитьсуществующие элементы на странице
  21. 21. // index.phpmenu_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_buildblock_page_build($page);// invoke hook_page_alterdrupal_render($page);
  22. 22. Render API и темирование drupal_render() / render() – отрендеритьэлемент hook_page_alter() – возможность изменитьлюбой элемент на странице hide() / show() – скрыть/показать элемент
  23. 23. Пример: 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]); ?>
  24. 24. Render API и темирование render() – отрендерить элемент hide() / show() – скрыть/показать элемент hook_page_alter() – возможность изменитьлюбой элемент на странице 2 вида функций темирования:  properties-as-variable  element-as-variable
  25. 25. /** * 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]; // ...}
  26. 26. Выводы Забудьте про theme(), используйте renderarrays Render API позволяет сделать код более:  прозрачным и понятным  быстрым  удобным
  27. 27. Ссылки Drupal APIhttp://api.drupal.org Render Arrays in Drupal 7http://drupal.org/node/930760 Examples modulehttp://drupal.org/project/examples
  28. 28. Спасибо за внимание! Вопросы?Ефим Web-Evt ЕвтушенкоE-mail: WebEvt@gmail.comSkype: Web-Evt

×