public function setUp() { parent::setUp(); // @todo fix controller stack problems and re-activate //$this->autoFollowRedirection = false; CMSMenu::populate_menu(); $this->backupCss = Config::inst()->get('LeftAndMain', 'extra_requirements_css'); $this->backupJs = Config::inst()->get('LeftAndMain', 'extra_requirements_javascript'); $this->backupCombined = Requirements::get_combined_files_enabled(); Config::inst()->update('LeftAndMain', 'extra_requirements_css', array(FRAMEWORK_DIR . '/tests/assets/LeftAndMainTest.css')); Config::inst()->update('LeftAndMain', 'extra_requirements_javascript', array(FRAMEWORK_DIR . '/tests/assets/LeftAndMainTest.js')); Requirements::set_combined_files_enabled(false); }
/** * See {@link combine_files()} * */ function process_combined_files() { if (Director::isDev() && !SapphireTest::is_running_test() || !Requirements::get_combined_files_enabled()) { return; } // Make a map of files that could be potentially combined $combinerCheck = array(); foreach ($this->combine_files as $combinedFile => $sourceItems) { foreach ($sourceItems as $sourceItem) { if (isset($combinerCheck[$sourceItem]) && $combinerCheck[$sourceItem] != $combinedFile) { user_error("Requirements::process_combined_files - file '{$sourceItem}' appears in two combined files:" . " '{$combinerCheck[$sourceItem]}' and '{$combinedFile}'", E_USER_WARNING); } $combinerCheck[$sourceItem] = $combinedFile; } } // Figure out which ones apply to this pageview $combinedFiles = array(); $newJSRequirements = array(); $newCSSRequirements = array(); foreach ($this->javascript as $file => $dummy) { if (isset($combinerCheck[$file])) { $newJSRequirements[$combinerCheck[$file]] = true; $combinedFiles[$combinerCheck[$file]] = true; } else { $newJSRequirements[$file] = true; } } foreach ($this->css as $file => $params) { if (isset($combinerCheck[$file])) { $newCSSRequirements[$combinerCheck[$file]] = true; $combinedFiles[$combinerCheck[$file]] = true; } else { $newCSSRequirements[$file] = $params; } } // Process the combined files $base = Director::baseFolder() . '/'; foreach (array_diff_key($combinedFiles, $this->blocked) as $combinedFile => $dummy) { $fileList = $this->combine_files[$combinedFile]; // Determine if we need to build the combined include if (file_exists($base . $combinedFile) && !isset($_GET['flush'])) { // file exists, check modification date of every contained file $srcLastMod = 0; foreach ($fileList as $file) { $srcLastMod = max(filemtime($base . $file), $srcLastMod); } $refresh = $srcLastMod > filemtime($base . $combinedFile); } else { // file doesn't exist, or refresh was explicitly required $refresh = true; } if (!$refresh) { continue; } $combinedData = ""; foreach (array_diff($fileList, $this->blocked) as $file) { $fileContent = file_get_contents($base . $file); // if we have a javascript file and jsmin is enabled, minify the content $isJS = stripos($file, '.js'); if ($isJS && $this->combine_js_with_jsmin) { require_once 'thirdparty/jsmin/JSMin.php'; increase_time_limit_to(); $fileContent = JSMin::minify($fileContent); } // write a header comment for each file for easier identification and debugging // also the semicolon between each file is required for jQuery to be combinable properly $combinedData .= "/****** FILE: {$file} *****/\n" . $fileContent . "\n" . ($isJS ? ';' : '') . "\n"; } if (!file_exists(dirname($base . $combinedFile))) { Filesystem::makeFolder(dirname($base . $combinedFile)); } $successfulWrite = false; $fh = fopen($base . $combinedFile, 'w'); if ($fh) { if (fwrite($fh, $combinedData) == strlen($combinedData)) { $successfulWrite = true; } fclose($fh); unset($fh); } // Unsuccessful write - just include the regular JS files, rather than the combined one if (!$successfulWrite) { user_error("Requirements_Backend::process_combined_files(): Couldn't create '{$base}{$combinedFile}'", E_USER_WARNING); return; } } // @todo Alters the original information, which means you can't call this // method repeatedly - it will behave different on the second call! $this->javascript = $newJSRequirements; $this->css = $newCSSRequirements; }