Example #1
0
 /**
  * Collect and merge layout updates from file
  *
  * @param string $area
  * @param string $package
  * @param string $theme
  * @param integer|null $storeId
  * @return Mage_Core_Model_Layout_Element
  */
 public function getFileLayoutUpdatesXml($area, $package, $theme, $storeId = null)
 {
     if (null === $storeId) {
         $storeId = Mage::app()->getStore()->getId();
     }
     /* @var $design Mage_Core_Model_Design_Package */
     $design = Mage::getSingleton('core/design_package');
     $layoutXml = null;
     $elementClass = $this->getElementClass();
     $updatesRoot = Mage::app()->getConfig()->getNode($area . '/layout/updates');
     Mage::dispatchEvent('core_layout_update_updates_get_after', array('updates' => $updatesRoot));
     $updates = $updatesRoot->asArray();
     $themeUpdates = Mage::getSingleton('core/design_config')->getNode("{$area}/{$package}/{$theme}/layout/updates");
     if ($themeUpdates && is_array($themeUpdates->asArray())) {
         //array_values() to ensure that theme-specific layouts don't override, but add to module layouts
         $updates = array_merge($updates, array_values($themeUpdates->asArray()));
     }
     $updateFiles = array();
     foreach ($updates as $updateNode) {
         if (!empty($updateNode['file'])) {
             $module = isset($updateNode['@']['module']) ? $updateNode['@']['module'] : false;
             if ($module && Mage::getStoreConfigFlag('advanced/modules_disable_output/' . $module, $storeId)) {
                 continue;
             }
             $updateFiles[] = $updateNode['file'];
         }
     }
     // custom local layout updates file - load always last
     $updateFiles[] = 'local.xml';
     /**
      * IDDQD: Inject custom layout files via event.
      */
     $eventData = new Varien_Object(array('update_files' => $updateFiles));
     Mage::dispatchEvent('before_layoutxml_compile', array('updates' => $eventData, 'god_mode' => $this));
     $updateFiles = $eventData->getUpdateFiles();
     $layoutStr = '';
     foreach ($updateFiles as $file) {
         $filename = $design->getLayoutFilename($file, array('_area' => $area, '_package' => $package, '_theme' => $theme));
         if (!is_readable($filename)) {
             continue;
         }
         $fileStr = file_get_contents($filename);
         $fileStr = str_replace($this->_subst['from'], $this->_subst['to'], $fileStr);
         $fileXml = simplexml_load_string($fileStr, $elementClass);
         if (!$fileXml instanceof SimpleXMLElement) {
             continue;
         }
         $layoutStr .= $fileXml->innerXml();
     }
     $layoutXml = simplexml_load_string('<layouts>' . $layoutStr . '</layouts>', $elementClass);
     return $layoutXml;
 }