<!DOCTYPE html> <html class="no-js" lang="en-GB"> <head> <title>Dividing Drupal's process and preprocess functions into separate files | Oliver Davies</title> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta property="og:url" content="https://www.oliverdavies.uk/blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files"> <meta property="og:title" content="Dividing Drupal's process and preprocess functions into separate files"/> <meta property="og:image" content="https://www.oliverdavies.uk/assets/images/me-precedent.jpg"/> <meta property="og:image:height" content="327"/> <meta property="og:image:type" content="image/jpg"> <meta property="og:image:width" content="327"/> <link rel="stylesheet" href="https://www.oliverdavies.uk/assets/css/main.css"> <link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=57" sizes="57x57"> <link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=114" sizes="114x114"> <link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=72" sizes="72x72"> <link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=144" sizes="144x144"> <link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=60" sizes="60x60"> <link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=120" sizes="120x120"> <link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=76" sizes="76x76"> <link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=152" sizes="152x152"> <link rel="icon" href="/assets/images/me-precedent.jpg?s=160" sizes="160x160"> <link rel="icon" href="/assets/images/me-precedent.jpg?s=96" sizes="96x96"> <link rel="icon" href="/assets/images/me-precedent.jpg?s=32" sizes="32x32"> <link rel="icon" href="/assets/images/me-precedent.jpg?s=16" sizes="16x16"> </head> <body class=""> <nav class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="https://www.oliverdavies.uk/">Oliver Davies</a> </div> <div id="navbar" class="collapse navbar-collapse" role="navigation"> <ul class="nav navbar-nav"> <li class=""> <a href="/">About</a> </li> <li class=""> <a href="/experience">Experience</a> </li> <li class=""> <a href="/testimonials">Testimonials</a> </li> <li class=""> <a href="/talks">Talks</a> </li> <li class="active"> <a href="/blog">Blog</a> </li> <li class=""> <a href="/contact">Contact</a> </li> </ul> </div> </div> </nav> <div class="container"> <div class="row"> <main class="col-md-9"> <h1>Dividing Drupal's process and preprocess functions into separate files</h1> <p class="posted text-light">24th May 2012</p> <p>If you use a lot of process and preprocess functions within your Drupal theme, then your template.php can get very long and it can become difficult to find a certain piece of code. Following the example of the <a href="http://drupal.org/project/omega" title="The Omega theme on Drupal.org">Omega theme</a>, I've started separating my process and preprocess functions into their own files. For example, mytheme_preprocess_node can be placed within a preprocess/node.inc file, and mytheme_process_page can be placed within process/page.inc.</p> <p>The first step is to use the default mytheme_process() and mytheme_preprocess() functions to utilise my custom function. So within my template.php file:</p> <pre><code class="language-php"><?php /** * Implements hook_preprocess(). * * Initialises the mytheme_invoke() function for the preprocess hook. */ function mytheme_preprocess(&$variables, $hook) { mytheme_invoke('preprocess', $hook, $variables); } /** * Implements hook_process(). * * Initialises the mytheme_invoke() function for the process hook. */ function mytheme_process(&$variables, $hook) { mytheme_invoke('process', $hook, $variables); } </code></pre> <p>Now, to write the <code>mytheme_invoke()</code> function:</p> <pre><code class="language-php"><?php /** * Invokes custom process and preprocess functions. * * @param string $type * The type of function we are trying to include (i.e. process or preprocess). * * @param array $variables * The variables array. * * @param string $hook * The name of the hook. * * @see mytheme_preprocess() * @see mytheme_process() */ function mytheme_invoke($type, $hook, &$variables) { global $theme_key; // The name of the function to look for (e.g. mytheme_process_node). $function = $theme_key . '_' . $type . '_' . $hook; // If the function doesn't exist within template.php, look for the // appropriate include file. if (!function_exists($function)) { // The file to search for (e.g. process/node.inc). $file = drupal_get_path('theme', $theme_key) . '/' . $type . '/' . $type . '-' . str_replace('_', '-', $hook) . '.inc'; // If the file exists, include it. if (is_file($file)) { include($file); } } // Try to call the function again. if (function_exists($function)) { $function($variables); } } </code></pre> <p>As <code>mytheme_invoke()</code> checks to see if the function already exists before searching for checking the include files, I could still add the functions into template.php as normal and this would override any corresponding include file.</p> <p class="tags"> Tags: <a href="https://www.oliverdavies.uk/blog/tags/drupal">drupal</a>, <a href="https://www.oliverdavies.uk/blog/tags/code">code</a>, <a href="https://www.oliverdavies.uk/blog/tags/theming">theming</a>, <a href="https://www.oliverdavies.uk/blog/tags/preprocessing">preprocessing</a> </p> <div class="post-pager is-flex"> <div class="is-half"> <a href="/blog/2012/05/23/writing-info-file-drupal-7-theme"> « Writing a .info file for a Drupal 7 theme </a> </div> <div class="is-half text-right"> <a href="/blog/2012/07/12/my-new-drupal-modules"> My new Drupal modules » </a> </div> </div> <div class="about-author"> <h2>About the Author</h2> <img src="//www.oliverdavies.uk/assets/images/me-precedent.jpg" alt="Picture of Oliver" class="img-circle"> <p>Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at <a href="https://microserve.io">Microserve</a> and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.</p> </div> </main> <div class="col-md-3"> <div class="panel badges text-center"> <a class="badge--da-member" href="https://assoc.drupal.org/membership" title="I’m a Drupal Association member."> <img src="//www.oliverdavies.uk/assets/images/da-individual-member.png" alt="Drupal Association Individual Member" width="152" > </a> <a href="http://drupalcores.com/#opdavies"> <img alt="I built Drupal 8 with hand holding a wrench on blue background" src="//www.oliverdavies.uk/assets/images/drupal-8.jpg" /> </a> <img src="//www.oliverdavies.uk/assets/images/badges/acquia-certified-developer-drupal-8.png" alt="Acquia Certified Developer - Drupal 8 Exam Badge" height="147" width="147" /> <a href="http://conference.phpnw.org.uk/phpnw17"> <img src="//www.oliverdavies.uk/assets/images/badges/phpnw17.png" alt=""> </a> </div> <div class="availability panel panel-default"> <div class="panel-heading">Availability</div> <div class="panel-body"> <p> <i class="fa fa-thumbs-o-up text-warning"></i> Currently have limited part-time capacity </p> <p> <i class="fa fa-thumbs-o-down text-danger"></i> Currently no spare full-time capacity. </p> </div> </div> <div class="latest-posts panel panel-default"> <div class="latest-posts__heading panel-heading">Latest blog posts</div> <ul class="list-group"> <li class="post list-group-item"> <span class="post__title"> <a href="/blog/2017/07/13/publishing-sculpin-sites-with-github-pages"> Publishing Sculpin Sites with GitHub Pages </a> </span> - <span class="post__date">13th July, 2017</span> </li> <li class="post list-group-item"> <span class="post__title"> <a href="/blog/2017/06/09/introducing-the-drupal-meetups-twitterbot"> Introducing the Drupal Meetups Twitterbot </a> </span> - <span class="post__date">9th June, 2017</span> </li> <li class="post list-group-item"> <span class="post__title"> <a href="/blog/2017/05/20/turning-drupal-module-into-feature"> Turning Your Custom Drupal Module into a Feature </a> </span> - <span class="post__date">20th May, 2017</span> </li> </ul> </div> </div> </div> </div> <footer class="container"> <p class="copyright"> © 2010-2017 Oliver Davies. Built with <a href="https://sculpin.io">Sculpin</a>. </p> <div class="meetups"> <h2>Things that I organise</h2> <ul> <li class="meetups--drupal-bristol"> <a href="http://www.drupalbristol.org.uk" title="Drupal Bristol"> <img src="//www.oliverdavies.uk/assets/images/meetups/drupal-bristol.jpeg" alt="Drupal Bristol logo" > </a> </li> <li class="meetups--drupalcamp-bristol"> <a href="http://www.drupalcampbristol.co.uk" title="DrupalCamp Bristol"> <img src="//www.oliverdavies.uk/assets/images/meetups/drupalcamp-bristol.png" alt="DrupalCamp Bristol logo" > </a> </li> <li class="meetups--phpsw"> <a href="http://phpsw.uk" title="PHPSW"> <img src="//www.oliverdavies.uk/assets/images/meetups/phpsw.jpeg" alt="PHPSW logo" > </a> </li> </ul> </div> </footer> <script src="https://www.oliverdavies.uk/assets/js/site.js"></script> <script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-11967257-1', 'auto'); ga('send', 'pageview');</script> </body> </html>