An Introduction to Drupal Architecture JohnVanDyk DrupalCamp Des Moines, Iowa September 17, 2011 1
Apache IIS OS Nginx PHP 5.2.5 Stack with OS, webserver and PHP. Most people use mod_php but deployments with engineers at the helm sometimes use FastCGI. PHP 5.2.4 with the 5.2.5 security backport is fine too (Ubuntu 8.0.4). 2
Apache IIS OS Nginx hash date SimpleXMLjson dom SPLpcre filter xmlsession gd pdo pdo_mysql PHP Some PHP extensions are required. 3
Apache IIS OS Nginx PHP 5.2.5 MySQL 5.0.15 MariaDB 5.1.44 Database. 4
Apache IIS OS Nginx PHP 5.2.5 MySQL 5.0.15 MariaDB 5.1.44 Drupal 7 Drupal sits atop the stack. 5
Apache IIS OS Nginx PHP 5.2.5 MySQL 5.0.15 MariaDB 5.1.44 Drupal 7 Varnish Varnish can be added to the front end for fast RAM-based response to anonymous users. 6
Apache Load Balancer PHP 5.2.5 MySQL Drupal 7 OS OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP Drupal 7 OS Webheads can be scaled out. 7
Apache Load Balancer PHP 5.2.5 MySQL Master Drupal 7 OS OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP Drupal 7 OS MySQL Slaves OS MySQL Slaves OS MySQL Slaves OS MySQL Slaves OS Databases can be scaled out. Show master-slave but master- master is also a possibility. See http://www.jochus.be/site/ 2011-01-13/drupal/drupal-master-master-replication-architecture for an example. 8
Source: Nate Haug, Lullabot Scaling the Grammys. DrupalCamp Denver 2010. 214 million hits in six hours at peak. Database load: 5%. Apache load: 1%. 9
You will not hack core. You should only modify the locations shown in green. Modifying the other files will inevitably lead to grief. 10
Development Site Local settings, including database connection info, are in sites/all/ dev.local. 11
Live Site On the live site settings are in a site-specific directory. 12
http://www.doodlepress.co.uk/item/1460 Drupal 7 Architecture Drupal architecture. Each include file has a different color and their interrelationships are shown. Uh...just kidding. 13
Browser request: GET /node/1 Bootstrap (includes/bootstrap.inc) - brings session, database, variables online Menu System (router) - maps URL to a function - checks access control - may bring functions into scope - calls function to build page data structure - calls function to theme page (look and feel) - page returned to client It is important for a developer to understand the sequence of events that occur when a request is processed by Drupal. 14
/index.php?q=node/1 /node/1 mod_rewrite in .htaccess $_GET['q'] will contain 'node/1' A typical request starts with mod_rewrite. 15
index.php menu system Which function should this path be mapped to? $items['node/%node'] = array( 'page callback' => 'node_page_view', 'page arguments' => array(1), 'access callback' => 'node_access', 'access arguments' => array('view', 1), ); index.php invokes the menu system, which handles much more than menus. The menu item that maps to node/1 can be found in node.module. 16
index.php menu system Does this user have permission to access this path? $items['node/%node'] = array( 'page callback' => 'node_page_view', 'page arguments' => array(1), 'access callback' => 'node_access', 'access arguments' => array('view', 1), ); node.module tells the menu system to invoke a function (node_access()) to determine whether the current user has permission. 17
index.php menu system node.module /** * Menu callback; view a single node. */ function node_page_view($node) { ... } The page callback for the path node/1 is 'node_page_view'. That's the name of the function that is called if the user has permission to view the page. 18
index.php menu system node.module hook_node_load() book.module comment.module forum.module user.module book_node_load() comment_node_load() forum_node_load() user_node_load() Other modules have a say in the loading of the node object. Many of these hooks (better thought of as "events") happen during the building of a page. 19
index.php menu system A large array with the node's data structure is returned to the menu system. 20
index.php menu system node.module hook_node_view_alter() drupalcorn.module drupalcorn_node_view_alter() Other modules may alter the final data structure. We've seen three common patterns that pervade Drupal: (1) hooks allow other modules to respond to events; (2) Drupal uses large structured arrays, and (3) other modules may alter these arrays once built. 21
index.php menu system delivery callback drupal_render_page() theme() page.tpl.php node.tpl.php block.tpl.php The menu system passes the structure array to a delivery callback which turns the array into HTML by rendering it; that is, passing it through Drupal's template engine. Template files (.tpl.php, pronounced "tipple-fipp") in the current theme are used to create the HTML. 22
index.php The HTML is then returned to the browser. 23
Common Library Database API Fields API Entity API N o d e s U s e r s T a x o n o m y C o m m e n t s Form API Menu API Block API Locali zation Views Template Preprocessing Theme Modules add functionality here Block diagram if you need a mental model. This doesnʼt have nearly enough dimensions to describe what actually happens. If you asked 5 developers to make Drupal block diagrams, you'd get 5 different diagrams. Hopefully this one helps someone. 24
"Entities" Node: a piece of content User: a user account Taxonomy: categories for tagging/classification Comment: content with a parent 25
An Entity has Bundles Node Title Body Title Body Page An entity can be thought of as a base object, and bundles are subclasses. For example, a node is an entity while the bundle of fields that make up a page are a type of node. 26
An Entity has Bundles Title Body Page Title Body Article Tags Image These are types of nodes. Each has a bundle of fields. 27
A Bundle has Fields Title Body Article Tags Image text_long text_with_summary taxonomy_term_reference image And each field has a type. 28
Not SQL Fields Title Body Article Tags Image text_with_summary taxonomy_term_reference These are more than SQL fields. text_with_summary autogenerates a summary. taxonomy_term_reference splits multiple tags into separate records. These are Drupal fields. 29
In the Real World "Entity" = node | user | comment | taxonomy "Bundle" = "Content Type" You assemble content types from fields using the UI. Part of the conversation with your client! Nobody says "let's create a new Node Bundle and call it Bug Report". 30
Before Building a Site • What content types and fields? • How will the data get in? (Forms) • How will the data get out? (Views) • Who may create/view/delete data? (Permissions) • What additional functionality? (Modules) • How can we make it pretty? (Theming) Questions to map client needs to Drupal concepts. 31
http://api.drupal.org Your home for API-related searches. 32
http://drupal.org/project/examples Simple implementations of APIs. You can base your own work on these examples. 33
Bonus! Two tools I use all the time. 34
Defeating the White Screen of Death error_log = /var/log/php/error.log Define PHP error log in php.ini: I close with two essential tools. First, don't be frightened by the WSOD. 35
tail -f /var/log/php/error.log [07-Sep-2011 16:25:02] PHP Fatal error: Call to undefined function int() in bgstat.module on line 41 Watch the error log to find out what’s going on: PHP will always tell you what went wrong in its log. If you've defined a PHP error log in php.ini, you can watch it in real time with tail -f. 36
Where is the code? egrep -rn searchstring . Quickly search the codebase for a function: Second, don't be overwhelmed with the codebase. egrep and pipes can help you find where functions live and where things happen. Example: where are mail-related variables set? 37
egrep -rn mail . | grep variable_set ./includes/install.core.inc:1802: variable_set('site_mail', $form_state['values'] ['site_mail']); ./includes/install.core.inc:1813: variable_set('update_notify_emails', array($form_state ['values']['account']['mail'])); ./modules/openid/openid.test:323: variable_set('user_email_verification',TRUE); ... There we go. The codebase is like a rich porridge, waiting for you to sift through and find the tasty lumps. 38
Thanks! Hopefully these help create a big picture of how Drupal works.This only scratches the surface. Now get your debugger working and explore Drupal core on your own! 39

Intro to drupal_7_architecture

  • 1.
    An Introduction to DrupalArchitecture JohnVanDyk DrupalCamp Des Moines, Iowa September 17, 2011 1
  • 2.
    Apache IIS OS Nginx PHP 5.2.5 Stackwith OS, webserver and PHP. Most people use mod_php but deployments with engineers at the helm sometimes use FastCGI. PHP 5.2.4 with the 5.2.5 security backport is fine too (Ubuntu 8.0.4). 2
  • 3.
    Apache IIS OS Nginx hash date SimpleXMLjson domSPLpcre filter xmlsession gd pdo pdo_mysql PHP Some PHP extensions are required. 3
  • 4.
  • 5.
  • 6.
    Apache IIS OS Nginx PHP 5.2.5 MySQL 5.0.15 MariaDB 5.1.44 Drupal7 Varnish Varnish can be added to the front end for fast RAM-based response to anonymous users. 6
  • 7.
    Apache Load Balancer PHP 5.2.5 MySQL Drupal 7 OS OS Apache PHP5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP Drupal 7 OS Webheads can be scaled out. 7
  • 8.
    Apache Load Balancer PHP 5.2.5 MySQL Master Drupal 7 OS OS Apache PHP5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP 5.2.5 Drupal 7 OS Apache PHP Drupal 7 OS MySQL Slaves OS MySQL Slaves OS MySQL Slaves OS MySQL Slaves OS Databases can be scaled out. Show master-slave but master- master is also a possibility. See http://www.jochus.be/site/ 2011-01-13/drupal/drupal-master-master-replication-architecture for an example. 8
  • 9.
    Source: Nate Haug,Lullabot Scaling the Grammys. DrupalCamp Denver 2010. 214 million hits in six hours at peak. Database load: 5%. Apache load: 1%. 9
  • 10.
    You will nothack core. You should only modify the locations shown in green. Modifying the other files will inevitably lead to grief. 10
  • 11.
    Development Site Local settings,including database connection info, are in sites/all/ dev.local. 11
  • 12.
    Live Site On thelive site settings are in a site-specific directory. 12
  • 13.
    http://www.doodlepress.co.uk/item/1460 Drupal 7 Architecture Drupalarchitecture. Each include file has a different color and their interrelationships are shown. Uh...just kidding. 13
  • 14.
    Browser request: GET/node/1 Bootstrap (includes/bootstrap.inc) - brings session, database, variables online Menu System (router) - maps URL to a function - checks access control - may bring functions into scope - calls function to build page data structure - calls function to theme page (look and feel) - page returned to client It is important for a developer to understand the sequence of events that occur when a request is processed by Drupal. 14
  • 15.
    /index.php?q=node/1 /node/1 mod_rewrite in .htaccess $_GET['q']will contain 'node/1' A typical request starts with mod_rewrite. 15
  • 16.
    index.php menu system Which functionshould this path be mapped to? $items['node/%node'] = array( 'page callback' => 'node_page_view', 'page arguments' => array(1), 'access callback' => 'node_access', 'access arguments' => array('view', 1), ); index.php invokes the menu system, which handles much more than menus. The menu item that maps to node/1 can be found in node.module. 16
  • 17.
    index.php menu system Does thisuser have permission to access this path? $items['node/%node'] = array( 'page callback' => 'node_page_view', 'page arguments' => array(1), 'access callback' => 'node_access', 'access arguments' => array('view', 1), ); node.module tells the menu system to invoke a function (node_access()) to determine whether the current user has permission. 17
  • 18.
    index.php menu system node.module /** *Menu callback; view a single node. */ function node_page_view($node) { ... } The page callback for the path node/1 is 'node_page_view'. That's the name of the function that is called if the user has permission to view the page. 18
  • 19.
    index.php menu system node.module hook_node_load() book.module comment.module forum.module user.module book_node_load() comment_node_load() forum_node_load() user_node_load() Othermodules have a say in the loading of the node object. Many of these hooks (better thought of as "events") happen during the building of a page. 19
  • 20.
    index.php menu system A largearray with the node's data structure is returned to the menu system. 20
  • 21.
    index.php menu system node.module hook_node_view_alter() drupalcorn.module drupalcorn_node_view_alter() Othermodules may alter the final data structure. We've seen three common patterns that pervade Drupal: (1) hooks allow other modules to respond to events; (2) Drupal uses large structured arrays, and (3) other modules may alter these arrays once built. 21
  • 22.
    index.php menu system delivery callback drupal_render_page() theme() page.tpl.php node.tpl.php block.tpl.php Themenu system passes the structure array to a delivery callback which turns the array into HTML by rendering it; that is, passing it through Drupal's template engine. Template files (.tpl.php, pronounced "tipple-fipp") in the current theme are used to create the HTML. 22
  • 23.
    index.php The HTML isthen returned to the browser. 23
  • 24.
    Common Library DatabaseAPI Fields API Entity API N o d e s U s e r s T a x o n o m y C o m m e n t s Form API Menu API Block API Locali zation Views Template Preprocessing Theme Modules add functionality here Block diagram if you need a mental model. This doesnʼt have nearly enough dimensions to describe what actually happens. If you asked 5 developers to make Drupal block diagrams, you'd get 5 different diagrams. Hopefully this one helps someone. 24
  • 25.
    "Entities" Node: a pieceof content User: a user account Taxonomy: categories for tagging/classification Comment: content with a parent 25
  • 26.
    An Entity hasBundles Node Title Body Title Body Page An entity can be thought of as a base object, and bundles are subclasses. For example, a node is an entity while the bundle of fields that make up a page are a type of node. 26
  • 27.
    An Entity hasBundles Title Body Page Title Body Article Tags Image These are types of nodes. Each has a bundle of fields. 27
  • 28.
    A Bundle hasFields Title Body Article Tags Image text_long text_with_summary taxonomy_term_reference image And each field has a type. 28
  • 29.
    Not SQL Fields Title Body Article Tags Image text_with_summary taxonomy_term_reference Theseare more than SQL fields. text_with_summary autogenerates a summary. taxonomy_term_reference splits multiple tags into separate records. These are Drupal fields. 29
  • 30.
    In the RealWorld "Entity" = node | user | comment | taxonomy "Bundle" = "Content Type" You assemble content types from fields using the UI. Part of the conversation with your client! Nobody says "let's create a new Node Bundle and call it Bug Report". 30
  • 31.
    Before Building aSite • What content types and fields? • How will the data get in? (Forms) • How will the data get out? (Views) • Who may create/view/delete data? (Permissions) • What additional functionality? (Modules) • How can we make it pretty? (Theming) Questions to map client needs to Drupal concepts. 31
  • 32.
    http://api.drupal.org Your home forAPI-related searches. 32
  • 33.
    http://drupal.org/project/examples Simple implementations ofAPIs. You can base your own work on these examples. 33
  • 34.
    Bonus! Two tools Iuse all the time. 34
  • 35.
    Defeating the White Screenof Death error_log = /var/log/php/error.log Define PHP error log in php.ini: I close with two essential tools. First, don't be frightened by the WSOD. 35
  • 36.
    tail -f /var/log/php/error.log [07-Sep-201116:25:02] PHP Fatal error: Call to undefined function int() in bgstat.module on line 41 Watch the error log to find out what’s going on: PHP will always tell you what went wrong in its log. If you've defined a PHP error log in php.ini, you can watch it in real time with tail -f. 36
  • 37.
    Where is thecode? egrep -rn searchstring . Quickly search the codebase for a function: Second, don't be overwhelmed with the codebase. egrep and pipes can help you find where functions live and where things happen. Example: where are mail-related variables set? 37
  • 38.
    egrep -rn mail. | grep variable_set ./includes/install.core.inc:1802: variable_set('site_mail', $form_state['values'] ['site_mail']); ./includes/install.core.inc:1813: variable_set('update_notify_emails', array($form_state ['values']['account']['mail'])); ./modules/openid/openid.test:323: variable_set('user_email_verification',TRUE); ... There we go. The codebase is like a rich porridge, waiting for you to sift through and find the tasty lumps. 38
  • 39.
    Thanks! Hopefully these helpcreate a big picture of how Drupal works.This only scratches the surface. Now get your debugger working and explore Drupal core on your own! 39