Skip to content
template.php 12.9 KiB
Newer Older
 * @file
 * File which contains theme overrides for the Zen theme.
 * The template.php file is one of the most useful files when creating or
John Albin Wilkins's avatar
John Albin Wilkins committed
 * modifying Drupal themes. You can add new regions for block content, modify or
 * override Drupal's theme functions, intercept or make additional variables
 * available to your theme, and create custom PHP logic. For more information,
 * please visit the Theme Developer's Guide on Drupal.org:
 * http://drupal.org/theme-guide
 *
 * NOTE ABOUT ZEN'S TEMPLATE.PHP FILE
 *
 * The base Zen theme is designed to be easily extended by its sub-themes. You
 * shouldn't modify this or any of the CSS or PHP files in the root zen/ folder.
 * See the online documentation for more information:
 *   http://drupal.org/node/193318
/*
 * To make this file easier to read, we split up the code into managable parts.
 * Theme developers are likely to only be interested in functions that are in
 * this main template.php file.
 */

// Initialize theme settings
include_once 'theme-settings-init.php';

// Tabs and menu functions
include_once 'template-menus.php';


/**
 * Return a themed breadcrumb trail.
 * @param $breadcrumb
 *   An array containing the breadcrumb links.
 * @return
 *   A string containing the breadcrumb output.
function phptemplate_breadcrumb($breadcrumb) {
  $show_breadcrumb = theme_get_setting('zen_breadcrumb');
  $show_breadcrumb_home = theme_get_setting('zen_breadcrumb_home');
  $breadcrumb_separator = theme_get_setting('zen_breadcrumb_separator');
  $trailing_separator = theme_get_setting('zen_breadcrumb_trailing') ? $breadcrumb_separator : '';

  // Determine if we are to display the breadcrumb
  if ($show_breadcrumb == 'yes' || $show_breadcrumb == 'admin' && arg(0) == 'admin') {
    if (!$show_breadcrumb_home) {
      // Optionally get rid of the homepage link
      array_shift($breadcrumb);
    }
    if (!empty($breadcrumb)) {
      // Return the breadcrumb with separators
      return '<div class="breadcrumb">'. implode($breadcrumb_separator, $breadcrumb) ."$trailing_separator</div>";
    }
  // Otherwise, return an empty string
  return '';
 * CREATE OR MODIFY VARIABLES FOR YOUR THEME
 * The most powerful functions available to themers are the
 * THEME_preprocess_HOOK() functions. They allow you to pass newly created
 * variables to different template (tpl.php) files in your theme. Or even unset
 * ones you don't want to use.
 * It works by switching on the hook, or name of the theme function, such as:
 *   - page
 *   - node
 *   - comment
 *   - block
 * By switching on this hook you can send different variables to page.tpl.php
 * file, node.tpl.php (and any other derivative node template file, like
 * node-forum.tpl.php), comment.tpl.php, and block.tpl.php.
 * Override or insert PHPTemplate variables into all templates.
 *   A sequential array of variables to pass to the theme template.
  global $user;
John Albin Wilkins's avatar
John Albin Wilkins committed

  // Set a new $is_admin variable. This is determined by looking at the
  // currently logged in user and seeing if they are in the role 'admin'. The
  // 'admin' role will need to have been created manually for this to work this
  // variable is available to all templates.
  $vars['is_admin'] = in_array('admin', $user->roles);

  // Send a new variable, $logged_in, to tell us if the current user is
  // logged in or out. An anonymous user has a user id of 0.
  $vars['logged_in'] = ($user->uid > 0) ? TRUE : FALSE;
}

/**
 * Override or insert PHPTemplate variables into the page templates.
 *
 * @param $vars
 *   A sequential array of variables to pass to the theme template.
 */
function phptemplate_preprocess_page(&$vars) {
  global $theme;

  // These next lines add additional CSS files and redefine
  // the $css and $styles variables available to your page template
John Albin Wilkins's avatar
John Albin Wilkins committed
  if ($theme == 'zen') { // If we're in the main theme
    // Load the stylesheet for a liquid layout
    if (theme_get_setting('zen_layout') == 'border-politics-liquid') {
      drupal_add_css($vars['directory'] .'/layout-liquid.css', 'theme', 'all');
    }
    // Or load the stylesheet for a fixed width layout
    else {
      drupal_add_css($vars['directory'] .'/layout-fixed.css', 'theme', 'all');
    }
    // Avoid IE5 bug that always loads @import print stylesheets
    $vars['head'] = zen_add_print_css($vars['directory'] .'/print.css');
  }
John Albin Wilkins's avatar
John Albin Wilkins committed
  // Optionally add the block editing styles.
  if (theme_get_setting('zen_block_editing')) {
    drupal_add_css(path_to_zentheme() .'/block-editing.css', 'theme', 'all');
  // Optionally add the wireframes style.
  if (theme_get_setting('zen_wireframes')) {
    drupal_add_css(path_to_zentheme() .'/wireframes.css', 'theme', 'all');
  }
  $vars['css'] = drupal_add_css();
  $vars['styles'] = drupal_get_css();

  // Allow sub-themes to have an ie.css file
John Albin Wilkins's avatar
John Albin Wilkins committed
  $vars['zentheme_directory'] = path_to_zentheme();
John Albin Wilkins's avatar
John Albin Wilkins committed
  // Don't display empty help from node_help().
  if ($vars['help'] == "<div class=\"help\"><p></p>\n</div>") {
    $vars['help'] = '';
  }

  // Classes for body element. Allows advanced theming based on context
  // (home page, node of certain type, etc.)
  $body_classes = array($vars['body_classes']);
  if (!$vars['is_front']) {
    // Add unique classes for each page and website section
    $path = drupal_get_path_alias($_GET['q']);
    list($section,) = explode('/', $path, 2);
    $body_classes[] = zen_id_safe('page-'. $path);
    $body_classes[] = zen_id_safe('section-'. $section);
John Albin Wilkins's avatar
John Albin Wilkins committed
    if (arg(0) == 'node') {
      if (arg(1) == 'add') {
        if ($section == 'node') {
          array_pop($body_classes); // Remove 'section-node'
        }
        $body_classes[] = 'section-node-add'; // Add 'section-node-add'
      }
      elseif (is_numeric(arg(1)) && (arg(2) == 'edit' || arg(2) == 'delete')) {
        if ($section == 'node') {
          array_pop($body_classes); // Remove 'section-node'
        }
        $body_classes[] = 'section-node-'. arg(2); // Add 'section-node-edit' or 'section-node-delete'
      }
    }
John Albin Wilkins's avatar
John Albin Wilkins committed
  $vars['body_classes'] = implode(' ', $body_classes); // Concatenate with spaces
/**
 * Override or insert PHPTemplate variables into the node templates.
 *
 * @param $vars
 *   A sequential array of variables to pass to the theme template.
 */
function phptemplate_preprocess_node(&$vars) {
  global $user;

  // Special classes for nodes
  $node_classes = array();
  if ($vars['sticky']) {
    $node_classes[] = 'sticky';
  }
  if (!$vars['node']->status) {
    $node_classes[] = 'node-unpublished';
John Albin Wilkins's avatar
John Albin Wilkins committed
    $vars['unpublished'] = TRUE;
  }
  else {
    $vars['unpublished'] = FALSE;
  }
  if ($vars['node']->uid && $vars['node']->uid == $user->uid) {
    // Node is authored by current user
    $node_classes[] = 'node-mine';
  if ($vars['teaser']) {
    // Node is displayed as teaser
    $node_classes[] = 'node-teaser';
  }
  // Class for node type: "node-type-page", "node-type-story", "node-type-my-custom-type", etc.
  $node_classes[] = 'node-type-'. $vars['node']->type;
John Albin Wilkins's avatar
John Albin Wilkins committed
  $vars['node_classes'] = implode(' ', $node_classes); // Concatenate with spaces
/**
 * Override or insert PHPTemplate variables into the comment templates.
 *
 * @param $vars
 *   A sequential array of variables to pass to the theme template.
 */
function phptemplate_preprocess_comment(&$vars) {
  global $user;

  // We load the node object that the current comment is attached to
  $node = node_load($vars['comment']->nid);
  // If the author of this comment is equal to the author of the node, we
  // set a variable so we can theme this comment uniquely.
  $vars['author_comment'] = $vars['comment']->uid == $node->uid ? TRUE : FALSE;

  $comment_classes = array();

  // Odd/even handling
  static $comment_odd = TRUE;
  $comment_classes[] = $comment_odd ? 'odd' : 'even';
  $comment_odd = !$comment_odd;
  if ($vars['comment']->status == COMMENT_NOT_PUBLISHED) {
    $comment_classes[] = 'comment-unpublished';
John Albin Wilkins's avatar
John Albin Wilkins committed
    $vars['unpublished'] = TRUE;
  }
  else {
    $vars['unpublished'] = FALSE;
  }
  if ($vars['author_comment']) {
    // Comment is by the node author
    $comment_classes[] = 'comment-by-author';
  }
  if ($vars['comment']->uid == 0) {
    // Comment is by an anonymous user
    $comment_classes[] = 'comment-by-anon';
  }
  if ($user->uid && $vars['comment']->uid == $user->uid) {
    // Comment was posted by current user
    $comment_classes[] = 'comment-mine';
  }
  $vars['comment_classes'] = implode(' ', $comment_classes);

  // If comment subjects are disabled, don't display 'em
  if (variable_get('comment_subject_field', 1) == 0) {
    $vars['title'] = '';
  }
John Albin Wilkins's avatar
John Albin Wilkins committed
/**
 * Override or insert PHPTemplate variables into the block templates.
 *
 * @param $vars
 *   A sequential array of variables to pass to the theme template.
 */
function phptemplate_preprocess_block(&$vars) {
John Albin Wilkins's avatar
John Albin Wilkins committed
  $block = $vars['block'];

  // Special classes for blocks
  $block_classes = array();
  $block_classes[] = 'block-'. $block->module;
  $block_classes[] = 'region-'. $vars['block_zebra'];
  $block_classes[] = $vars['zebra'];
  $block_classes[] = 'region-count-'. $vars['block_id'];
  $block_classes[] = 'count-'. $vars['id'];
  $vars['block_classes'] = implode(' ', $block_classes);

John Albin Wilkins's avatar
John Albin Wilkins committed
  if (theme_get_setting('zen_block_editing') && user_access('administer blocks')) {
    // Display 'edit block' for custom blocks
    if ($block->module == 'block') {
      $edit_links[] = l('<span>'. t('edit block') .'</span>', 'admin/build/block/configure/'. $block->module .'/'. $block->delta,
        array(
          'attributes' => array(
            'title' => t('edit the content of this block'),
            'class' => 'block-edit',
          ),
          'query' => drupal_get_destination(),
          'html' => TRUE,
        )
      );
John Albin Wilkins's avatar
John Albin Wilkins committed
    }
    // Display 'configure' for other blocks
    else {
      $edit_links[] = l('<span>'. t('configure') .'</span>', 'admin/build/block/configure/'. $block->module .'/'. $block->delta,
        array(
          'attributes' => array(
            'title' => t('configure this block'),
            'class' => 'block-config',
          ),
          'query' => drupal_get_destination(),
          'html' => TRUE,
        )
      );
John Albin Wilkins's avatar
John Albin Wilkins committed
    }

    // Display 'administer views' for views blocks
    if ($block->module == 'views' && user_access('administer views')) {
      $edit_links[] = l('<span>'. t('edit view') .'</span>', 'admin/build/views/'. $block->delta .'/edit',
        array(
          'attributes' => array(
            'title' => t('edit the view that defines this block'),
            'class' => 'block-edit-view',
          ),
          'query' => drupal_get_destination(),
          'fragment' => 'edit-block',
          'html' => TRUE,
        )
      );
John Albin Wilkins's avatar
John Albin Wilkins committed
    }
    // Display 'edit menu' for menu blocks
    elseif (($block->module == 'menu' || ($block->module == 'user' && $block->delta == 1)) && user_access('administer menu')) {
      $menu_name = ($block->module == 'user') ? 'navigation' : $block->delta;
      $edit_links[] = l('<span>'. t('edit menu') .'</span>', 'admin/build/menu-customize/'. $menu_name,
        array(
          'attributes' => array(
            'title' => t('edit the menu that defines this block'),
            'class' => 'block-edit-menu',
          ),
          'query' => drupal_get_destination(),
          'html' => TRUE,
        )
      );
John Albin Wilkins's avatar
John Albin Wilkins committed
    }
    $vars['edit_links_array'] = $edit_links;
    $vars['edit_links'] = '<div class="edit">'. implode(' ', $edit_links) .'</div>';
  }
}

 * Converts a string to a suitable html ID attribute.
 *
 * - Preceeds initial numeric with 'n' character.
John Albin Wilkins's avatar
John Albin Wilkins committed
 * - Replaces any character except A-Z, numbers, and underscores with dashes.
 * - Converts entire string to lowercase.
 * - Works for classes too!
 *
John Albin Wilkins's avatar
John Albin Wilkins committed
 * @param $string
 *   The string
 * @return
 *   The converted string
 */
function zen_id_safe($string) {
  if (is_numeric($string{0})) {
    // If the first character is numeric, add 'n' in front
John Albin Wilkins's avatar
John Albin Wilkins committed
  return strtolower(preg_replace('/[^a-zA-Z0-9_-]+/', '-', $string));

/**
 * Adds a print stylesheet to the page's $head variable.
 *
 * This is a work-around for a serious bug in IE5 in which it loads print
 * stylesheets for screen display when using an @import method, Drupal's default
 * method when using drupal_add_css().
 *
John Albin Wilkins's avatar
John Albin Wilkins committed
 * @param $url
 *   The URL of the print stylesheet
 * @return
 *   All the rendered links for the $head variable
 */
function zen_add_print_css($url) {
  global $base_path;
  return drupal_set_html_head(
    '<link'.
    drupal_attributes(
      array(
        'rel' => 'stylesheet',
        'href' => $base_path . $url,
        'type' => 'text/css',
        'media' => 'print',
      )
    ) ." />\n"
  );
}

/**
 * Return the path to the main zen theme directory.
 */
function path_to_zentheme() {
  static $theme_path;
  if (!isset($theme_path)) {
    global $theme;
    if ($theme == 'zen') {
      $theme_path = path_to_theme();
    }
    else {
      $theme_path = drupal_get_path('theme', 'zen');
    }
  }
  return $theme_path;
}