7 theme.inc template_preprocess_page(&$variables)
6 theme.inc template_preprocess_page(&$variables)
8 theme.inc template_preprocess_page(&$variables)

Preprocess variables for page.tpl.php

Most themes utilize their own copy of page.tpl.php. The default is located inside "modules/system/page.tpl.php". Look in there for the full list of variables.

Uses the arg() function to generate a series of page template suggestions based on the current path.

Any changes to variables in this preprocessor should also be changed inside template_preprocess_maintenance_page() to keep all of them consistent.

See also

drupal_render_page()

template_process_page()

page.tpl.php

File

includes/theme.inc, line 2617
The theme system, which controls the output of Drupal.

Code

function template_preprocess_page(&$variables) {
  // Move some variables to the top level for themer convenience and template cleanliness.
  $variables ['show_messages'] = $variables ['page']['#show_messages'];

  foreach (system_region_list($GLOBALS ['theme']) as $region_key => $region_name) {
    if (!isset($variables ['page'][$region_key])) {
      $variables ['page'][$region_key] = array();
    }
    if ($region_content = drupal_get_region_content($region_key)) {
      $variables ['page'][$region_key][]['#markup'] = $region_content;
    }
  }

  // Set up layout variable.
  $variables ['layout'] = 'none';
  if (!empty($variables ['page']['sidebar_first'])) {
    $variables ['layout'] = 'first';
  }
  if (!empty($variables ['page']['sidebar_second'])) {
    $variables ['layout'] = ($variables ['layout'] == 'first') ? 'both' : 'second';
  }

  $variables ['base_path'] = base_path();
  $variables ['front_page'] = url();
  $variables ['feed_icons'] = drupal_get_feeds();
  $variables ['language'] = $GLOBALS ['language'];
  $variables ['language']->dir = $GLOBALS ['language']->direction ? 'rtl' : 'ltr';
  $variables ['logo'] = theme_get_setting('logo');
  $variables ['main_menu'] = theme_get_setting('toggle_main_menu') ? menu_main_menu() : array();
  $variables ['secondary_menu'] = theme_get_setting('toggle_secondary_menu') ? menu_secondary_menu() : array();
  $variables ['action_links'] = menu_local_actions();
  $variables ['site_name'] = (theme_get_setting('toggle_name') ? filter_xss_admin(variable_get('site_name', 'Drupal')) : '');
  $variables ['site_slogan'] = (theme_get_setting('toggle_slogan') ? filter_xss_admin(variable_get('site_slogan', '')) : '');
  $variables ['tabs'] = menu_local_tabs();

  if ($node = menu_get_object()) {
    $variables ['node'] = $node;
  }

  // Populate the page template suggestions.
  if ($suggestions = theme_get_suggestions(arg(), 'page')) {
    $variables ['theme_hook_suggestions'] = $suggestions;
  }
}

Comments

You can implement this hook in a module with MODULENAME_preprocess_page.

If folks want a nice little snippet that adds a bunch of dynamic suggestions you could add...

// Do we have a node?
  if (isset($vars['node'])) {

    // Ref suggestions cuz it's stupid long.
    $suggests = &$vars['theme_hook_suggestions'];

    // Get path arguments.
    $args = arg();
    // Remove first argument of "node".
    unset($args[0]);

    // Set type.
    $type = "page__type_{$vars['node']->type}";

    // Bring it all together.
    $suggests = array_merge(
      $suggests,
      array($type),
      theme_get_suggestions($args, $type)
    );

    // if the url is: 'http://domain.com/node/123/edit'
    // and node type is 'blog'..
    // This will be the suggestions:
    //
    // - page__node
    // - page__node__%
    // - page__node__123
    // - page__node__edit
    // - page__type_blog
    // - page__type_blog__%
    // - page__type_blog__123
    // - page__type_blog__edit
    //
    // Which connects to these templates:
    //
    // - page--node.tpl.php
    // - page--node--%.tpl.php
    // - page--node--123.tpl.php
    // - page--node--edit.tpl.php
    // - page--type-blog.tpl.php          << this is what you want.
    // - page--type-blog--%.tpl.php
    // - page--type-blog--123.tpl.php
    // - page--type-blog--edit.tpl.php
    //
    // Latter items take precedence.

Theme

If you use hook_preprocess_node in a theme file, it works only for that theme. Once you change the theme, you loss the feature you add via this function.

Module

If the hook is in a module, you will have your functionality even when you swap the themes.

I've no idea about the performance implications.

$variables['title'] is available in the template_process_page:
https://api.drupal.org/api/drupal/includes%21theme.inc/function/template...