Index: t3lib/class.t3lib_div.php =================================================================== --- t3lib/class.t3lib_div.php (revision 7235) +++ t3lib/class.t3lib_div.php (working copy) @@ -3343,6 +3343,38 @@ } + /** + * Function for static version numbers on files, based on the filemtime + * This will make the filename automaticall change when a file is changed, and by that re-cached by the browser + * If the file does not exist physically the original file passed to the function is returned without the timestamp + * + * @param string $file Relative path to file + * @return Relative path with version filename including the timestamp + * @author Lars Houmark + */ + public static function createVersionNumberedFile($file) { + + // start by splitting up the querystring, the part after ? will break filemtime lookup / mainly done for scriptaculous + // it will be added back in the end... + $lookupFile = explode('?', $file); + $name = explode('.', $lookupFile[0]); + $extension = array_pop($name); + $path = self::resolveBackPath(self::dirname(PATH_thisScript) .'/'. $lookupFile[0]); + + if (file_exists($path)) { + array_push($name, filemtime($path), $extension); + $fullName = implode('.', $name); + + // if there was a querystring in the filename, we need to append it to the current string + $fullName .= $lookupFile[1] ? '?'. $lookupFile[1] : ''; + + } else { + // file was not found on given location, we will return the path given to this function + $fullName = $file; + } + + return $fullName; + } @@ -3352,7 +3384,6 @@ - /************************* * * DEBUG helper FUNCTIONS Index: t3lib/class.t3lib_pagerenderer.php =================================================================== --- t3lib/class.t3lib_pagerenderer.php (revision 7235) +++ t3lib/class.t3lib_pagerenderer.php (working copy) @@ -1001,6 +1001,7 @@ if (count($this->cssFiles)) { foreach ($this->cssFiles as $file => $properties) { $file = htmlspecialchars(t3lib_div::resolveBackPath($file)); + $file = (TYPO3_MODE == 'BE' ? t3lib_div::createVersionNumberedFile($file) : $file); $tag = ''; if ($properties['allWrap'] && strpos($properties['allWrap'], '|') !== FALSE) { $tag = str_replace('|', $tag, $properties['allWrap']); @@ -1031,6 +1032,7 @@ $properties['file'] = htmlspecialchars( t3lib_div::resolveBackPath($properties['file']) ); + $properties['file'] = (TYPO3_MODE == 'BE' ? t3lib_div::createVersionNumberedFile($properties['file']) : $properties['file']); $tag = ''; if ($properties['allWrap'] && strpos($properties['allWrap'], '|') !== FALSE) { $tag = str_replace('|', $tag, $properties['allWrap']); @@ -1055,6 +1057,7 @@ if (count($this->jsFiles)) { foreach ($this->jsFiles as $file => $properties) { $file = htmlspecialchars(t3lib_div::resolveBackPath($file)); + $file = (TYPO3_MODE == 'BE' ? t3lib_div::createVersionNumberedFile($file) : $file); $tag = ''; if ($properties['allWrap'] && strpos($properties['allWrap'], '|') !== FALSE) { $tag = str_replace('|', $tag, $properties['allWrap']); @@ -1162,7 +1165,7 @@ $out = ''; if ($this->addPrototype) { - $out .= '' . chr(10); + $out .= '' . chr(10); unset($this->jsFiles[$this->backPath . 'contrib/prototype/prototype.js']); } @@ -1181,22 +1184,21 @@ if (count($mods)) { $moduleLoadString = '?load=' . implode(',', $mods); } - - $out .= '' . chr(10); + $out .= '' . chr(10); unset($this->jsFiles[$this->backPath . 'contrib/scriptaculous/scriptaculous.js' . $moduleLoadString]); } // include extCore if ($this->addExtCore) { - $out .= '' . chr(10); + $out .= '' . chr(10); unset($this->jsFiles[$this->backPath . 'contrib/extjs/ext-core' . ($this->enableExtCoreDebug ? '-debug' : '') . '.js']); } // include extJS if ($this->addExtJS) { // use the base adapter all the time - $out .= '' . chr(10); - $out .= '' . chr(10); + $out .= '' . chr(10); + $out .= '' . chr(10); // add extJS localization $localeMap = $this->csConvObj->isoArray; // load standard ISO mapping and modify for use with ExtJS @@ -1211,7 +1213,7 @@ // TODO autoconvert file from UTF8 to current BE charset if necessary!!!! $extJsLocaleFile = 'contrib/extjs/locale/ext-lang-' . $extJsLang . '.js'; if (file_exists(PATH_typo3 . $extJsLocaleFile)) { - $out .= '' . chr(10); + $out .= '' . chr(10); } Index: typo3/alt_main.php =================================================================== --- typo3/alt_main.php (revision 7235) +++ typo3/alt_main.php (working copy) @@ -498,8 +498,8 @@ $this->generateJScode(); $GLOBALS['TBE_TEMPLATE']->JScode= ' - - + + '; $GLOBALS['TBE_TEMPLATE']->JScode.=$GLOBALS['TBE_TEMPLATE']->wrapScriptTags($this->mainJScode); Index: typo3/backend.php =================================================================== --- typo3/backend.php (revision 7235) +++ typo3/backend.php (working copy) @@ -237,7 +237,7 @@ foreach($this->jsFilesAfterInline as $jsFile) { $GLOBALS['TBE_TEMPLATE']->JScode .= ' - '; + '; } Index: typo3/sysext/t3editor/classes/class.tx_t3editor.php =================================================================== --- typo3/sysext/t3editor/classes/class.tx_t3editor.php (revision 7235) +++ typo3/sysext/t3editor/classes/class.tx_t3editor.php (working copy) @@ -126,9 +126,9 @@ // include editor-css $content .= ''; // include editor-js-lib Index: typo3/sysext/cms/tslib/class.tslib_content.php =================================================================== --- typo3/sysext/cms/tslib/class.tslib_content.php (revision 7235) +++ typo3/sysext/cms/tslib/class.tslib_content.php (working copy) @@ -6989,7 +6989,7 @@ /*]]>*/ '; - $GLOBALS['TSFE']->additionalHeaderData['JSincludeFormupdate']=''; + $GLOBALS['TSFE']->additionalHeaderData['JSincludeFormupdate']=''; return $JSPart; } Index: typo3/sysext/cms/layout/db_layout.php =================================================================== --- typo3/sysext/cms/layout/db_layout.php (revision 7235) +++ typo3/sysext/cms/layout/db_layout.php (working copy) @@ -426,7 +426,7 @@ $this->doc->setModuleTemplate('templates/db_layout.html'); // JavaScript: - $this->doc->JScode = ''; + $this->doc->JScode = ''; $this->doc->JScode.= $this->doc->wrapScriptTags(' if (top.fsMod) top.fsMod.recentIds["web"] = '.intval($this->id).'; if (top.fsMod) top.fsMod.navFrameHighlightedID["web"] = "pages'.intval($this->id).'_"+top.fsMod.currentBank; '.intval($this->id).'; Index: typo3/sysext/recycler/mod1/index.php =================================================================== --- typo3/sysext/recycler/mod1/index.php (revision 7235) +++ typo3/sysext/recycler/mod1/index.php (working copy) @@ -158,7 +158,7 @@ */ protected function loadStylesheet($fileName) { $fileName = t3lib_div::resolveBackPath($this->doc->backPath . $fileName); - $this->doc->JScode.= "\t" . '' . "\n"; + $this->doc->JScode.= "\t" . '' . "\n"; } /** @@ -169,7 +169,7 @@ */ protected function loadJavaScript($fileName) { $fileName = t3lib_div::resolveBackPath($this->doc->backPath . $fileName); - $this->doc->JScode.= "\t" . '' . "\n"; + $this->doc->JScode.= "\t" . '' . "\n"; } /**