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);
 }
Ejemplo n.º 2
0
 /**
  * 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;
 }