drupal module development
DESCRIPTION
Slides for Drupal Camp Alpe-Adria on April 13 2013 in Ljubljana (Slovenia). http://www.drupalalpeadria.org/TRANSCRIPT
My first Drupal module! Why not?
About @Cvetko • Started as PHP developer with
custom CMS • “You need Linux” they said • I know Drupal since version 4.x
• Working as Sys admin, Drupal developer, iOS developer, etc.
Twitter @Cvetko Skype damjan.cvetan Email [email protected]
Drupal
• Available from drupal.org. • Runs on every machine with
PHP, supported database and web server.
• Very customizable (themes, modules).
• Good documented. • No limits.
A whole bunch of modules
Which one to use?
Missing a module?
Three kinds of modules (3 Cs)
• Core – Shipped with Drupal – Approved by core developers and community
• Contributed – Written by community – Shared under the same GNU Public License
• Custom – Created by website developer
Where to?
Drupal
Core Modules
Contributed Modules
Custom Module
Core Themes
Contributed Themes
Custom Theme
/sites/[all|mysite.com]/custom
Module name
• Should be a UNIQUE “short name” • Used in all file and function names • Must start with a letter • Only lower-case letters and underscores
• We will use name: “dc_stat” – For display current node/user stats
Create a folder + module file
• Module name “dc_stats”. • Create empty folder: – /sites/*/modules/custom/dc_stats/
• Create new file “dc_stats.module” with opening PHP tag and NO closing tag!!
• Create new file “dc_stats.info” for meta information.
*.info
• Required for every module! • Standard .ini file format – key/value pairs
name = Drupal statistic !description = Provides some statistic data. !core = 7.x !package = Damjan Cvetan !
Other optional keys: stylesheets, scripts, files, dependencies, …
Checkpoint
• Navigate to Modules section on your site • You should see your module • Enable it!
Coding standards
• Use an indent of 2 spaces, no tabs! • UNIX line ending (\n) • Omit closing “?>” PHP tag • Constants should be all-uppercase • Comments are your friends!
Half way there
Hook(s)
hook – [hoo k], noun � a curved or angular piece of metal or other hard substance for catching, pulling, holding, or suspending something.
• Fundamental to Drupal modules. • A way to interact with the core code. • Occur at various points in execution thread. • An event listener. • Names as foo_bar() – foo : module name, bar : hook name
How does it work?
Call for hook: hook_menu()
Drupal runFme Drupal runFme
Call dispatch
Foreach (enabled_module): ! module_name_menu(); !end foreach; !
locale_menu() !user_menu() !contact_menu() !help_menu() !… !… !dc_stats_menu() !… !… !trigger_menu() !path_menu() !
Hooks line up!
• hook_help() – Provides available documentation.
• hook_menu() – For paths registration in order to define how URL request are handled.
• hook_init() – Run at the beginning of page request.
• hook_cron() – Called whenever a cron run happens.
• More at http://api.drupal.org/
API.drupal.org
• Drupal developer’s documentation. • Doc for Drupal 4.6+. • Describes function calls, their parameters
and return values. • You can see the code and “who” is calling
this code within Drupal. • http://api.drupal.org
Let’s code
• Define callback function dc_stats_page() as follows:
funcFon dc_stats_page(){ return "Hello world! You’re awesome!”; }
• This will return defined string on call. • Put this code in dc_stats.module file.
Hey Drupal! Come in!
• Register path with hook_menu(). • We will use basic return array structure. funcFon dc_stats_menu(){
$items['dc/stats-‐page'] = array( 'Ftle' => 'Stats info page', 'page callback' => 'dc_stats_page', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); return $items; }
Visit URL: /dc/stats-page to see if it works. (You might need to clear cache first.)
Get some real data
funcFon dc_stats_page(){ drupal_set_Ftle("Drupal staFsFcs"); $node_count = $db_node_count; $user_count = $db_users_count; $header = array("InformaFon", "Value"); $rows[] = array('Number of nodes:', $node_count); $rows[] = array('Number of users:', $user_count); return theme_table(array( 'header' => $header, 'rows' => $rows, … … )); // return }
Happy ending
• Refresh your page and see your work.
• You can do much more – I’m certain! • Use your PHP + any other knowledge with
existing Drupal functions, hooks and variables!
Links to consider
• http://api.drupal.org http://drupalcontrib.org/
• http://buildamodule.com/
• http://drupal.org/project/devel – A suit of modules containing fun for module
developers and themers.
Books
• Drupal 7 Development by Example
• Beginning Drupal 7
• Drupal 7 Module Development
• …
• …
Q & A