Index: index.php =================================================================== RCS file: /cvs/drupal/drupal/index.php,v retrieving revision 1.94 diff -u -p -r1.94 index.php --- index.php 26 Dec 2007 08:46:48 -0000 1.94 +++ index.php 26 Jun 2008 03:21:26 -0000 @@ -21,19 +21,21 @@ $return = menu_execute_active_handler(); if (is_int($return)) { switch ($return) { case MENU_NOT_FOUND: - drupal_not_found(); + $elements = drupal_not_found(); break; case MENU_ACCESS_DENIED: - drupal_access_denied(); + $elements = drupal_access_denied(); break; case MENU_SITE_OFFLINE: - drupal_site_offline(); + $elements = drupal_site_offline(); break; } } elseif (isset($return)) { // Print any value (including an empty string) except NULL or undefined: - print theme('page', $return); + $elements = drupal_build_page($return); } +echo drupal_render_page($elements); + drupal_page_footer(); Index: includes/common.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/common.inc,v retrieving revision 1.773 diff -u -p -r1.773 common.inc --- includes/common.inc 24 Jun 2008 22:09:52 -0000 1.773 +++ includes/common.inc 26 Jun 2008 03:21:26 -0000 @@ -331,8 +331,16 @@ function drupal_site_offline() { drupal_maintenance_theme(); drupal_set_header('HTTP/1.1 503 Service unavailable'); drupal_set_title(t('Site off-line')); - print theme('maintenance_page', filter_xss_admin(variable_get('site_offline_message', - t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array('@site' => variable_get('site_name', 'Drupal')))))); + + $elements['page'] = array( + '#title' => drupal_get_title(), + '#theme' => 'maintenance_page', + '#theme arguments' => array(), + '#content' => array( + '#value' => filter_xss_admin(variable_get('site_offline_message', t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array('@site' => variable_get('site_name', 'Drupal'))))), + ), + ); + return $elements; } /** @@ -358,11 +366,11 @@ function drupal_not_found() { if (empty($return) || $return == MENU_NOT_FOUND || $return == MENU_ACCESS_DENIED) { drupal_set_title(t('Page not found')); - $return = t('The requested page could not be found.'); + $return = array('#value' => t('The requested page could not be found.')); } // To conserve CPU and bandwidth, omit the blocks. - print theme('page', $return, FALSE); + return drupal_build_page($return, FALSE, TRUE, FALSE); } /** @@ -387,9 +395,64 @@ function drupal_access_denied() { if (empty($return) || $return == MENU_NOT_FOUND || $return == MENU_ACCESS_DENIED) { drupal_set_title(t('Access denied')); - $return = t('You are not authorized to access this page.'); + $return = array('#value' => t('You are not authorized to access this page.')); } - print theme('page', $return); + return drupal_build_page($return, TRUE, TRUE, FALSE); +} + +/** + * Build a structured array with page content and theme parameters. + */ +function drupal_build_page($content, $show_blocks = TRUE, $show_messages = TRUE, $success = TRUE) { + if (!is_array($content)) { + $content = array('#value' => $content); + } + $elements['page'] = array( + '#title' => drupal_get_title(), + '#theme' => 'page', + '#theme arguments' => array($show_blocks, $show_messages, $success), + '#content' => $content, + ); + return $elements; +} + +function drupal_render_page($elements) { + $render_type = ''; + if (isset($_GET['render'])) { + $render_type = $_GET['render']; + } + // jQuery sets a HTTP_X_REQUESTED_WITH header of 'XMLHttpRequest'. + if (!$render_type) { + // Set the render type based on the request header. + if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { + $render_type = 'json'; + } + else { + $render_type = 'xhtml'; + } + } + switch ($render_type) { + case 'xhtml': + case 'html': + $render = 'drupal_render'; + break; + + default: + $render = 'drupal_render_' . $render_type; + if (!drupal_function_exists($render)) { + $render = 'drupal_render'; + } + break; + } + + return $render($elements); +} + +/** + * Render the elements into simple XML. + */ +function drupal_render_xml($elements) { + return drupal_render($elements, 'theme_xml'); } /** @@ -2699,10 +2762,13 @@ function drupal_alter($type, &$data) { * * @param $elements * The structured array describing the data to be rendered. + * @param $callback + * Optional parameter defining which funciton to use to mediate conversion of + * each elemement to a string. * @return * The rendered HTML. */ -function drupal_render(&$elements) { +function drupal_render(&$elements, $callback = 'theme') { if (!isset($elements) || (isset($elements['#access']) && !$elements['#access'])) { return NULL; } @@ -2753,16 +2819,25 @@ function drupal_render(&$elements) { $elements['#type'] = 'markup'; unset($elements['#prefix'], $elements['#suffix']); - $content = theme($elements['#theme'], $elements); + + $args[] = $elements['#theme']; + $args[] = $elements; + if (!empty($elements['#theme arguments'])) { + foreach($elements['#theme arguments'] as $value) { + $args[] = $value; + } + } + // The default $callback is 'theme'. + $content = call_user_func_array($callback, $args); foreach (array('#value', '#type', '#prefix', '#suffix') as $key) { $elements[$key] = isset($previous[$key]) ? $previous[$key] : NULL; } } - /* render each of the children using drupal_render and concatenate them */ + // Render each of the children using drupal_render and concatenate them if (!isset($content) || $content === '') { foreach ($children as $key) { - $content .= drupal_render($elements[$key]); + $content .= drupal_render($elements[$key], $callback); } } } @@ -2793,6 +2868,12 @@ function drupal_render(&$elements) { } } +function drupal_render_json($elements) { + drupal_set_header('Content-Type: text/javascript; charset=utf-8'); + + return drupal_to_js($elements); +} + /** * Function used by uasort to sort structured arrays by weight. */ @@ -2843,18 +2924,18 @@ function drupal_common_theme() { 'arguments' => array('text' => NULL) ), 'page' => array( - 'arguments' => array('content' => NULL, 'show_blocks' => TRUE, 'show_messages' => TRUE), + 'arguments' => array('elements' => NULL, 'show_blocks' => TRUE, 'show_messages' => TRUE), 'template' => 'page', ), 'maintenance_page' => array( - 'arguments' => array('content' => NULL, 'show_blocks' => TRUE, 'show_messages' => TRUE), + 'arguments' => array('elements' => NULL, 'show_blocks' => TRUE, 'show_messages' => TRUE), 'template' => 'maintenance-page', ), 'update_page' => array( - 'arguments' => array('content' => NULL, 'show_messages' => TRUE), + 'arguments' => array('elements' => NULL, 'show_messages' => TRUE), ), 'install_page' => array( - 'arguments' => array('content' => NULL), + 'arguments' => array('elements' => NULL), ), 'task_list' => array( 'arguments' => array('items' => NULL, 'active' => NULL), Index: includes/form.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/form.inc,v retrieving revision 1.275 diff -u -p -r1.275 form.inc --- includes/form.inc 25 Jun 2008 09:57:07 -0000 1.275 +++ includes/form.inc 26 Jun 2008 03:21:26 -0000 @@ -145,7 +145,8 @@ function drupal_get_form($form_id) { // If we haven't redirected to a new location by now, we want to // render whatever form array is currently in hand. - return drupal_render_form($form_id, $form); + drupal_set_form_theme($form_id, $form); + return $form; } /** @@ -586,7 +587,7 @@ function drupal_validate_form($form_id, * A string containing the path of the page to display when processing * is complete. */ -function drupal_render_form($form_id, &$form) { +function drupal_set_form_theme($form_id, &$form) { // Don't override #theme if someone already set it. if (!isset($form['#theme'])) { init_theme(); @@ -595,9 +596,6 @@ function drupal_render_form($form_id, &$ $form['#theme'] = $form_id; } } - - $output = drupal_render($form); - return $output; } /** Index: includes/theme.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/theme.inc,v retrieving revision 1.428 diff -u -p -r1.428 theme.inc --- includes/theme.inc 25 Jun 2008 09:12:24 -0000 1.428 +++ includes/theme.inc 26 Jun 2008 03:21:26 -0000 @@ -478,6 +478,14 @@ function list_themes($refresh = FALSE) { } /** + * Dummy function for now. + */ +function theme_xml() { + $args = func_get_args(); + return call_user_func_array('theme', $args); +} + +/** * Generate the themed output. * * All requests for theme hooks must go through this function. It examines @@ -1825,6 +1833,8 @@ function template_preprocess_page(&$vari $head_title[] = variable_get('site_slogan', ''); } } + + $variables['content'] = drupal_render($variables['elements']['#content']);//'
'.print_r($variables,1).'
';// $variables['head_title'] = implode(' | ', $head_title); $variables['base_path'] = base_path(); $variables['front_page'] = url(); Index: includes/theme.maintenance.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/theme.maintenance.inc,v retrieving revision 1.14 diff -u -p -r1.14 theme.maintenance.inc --- includes/theme.maintenance.inc 25 Jun 2008 09:12:24 -0000 1.14 +++ includes/theme.maintenance.inc 26 Jun 2008 03:21:26 -0000 @@ -164,7 +164,7 @@ function theme_update_page($content, $sh drupal_set_header('Content-Type: text/html; charset=utf-8'); // Assign content and show message flag. - $variables['content'] = $content; + $variables['elements']['#content'] = array('#value' => $content); $variables['show_messages'] = $show_messages; // The maintenance preprocess function is recycled here. template_preprocess_maintenance_page($variables); @@ -239,6 +239,8 @@ function template_preprocess_maintenance $head_title[] = variable_get('site_slogan', ''); } } + + $variables['content'] = drupal_render($variables['elements']['#content']); $variables['head_title'] = implode(' | ', $head_title); $variables['base_path'] = base_path(); $variables['front_page'] = url(); Index: modules/user/user.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.admin.inc,v retrieving revision 1.22 diff -u -p -r1.22 user.admin.inc --- modules/user/user.admin.inc 7 May 2008 19:34:24 -0000 1.22 +++ modules/user/user.admin.inc 26 Jun 2008 03:21:26 -0000 @@ -19,8 +19,8 @@ function user_admin($callback_arg = '') $output = drupal_get_form('user_multiple_delete_confirm'); } else { - $output = drupal_get_form('user_filter_form'); - $output .= drupal_get_form('user_admin_account'); + $output[] = drupal_get_form('user_filter_form'); + $output[] = drupal_get_form('user_admin_account'); } } return $output; Index: modules/user/user.module =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.module,v retrieving revision 1.910 diff -u -p -r1.910 user.module --- modules/user/user.module 18 Jun 2008 03:36:24 -0000 1.910 +++ modules/user/user.module 26 Jun 2008 03:21:26 -0000 @@ -749,7 +749,7 @@ function user_block($op = 'list', $delta if (!$user->uid && !(arg(0) == 'user' && !is_numeric(arg(1)))) { $block['subject'] = t('User login'); - $block['content'] = drupal_get_form('user_login_block'); + $block['content'] = drupal_render(drupal_get_form('user_login_block')); } return $block;