diff --git a/e107_admin/footer.php b/e107_admin/footer.php index 0926fe1dc..17855f135 100644 --- a/e107_admin/footer.php +++ b/e107_admin/footer.php @@ -11,16 +11,51 @@ | GNU General Public License (http://gnu.org). | | $Source: /cvs_backup/e107_0.8/e107_admin/footer.php,v $ -| $Revision: 1.1.1.1 $ -| $Date: 2006-12-02 04:33:22 $ -| $Author: mcfly_e107 $ +| $Revision: 1.2 $ +| $Date: 2006-12-05 09:28:02 $ +| $Author: mrpete $ +----------------------------------------------------------------------------+ */ - if (!defined('e107_INIT')) { exit; } +$In_e107_Footer = TRUE; // For registered shutdown function +global $eTraffic, $error_handler, $db_time, $sql, $mySQLserver, $mySQLuser, $mySQLpassword, $mySQLdefaultdb, $ADMIN_FOOTER, $e107; -global $ADMIN_FOOTER, $footer_js, $sql; +// +// SHUTDOWN SEQUENCE +// +// The following items have been carefully designed so page processing will finish properly +// Please DO NOT re-order these items without asking first! You WILL break something ;) +// These letters match the USER footer (that's why there is B.1,B.2) +// +// A Ensure sql and traffic objects exist +// B.1 Clear cache if over a week old +// B.2 Send the footer templated data +// C Dump any/all traffic and debug information +// [end of regular-page-only items] +// D Close the database connection +// E Themed footer code +// F Configured footer scripts +// G Browser-Server time sync script (must be the last one generated/sent) +// H Final HTML (/body, /html) +// I collect and send buffered page, along with needed headers +// +// +// A Ensure sql and traffic objects exist +// + +if(!is_object($sql)){ + // reinstigate db connection if another connection from third-party script closed it ... + $sql = new db; + $sql -> db_Connect($mySQLserver, $mySQLuser, $mySQLpassword, $mySQLdefaultdb); +} +if (!is_object($eTraffic)) { + $eTraffic = new e107_traffic; + $eTraffic->Bump('Lost Traffic Counters'); +} +// +// B.1 Clear cache if over a week old +// if (ADMIN == TRUE) { if ($pref['cachestatus']) { if (!$sql->db_Select('generic', '*', "gen_type='empty_cache'")) @@ -38,50 +73,117 @@ if (ADMIN == TRUE) { } } } + + +// +// B.2 Send footer template +// if (strpos(e_SELF.'?'.e_QUERY, 'menus.php?configure') === FALSE) { parse_admin($ADMIN_FOOTER); } + + +// +// C Dump all debug and traffic information +// $eTimingStop = microtime(); -global $eTimingStart, $eTraffic; +global $eTimingStart; $rendertime = number_format($eTraffic->TimeDelta( $eTimingStart, $eTimingStop ), 4); $db_time = number_format($db_time,4); $rinfo = ''; -if($pref['displayrendertime']){ $rinfo .= "Render time: {$rendertime} second(s); {$db_time} of that for queries. "; } -if($pref['displaysql']){ $rinfo .= "DB queries: ".$sql -> db_QueryCount().". "; } -if(isset($pref['displaycacheinfo']) && $pref['displaycacheinfo']){ $rinfo .= $cachestring."."; } -echo ($rinfo ? "\n
{$rinfo}
\n" : ""); + if($pref['displayrendertime']){ $rinfo .= "Render time: {$rendertime} second(s); {$db_time} of that for queries. "; } + if($pref['displaysql']){ $rinfo .= "DB queries: ".$sql -> db_QueryCount().". "; } + if(isset($pref['display_memory_usage']) && $pref['display_memory_usage']){ $rinfo .= "Memory Usage: ".$e107->get_memory_usage(); } + if(isset($pref['displaycacheinfo']) && $pref['displaycacheinfo']){ $rinfo .= $cachestring."."; } + echo ($rinfo ? "\n
{$rinfo}
\n" : ""); -if($error_handler->debug == true) { - echo " -

"; + if ((ADMIN || $pref['developer']) && E107_DEBUG_LEVEL) { + global $db_debug; + echo "\n\n"; + $db_debug->Show_All(); + } + + /* + changes by jalist 24/01/2005: + show sql queries + usage: add ?showsql to query string, must be admin + */ + + if(ADMIN && isset($queryinfo) && is_array($queryinfo)) + { + $c=1; + $mySQLInfo = $sql->mySQLinfo; + echo " + + \n\n"; + foreach ($queryinfo as $infovalue) + { + echo "\n\n\n"; + $c++; + } + echo "
IDSQL Queries
{$c}{$infovalue}
"; + } + +// +// D Close DB connection. We're done talking to underlying MySQL +// + $sql -> db_Close(); // Only one is needed; the db is only connected once even with several $sql objects + + // + // Just before we quit: dump quick timer if there is any + // Works any time we get this far. Not calibrated, but it is quick and simple to use. + // To use: eQTimeOn(); eQTimeOff(); + // + $tmp = eQTimeElapsed(); + if (strlen($tmp)) { + global $ns; + $ns->tablerender('Quick Admin Timer',"Results: {$tmp} microseconds"); + } + +if ($pref['developer']) { + global $oblev_at_start,$oblev_before_start; + if (ob_get_level() != $oblev_at_start) { + $oblev = ob_get_level(); + $obdbg = "
Software defect detected; ob_*() level {$oblev} at end instead of ($oblev_at_start). POPPING EXTRA BUFFERS!
"; + while (ob_get_level() > $oblev_at_start) { + ob_end_flush(); + } + echo $obdbg; + } + // 061109 PHP 5 has a bug such that the starting level might be zero or one. + // Until they work that out, we'll disable this message. + // Devs can re-enable for testing as needed. + // + if (0 && $oblev_before_start != 0) { + $obdbg = "
Software warning; ob_*() level {$oblev_before_start} at start; this page not properly integrated into its wrapper.
"; + echo $obdbg; + } +} + +if((ADMIN == true || $pref['developer']) && $error_handler->debug == true) { echo " +

PHP Errors:


".$error_handler->return_errors()."
"; - $tmp = $eTraffic->Display(); - if (strlen($tmp)) { - $ns->tablerender('Traffic Counters', $tmp); - } - - $tmp = $db_debug->Show_Performance(); - if (strlen($tmp)) { - $ns->tablerender('Time Analysis', $tmp); - } - $tmp = $db_debug->Show_SQL_Details(); - if (strlen($tmp)) { - $ns->tablerender('SQL Analysis', $tmp); - } } +// +// E Last themed footer code, usually JS +// if (function_exists('theme_foot')) { echo theme_foot(); } +// +// F any included JS footer scripts +// +global $footer_js; if(isset($footer_js) && is_array($footer_js)) { $footer_js = array_unique($footer_js); @@ -92,8 +194,57 @@ if(isset($footer_js) && is_array($footer_js)) } } +// +// G final JS script keeps user and server time in sync. +// It must be the last thing created before sending the page to the user. +// +// see e107.js and class2.php +// This must be done as late as possible in page processing. +$_serverTime=time(); +$lastSet = isset($_COOKIE['e107_tdSetTime']) ? $_COOKIE['e107_tdSetTime'] : 0; +if (abs($_serverTime - $lastSet) > 120) { + /* update time delay every couple of minutes. + * Benefit: account for user time corrections and changes in internet delays + * Drawback: each update may cause all server times to display a bit different + */ + echo "\n"; +} + +// +// H Final HTML +// echo ""; -$sql->db_Close(); +// +// I Send the buffered page data, along with appropriate headers +// +$page = ob_get_clean(); + +$etag = md5($page); +header("Cache-Control: must-revalidate"); +header("ETag: {$etag}"); + +$pref['compression_level'] == 6; +if(strstr($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip") || strstr($_SERVER['HTTP_USER_AGENT'], "Mozilla")) { + $browser_support = true; +} +if(ini_get("zlib.output_compression") == false && function_exists("gzencode")) { + $server_support = true; +} +if($pref['compress_output'] == true && $server_support == true && $browser_support == true) { + $level = intval($pref['compression_level']); + $page = gzencode($page, $level); + header("Content-Encoding: gzip", true); + header("Content-Length: ".strlen($page), true); + echo $page; +} else { + header("Content-Length: ".strlen($page), true); + echo $page; +} + +unset($In_e107_Footer); +$e107_Clean_Exit=TRUE; // For registered shutdown function -- let it know all is well! ?> diff --git a/e107_admin/header.php b/e107_admin/header.php index 8e7928721..9533b5d8c 100644 --- a/e107_admin/header.php +++ b/e107_admin/header.php @@ -12,22 +12,66 @@ | GNU General Public License (http://gnu.org). | | $Source: /cvs_backup/e107_0.8/e107_admin/header.php,v $ -| $Revision: 1.1.1.1 $ -| $Date: 2006-12-02 04:33:22 $ -| $Author: mcfly_e107 $ +| $Revision: 1.2 $ +| $Date: 2006-12-05 09:28:02 $ +| $Author: mrpete $ +---------------------------------------------------------------+ */ if (!defined('e107_INIT')) { exit; } define("ADMIN_AREA",TRUE); define("USER_AREA",FALSE); +$sql->db_Mark_Time('(Header Top)'); -// send the charset to the browser - overides spurious server settings with the lan pack settings. +// +// *** Code sequence for headers *** +// IMPORTANT: These items are in a carefully constructed order. DO NOT REARRANGE +// without checking with experienced devs! Various subtle things WILL break. +// +// We realize this is a bit (!) of a mess and hope to make further cleanups in a future release. +// +// A: Admin Defines and Links +// B: Send HTTP headers that come before any html +// C: Send start of HTML +// D: Send JS +// E: Send CSS +// F: Send Meta Tags and Icon links +// G: Send final theme headers (theme_head() function) +// H: Generate JS for image preloading (setup for onload) +// I: Calculate onload() JS functions to be called +// J: Send end of html and start of +// K: (The rest is ignored for popups, which have no menus) +// L: (optional) Body JS to disable right clicks +// M: Send top of body for custom pages and for news +// N: Send other top-of-body HTML +// +// Load order notes for devs +// * Browsers wait until ALL HTML has loaded before executing ANY JS +// * The last CSS tag downloaded supercedes earlier CSS tags +// * Browsers don't care when Meta tags are loaded. We load last due to +// a quirk of e107's log subsystem. +// * Multiple external file references slow down page load. Each one requires +// browser-server interaction even when cached. +// + +// +// A: Admin Defines and Links +// +require_once(e_ADMIN.'ad_links.php'); +// +// B: Send HTTP headers (these come before ANY html) +// + +// send the charset to the browser - overrides spurious server settings with the lan pack settings. header("Content-type: text/html; charset=".CHARSET, true); -require_once(e_ADMIN.'ad_links.php'); -echo defined('STANDARDS_MODE') ? "" : - ""; + +echo (defined("STANDARDS_MODE") ? "" : "\n")."\n"; + +// +// B.2: Include admin LAN defines +// + if (file_exists(e_LANGUAGEDIR.e_LANGUAGE.'/admin/lan_header.php')) { @include_once(e_LANGUAGEDIR.e_LANGUAGE."/admin/lan_header.php"); } else { @@ -69,49 +113,37 @@ if (!defined('ADMIN_DELETE_ICON')) define("ADMIN_DELETE_ICON_PATH", e_IMAGE."admin_images/delete_16.png"); } -echo " - +// +// C: Send start of HTML +// + +echo " ".SITENAME." : ".LAN_head_4."\n"; -echo " - \n"; -if (strpos(e_SELF.'?'.e_QUERY, 'menus.php?configure') === FALSE && isset($pref['admincss']) && $pref['admincss'] && file_exists(THEME.$pref['admincss'])) { - $css_file = file_exists(THEME.'admin_'.$pref['admincss']) ? THEME_ABS.'admin_'.$pref['admincss'] : THEME_ABS.$pref['admincss']; - echo "\n"; -} else if (isset($pref['themecss']) && $pref['themecss'] && file_exists(THEME.$pref['themecss'])) { - $css_file = file_exists(THEME.'admin_'.$pref['themecss']) ? THEME_ABS.'admin_'.$pref['themecss'] : THEME_ABS.$pref['themecss']; - echo "\n"; -} else { - $css_file = file_exists(THEME.'admin_style.css') ? THEME_ABS.'admin_style.css' : THEME_ABS.'style.css'; - echo "\n"; + +// +// D: Send JS +// +echo "\n"; + +// Wysiwyg JS support on or off. +if (/* isset($WYSIWYG) && $WYSIWYG == TRUE && */ check_class($pref['post_html']) && isset($e_wysiwyg) && $e_wysiwyg != "") { + require_once(e_HANDLER."tiny_mce/wysiwyg.php"); + define("e_WYSIWYG",TRUE); + echo wysiwyg($e_wysiwyg); +}else{ + define("e_WYSIWYG",FALSE); } -if (!isset($no_core_css) || !$no_core_css) { - echo "\n"; -} - -// ---------- Favicon --------- -if (file_exists(THEME."favicon.ico")) { - echo "\n\n"; -}elseif (file_exists(e_BASE."favicon.ico")) { - echo "\n\n"; -} - - -if (function_exists('theme_head')) { - echo theme_head(); -} if (strpos(e_SELF.'?'.e_QUERY, 'menus.php?configure') === FALSE) { echo "\n"; } -if (file_exists(THEME."theme.js")) { - echo "\n"; -} -if (filesize(e_FILE.'user.js')) { - echo "\n"; -} -if (function_exists("headerjs")) { - echo headerjs(); + if (file_exists(THEME.'theme.js')) { echo "\n"; } + if (filesize(e_FILE.'user.js')) { echo "\n"; } + +if (isset($eplug_js) && $eplug_js) { + echo "\n\n"; + echo "\n"; } if (isset($htmlarea_js) && $htmlarea_js) { echo $htmlarea_js; @@ -129,32 +161,115 @@ function savepreset(ps,pid){ //--> \n"; } -if (isset($eplug_js) && $eplug_js) { - echo "\n"; -} + +if (function_exists('headerjs')){echo headerjs(); } + +// +// E: Send CSS +// +echo "\n"; + if (isset($eplug_css) && $eplug_css) { - echo "\n\n"; + echo "\n\n"; + echo "\n"; } -if(check_class($pref['post_html']) && $pref['wysiwyg'] && $e_wysiwyg == TRUE){ - require_once(e_HANDLER."tiny_mce/wysiwyg.php"); - echo wysiwyg($e_wysiwyg); - define("e_WYSIWYG",TRUE); -}else{ - define("e_WYSIWYG",FALSE); -} -// load plugin header-data. -foreach($pref['e_meta_list'] as $val) + +echo "\n"; +if (strpos(e_SELF.'?'.e_QUERY, 'menus.php?configure') === FALSE && isset($pref['admincss']) && $pref['admincss'] && file_exists(THEME.$pref['admincss'])) { + $css_file = file_exists(THEME.'admin_'.$pref['admincss']) ? THEME_ABS.'admin_'.$pref['admincss'] : THEME_ABS.$pref['admincss']; + echo "\n"; +} else if (isset($pref['themecss']) && $pref['themecss'] && file_exists(THEME.$pref['themecss'])) { - if(is_readable(e_PLUGIN.$val."/e_meta.php")) + $css_file = file_exists(THEME.'admin_'.$pref['themecss']) ? THEME_ABS.'admin_'.$pref['themecss'] : THEME_ABS.$pref['themecss']; + echo "\n"; + + +} +else +{ + $css_file = file_exists(THEME.'admin_style.css') ? THEME_ABS.'admin_style.css' : THEME_ABS.'style.css'; + echo "\n"; +} +if (!isset($no_core_css) || !$no_core_css) { + echo "\n"; +} + + +// +// F: Send Meta Tags and Icon links +// +echo "\n"; + +// Multi-Language meta-tags with merge and override option. + +echo " +\n"; + +// --- Load plugin Meta files and eplug_ before others -------- +if (is_array($pref['e_meta_list'])) +{ + foreach($pref['e_meta_list'] as $val) { - require_once(e_PLUGIN.$val."/e_meta.php"); + if(is_readable(e_PLUGIN.$val."/e_meta.php")) + { + echo "\n"; + require_once(e_PLUGIN.$val."/e_meta.php"); + } } } +// ---------- Favicon --------- +if (file_exists(THEME."favicon.ico")) { + echo "\n\n"; +}elseif (file_exists(e_BASE."favicon.ico")) { + echo "\n\n"; +} +// +// G: Send Theme Headers +// + + +if(function_exists('theme_head')){ + echo "\n\n"; + echo theme_head(); +} + + +// +// H: Generate JS for image preloads [user mode only] +// +echo "\n\n"; + +// +// I: Calculate JS onload() functions for the BODY tag [user mode only] +// +$body_onload = ""; + + +// +// J: Send end of and start of +// echo " -\n"; +\n"; +$sql->db_Mark_Time("End Head, Start Body"); + +// +// K: (The rest is ignored for popups, which have no menus) [reserved; user mode] +// + +// +// L: (optional) Body JS to disable right clicks [reserved; user mode] +// + +// +// M: Send top of body for custom pages and for news [user mode only] +// + +// +// N: Send other top-of-body HTML +// $ns = new e107table; $e107_var = array(); @@ -329,8 +444,10 @@ function admin_purge_related($table, $id) } } +$sql->db_Mark_Time('Parse Admin Header'); if (strpos(e_SELF.'?'.e_QUERY, 'menus.php?configure') === FALSE) { parse_admin($ADMIN_HEADER); } +$sql->db_Mark_Time('(End: Parse Admin Header)'); ?> \ No newline at end of file