diff --git a/e107_handlers/js_manager.php b/e107_handlers/js_manager.php index 0bbfb11f2..39bd60b28 100644 --- a/e107_handlers/js_manager.php +++ b/e107_handlers/js_manager.php @@ -281,6 +281,12 @@ class e_jsmanager $theme_libs = array(); } $this->themeLib($theme_libs); + + // TEST VALUES + // $this->_e_jslib_plugin[] = '{e_PLUGIN}myplug/test.js'; + // $this->_e_jslib_plugin[] = 'http://somesite/myplug/test.js'; + // $this->_e_jslib_theme[] = '{THEME}js/test.js'; + // $this->_e_jslib_theme[] = 'http://somesite/js/test.js'; } /** @@ -942,8 +948,25 @@ class e_jsmanager switch($mod) { + case 'framework': // CDN frameworks - rendered before consolidation script (if enabled) + $fw = array(); + foreach ($this->_libraries as $lib) + { + foreach ($lib as $path) + { + $erase = array_search($path, $this->_e_jslib_core); + if($erase !== false && strpos($path, 'http') === 0) + { + unset($this->_e_jslib_core[$erase]); + $fw[] = $path; + } + } + } + $this->renderFile($fw, $external, 'CDN Framework', $mod, false); + break; + case 'core': //e_jslib - $this->setLastModfied($mod, $this->renderFile($this->_e_jslib_core, $external, 'Core libraries')); + $this->setLastModfied($mod, $this->renderFile($this->_e_jslib_core, $external, 'Core libraries', $mod)); $this->_e_jslib_core = array(); break; @@ -952,37 +975,37 @@ class e_jsmanager { $this->setLastModfied($mod, $this->renderFile($paths, $external, $plugname.' libraries')); }*/ - $this->setLastModfied($mod, $this->renderFile($this->_e_jslib_plugin, $external, 'Plugin libraries')); + $this->setLastModfied($mod, $this->renderFile($this->_e_jslib_plugin, $external, 'Plugin libraries', $mod)); $this->_e_jslib_plugin = array(); break; case 'theme': //e_jslib - $this->setLastModfied($mod, $this->renderFile($this->_e_jslib_theme, $external, 'Theme libraries')); + $this->setLastModfied($mod, $this->renderFile($this->_e_jslib_theme, $external, 'Theme libraries', $mod)); $this->_e_jslib_theme = array(); break; case 'header': - $this->renderFile(varsettrue($this->_runtime_header[$zone], array()), $external, 'Header JS include - zone #'.$zone); + $this->renderFile(varsettrue($this->_runtime_header[$zone], array()), $external, 'Header JS include - zone #'.$zone, $mod); unset($this->_runtime_header[$zone]); break; case 'core_css': //e_jslib - $this->renderFile(varset($this->_e_css['core'], array()), $external, 'Core CSS', false); + $this->renderFile(varset($this->_e_css['core'], array()), $external, 'Core CSS', $mod, false); unset($this->_e_css['core']); break; case 'plugin_css': //e_jslib - $this->renderFile(varset($this->_e_css['plugin'], array()), $external, 'Plugin CSS', false); + $this->renderFile(varset($this->_e_css['plugin'], array()), $external, 'Plugin CSS', $mod, false); unset($this->_e_css['plugin']); break; case 'theme_css': //e_jslib - $this->renderFile(varset($this->_e_css['theme'], array()), $external, 'Theme CSS', false); + $this->renderFile(varset($this->_e_css['theme'], array()), $external, 'Theme CSS', $mod, false); unset($this->_e_css['theme']); break; case 'other_css': - $this->renderFile(varset($this->_e_css['other'], array()), $external, 'Other CSS', false); + $this->renderFile(varset($this->_e_css['other'], array()), $external, 'Other CSS', $mod, false); unset($this->_e_css['other']); break; @@ -998,13 +1021,13 @@ class e_jsmanager ksort($this->_runtime_footer, SORT_NUMERIC); foreach ($this->_runtime_footer as $priority => $path_array) { - $this->renderFile($path_array, $external, 'Footer JS include - priority #'.$priority); + $this->renderFile($path_array, $external, 'Footer JS include - priority #'.$priority, $mod); } $this->_runtime_footer = array(); } else { - $this->renderFile(varsettrue($this->_runtime_footer[$zone], array()), $external, 'Footer JS include - priority #'.$zone); + $this->renderFile(varsettrue($this->_runtime_footer[$zone], array()), $external, 'Footer JS include - priority #'.$zone, $mod); unset($this->_runtime_footer[$zone]); } break; @@ -1048,7 +1071,7 @@ class e_jsmanager * @param string $label added as comment if non-empty * @return void */ - public function renderFile($file_path_array, $external = false, $label = '', $checkModified = true) + public function renderFile($file_path_array, $external = false, $label = '', $mod = null, $checkModified = true) { if(empty($file_path_array)) { @@ -1082,7 +1105,8 @@ class e_jsmanager } elseif($external) //true or 'js' { - if(strpos($path, 'http') !== 0) $path = $tp->replaceConstants($path, 'abs').'?external=1&'.$this->getCacheId(); + if(strpos($path, 'http') == 0) continue; // not allowed + $path = $tp->replaceConstants($path, 'abs').'?external=1&'.$this->getCacheId(); echo ''; echo "\n"; continue; @@ -1095,6 +1119,14 @@ class e_jsmanager } else { + // CDN fix, ignore URLs inside consolidation script, render as external scripts + $isExternal = false; + if(strpos($path, 'http') === 0) + { + if($external !== 'css') $isExternal = true; + } + + if('css' === $external) { $path = explode('|', $path, 4); @@ -1111,13 +1143,23 @@ class e_jsmanager } if($external) { - // Never use CacheID on a CDN script. - if(strpos($path, 'http') !== 0) $path = $tp->replaceConstants($path, 'abs').'?'.$this->getCacheId(); + // Never use CacheID on a CDN script, always render if it's CDN + if(!$isExternal) + { + // don't render non CDN libs as external script calls when script consolidation is enabled + if($mod === 'core' || $mod === 'plugin' || $mod === 'theme') + { + if(!e107::getPref('e_jslib_nocombine')) continue; + } + $path = $tp->replaceConstants($path, 'abs').'?'.$this->getCacheId(); + } echo ''; echo "\n"; continue; } - + + // never try to consolidate external scripts + if($isExternal) continue; $path = $tp->replaceConstants($path, ''); if($checkModified) $lmodified = max($lmodified, filemtime($path)); echo file_get_contents($path); diff --git a/e107_handlers/jslib_handler.php b/e107_handlers/jslib_handler.php index b2b47b7c1..da43c3194 100644 --- a/e107_handlers/jslib_handler.php +++ b/e107_handlers/jslib_handler.php @@ -52,10 +52,21 @@ class e_jslib // FIXED: option to use external sources (e.g. google) even if JS is combined (script tags for external sources) if(!e107::getPref('e_jslib_nocombine')) { + $e_jsmanager = e107::getJs(); + + // render CDN frameworks + $ret .= $e_jsmanager->renderJs('framework', null, true, true); + $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')/* || deftrue('e_NOCACHE')*/ ? '_nocache' : '').(!e107::getPref('e_jslib_nobcache') || deftrue('e_NOCACHE') ? '_nobcache' : '').(e107::getPref('e_jslib_gzip') ? '' : '_nogzip'); $ret .= "\n"; + + // render CDN libraries asap + $ret .= $e_jsmanager->renderJs('core', null, true, true); + $ret .= $e_jsmanager->renderJs('plugin', null, true, true); + $ret .= $e_jsmanager->renderJs('theme', null, true, true); + if($return) return $ret; echo $ret; return;