SlideShare a Scribd company logo
Render API

                          Pavel Makhrinsky



e-mail: gumanistius@gmail.com
skype: gumanista
drupal.org: http://drupal.org/user/773216
facebook: https://www.facebook.com/gumanist
Overview
● Form API successor
● Drupal 6 ‘theme’ replacement
● System to build structured arrays into content
● The way to build presentation layer
Theming ways
● Noob way
● Drupal 6 way
● Drupal 7 way
Noob way
           1 <div class="nav">
● Inline   2 <ul class="topnav">
           3 <li id="lefttopnav" <?php if($levelone == 'home') echo "class="current"";?>><?php echo $menu1;?></li>
           4 <li <?php if($levelone == "item-2") echo "class="current"";?>> <?php echo $menu2;?></li>
● Inline   5 <li <?php if($levelone == "item-3") echo "class="current"";?>> <?php echo $menu4;?></li>
           6 <li <?php if($levelone == "item-4") echo "class="current"";?>> <?php echo $menu6;?></li>
           7 <li <?php if($levelone == "item-5") echo "class="current"";?>> <?php echo $menu5;?></li>
● Inline   8 <li <?php if($levelone == 'item-6') echo "class="current"";?>> <?php echo $menu7;?></li>
           9 </ul>
           10 </div>
● Inline
● Inline
Drupal 6 way
 ● Use theme functions
 ● Implement hook_theme
 ● Move large markup to templates


1 $items = array('item-1', 'item-2', 'item-3', 'item-4', 'item-5');
2 $output = theme('item_list', $items);
Drupal 6 way - advantages
● Common way to render elements
● Reusable functions
● Predictable markup
● Possibility to change generation
● Output altering
Drupal 6 way - disadvantages
● Slower performance
● Caching difficulties
● Different parameters
Drupal 7 way
 ● Use renderable arrays
 ● Alter content you need



1 $items = array('item-1', 'item-2', 'item-3', 'item-4', 'item-5');
2 $output = array(
3 '#items' => $items,
4 '#theme' => 'item_list'
5 );
Drupal 7 way advantages
● Content alterable in a common way
● All the renderable elements have preprocess
  and process functions
● Transparent caching
● Resources could be attached to elements
Render API details
● hook_theme
● Renderable array structure
● Content altering
● #type, #theme, #theme_wrappers
● #states
● Resources
● Performance and caching
hook_theme()
● hook_theme
 ○ variables | render element
 ○ file
 ○ path
 ○ template
 ○ function
 ○ preprocess functions
Renderable array structure
● ‘#’ elements
● system elements
  ○ #children
  ○ #access
  ○ #printed
  ○ #sorted
Content altering
● #pre_render
● #post_render
● preprocess and process functions
#type
 ● Loads defaults from hook_element_info()
1 // If the default values for this element have not been loaded yet, populate
2 // them.
3 if (isset($elements['#type']) && empty($elements['#defaults_loaded'])) {
4 $elements += element_info($elements['#type']);
5}




1 function module_template_element_info() {
2 return array(
3 'file_template' => array(
4 '#name' => 'misc',
5 '#fileinfo' => array(
6 'filename' => '[module_name].[name].[extension]',
7 'path' => 'includes',
8 'extension' => 'inc'
9)
10 )
11 );
11 }
#theme
 ● Invokes theme() function
1 // Get the children of the element, sorted by weight.
2 $children = element_children($elements, TRUE);
3
4 // Initialize this element's #children, unless a #pre_render callback already
5 // preset #children.
6 if (!isset($elements['#children'])) {
7 $elements['#children'] = '';
8}
9 // Call the element's #theme function if it is set. Then any children of the
10 // element have to be rendered there.
11 if (isset($elements['#theme'])) {
12 $elements['#children'] = theme($elements['#theme'], $elements);
13 }
14 // If #theme was not set and the element has children, render them now.
15 // This is the same process as drupal_render_children() but is inlined
16 // for speed.
17 if ($elements['#children'] == '') {
18 foreach ($children as $key) {
19 $elements['#children'] .= drupal_render($elements[$key]);
20 }
21 }
#theme_wrappers
 ● Wrap #children element with code
1 // Let the theme functions in #theme_wrappers add markup around the rendered
2 // children.
3 if (isset($elements['#theme_wrappers'])) {
4 foreach ($elements['#theme_wrappers'] as $theme_wrapper) {
5 $elements['#children'] = theme($theme_wrapper, $elements);
6}
7}
#states
● Adds JavaScript to change the state of an
  element based on another element
1 $form['toggle_me'] = array(
2 '#type' => 'checkbox',
3 '#title' => t('Tick this box to type'),
4 );
5 $form['settings'] = array(
6 '#type' => 'textfield',
7 '#states' => array(
8 // Only show this field when the 'toggle_me' checkbox is enabled.
9 'visible' => array(
10 ':input[name="toggle_me"]' => array('checked' => TRUE),
11 ),
12 ),
13 );
Resources
● #attached property
● Allow attach
  ○ CSS
  ○ JavaScript
  ○ Libraries
● Not cached
Performance and caching
● Setting cache for renderable arrays
● Some cache usage tips
#cache
● 'keys' => an array of keys which will be
  concatenated to form the cache key.
● 'bin' => the name of the cache bin to be used
  (as in 'cache' or 'cache_page', etc.
● 'expire' => a Unix timestamp indicating the
  expiration time of the cache.
● 'granularity' => a bitmask indicating the cache
  type. This should be
  DRUPAL_CACHE_PER_PAGE,
  DRUPAL_CACHE_PER_ROLE, or
  DRUPAL_CACHE_PER_USER
Some cache usage tips
● Don’t cache small items
● Items from #attached not stored with rendered
Elements            5      100          500
   items
With #cache
Without #cache
                    3211
                    747
                           3276
                           4257
                                        3235
                                        18336
● Use cache targeting
● Cache items will not be expired until cron runs,
   regardless of the expiration time used
Summary
● Don’t use direct call of theme() function
● Generate HTML as later as possible
Links
● Render API
     ○ http://drupal.org/node/933976
     ○ http://drupal.org/node/930760
     ○ http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_render/7
● States
     ○ http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_process_states/7
● Drupal API
     ○ http://api.drupal.org
● Examples module
     ○ http://drupal.org/project/examples
● Cache backends
     ○ http://drupal.org/project/apc
     ○ http://drupal.org/project/memcache
     ○ http://drupal.org/project/filecache
Thank you




e-mail: gumanistius@gmail.com
skype: gumanista
drupal.org: http://drupal.org/user/773216
facebook: https://www.facebook.com/gumanist

More Related Content

PPTX
Drupal 8 migrate!
PDF
Drupal Field API. Practical usage
ODP
Multilingual drupal 7
PDF
Field api.From d7 to d8
PDF
Doctrine 2
PPTX
Drupal 8 migrate!
PDF
jQuery secrets
ZIP
What's new in the Drupal 7 API?
Drupal 8 migrate!
Drupal Field API. Practical usage
Multilingual drupal 7
Field api.From d7 to d8
Doctrine 2
Drupal 8 migrate!
jQuery secrets
What's new in the Drupal 7 API?

What's hot (20)

PDF
The Beauty and the Beast
PDF
Advanced Querying with CakePHP 3
PDF
Php unit the-mostunknownparts
PDF
Doctrine fixtures
PDF
PHP Data Objects
KEY
Lithium Best
ODP
Rich domain model with symfony 2.5 and doctrine 2.5
PDF
Agile database access with CakePHP 3
PPT
Quebec pdo
PDF
The Beauty And The Beast Php N W09
PDF
The Origin of Lithium
PDF
The IoC Hydra - Dutch PHP Conference 2016
PDF
Future of HTTP in CakePHP
KEY
Php 101: PDO
PDF
Introduction to the Pods JSON API
PDF
CakeFest 2013 keynote
PDF
New in cakephp3
PDF
The Zen of Lithium
PDF
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
PDF
Current state-of-php
The Beauty and the Beast
Advanced Querying with CakePHP 3
Php unit the-mostunknownparts
Doctrine fixtures
PHP Data Objects
Lithium Best
Rich domain model with symfony 2.5 and doctrine 2.5
Agile database access with CakePHP 3
Quebec pdo
The Beauty And The Beast Php N W09
The Origin of Lithium
The IoC Hydra - Dutch PHP Conference 2016
Future of HTTP in CakePHP
Php 101: PDO
Introduction to the Pods JSON API
CakeFest 2013 keynote
New in cakephp3
The Zen of Lithium
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Current state-of-php
Ad

Viewers also liked (12)

PPT
Revistă bibliografică: Suveranitatea, Independență, Democrație și Libertate
PPT
Survival
PPTX
IAP&IAB Cash Testing
PPTX
Photography Presentation
PPTX
Visually impaired
PPT
Techpetually speaking: How Tech is Transforming the Pet Industry
PPTX
Tajuk sejarah spm 2012
DOCX
Hoja de vida corporativa
PPT
Asic pd
PPTX
Baking & Pastry - Bread Making Process
PPTX
Presentation.ai
PPT
Bahasa Malaysia Kertas 1(Teknik Menjawab)
Revistă bibliografică: Suveranitatea, Independență, Democrație și Libertate
Survival
IAP&IAB Cash Testing
Photography Presentation
Visually impaired
Techpetually speaking: How Tech is Transforming the Pet Industry
Tajuk sejarah spm 2012
Hoja de vida corporativa
Asic pd
Baking & Pastry - Bread Making Process
Presentation.ai
Bahasa Malaysia Kertas 1(Teknik Menjawab)
Ad

Similar to Drupal Render API (20)

PPT
Render API - Pavel Makhrinsky
PPTX
Drupal Camp Porto - Developing with Drupal: First Steps
PDF
Nickolay Shmalenuk.Render api eng.DrupalCamp Kyiv 2011
PDF
Drupal 7 Theming - Behind the scenes
PDF
Learning PHP for Drupal Theming, DC Chicago 2009
PDF
Drupal Front End PHP
PPT
The Render API in Drupal 7
PDF
2007 Fsoss Drupal Under The Hood
PPT
Drupal 6 in a nutshell
ODP
Drupal Theme Development - DrupalCon Chicago 2011
PDF
Intro to drupal_7_architecture
PDF
Grok Drupal (7) Theming
PDF
Drupal Flyover, CMS Expo
KEY
PDF
Drupal theming - a practical approach (European Drupal Days 2015)
ODP
Drupal in 5mins + Previewing Drupal 8.x
PPTX
Theming Drupal: Beyond the Look and Feel
PDF
D7 theming what's new - London
PDF
13th Sep, Drupal 7 advanced training by TCS
PDF
Functional FIPS: Learning PHP for Drupal Theming
Render API - Pavel Makhrinsky
Drupal Camp Porto - Developing with Drupal: First Steps
Nickolay Shmalenuk.Render api eng.DrupalCamp Kyiv 2011
Drupal 7 Theming - Behind the scenes
Learning PHP for Drupal Theming, DC Chicago 2009
Drupal Front End PHP
The Render API in Drupal 7
2007 Fsoss Drupal Under The Hood
Drupal 6 in a nutshell
Drupal Theme Development - DrupalCon Chicago 2011
Intro to drupal_7_architecture
Grok Drupal (7) Theming
Drupal Flyover, CMS Expo
Drupal theming - a practical approach (European Drupal Days 2015)
Drupal in 5mins + Previewing Drupal 8.x
Theming Drupal: Beyond the Look and Feel
D7 theming what's new - London
13th Sep, Drupal 7 advanced training by TCS
Functional FIPS: Learning PHP for Drupal Theming

Recently uploaded (20)

PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
KodekX | Application Modernization Development
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
cuic standard and advanced reporting.pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PPTX
Big Data Technologies - Introduction.pptx
PDF
Electronic commerce courselecture one. Pdf
PPTX
Cloud computing and distributed systems.
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
Advanced methodologies resolving dimensionality complications for autism neur...
KodekX | Application Modernization Development
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Network Security Unit 5.pdf for BCA BBA.
cuic standard and advanced reporting.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Big Data Technologies - Introduction.pptx
Electronic commerce courselecture one. Pdf
Cloud computing and distributed systems.
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Diabetes mellitus diagnosis method based random forest with bat algorithm
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Spectral efficient network and resource selection model in 5G networks

Drupal Render API

  • 1. Render API Pavel Makhrinsky e-mail: gumanistius@gmail.com skype: gumanista drupal.org: http://drupal.org/user/773216 facebook: https://www.facebook.com/gumanist
  • 2. Overview ● Form API successor ● Drupal 6 ‘theme’ replacement ● System to build structured arrays into content ● The way to build presentation layer
  • 3. Theming ways ● Noob way ● Drupal 6 way ● Drupal 7 way
  • 4. Noob way 1 <div class="nav"> ● Inline 2 <ul class="topnav"> 3 <li id="lefttopnav" <?php if($levelone == 'home') echo "class="current"";?>><?php echo $menu1;?></li> 4 <li <?php if($levelone == "item-2") echo "class="current"";?>> <?php echo $menu2;?></li> ● Inline 5 <li <?php if($levelone == "item-3") echo "class="current"";?>> <?php echo $menu4;?></li> 6 <li <?php if($levelone == "item-4") echo "class="current"";?>> <?php echo $menu6;?></li> 7 <li <?php if($levelone == "item-5") echo "class="current"";?>> <?php echo $menu5;?></li> ● Inline 8 <li <?php if($levelone == 'item-6') echo "class="current"";?>> <?php echo $menu7;?></li> 9 </ul> 10 </div> ● Inline ● Inline
  • 5. Drupal 6 way ● Use theme functions ● Implement hook_theme ● Move large markup to templates 1 $items = array('item-1', 'item-2', 'item-3', 'item-4', 'item-5'); 2 $output = theme('item_list', $items);
  • 6. Drupal 6 way - advantages ● Common way to render elements ● Reusable functions ● Predictable markup ● Possibility to change generation ● Output altering
  • 7. Drupal 6 way - disadvantages ● Slower performance ● Caching difficulties ● Different parameters
  • 8. Drupal 7 way ● Use renderable arrays ● Alter content you need 1 $items = array('item-1', 'item-2', 'item-3', 'item-4', 'item-5'); 2 $output = array( 3 '#items' => $items, 4 '#theme' => 'item_list' 5 );
  • 9. Drupal 7 way advantages ● Content alterable in a common way ● All the renderable elements have preprocess and process functions ● Transparent caching ● Resources could be attached to elements
  • 10. Render API details ● hook_theme ● Renderable array structure ● Content altering ● #type, #theme, #theme_wrappers ● #states ● Resources ● Performance and caching
  • 11. hook_theme() ● hook_theme ○ variables | render element ○ file ○ path ○ template ○ function ○ preprocess functions
  • 12. Renderable array structure ● ‘#’ elements ● system elements ○ #children ○ #access ○ #printed ○ #sorted
  • 13. Content altering ● #pre_render ● #post_render ● preprocess and process functions
  • 14. #type ● Loads defaults from hook_element_info() 1 // If the default values for this element have not been loaded yet, populate 2 // them. 3 if (isset($elements['#type']) && empty($elements['#defaults_loaded'])) { 4 $elements += element_info($elements['#type']); 5} 1 function module_template_element_info() { 2 return array( 3 'file_template' => array( 4 '#name' => 'misc', 5 '#fileinfo' => array( 6 'filename' => '[module_name].[name].[extension]', 7 'path' => 'includes', 8 'extension' => 'inc' 9) 10 ) 11 ); 11 }
  • 15. #theme ● Invokes theme() function 1 // Get the children of the element, sorted by weight. 2 $children = element_children($elements, TRUE); 3 4 // Initialize this element's #children, unless a #pre_render callback already 5 // preset #children. 6 if (!isset($elements['#children'])) { 7 $elements['#children'] = ''; 8} 9 // Call the element's #theme function if it is set. Then any children of the 10 // element have to be rendered there. 11 if (isset($elements['#theme'])) { 12 $elements['#children'] = theme($elements['#theme'], $elements); 13 } 14 // If #theme was not set and the element has children, render them now. 15 // This is the same process as drupal_render_children() but is inlined 16 // for speed. 17 if ($elements['#children'] == '') { 18 foreach ($children as $key) { 19 $elements['#children'] .= drupal_render($elements[$key]); 20 } 21 }
  • 16. #theme_wrappers ● Wrap #children element with code 1 // Let the theme functions in #theme_wrappers add markup around the rendered 2 // children. 3 if (isset($elements['#theme_wrappers'])) { 4 foreach ($elements['#theme_wrappers'] as $theme_wrapper) { 5 $elements['#children'] = theme($theme_wrapper, $elements); 6} 7}
  • 17. #states ● Adds JavaScript to change the state of an element based on another element 1 $form['toggle_me'] = array( 2 '#type' => 'checkbox', 3 '#title' => t('Tick this box to type'), 4 ); 5 $form['settings'] = array( 6 '#type' => 'textfield', 7 '#states' => array( 8 // Only show this field when the 'toggle_me' checkbox is enabled. 9 'visible' => array( 10 ':input[name="toggle_me"]' => array('checked' => TRUE), 11 ), 12 ), 13 );
  • 18. Resources ● #attached property ● Allow attach ○ CSS ○ JavaScript ○ Libraries ● Not cached
  • 19. Performance and caching ● Setting cache for renderable arrays ● Some cache usage tips
  • 20. #cache ● 'keys' => an array of keys which will be concatenated to form the cache key. ● 'bin' => the name of the cache bin to be used (as in 'cache' or 'cache_page', etc. ● 'expire' => a Unix timestamp indicating the expiration time of the cache. ● 'granularity' => a bitmask indicating the cache type. This should be DRUPAL_CACHE_PER_PAGE, DRUPAL_CACHE_PER_ROLE, or DRUPAL_CACHE_PER_USER
  • 21. Some cache usage tips ● Don’t cache small items ● Items from #attached not stored with rendered Elements 5 100 500 items With #cache Without #cache 3211 747 3276 4257 3235 18336 ● Use cache targeting ● Cache items will not be expired until cron runs, regardless of the expiration time used
  • 22. Summary ● Don’t use direct call of theme() function ● Generate HTML as later as possible
  • 23. Links ● Render API ○ http://drupal.org/node/933976 ○ http://drupal.org/node/930760 ○ http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_render/7 ● States ○ http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_process_states/7 ● Drupal API ○ http://api.drupal.org ● Examples module ○ http://drupal.org/project/examples ● Cache backends ○ http://drupal.org/project/apc ○ http://drupal.org/project/memcache ○ http://drupal.org/project/filecache
  • 24. Thank you e-mail: gumanistius@gmail.com skype: gumanista drupal.org: http://drupal.org/user/773216 facebook: https://www.facebook.com/gumanist