Commit 951b553a authored by Dries's avatar Dries

- Committed stage 2 of the theme system improvements!  Patch by CodeMonkeyX.
parent 00ee7f74
......@@ -1186,6 +1186,5 @@ function drupal_page_footer() {
$locale = locale_init();
// initialize theme:
$theme = theme_init();
$theme = init_theme();
?>
......@@ -28,7 +28,7 @@ function pager_display($tags = "", $limit = 10, $element = 0, $type = "default",
*
* @see pager_display
*/
function pager_display_default($tags = "", $limit = 10, $element = 0, $attributes = array()) {
function theme_pager_display_default($tags = "", $limit = 10, $element = 0, $attributes = array()) {
global $pager_total;
if ($pager_total[$element] > $limit) {
$output .= "<div id=\"pager\" class=\"container-inline\">";
......@@ -51,13 +51,13 @@ function pager_display_default($tags = "", $limit = 10, $element = 0, $attribute
*
* @see pager_display
*/
function pager_display_simple($tags = "", $limit = 10, $element = 0, $attributes = array()) {
function theme_pager_display_simple($tags = "", $limit = 10, $element = 0, $attributes = array()) {
/*
** It's left as an exercise to theme writers to create an alternative
** pager for pager_display_simple(). if your theme does not offer a
** replacement, the theme.inc pager_display_default() is used.
*/
return pager_display_default($tags, $limit, $element, $attributes);
return theme_pager_display_default($tags, $limit, $element, $attributes);
}
/**
......@@ -68,13 +68,13 @@ function pager_display_simple($tags = "", $limit = 10, $element = 0, $attributes
*
* @see pager_display
*/
function pager_display_admin($tags = "", $limit = 10, $element = 0, $attributes = array()) {
function theme_pager_display_admin($tags = "", $limit = 10, $element = 0, $attributes = array()) {
/*
** It's left as an exercise to theme writers to create an alternative
** pager for pager_display_admin(). if your theme does not offer a
** replacement, the pager.inc pager_display_default() is used.
*/
return pager_display_default($tags, $limit, $element, $attributes);
return theme_pager_display_default($tags, $limit, $element, $attributes);
}
/* *******************************************************************
......
<?php
// $Id$
/**
* Basic theme
*
* @package theme system
*/
Theme System - controls the output of Drupal.
The theme system allows for nearly all output of the Drupal system to be
customized by user themes.
function theme_help($section) {
@package theme_system
$ouptout = "";
@defgroup theme_system
@{
**/
switch ($section) {
case 'admin/system/themes#description':
$output = t("The base theme");
break;
}
/* $Id$ */
return $output;
}
/**
Returns the theme header.
class BaseTheme {
}
@param $title (optional) override the page title.
@return a string contraining the \a header output.
**/
function theme_header($title = "") {
global $base_url;
......@@ -31,27 +27,69 @@ function theme_header($title = "") {
$output .= "<html xmlns=\"http://www.w3.org/1999/xhtml\">";
$output .= "<head><title>". $title ? $title : variable_get(site_name, "drupal") ."</title>";
$output .= theme_head($main);
$output .= "</head><body style=\"background-color: #fff; color: #000;\"". theme_onload_attribute(). "\">";
$output .= "</head><body style=\"background-color: #fff; color: #000;\"". theme("onload_attribute"). "\">";
$output .= "<table border=\"0\" cellspacing=\"4\" cellpadding=\"4\"><tr><td style=\"vertical-align: top; width: 170px;\">";
print $output;
theme("box", t("Navigation"), @implode("<br />", link_page()));
theme_blocks("all", $this);
print "</td><td style=\"vertical-align: top;\">";
$output .= theme("box", t("Navigation"), @implode("<br />", link_page()));
$output .= render_blocks("all");
$output .= "</td><td style=\"vertical-align: top;\">";
return $output;
}
/**
Returns themed set of links.
@param $links an array of \a links to be themed.
@param $delimiter (optional) \a delimiter used to seperate the links.
@return a string contraining the \a links output.
**/
function theme_links($links, $delimiter = " | ") {
return implode($delimiter, $links);
}
/**
Returns themed image.
@param $name the \a name of the image file.
@return a string contraining the \a image output.
**/
function theme_image($name) {
return "misc/$name";
}
/**
Returns a themed breadcrumb menu.
@param $breadcrumb an array containing the breadcrumb links.
@return a string contraining the \a breadcrumb output.
**/
function theme_breadcrumb($breadcrumb) {
print "<div class=\"breadcrumb\">". implode($breadcrumb, " &raquo; ") ."</div>";
return "<div class=\"breadcrumb\">". implode($breadcrumb, " &raquo; ") ."</div>";
}
/**
Returns themed node.
The passed $node object provides a all relevant information for displaying a node:
\li \c $node->nid
\li \c $node->type i.e. story, blog, forum.
\li \c $node->title
\li \c $node->created a unix timestamp.
\li \c $node->teaser
\li \c $node->body
\li \c $node->changed a unix timestamp.
\li \c $node->uid the id of the poster.
\li \c $node->username the username of the poster.
@param $node the \a node to be themed.
@param $main
@return a string contraining the \a node output.
**/
function theme_node($node, $main) {
if (module_exist("taxonomy")) {
$terms = taxonomy_link("taxonomy terms", $node);
......@@ -60,7 +98,7 @@ function theme_node($node, $main) {
$output = "<h2>$node->title</h2> by ". format_name($node);
if (count($terms)) {
$output .= " <small>(". theme("links", $terms) .")</small><br />";
$output .= " <small>(". print theme("links", $terms) .")</small><br />";
}
if ($main && $node->teaser) {
......@@ -71,58 +109,77 @@ function theme_node($node, $main) {
}
if ($links = link_node($node, $main)) {
$output .= "<br />[ ". theme("links", $links) ." ]";
$output .= "<br />[ ". print theme("links", $links) ." ]";
}
$output .= "<hr />";
print $output;
return $output;
}
/**
Returns themed box.
@param $subject the \a subject of the box.
@param $content the \a content of the box.
@param $requion the \a region of the box.
@return a string contraining the \a box output.
**/
function theme_box($subject, $content, $region = "main") {
$output = "<h2>$subject</h2><p>$content</p>";
print $output;
return $output;
}
/**
* Render a block.
*
* You can style your blocks by defining .block (all blocks),
* .block-<i>module</i> (all blocks of module <i>module</i>),
* and \#block-<i>module</i>-<i>delta</i> (specific block of
* module <i>module</i> with delta <i>delta</i>) in your
* theme's CSS.
*
* @param $block object "indexed with" fields from database
* table 'blocks' ($block->module, $block->delta, $block->region,
* ...) and fields returned by <i>module</i>_block("view")
* ($block->subject, $block->content, ...).
*/
Returns a themed block.
You can style your blocks by defining .block (all blocks),
.block-<i>module</i> (all blocks of module <i>module</i>),
and \#block-<i>module</i>-<i>delta</i> (specific block of
module <i>module</i> with delta <i>delta</i>) in your
theme's CSS.
@param $block object "indexed with" fields from database table 'blocks' ($block->module, $block->delta, $block->region, ...) and fields returned by <i>module</i>_block("view") ($block->subject, $block->content, ...).
@return a string contraining the \a box output.
**/
function theme_block($block) {
$output = "<div class=\"block block-$block->module\" id=\"block-$block->module-$block->delta\">";
$output .= " <h3>$block->subject</h3>";
$output .= " <div class=\"content\">$block->content</div>";
$output .= "</div>";
print $output;
return $output;
}
/**
Returns themed page footer.
@return a string contraining the \a footer output.
**/
function theme_footer() {
$output = "</td></tr></table>";
$output .= theme_closure();
$output .= "</body></html>";
print $output;
return $output;
}
/**
* Return a marker. Used to indicate new comments or required form
* fields.
*/
Returns themed marker, useful for marking new comments or required form elements.
@return a string contraining the \a mark output.
**/
function theme_mark() {
return "<span class=\"marker\">*</span>";
}
/**
* Return a formatted array of items.
*/
Returns themed list of items.
@param $items (optional) an array of the items to be displayed in a list.
@param $title (optional) the title of the list.
@return a string contraining the \a list output.
**/
function theme_item_list($items = array(), $title = NULL) {
$output .= "<div class=\"item-list\">";
if (isset($title)) {
......@@ -141,32 +198,23 @@ function theme_item_list($items = array(), $title = NULL) {
}
/**
* Return an error message.
*/
Returns themed error message.
@param $message the error message to be themed.
@return a string contraining the \a error output.
**/
function theme_error($message) {
return "<div class=\"error\">$message</div>";
}
function theme_list($refresh = 0) {
static $list;
/**
Execute hook _head which is run at the start of the page, and output should be in the head tags.
if ($refresh) {
unset($list);
}
if (!$list) {
$list = array();
$result = db_query("SELECT * FROM {system} where type = 'theme' AND status = '1' ORDER BY name");
while ($theme = db_fetch_object($result)) {
if (file_exists($theme->filename)) {
$list[$theme->name] = $theme;
}
}
}
return $list;
}
@param $main (optional)
@return a string contraining the \a error output.
**/
function theme_head($main = 0) {
global $base_url;
$output .= "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />";
......@@ -180,95 +228,165 @@ function theme_head($main = 0) {
}
/**
* Execute hook _footer() which is run at the end of the page right
* before the </body> tag
*/
Execute hook _footer() which is run at the end of the page right
before the </body> tag.
@param $main (optional)
@return a string contraining the \a cloasure output.
**/
function theme_closure($main = 0) {
$footer = module_invoke_all("footer", $main);
return implode($footer, "\n");
}
function theme_init() {
global $user;
/**
Call _onload hook in all modules to enable modules to insert javascript
that will get run once the page has been loaded by the browser.
$themes = theme_list();
$name = $user->theme ? $user->theme : variable_get("theme_default", 0);
@param $theme_onloads (optional) addition onload directives.
if (is_object($themes[$name])) {
include_once($themes[$name]->filename);
$class = "Theme_$name";
$instance =& new $class();
$instance->path = dirname($themes[$name]->filename);
@return a string contraining the \a onload output.
**/
function theme_onload_attribute($theme_onloads = array()) {
if (!is_array($theme_onloads)) {
$theme_onloads = array($theme_onloads);
}
else {
$instance =& new BaseTheme;
// Merge theme onloads (javascript rollovers, image preloads, etc.)
// with module onloads (htmlarea, etc.)
$onloads = array_merge(module_invoke_all("onload"), $theme_onloads);
if (count($onloads)) {
return " onload=\"" . implode("; ", $onloads) . "\"";
}
$instance->theme = $name;
return $instance;
return "";
}
/**
* Render blocks available for (global) $user and $region calling $theme->block($block).
*
* @param $region main|left|right
*/
function theme_blocks($region) {
Render blocks available for (global) $user and $region calling $theme->block($block).
@param $region main|left|right
@return a string contraining the \a blocks output.
**/
function render_blocks($region) {
global $user;
$result = db_query("SELECT * FROM {blocks} WHERE (status = '1' OR custom = '1') ". ($region != "all" ? "AND region = %d " : "") ."ORDER BY weight, module", $region == "left" ? 0 : 1);
$output = "";
while ($result && ($block = db_fetch_array($result))) {
if ((($block['status'] && (!$user->uid || !$block['custom'])) || ($block['custom'] && $user->block[$block['module']][$block['delta']])) && (!$block['path'] || preg_match($block['path'], str_replace("?q=", "", request_uri())))) {
$block = array_merge($block, module_invoke($block['module'], 'block', 'view', $block['delta']));
if ($block['content']) {
theme('block', (object) $block);
$output .= theme('block', (object)$block);
}
}
}
return $output;
}
function theme() {
global $theme;
/**
Hook Help - returns theme specific help and information.
$args = func_get_args();
@param section defines the \a section of the help to be returned.
$function = array_shift($args);
$name = $theme->theme;
@return a string contraining the help output.
**/
function theme_help($section) {
$ouptout = "";
if (function_exists($name ."_". $function)) {
return call_user_func_array($name ."_". $function, $args);
switch ($section) {
case 'admin/system/themes#description':
$output = t("The base theme");
break;
}
else if (method_exists($theme, $function)) {
return call_user_method_array($function, $theme, $args);
// temporary fall-back; can be removed as soon the $theme-object is no more
return $output;
}
/**
Provides a list of currently avalible themes.
@param $refresh
@return an array of the currently avalible themes.
**/
function list_themes($refresh = 0) {
static $list;
if ($refresh) {
unset($list);
}
else if (function_exists("theme_". $function)) {
return call_user_func_array("theme_". $function, $args);
if (!$list) {
$list = array();
$result = db_query("SELECT * FROM {system} where type = 'theme' AND status = '1' ORDER BY name");
while ($theme = db_fetch_object($result)) {
if (file_exists($theme->filename)) {
$list[$theme->name] = $theme;
}
}
}
else {
return call_user_func_array($function, $args);
// temporary fall-back; can be removed as soon the $theme-object is no more
return $list;
}
/**
Initialized the theme system.
@return the name of the currently selected theme.
**/
function init_theme() {
global $user;
$themes = list_themes();
$name = $user->theme ? $user->theme : variable_get("theme_default", 0);
$theme->path = "";
$theme->name = "";
if (is_object($themes[$name])) {
include_once($themes[$name]->filename);
$theme->path = dirname($themes[$name]->filename);
$theme->name = $name;
}
return $theme;
}
/**
* Call _onload hook in all modules to enable modules to insert javascript
* that will get run once the page has been loaded by the browser
*/
function theme_onload_attribute($theme_onloads = array()) {
if (!is_array($theme_onloads)) {
$theme_onloads = array($theme_onloads);
Returns the path to the currently selected theme.
@return the path to the the currently selected theme.
**/
function path_to_theme() {
global $theme;
return $theme->path;
}
/**
External interface of the theme system to all other modules, and core files.
All requests for themed functions must go through this function. It examines
the request and routes it to the appropriate theme function. If the current
theme does not implement the requested function, then the base theme function
is called.
Example: \verbatim $header_text = theme("header"); \endverbatim
@return the path to the the currently selected theme.
**/
function theme() {
global $theme;
$args = func_get_args();
$function = array_shift($args);
if (($theme->name != "") && (function_exists($theme->name ."_". $function))) {
return call_user_func_array($theme->name ."_". $function, $args);
}
// Merge theme onloads (javascript rollovers, image preloads, etc.)
// with module onloads (htmlarea, etc.)
$onloads = array_merge(module_invoke_all("onload"), $theme_onloads);
if (count($onloads)) {
return " onload=\"" . implode("; ", $onloads) . "\"";
elseif (function_exists("theme_". $function)){
return call_user_func_array("theme_". $function, $args);
}
return;
}
/** @} End of defgroup theme_system **/
?>
......@@ -124,7 +124,7 @@ function import_update() {
}
}
function import_theme_format_item($item, $feed = 0) {
function theme_import_format_item($item, $feed = 0) {
global $user;
if ($user->uid && module_exist("blog") && user_access("maintain personal blog")) {
......@@ -148,7 +148,7 @@ function import_bundle_block($attributes) {
$items = array();
while ($item = db_fetch_object($result)) {
$items[] = theme("import_theme_format_item", $item);
$items[] = theme("import_format_item", $item);
}
$output = "<div class=\"import-block\"><div class=\"bundle\">";
......@@ -163,11 +163,11 @@ function import_feed_block($feed) {
$items = array();
while ($item = db_fetch_object($result)) {
$items[] = theme("import_theme_format_item", $item);
$items[] = theme("import_format_item", $item);
}
$output = "<div class=\"import-block\"><div class=\"feed\">";
$output .= theme("theme_item_list", $items);
$output .= theme("item_list", $items);
$output .= "</div></div>";
return $output;
......@@ -656,10 +656,10 @@ function import_page_last() {
}
$output .= "</table>\n";
theme("header");
theme("box", t("News feeds"), import_page_info());
theme("box", t("Latest news"), $output);
theme("footer");
print theme("header");
print theme("box", t("News feeds"), import_page_info());
print theme("box", t("Latest news"), $output);
print theme("footer");
}
function import_page_feed($fid) {
......@@ -691,11 +691,11 @@ function import_page_feed($fid) {
}
$output .= "</table>\n";
theme("header");
theme("box", t("News feeds"), import_page_info());
theme("box", $feed->title, $header);
theme("box", t("Latest news"), $output);
theme("footer");
print theme("header");
print theme("box", t("News feeds"), import_page_info());
print theme("box", $feed->title, $header);
print theme("box", t("Latest news"), $output);
print theme("footer");
}
function import_page_bundle($bid) {
......@@ -730,11 +730,11 @@ function import_page_bundle($bid) {
}
$output .= "</table>\n";
theme("header");
theme("box", t("News feeds"), import_page_info());
theme("box", $bundle->title, $header);
theme("box", t("Latest news"), $output);
theme("footer");
print theme("header");
print theme("box", t("News feeds"), import_page_info());
print theme("box", $bundle->title, $header);
print theme("box", t("Latest news"), $output);
print theme("footer");
}
......@@ -750,10 +750,10 @@ function import_page_sources() {
$output .= "<div style=\"xml-icon\">". l("<img src=\"". theme("image", "xml.gif") ."\" width=\"36\" height=\"14\" style=\"border: 0px;\" />", "import/fd", array("title" => t("View the list of syndicated web sites in XML format."))) ."</div><br />";
theme("header");
theme("box", t("News feeds"), import_page_info());
theme("box", t("News sources"), $output);
theme("footer");
print theme("header");
print theme("box", t("News feeds"), import_page_info());
print theme("box", t("News sources"), $output);
print theme("footer");
}
function import_page_fd() {
......@@ -788,8 +788,8 @@ function import_page_feeds() {
function import_page_blocks($blocks) {
theme("header");
theme("box", t("News feeds"), import_page_info());
print theme("header");
print theme("box", t("News feeds"), import_page_info());