SlideShare ist ein Scribd-Unternehmen logo
1 von 30
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.

Weitere ähnliche Inhalte

Was ist angesagt?

Yii development
Yii developmentYii development
Yii development
MageCloud
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
Magecom Ukraine
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf Conference
 
Form api в drupal 7
Form api в drupal 7Form api в drupal 7
Form api в drupal 7
dimateus
 
UWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем YiiUWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем Yii
Alexander Makarov
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
Alexander Makarov
 
Ubercart -nemnogo_primerov_iz_zhizni
Ubercart  -nemnogo_primerov_iz_zhizniUbercart  -nemnogo_primerov_iz_zhizni
Ubercart -nemnogo_primerov_iz_zhizni
drupalconf
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
ITmozg
 
Making Scalable JavaScript Application
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript Application
Mikhail Davydov
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
Pavel Novitsky
 

Was ist angesagt? (20)

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

Ähnlich wie Render API.

Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?
Stepan Tanasiychuk
 
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf Conference
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
 
Как не утонуть в мегабайтах JS-кода
Как не утонуть в мегабайтах JS-кодаКак не утонуть в мегабайтах JS-кода
Как не утонуть в мегабайтах JS-кода
tfmailru
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на Django
MoscowDjango
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
DrupalCampDN
 

Ähnlich wie Render API. (20)

Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 
Caching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoCaching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander Shumenko
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Sumin
SuminSumin
Sumin
 
Как не утонуть в мегабайтах JS-кода
Как не утонуть в мегабайтах JS-кодаКак не утонуть в мегабайтах JS-кода
Как не утонуть в мегабайтах JS-кода
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на Django
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 
DSLs в Perl
DSLs в PerlDSLs в Perl
DSLs в Perl
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий Копачёв
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PI
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 

Mehr von DrupalForumZP2012

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

Mehr von DrupalForumZP2012 (20)

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

Render API.

  • 1.
  • 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