Example #1
0
 /**
  * @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__);
 }