/** * @param Mage_Core_Controller_Varien_Action $action * @param Mage_Core_Model_Layout $layout */ public function processFiles($action, $layout) { // TODO: refactor phases, find positions, then insert all, then delete all Mana_Core_Profiler::start(__METHOD__); $layoutXml = $layout->getNode(); $layoutDom = new DOMDocument('1.0'); $layoutNode = $layoutDom->importNode(dom_import_simplexml($layoutXml), true); $layoutDom->appendChild($layoutNode); $layoutXPath = new DOMXPath($layoutDom); $layoutModified = false; $headBlock = $this->_findHeadBlock($layoutXPath); $prototypeAction = $this->_findPrototypeAction($layoutXPath); $insertOnDemand = array(); $insertEverywhere = array(); $delete = array(); $onDemandInsertPlace = null; $xpath = ''; foreach ($this->_getFileConfig() as $name => $fileConfig) { /* @var $config array */ /* @var $options array */ extract($fileConfig); if ($xpath) { $xpath .= ' | '; } $xpath .= $this->_getActionsXPath($config); } foreach ($layoutXPath->query($xpath) as $element) { $onDemandInsertPlace = $element; break; } // handle javascript minification, merging and inclusion on all pages foreach ($this->_getFileConfig() as $name => $fileConfig) { /* @var $config array */ /* @var $options array */ extract($fileConfig); if (in_array('skip', $options)) { continue; } // find all statically defined actions of including a given script $fileActions = $this->_findDomActions($layoutXPath, $config); // prepare layout XML action depending on script parameters $action = $this->_createConfigurableAction($layoutDom, $config, $options); // insert script where and if appropriate if (in_array('ondemand', $options)) { if ($fileAction = $this->_getFirstElement($fileActions)) { $insertOnDemand[] = array($action, $onDemandInsertPlace); } $delete[] = $fileActions; } elseif (in_array('everywhere', $options)) { $insertEverywhere[] = $action; foreach (array_reverse($insertOnDemand) as $insertOptions) { list($action, $fileAction) = $insertOptions; array_unshift($insertEverywhere, $action); } $insertOnDemand = array(); $delete[] = $fileActions; } elseif (in_array('unload', $options)) { $delete[] = $fileActions; } } // insert configurable on demand js files foreach ($insertOnDemand as $insertOptions) { list($action, $fileAction) = $insertOptions; /* @var $fileAction DOMElement */ $fileAction->parentNode->insertBefore($action, $fileAction); $layoutModified = true; } // insert configurable global js files if ($prototypeAction) { foreach (array_reverse($insertEverywhere) as $action) { $prototypeAction->parentNode->insertBefore($action, $prototypeAction->nextSibling); $layoutModified = true; } } elseif ($headBlock) { foreach (array_reverse($insertEverywhere) as $action) { $headBlock->insertBefore($action, $headBlock->firstChild); $layoutModified = true; } } // delete js files includes via layout XML instructions foreach ($delete as $fileActions) { foreach ($fileActions as $firstFileAction) { /* @var $firstFileAction DOMElement */ $firstFileAction->parentNode->removeChild($firstFileAction); $layoutModified = true; } } if ($layoutModified) { $layout->loadDom($layoutNode); } Mana_Core_Profiler::stop(__METHOD__); }