diff --git a/e107_files/e_jslib.php b/e107_files/e_jslib.php index 5775172a8..6a89ebefa 100644 --- a/e107_files/e_jslib.php +++ b/e107_files/e_jslib.php @@ -18,12 +18,7 @@ // prevent notices/warnings to break JS source error_reporting(0); -//output cache if available before calling the api -e_jslib_cache_out(); - -//v0.8 - we need THEME defines here (do we?) - WE DON'T -//$_E107 = array('no_forceuserupdate' => 1, 'no_online' => 1, 'no_menus' => 1, 'no_prunetmp' => 1); -$_E107['minimal'] = true; +session_cache_limiter('private'); //admin or front-end call if (strpos($_SERVER['QUERY_STRING'], '_admin') !== FALSE) @@ -34,11 +29,31 @@ else { define('USER_AREA', true); //force user area } +// no-cache check +if (strpos($_SERVER['QUERY_STRING'], '_nocache') !== FALSE) +{ + define('e_NOCACHE', true); //force admin area +} +else +{ + define('e_NOCACHE', false); //force user area +} + +if(!e_NOCACHE) session_cache_limiter('private'); +else session_cache_limiter('nocache'); + +//output cache if available before calling the api +e_jslib_cache_out(); + +//v0.8 - we need THEME defines here (do we?) - WE DON'T +//$_E107 = array('no_forceuserupdate' => 1, 'no_online' => 1, 'no_menus' => 1, 'no_prunetmp' => 1); +$_E107['minimal'] = true; //call jslib handler, render content require_once ("../class2.php"); -require_once (e_HANDLER.'jslib_handler.php'); -$jslib = new e_jslib(); +//require_once (e_HANDLER.'jslib_handler.php'); +//$jslib = new e_jslib(); +$jslib = e107::getObject('e_jslib', null, e_HANDLER.'jslib_handler.php'); $jslib->getContent(); exit; @@ -54,11 +69,15 @@ exit; */ function e_jslib_cache_out() { + if(e_NOCACHE) return; $encoding = e_jslib_browser_enc(); //NOTE - should be called first $cacheFile = e_jslib_is_cache($encoding); if ($cacheFile) { + //kill any output buffering - better performance and 304 not modified requirement + while (@ob_end_clean()); + if (function_exists('date_default_timezone_set')) { date_default_timezone_set('UTC'); @@ -67,16 +86,11 @@ function e_jslib_cache_out() // last modification time $lmodified = filemtime($cacheFile); - // not modified - send 304 and exit - if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lmodified) - { - header("HTTP/1.1 304 Not Modified", true); - exit; - } - // send last modified date - header('Cache-Control: must-revalidate'); - header('Last-modified: '.gmdate('r', $lmodified), true); + //header('Cache-Control: must-revalidate'); + //header('Last-modified: '.gmdate('r', $lmodified), true); + if($lmodified) header('Last-modified: '.gmdate("D, d M Y H:i:s", $lmodified).' GMT', true); + // send content type and encoding header('Content-type: text/javascript', true); @@ -87,12 +101,37 @@ function e_jslib_cache_out() // Expire header - 1 year $time = time()+ 365 * 86400; - header('Expires: '.gmdate('r', $time), true); + //header('Expires: '.gmdate('r', $time), true); + header('Expires: '.gmdate("D, d M Y H:i:s", $time).' GMT', true); - //kill any output buffering - better performance - while (@ob_end_clean()); + header('Cache-Control: must-revalidate', true); - echo @file_get_contents($cacheFile); + // not modified check by last modified time - send 304 and exit + if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lmodified) + { + header("HTTP/1.1 304 Not Modified", true); + exit; + } + + $page = @file_get_contents($cacheFile); + $etag = md5($page).($encoding ? '-'.$encoding : ''); + + header('Content-Length: '.strlen($page), true); + header('ETag: '.$etag, true); + + // not modified check by Etag + if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) + { + $IF_NONE_MATCH = str_replace('"','',$_SERVER['HTTP_IF_NONE_MATCH']); + + if($IF_NONE_MATCH == $etag || ($IF_NONE_MATCH == ($etag.'-'.$encoding))) + { + header('HTTP/1.1 304 Not Modified'); + exit(); + } + } + + echo $page; //TODO - debug //@file_put_contents('cache/e_jslib_log', "----------\ncache used - ".$cacheFile."\n\n", FILE_APPEND); exit; diff --git a/e107_handlers/js_manager.php b/e107_handlers/js_manager.php index 17de3675b..4e53debc0 100644 --- a/e107_handlers/js_manager.php +++ b/e107_handlers/js_manager.php @@ -670,7 +670,7 @@ class e_jsmanager * * @param string $mod core|plugin|theme|header|footer|header_inline|footer_inline|core_css|plugin_css|theme_css|other_css|inline_css * @param integer $zone 1-5 - only used when in 'header','footer','header_inline' and 'footer_inline' render mod - * @param boolean $external exrernal file calls, only used when NOT in 'header_inline' and 'footer_inline' render mod + * @param boolean $external external file calls, only used when NOT in 'header_inline' and 'footer_inline' render mod * @param boolean $return * @return string JS content - only if $return is true */ @@ -1082,5 +1082,39 @@ class e_jsmanager $core->setPref($key, $libs); return $this; } + + /** + * Get current object data + * @return array + */ + public function getData() + { + $data = get_class_vars(__CLASS__); + unset($data['_instance'], $data['_in_admin']); + $kdata = array_keys($data); + $instance = self::getInstance(); + $data = array(); + foreach ($kdata as $prop) + { + $data[$prop] = $this->$prop; + } + return $data; + } + + /** + * Set all current object data + * @param $data + * @return e_jsmanager + */ + public function setData($data) + { + if(!is_array($data)) return $this; + foreach ($data as $prop => $val) + { + if('_instance' == $prop || '_in_admin' == $prop) continue; + $this->$prop = $val; + } + return $this; + } } diff --git a/e107_handlers/jslib_handler.php b/e107_handlers/jslib_handler.php index 4ea92142e..c1db9029b 100644 --- a/e107_handlers/jslib_handler.php +++ b/e107_handlers/jslib_handler.php @@ -12,7 +12,7 @@ * $Author$ * */ -global $pref, $eplug_admin, $THEME_JSLIB, $THEME_CORE_JSLIB; +global $pref, $eplug_admin; class e_jslib { @@ -22,6 +22,36 @@ class e_jslib } + /** + * Called from HEADERF + * @return string + */ + public function renderHeader($where = 'front', $return = false) + { + // FIXME: convert e107.js.php to pure e107.js file + // FIXME: 'e_jslib_browser_cache' used by js_manager - add it together with all new prefs (JS management tab, Site preferences area) + // FIXME: option to use external sources (e.g. google) even if JS is combined (script tags for external sources) + if(!e107::getPref('e_jslib_nocombine')) + { + $hash = md5(serialize(varset($pref['e_jslib'])).e107::getPref('e_jslib_browser_cache', 0).THEME.e_LANGUAGE.ADMIN).'_'.$where; + // TODO disable cache in debug mod + $hash .= (e107::getPref('e_jslib_nocache') ? '_nocache' : '').(e107::getPref('e_jslib_gzip') ? '' : '_nogzip'); + $ret = "\n"; + if($return) $ret; + echo $ret; + return; + } + + $e_jsmanager = e107::getJs(); + + // script tags + $ret = $e_jsmanager->renderJs('core', null, true, $return); + $ret .= $e_jsmanager->renderJs('plugin', null, true, $return); + $ret .= $e_jsmanager->renderJs('theme', null, true, $return); + + return $ret; + } + /** * Collect & output content of all available JS libraries (requires e107 API) * FIXME @@ -57,34 +87,41 @@ class e_jslib // last modification time for loaded files $lmodified = max($lmodified); + + // send content type + header('Content-type: text/javascript', true); + + if(deftrue('e_NOCACHE')) + { + $this->content_out($lmodified); + } if (function_exists('date_default_timezone_set')) { date_default_timezone_set('UTC'); } + + + // send last modified date + header('Cache-Control: must-revalidate', true); + if($lmodified) header('Last-modified: '.gmdate("D, d M Y H:i:s", $lmodified).' GMT', true); + //if($lmodified) header('Last-modified: '.gmdate('r', $lmodified), true); + + // Expire header - 1 year + $time = time()+ 365 * 86400; + header('Expires: '.gmdate("D, d M Y H:i:s", $time).' GMT', true); // If-Modified check only if cache disabled // if cache is enabled, cache file modification date is set to $lmodified - /*if(!e107::getPref('syscachestatus')) + if(!e107::getPref('syscachestatus')) { // not modified - send 304 and exit - if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lmodified) + if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $lmodified && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lmodified) { header("HTTP/1.1 304 Not Modified", true); exit; } - }*/ - - // send last modified date - header('Cache-Control: must-revalidate'); - header('Last-modified: '.gmdate('r', $lmodified), true); - - // send content type - header('Content-type: text/javascript', true); - - // Expire header - 1 year - $time = time()+ 365 * 86400; - header('Expires: '.gmdate('r', $time), true); + } //Output $this->content_out($lmodified); @@ -197,6 +234,21 @@ class e_jslib $contents = ob_get_contents(); ob_end_clean(); + $etag = md5($page).($encoding ? '-'.$encoding : ''); + header('ETag: '.$etag, true); + if($encoding) header('Content-Encoding: ' . $encoding); + + if (!deftrue('e_NOCACHE') && isset($_SERVER['HTTP_IF_NONE_MATCH'])) + { + $IF_NONE_MATCH = str_replace('"','',$_SERVER['HTTP_IF_NONE_MATCH']); + + if($IF_NONE_MATCH == $etag || ($IF_NONE_MATCH == ($etag.'-'.$encoding))) + { + header('HTTP/1.1 304 Not Modified'); + exit(); + } + } + if ($encoding) { $gzdata = "\x1f\x8b\x08\x00\x00\x00\x00\x00"; @@ -210,8 +262,7 @@ class e_jslib $gsize = strlen($gzdata); $this->set_cache($gzdata, $encoding, $lmodified); - header('Content-Encoding: ' . $encoding); - //header('Content-Length: '.$gsize); + header('Content-Length: '.$gsize); header('X-Content-size: ' . $size); print($gzdata); //TODO - log/debug @@ -221,6 +272,7 @@ class e_jslib { //header('Content-Length: '.strlen($contents)); $this->set_cache($contents, '', $lmodified); + header('Content-Length: '.strlen($contents)); print($contents); //TODO - log/debug //@file_put_contents('cache/e_jslib_log', "----------\nno cache used - raw\n\n", FILE_APPEND); @@ -238,13 +290,13 @@ class e_jslib */ function set_cache($contents, $encoding = '', $lmodified = 0) { - if (e107::getPref('syscachestatus')) + if (!deftrue('e_NOCACHE') && e107::getPref('syscachestatus')) { $cacheFile = $this->cache_filename($encoding); if(!$lmodified) $lmodified = time(); @file_put_contents($cacheFile, $contents); @chmod($cacheFile, 0775); - @touch($cacheFile, $lmodified); + if($lmodified) @touch($cacheFile, $lmodified); } } diff --git a/e107_themes/templates/footer_default.php b/e107_themes/templates/footer_default.php index 030cc6259..76ff55100 100644 --- a/e107_themes/templates/footer_default.php +++ b/e107_themes/templates/footer_default.php @@ -279,8 +279,10 @@ if (abs($_serverTime - $lastSet) > 120) * Drawback: each update may cause all server times to display a bit different */ echo "\n"; + echo " SyncWithServerTime('', '{$_serverPath}', '{$_serverDomain}');\n"; + //tdOffset disabled as it can't live together with HTTP_IF_NONE_MATCH (page load speed) + //echo " SyncWithServerTime('{$_serverTime}', '{$_serverPath}', '{$_serverDomain}');\n"; + echo "\n"; } // @@ -295,21 +297,16 @@ $page = ob_get_clean(); $etag = md5($page); - -if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) +// previously disabled or there is posted data +if(!deftrue('e_NOCACHE') && empty($_POST)) { - $IF_NONE_MATCH = str_replace('"','',$_SERVER['HTTP_IF_NONE_MATCH']); - - if($IF_NONE_MATCH == $etag || ($IF_NONE_MATCH == ($etag."-gzip"))) + header("Cache-Control: must-revalidate", true); + if (function_exists('date_default_timezone_set')) { - header('HTTP/1.1 304 Not Modified'); - exit(); + date_default_timezone_set('UTC'); } -} - -if(!defined('e_NOCACHE')) -{ - header("Cache-Control: must-revalidate"); + $time = time()+ 365 * 86400; + header('Expires: '.gmdate("D, d M Y H:i:s", $time).' GMT', true); } $pref['compression_level'] = 6; @@ -330,7 +327,6 @@ if(varset($pref['compress_output'],false) && $server_support == true && $browser $page = gzencode($page, $level); header("Content-Encoding: gzip", true); header("Content-Length: ".strlen($page), true); - echo $page; } else { @@ -344,9 +340,23 @@ else } header("Content-Length: ".strlen($page), true); - echo $page; } +// should come after the Etag header +if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) +{ + $IF_NONE_MATCH = str_replace('"','',$_SERVER['HTTP_IF_NONE_MATCH']); + + if($IF_NONE_MATCH == $etag || ($IF_NONE_MATCH == ($etag."-gzip"))) + { + header('HTTP/1.1 304 Not Modified'); + exit(); + } +} + +// real output +echo $page; + unset($In_e107_Footer); $e107_Clean_Exit=TRUE; // For registered shutdown function -- let it know all is well! ?> \ No newline at end of file diff --git a/e107_themes/templates/header_default.php b/e107_themes/templates/header_default.php index 04c7245dd..efb5b3558 100644 --- a/e107_themes/templates/header_default.php +++ b/e107_themes/templates/header_default.php @@ -143,6 +143,24 @@ unset($e_headers); $e_js = e107::getJs(); $e_pref = e107::getConfig('core'); +// --- Load plugin Meta files - now possible to add to all zones! -------- +$e_meta_content = ''; +if (is_array($pref['e_meta_list'])) +{ + ob_start(); + foreach($pref['e_meta_list'] as $val) + { + if(is_readable(e_PLUGIN.$val."/e_meta.php")) + { + require_once(e_PLUGIN.$val."/e_meta.php"); + } + } + // content will be added later + // NOTE: not wise to do e_meta output, use JS Manager! + $e_meta_content = ob_get_contents(); + ob_end_clean(); +} + // Register Plugin specific CSS // DEPRECATED, use $e_js->pluginCSS('myplug', 'style/myplug.css'[, $media = 'all|screen|...']); if (isset($eplug_css) && $eplug_css) @@ -246,13 +264,6 @@ echo "\n\n"; $e_js->renderJs('inline_css', false, 'css', false); echo "\n\n"; - -/* -if((isset($pref['enable_png_image_fix']) && $pref['enable_png_image_fix'] == true) || (isset($sleight) && $sleight == true)) -{ - echo "\n\n"; -} -*/ //IEpngfix - visible by IE6 only // FIXME - disable this style block via JS for all GOOD browsers. if($e_pref->get('enable_png_image_fix') || (isset($sleight) && $sleight == true)) // FIXME - KILL this GLOBAL! @@ -275,8 +286,8 @@ if($e_pref->get('enable_png_image_fix') || (isset($sleight) && $sleight == true) // // E: Send JS all in once // Read here why - http://code.google.com/speed/page-speed/docs/rtt.html#PutStylesBeforeScripts -// TODO - more work (zones, eplug_js, headerjs etc order) -// +// TODO - more work (zones, eplug_js, headerjs etc order, external JS/CSS) +// TODO - mobile support // [JSManager] Load JS Includes - Zone 1 - Before Library @@ -284,9 +295,8 @@ e107::getJs()->renderJs('header', 1); e107::getJs()->renderJs('header_inline', 1); // Send Javascript Libraries ALWAYS (for now) -//FIXME: [JS Manager] - build URL, disable core JS, option to use external sources (google) -$hash = md5(serialize(varset($pref['e_jslib'])).serialize(varset($THEME_JSLIB)).THEME.e_LANGUAGE.ADMIN).'_front'; -echo "\n"; +$jslib = e107::getObject('e_jslib', null, e_HANDLER.'jslib_handler.php'); +$jslib->renderHeader('front', false); // [JSManager] Load JS Includes - Zone 2 - After Library e107::getJs()->renderJs('header', 2); @@ -329,13 +339,13 @@ else // TODO - convert it to e107::getJs()->header/footerFile() call if (!USER && ($pref['user_tracking'] == "session") && varset($pref['password_CHAP'],0)) { - if ($pref['password_CHAP'] == 2) - { + if ($pref['password_CHAP'] == 2) + { // *** Add in the code to swap the display tags - $js_body_onload[] = "expandit('loginmenuchap','nologinmenuchap');"; - } - echo "\n"; - $js_body_onload[] = "getChallenge();"; + $js_body_onload[] = "expandit('loginmenuchap','nologinmenuchap');"; + } + echo "\n"; + $js_body_onload[] = "getChallenge();"; } //headerjs moved below @@ -343,15 +353,15 @@ if (!USER && ($pref['user_tracking'] == "session") && varset($pref['password_CHA // Deprecated function finally removed //if(function_exists('core_head')){ echo core_head(); } -// [JSManager] Load JS Includes - Zone 3 - After e_plug/theme.js, before e_meta and headerjs() +// [JSManager] Load JS Includes - Zone 3 - After e_plug/theme.js, before headerjs() e107::getJs()->renderJs('header', 3); e107::getJs()->renderJs('header_inline', 3); -// [JSManager] Load JS Includes - Zone 4 - Just before e_meta, after headerjs +// [JSManager] Load JS Includes - Zone 4 - After headerjs e107::getJs()->renderJs('header', 4); e107::getJs()->renderJs('header_inline', 4); -// [JSManager] Load JS Includes - Zone 5 - After headerjs, just before e_meta, e107:loaded trigger +// [JSManager] Load JS Includes - Zone 5 - End of header JS, just before e_meta content and e107:loaded trigger e107::getJs()->renderJs('header', 5); e107::getJs()->renderJs('header_inline', 5); @@ -359,17 +369,8 @@ e107::getJs()->renderJs('header_inline', 5); // F: Send Meta Tags, Icon links // -// --- Load plugin Meta files -------- -if (is_array($pref['e_meta_list'])) -{ - foreach($pref['e_meta_list'] as $val) - { - if(is_readable(e_PLUGIN.$val."/e_meta.php")) - { - require_once(e_PLUGIN.$val."/e_meta.php"); - } - } -} +// --- Send plugin Meta -------- +echo $e_meta_content; // e_meta already loaded // // G: Send Theme Headers