1 theme.inc _backdrop_theme_initialize($theme, $base_themes = array(), $registry_callback = '_theme_load_registry')

Initializes the theme system given already loaded information.

This function is useful to initialize a theme when no database is present.

Parameters

stdClass $theme: An object with the following information:

  • filename: The .info file for this theme. The 'path' to the theme will be in this file's directory.
  • owner: The path to the .theme file or the .engine file to load for the theme.
  • stylesheet: (optional) The primary stylesheet for the theme.
  • engine: (optional) The name of theme engine to use.

array $base_themes: An optional array of objects that represent the 'base theme' if the theme is meant to be derivative of another theme. It requires the same information as the $theme object. It should be in 'oldest first' order, meaning the top level of the chain will be first.

string $registry_callback: The callback to invoke to set the theme registry.

File

core/includes/theme.inc, line 150
The theme system, which controls the output of Backdrop.

Code

function _backdrop_theme_initialize($theme, $base_themes = array(), $registry_callback = '_theme_load_registry') {
  global $theme_info, $base_theme_info, $theme_engine, $theme_path;
  $theme_info = $theme;
  $base_theme_info = $base_themes;

  $theme_path = dirname($theme->filename);

  // Prepare stylesheets from this theme as well as all ancestor themes.
  // We work it this way so that we can have child themes override parent
  // theme stylesheets.
  $final_stylesheets = array();

  // Grab stylesheets from base theme.
  foreach ($base_themes as $base) {
    if (!empty($base->stylesheets)) {
      foreach ($base->stylesheets as $media => $stylesheets) {
        foreach ($stylesheets as $name => $stylesheet) {
          $final_stylesheets[$media][$name] = $stylesheet;
        }
      }
    }
  }

  // Add stylesheets used by this theme.
  if (!empty($theme->stylesheets)) {
    foreach ($theme->stylesheets as $media => $stylesheets) {
      foreach ($stylesheets as $name => $stylesheet) {
        $final_stylesheets[$media][$name] = $stylesheet;
      }
    }
  }

  // And now add the stylesheets properly.
  foreach ($final_stylesheets as $media => $stylesheets) {
    foreach ($stylesheets as $stylesheet) {
      backdrop_add_css($stylesheet, array('group' => CSS_THEME, 'every_page' => TRUE, 'media' => $media));
    }
  }

  // Do basically the same as the above for scripts.
  $final_scripts = array();

  // Grab scripts from base theme.
  foreach ($base_themes as $base) {
    if (!empty($base->scripts)) {
      foreach ($base->scripts as $key => $value) {
        if (is_string($value)) {
          // Empty scope defaults to 'header'.
          $final_scripts['header'][$key] = $value;
        }
        else {
          foreach ($value as $name => $script) {
            $final_scripts[$key][$name] = $script;
          }
        }
      }
    }
  }

  // Add scripts used by this theme.
  if (!empty($theme->scripts)) {
    foreach ($theme->scripts as $key => $value) {
      if (is_string($value)) {
        // Empty scope defaults to 'header'.
        $final_scripts['header'][$key] = $value;
      }
      else {
        foreach ($value as $name => $script) {
          $final_scripts[$key][$name] = $script;
        }
      }
    }
  }

  // Add scripts used by this theme.
  foreach ($final_scripts as $scope => $scripts) {
    foreach ($scripts as $script) {
      backdrop_add_js($script, array('group' => JS_THEME, 'every_page' => TRUE, 'scope' => $scope));
    }
  }

  $theme_engine = NULL;

  // Initialize the theme.
  if (isset($theme->engine)) {
    // Include the engine.
    include_once BACKDROP_ROOT . '/' . $theme->owner;

    $theme_engine = $theme->engine;
    if (function_exists($theme_engine . '_init')) {
      foreach ($base_themes as $base) {
        call_user_func($theme_engine . '_init', $base);
      }
      call_user_func($theme_engine . '_init', $theme);
    }
  }
  else {
    // include non-engine theme files
    foreach ($base_themes as $base) {
      // Include the theme file or the engine.
      if (!empty($base->owner)) {
        include_once BACKDROP_ROOT . '/' . $base->owner;
      }
    }
    // and our theme gets one too.
    if (!empty($theme->owner)) {
      include_once BACKDROP_ROOT . '/' . $theme->owner;
    }
  }

  if (isset($registry_callback)) {
    _theme_registry_callback($registry_callback, array($theme, $base_themes, $theme_engine));
  }
}