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));
}
}