Overview

Packages

  • currencysymbol
  • MAbout
  • Mage
    • Admin
    • Adminhtml
    • AdminNotification
    • Api
    • Api2
    • Authorizenet
    • Backup
    • Bundle
    • Captcha
    • Catalog
    • CatalogIndex
    • CatalogInventory
    • CatalogRule
    • CatalogSearch
    • Centinel
    • Checkout
    • Cms
    • Compiler
    • Connect
    • Contacts
    • Core
    • Cron
    • CurrencySymbol
    • Customer
    • Dataflow
    • Directory
    • DirtectPost
    • Downloadable
    • Eav
    • GiftMessage
    • GoogleAnalytics
    • GoogleBase
    • GoogleCheckout
    • ImportExport
    • Index
    • Install
    • Log
    • Media
    • Newsletter
    • Oauth
    • Page
    • PageCache
    • Paygate
    • Payment
    • Paypal
    • PaypalUk
    • Persistent
    • Poll
    • ProductAlert
    • Rating
    • Reports
    • Review
    • Rss
    • Rule
    • Sales
    • SalesRule
    • Sedfriend
    • Sendfriend
    • Shipping
    • Sitemap
    • Tag
    • Tax
    • Usa
    • Weee
    • Widget
    • Wishlist
    • XmlConnect
  • None
  • Phoenix
    • Moneybookers
  • PHP
  • Zend
    • Date
    • Mime
    • XmlRpc

Classes

  • Mage
  • Mage_Adminhtml_Block_Html_Date
  • Mage_Adminhtml_Block_Html_Select
  • Mage_Api_Model_Wsdl_Config_Element
  • Mage_Captcha_Adminhtml_RefreshController
  • Mage_Captcha_RefreshController
  • Mage_Core_AjaxController
  • Mage_Core_Block_Abstract
  • Mage_Core_Block_Flush
  • Mage_Core_Block_Html_Calendar
  • Mage_Core_Block_Html_Date
  • Mage_Core_Block_Html_Link
  • Mage_Core_Block_Html_Select
  • Mage_Core_Block_Messages
  • Mage_Core_Block_Profiler
  • Mage_Core_Block_Store_Switcher
  • Mage_Core_Block_Template
  • Mage_Core_Block_Template_Facade
  • Mage_Core_Block_Template_Smarty
  • Mage_Core_Block_Template_Zend
  • Mage_Core_Block_Text
  • Mage_Core_Block_Text_List
  • Mage_Core_Block_Text_List_Item
  • Mage_Core_Block_Text_List_Link
  • Mage_Core_Block_Text_Tag
  • Mage_Core_Block_Text_Tag_Css
  • Mage_Core_Block_Text_Tag_Css_Admin
  • Mage_Core_Block_Text_Tag_Debug
  • Mage_Core_Block_Text_Tag_Js
  • Mage_Core_Block_Text_Tag_Meta
  • Mage_Core_Controller_Front_Action
  • Mage_Core_Controller_Front_Router
  • Mage_Core_Controller_Request_Http
  • Mage_Core_Controller_Response_Http
  • Mage_Core_Controller_Varien_Action
  • Mage_Core_Controller_Varien_Front
  • Mage_Core_Controller_Varien_Router_Abstract
  • Mage_Core_Controller_Varien_Router_Admin
  • Mage_Core_Controller_Varien_Router_Default
  • Mage_Core_Controller_Varien_Router_Standard
  • Mage_Core_Helper_Abstract
  • Mage_Core_Helper_Cookie
  • Mage_Core_Helper_Data
  • Mage_Core_Helper_File_Storage
  • Mage_Core_Helper_File_Storage_Database
  • Mage_Core_Helper_Hint
  • Mage_Core_Helper_Http
  • Mage_Core_Helper_Js
  • Mage_Core_Helper_String
  • Mage_Core_Helper_Translate
  • Mage_Core_Helper_Url
  • Mage_Core_Helper_Url_Rewrite
  • Mage_Core_IndexController
  • Mage_Core_Model_Abstract
  • Mage_Core_Model_App
  • Mage_Core_Model_App_Area
  • Mage_Core_Model_App_Emulation
  • Mage_Core_Model_Cache
  • Mage_Core_Model_Calculator
  • Mage_Core_Model_Config
  • Mage_Core_Model_Config_Base
  • Mage_Core_Model_Config_Data
  • Mage_Core_Model_Config_Element
  • Mage_Core_Model_Config_Options
  • Mage_Core_Model_Config_System
  • Mage_Core_Model_Cookie
  • Mage_Core_Model_Date
  • Mage_Core_Model_Design
  • Mage_Core_Model_Design_Package
  • Mage_Core_Model_Design_Source_Design
  • Mage_Core_Model_Email
  • Mage_Core_Model_Email_Info
  • Mage_Core_Model_Email_Template
  • Mage_Core_Model_Email_Template_Filter
  • Mage_Core_Model_Email_Template_Mailer
  • Mage_Core_Model_Email_Transport
  • Mage_Core_Model_Encryption
  • Mage_Core_Model_File_Storage
  • Mage_Core_Model_File_Storage_Abstract
  • Mage_Core_Model_File_Storage_Database
  • Mage_Core_Model_File_Storage_Database_Abstract
  • Mage_Core_Model_File_Storage_Directory_Database
  • Mage_Core_Model_File_Storage_File
  • Mage_Core_Model_File_Storage_Flag
  • Mage_Core_Model_File_Uploader
  • Mage_Core_Model_File_Validator_AvailablePath
  • Mage_Core_Model_File_Validator_NotProtectedExtension
  • Mage_Core_Model_Flag
  • Mage_Core_Model_Input_Filter
  • Mage_Core_Model_Input_Filter_MaliciousCode
  • Mage_Core_Model_Language
  • Mage_Core_Model_Layout
  • Mage_Core_Model_Layout_Data
  • Mage_Core_Model_Layout_Element
  • Mage_Core_Model_Layout_Update
  • Mage_Core_Model_Locale
  • Mage_Core_Model_Locale_Config
  • Mage_Core_Model_Log_Adapter
  • Mage_Core_Model_Magento_Api
  • Mage_Core_Model_Magento_Api_V2
  • Mage_Core_Model_Message
  • Mage_Core_Model_Message_Abstract
  • Mage_Core_Model_Message_Collection
  • Mage_Core_Model_Message_Error
  • Mage_Core_Model_Message_Notice
  • Mage_Core_Model_Message_Success
  • Mage_Core_Model_Message_Warning
  • Mage_Core_Model_Mysql4_Abstract
  • Mage_Core_Model_Mysql4_Cache
  • Mage_Core_Model_Mysql4_Collection_Abstract
  • Mage_Core_Model_Mysql4_Config
  • Mage_Core_Model_Mysql4_Config_Data
  • Mage_Core_Model_Mysql4_Config_Data_Collection
  • Mage_Core_Model_Mysql4_Design
  • Mage_Core_Model_Mysql4_Design_Collection
  • Mage_Core_Model_Mysql4_Design_Package_Collection
  • Mage_Core_Model_Mysql4_Design_Theme
  • Mage_Core_Model_Mysql4_Email_Template
  • Mage_Core_Model_Mysql4_Email_Template_Collection
  • Mage_Core_Model_Mysql4_File_Storage_Abstract
  • Mage_Core_Model_Mysql4_File_Storage_Database
  • Mage_Core_Model_Mysql4_File_Storage_Directory_Database
  • Mage_Core_Model_Mysql4_File_Storage_File
  • Mage_Core_Model_Mysql4_Flag
  • Mage_Core_Model_Mysql4_Language
  • Mage_Core_Model_Mysql4_Language_Collection
  • Mage_Core_Model_Mysql4_Layout
  • Mage_Core_Model_Mysql4_Resource
  • Mage_Core_Model_Mysql4_Session
  • Mage_Core_Model_Mysql4_Store
  • Mage_Core_Model_Mysql4_Store_Collection
  • Mage_Core_Model_Mysql4_Store_Group
  • Mage_Core_Model_Mysql4_Store_Group_Collection
  • Mage_Core_Model_Mysql4_Translate
  • Mage_Core_Model_Mysql4_Translate_String
  • Mage_Core_Model_Mysql4_Url_Rewrite
  • Mage_Core_Model_Mysql4_Url_Rewrite_Collection
  • Mage_Core_Model_Mysql4_Variable
  • Mage_Core_Model_Mysql4_Variable_Collection
  • Mage_Core_Model_Mysql4_Website
  • Mage_Core_Model_Mysql4_Website_Collection
  • Mage_Core_Model_Observer
  • Mage_Core_Model_Resource
  • Mage_Core_Model_Resource_Abstract
  • Mage_Core_Model_Resource_Cache
  • Mage_Core_Model_Resource_Config
  • Mage_Core_Model_Resource_Config_Data
  • Mage_Core_Model_Resource_Config_Data_Collection
  • Mage_Core_Model_Resource_Db_Abstract
  • Mage_Core_Model_Resource_Db_Collection_Abstract
  • Mage_Core_Model_Resource_Design
  • Mage_Core_Model_Resource_Design_Collection
  • Mage_Core_Model_Resource_Design_Package_Collection
  • Mage_Core_Model_Resource_Email_Template
  • Mage_Core_Model_Resource_Email_Template_Collection
  • Mage_Core_Model_Resource_Entity_Abstract
  • Mage_Core_Model_Resource_Entity_Table
  • Mage_Core_Model_Resource_File_Storage_Abstract
  • Mage_Core_Model_Resource_File_Storage_Database
  • Mage_Core_Model_Resource_File_Storage_Directory_Database
  • Mage_Core_Model_Resource_File_Storage_File
  • Mage_Core_Model_Resource_Flag
  • Mage_Core_Model_Resource_Helper_Abstract
  • Mage_Core_Model_Resource_Helper_Mysql4
  • Mage_Core_Model_Resource_Iterator
  • Mage_Core_Model_Resource_Language
  • Mage_Core_Model_Resource_Language_Collection
  • Mage_Core_Model_Resource_Layout
  • Mage_Core_Model_Resource_Resource
  • Mage_Core_Model_Resource_Session
  • Mage_Core_Model_Resource_Setup
  • Mage_Core_Model_Resource_Setup_Query_Modifier
  • Mage_Core_Model_Resource_Store
  • Mage_Core_Model_Resource_Store_Collection
  • Mage_Core_Model_Resource_Store_Group
  • Mage_Core_Model_Resource_Store_Group_Collection
  • Mage_Core_Model_Resource_Transaction
  • Mage_Core_Model_Resource_Translate
  • Mage_Core_Model_Resource_Translate_String
  • Mage_Core_Model_Resource_Type_Abstract
  • Mage_Core_Model_Resource_Type_Db
  • Mage_Core_Model_Resource_Type_Db_Mysqli
  • Mage_Core_Model_Resource_Type_Db_Mysqli_Setup
  • Mage_Core_Model_Resource_Type_Db_Pdo_Mysql
  • Mage_Core_Model_Resource_Url_Rewrite
  • Mage_Core_Model_Resource_Url_Rewrite_Collection
  • Mage_Core_Model_Resource_Variable
  • Mage_Core_Model_Resource_Variable_Collection
  • Mage_Core_Model_Resource_Website
  • Mage_Core_Model_Resource_Website_Collection
  • Mage_Core_Model_Session
  • Mage_Core_Model_Session_Abstract
  • Mage_Core_Model_Session_Abstract_Varien
  • Mage_Core_Model_Session_Abstract_Zend
  • Mage_Core_Model_Source_Email_Variables
  • Mage_Core_Model_Store
  • Mage_Core_Model_Store_Api
  • Mage_Core_Model_Store_Api_V2
  • Mage_Core_Model_Store_Group
  • Mage_Core_Model_Template
  • Mage_Core_Model_Translate
  • Mage_Core_Model_Translate_Expr
  • Mage_Core_Model_Translate_Inline
  • Mage_Core_Model_Translate_String
  • Mage_Core_Model_Url
  • Mage_Core_Model_Url_Rewrite
  • Mage_Core_Model_Url_Validator
  • Mage_Core_Model_Variable
  • Mage_Core_Model_Variable_Config
  • Mage_Core_Model_Variable_Observer
  • Mage_Core_Model_Website
  • Mage_Page_Block_Switch
  • Mage_Page_Block_Template_Container
  • Mage_Page_Block_Template_Links
  • Mage_Page_Block_Template_Links_Block
  • Mage_Sales_Model_Quote_Address_Total_Collector

Exceptions

  • Mage_Core_Controller_Varien_Exception
  • Mage_Core_Exception
  • Mage_Core_Model_Session_Exception
  • Mage_Core_Model_Store_Exception

Functions

  • destruct
  • is_dir_writeable
  • is_empty_date
  • mageCoreErrorHandler
  • mageDebugBacktrace
  • mageDelTree
  • mageFindClassFile
  • mageParseCsv
  • mageSendErrorFooter
  • mageSendErrorHeader
  • mageUndoMagicQuotes
  • now
  • sys_get_temp_dir
  • uc_words
  • Overview
  • Package
  • Class
  • Tree
  1: <?php
  2: /**
  3:  * Magento
  4:  *
  5:  * NOTICE OF LICENSE
  6:  *
  7:  * This source file is subject to the Open Software License (OSL 3.0)
  8:  * that is bundled with this package in the file LICENSE.txt.
  9:  * It is also available through the world-wide-web at this URL:
 10:  * http://opensource.org/licenses/osl-3.0.php
 11:  * If you did not receive a copy of the license and are unable to
 12:  * obtain it through the world-wide-web, please send an email
 13:  * to license@magentocommerce.com so we can send you a copy immediately.
 14:  *
 15:  * DISCLAIMER
 16:  *
 17:  * Do not edit or add to this file if you wish to upgrade Magento to newer
 18:  * versions in the future. If you wish to customize Magento for your
 19:  * needs please refer to http://www.magentocommerce.com for more information.
 20:  *
 21:  * @category    Mage
 22:  * @package     Mage_Core
 23:  * @copyright   Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
 24:  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 25:  */
 26: 
 27: 
 28: class Mage_Core_Model_Layout_Update
 29: {
 30:     /**
 31:      * Additional tag for cleaning layout cache convenience
 32:      */
 33:     const LAYOUT_GENERAL_CACHE_TAG = 'LAYOUT_GENERAL_CACHE_TAG';
 34: 
 35:     /**
 36:      * Layout Update Simplexml Element Class Name
 37:      *
 38:      * @var string
 39:      */
 40:     protected $_elementClass;
 41: 
 42:     /**
 43:      * @var Simplexml_Element
 44:      */
 45:     protected $_packageLayout;
 46: 
 47:     /**
 48:      * Cache key
 49:      *
 50:      * @var string
 51:      */
 52:     protected $_cacheId;
 53: 
 54:     /**
 55:      * Cache prefix
 56:      *
 57:      * @var string
 58:      */
 59:     protected $_cachePrefix;
 60: 
 61:     /**
 62:      * Cumulative array of update XML strings
 63:      *
 64:      * @var array
 65:      */
 66:     protected $_updates = array();
 67: 
 68:     /**
 69:      * Handles used in this update
 70:      *
 71:      * @var array
 72:      */
 73:     protected $_handles = array();
 74: 
 75:     /**
 76:      * Substitution values in structure array('from'=>array(), 'to'=>array())
 77:      *
 78:      * @var array
 79:      */
 80:     protected $_subst = array();
 81: 
 82:     public function __construct()
 83:     {
 84:         $subst = Mage::getConfig()->getPathVars();
 85:         foreach ($subst as $k=>$v) {
 86:             $this->_subst['from'][] = '{{'.$k.'}}';
 87:             $this->_subst['to'][] = $v;
 88:         }
 89:     }
 90: 
 91:     public function getElementClass()
 92:     {
 93:         if (!$this->_elementClass) {
 94:             $this->_elementClass = Mage::getConfig()->getModelClassName('core/layout_element');
 95:         }
 96:         return $this->_elementClass;
 97:     }
 98: 
 99:     public function resetUpdates()
100:     {
101:         $this->_updates = array();
102:         return $this;
103:     }
104: 
105:     public function addUpdate($update)
106:     {
107:         $this->_updates[] = $update;
108:         return $this;
109:     }
110: 
111:     public function asArray()
112:     {
113:         return $this->_updates;
114:     }
115: 
116:     public function asString()
117:     {
118:         return implode('', $this->_updates);
119:     }
120: 
121:     public function resetHandles()
122:     {
123:         $this->_handles = array();
124:         return $this;
125:     }
126: 
127:     public function addHandle($handle)
128:     {
129:         if (is_array($handle)) {
130:             foreach ($handle as $h) {
131:                 $this->_handles[$h] = 1;
132:             }
133:         } else {
134:             $this->_handles[$handle] = 1;
135:         }
136:         return $this;
137:     }
138: 
139:     public function removeHandle($handle)
140:     {
141:         unset($this->_handles[$handle]);
142:         return $this;
143:     }
144: 
145:     public function getHandles()
146:     {
147:         return array_keys($this->_handles);
148:     }
149: 
150:     /**
151:      * Get cache id
152:      *
153:      * @return string
154:      */
155:     public function getCacheId()
156:     {
157:         if (!$this->_cacheId) {
158:             $this->_cacheId = 'LAYOUT_'.Mage::app()->getStore()->getId().md5(join('__', $this->getHandles()));
159:         }
160:         return $this->_cacheId;
161:     }
162: 
163:     /**
164:      * Set cache id
165:      *
166:      * @param string $cacheId
167:      * @return Mage_Core_Model_Layout_Update
168:      */
169:     public function setCacheId($cacheId)
170:     {
171:         $this->_cacheId = $cacheId;
172:         return $this;
173:     }
174: 
175:     public function loadCache()
176:     {
177:         if (!Mage::app()->useCache('layout')) {
178:             return false;
179:         }
180: 
181:         if (!$result = Mage::app()->loadCache($this->getCacheId())) {
182:             return false;
183:         }
184: 
185:         $this->addUpdate($result);
186: 
187:         return true;
188:     }
189: 
190:     public function saveCache()
191:     {
192:         if (!Mage::app()->useCache('layout')) {
193:             return false;
194:         }
195:         $str = $this->asString();
196:         $tags = $this->getHandles();
197:         $tags[] = self::LAYOUT_GENERAL_CACHE_TAG;
198:         return Mage::app()->saveCache($str, $this->getCacheId(), $tags, null);
199:     }
200: 
201:     /**
202:      * Load layout updates by handles
203:      *
204:      * @param array|string $handles
205:      * @return Mage_Core_Model_Layout_Update
206:      */
207:     public function load($handles=array())
208:     {
209:         if (is_string($handles)) {
210:             $handles = array($handles);
211:         } elseif (!is_array($handles)) {
212:             throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid layout update handle'));
213:         }
214: 
215:         foreach ($handles as $handle) {
216:             $this->addHandle($handle);
217:         }
218: 
219:         if ($this->loadCache()) {
220:             return $this;
221:         }
222: 
223:         foreach ($this->getHandles() as $handle) {
224:             $this->merge($handle);
225:         }
226: 
227:         $this->saveCache();
228:         return $this;
229:     }
230: 
231:     public function asSimplexml()
232:     {
233:         $updates = trim($this->asString());
234:         $updates = '<'.'?xml version="1.0"?'.'><layout>'.$updates.'</layout>';
235:         return simplexml_load_string($updates, $this->getElementClass());
236:     }
237: 
238:     /**
239:      * Merge layout update by handle
240:      *
241:      * @param string $handle
242:      * @return Mage_Core_Model_Layout_Update
243:      */
244:     public function merge($handle)
245:     {
246:         $packageUpdatesStatus = $this->fetchPackageLayoutUpdates($handle);
247:         if (Mage::app()->isInstalled()) {
248:             $this->fetchDbLayoutUpdates($handle);
249:         }
250: //        if (!$this->fetchPackageLayoutUpdates($handle)
251: //            && !$this->fetchDbLayoutUpdates($handle)) {
252: //            #$this->removeHandle($handle);
253: //        }
254:         return $this;
255:     }
256: 
257:     public function fetchFileLayoutUpdates()
258:     {
259:         $storeId = Mage::app()->getStore()->getId();
260:         $elementClass = $this->getElementClass();
261:         $design = Mage::getSingleton('core/design_package');
262:         $cacheKey = 'LAYOUT_' . $design->getArea() . '_STORE' . $storeId . '_' . $design->getPackageName() . '_'
263:             . $design->getTheme('layout');
264: 
265:         $cacheTags = array(self::LAYOUT_GENERAL_CACHE_TAG);
266:         if (Mage::app()->useCache('layout') && ($layoutStr = Mage::app()->loadCache($cacheKey))) {
267:             $this->_packageLayout = simplexml_load_string($layoutStr, $elementClass);
268:         }
269:         if (empty($layoutStr)) {
270:             $this->_packageLayout = $this->getFileLayoutUpdatesXml(
271:                 $design->getArea(),
272:                 $design->getPackageName(),
273:                 $design->getTheme('layout'),
274:                 $storeId
275:             );
276:             if (Mage::app()->useCache('layout')) {
277:                 Mage::app()->saveCache($this->_packageLayout->asXml(), $cacheKey, $cacheTags, null);
278:             }
279:         }
280: 
281: 
282: 
283: //        $elementClass = $this->getElementClass();
284: //
285: //        $design = Mage::getSingleton('core/design_package');
286: //        $area = $design->getArea();
287: //        $storeId = Mage::app()->getStore()->getId();
288: //        $cacheKey = 'LAYOUT_'.$area.'_STORE'.$storeId.'_'.$design->getPackageName().'_'.$design->getTheme('layout');
289: //#echo "TEST:".$cacheKey;
290: //        $cacheTags = array('layout');
291: //
292: //        if (Mage::app()->useCache('layout') && ($layoutStr = Mage::app()->loadCache($cacheKey))) {
293: //            $this->_packageLayout = simplexml_load_string($layoutStr, $elementClass);
294: //        }
295: //
296: //        if (empty($layoutStr)) {
297: //            $updatesRoot = Mage::app()->getConfig()->getNode($area.'/layout/updates');
298: //            Mage::dispatchEvent('core_layout_update_updates_get_after', array('updates' => $updatesRoot));
299: //            $updateFiles = array();
300: //            foreach ($updatesRoot->children() as $updateNode) {
301: //                if ($updateNode->file) {
302: //                    $module = $updateNode->getAttribute('module');
303: //                    if ($module && Mage::getStoreConfigFlag('advanced/modules_disable_output/' . $module)) {
304: //                        continue;
305: //                    }
306: //                    $updateFiles[] = (string)$updateNode->file;
307: //                }
308: //            }
309: //
310: //            // custom local layout updates file - load always last
311: //            $updateFiles[] = 'local.xml';
312: //
313: //            $layoutStr = '';
314: //            #$layoutXml = new $elementClass('<layouts/>');
315: //            foreach ($updateFiles as $file) {
316: //                $filename = $design->getLayoutFilename($file);
317: //                if (!is_readable($filename)) {
318: //                    continue;
319: //                }
320: //                $fileStr = file_get_contents($filename);
321: //                $fileStr = str_replace($this->_subst['from'], $this->_subst['to'], $fileStr);
322: //                $fileXml = simplexml_load_string($fileStr, $elementClass);
323: //                if (!$fileXml instanceof SimpleXMLElement) {
324: //                    continue;
325: //                }
326: //                $layoutStr .= $fileXml->innerXml();
327: //
328: //                #$layoutXml->appendChild($fileXml);
329: //            }
330: //            $layoutXml = simplexml_load_string('<layouts>'.$layoutStr.'</layouts>', $elementClass);
331: //
332: //            $this->_packageLayout = $layoutXml;
333: //
334: //            if (Mage::app()->useCache('layout')) {
335: //                Mage::app()->saveCache($this->_packageLayout->asXml(), $cacheKey, $cacheTags, null);
336: //            }
337: //        }
338: 
339:         return $this;
340:     }
341: 
342:     public function fetchPackageLayoutUpdates($handle)
343:     {
344:         $_profilerKey = 'layout/package_update: '.$handle;
345:         Varien_Profiler::start($_profilerKey);
346:         if (empty($this->_packageLayout)) {
347:             $this->fetchFileLayoutUpdates();
348:         }
349:         foreach ($this->_packageLayout->$handle as $updateXml) {
350: #echo '<textarea style="width:600px; height:400px;">'.$handle.':'.print_r($updateXml,1).'</textarea>';
351:             $this->fetchRecursiveUpdates($updateXml);
352:             $this->addUpdate($updateXml->innerXml());
353:         }
354:         Varien_Profiler::stop($_profilerKey);
355: 
356:         return true;
357:     }
358: 
359:     public function fetchDbLayoutUpdates($handle)
360:     {
361:         $_profilerKey = 'layout/db_update: '.$handle;
362:         Varien_Profiler::start($_profilerKey);
363:         $updateStr = $this->_getUpdateString($handle);
364:         if (!$updateStr) {
365:             return false;
366:         }
367:         $updateStr = '<update_xml>' . $updateStr . '</update_xml>';
368:         $updateStr = str_replace($this->_subst['from'], $this->_subst['to'], $updateStr);
369:         $updateXml = simplexml_load_string($updateStr, $this->getElementClass());
370:         $this->fetchRecursiveUpdates($updateXml);
371:         $this->addUpdate($updateXml->innerXml());
372: 
373:         Varien_Profiler::stop($_profilerKey);
374:         return true;
375:     }
376: 
377:     /**
378:      * Get update string
379:      *
380:      * @param string $handle
381:      * @return mixed
382:      */
383:     protected function _getUpdateString($handle)
384:     {
385:         return Mage::getResourceModel('core/layout')->fetchUpdatesByHandle($handle);
386:     }
387: 
388:     public function fetchRecursiveUpdates($updateXml)
389:     {
390:         foreach ($updateXml->children() as $child) {
391:             if (strtolower($child->getName())=='update' && isset($child['handle'])) {
392:                 $this->merge((string)$child['handle']);
393:                 // Adding merged layout handle to the list of applied hanles
394:                 $this->addHandle((string)$child['handle']);
395:             }
396:         }
397:         return $this;
398:     }
399: 
400:     /**
401:      * Collect and merge layout updates from file
402:      *
403:      * @param string $area
404:      * @param string $package
405:      * @param string $theme
406:      * @param integer|null $storeId
407:      * @return Mage_Core_Model_Layout_Element
408:      */
409:     public function getFileLayoutUpdatesXml($area, $package, $theme, $storeId = null)
410:     {
411:         if (null === $storeId) {
412:             $storeId = Mage::app()->getStore()->getId();
413:         }
414:         /* @var $design Mage_Core_Model_Design_Package */
415:         $design = Mage::getSingleton('core/design_package');
416:         $layoutXml = null;
417:         $elementClass = $this->getElementClass();
418:         $updatesRoot = Mage::app()->getConfig()->getNode($area.'/layout/updates');
419:         Mage::dispatchEvent('core_layout_update_updates_get_after', array('updates' => $updatesRoot));
420:         $updateFiles = array();
421:         foreach ($updatesRoot->children() as $updateNode) {
422:             if ($updateNode->file) {
423:                 $module = $updateNode->getAttribute('module');
424:                 if ($module && Mage::getStoreConfigFlag('advanced/modules_disable_output/' . $module, $storeId)) {
425:                     continue;
426:                 }
427:                 $updateFiles[] = (string)$updateNode->file;
428:             }
429:         }
430:         // custom local layout updates file - load always last
431:         $updateFiles[] = 'local.xml';
432:         $layoutStr = '';
433:         foreach ($updateFiles as $file) {
434:             $filename = $design->getLayoutFilename($file, array(
435:                 '_area'    => $area,
436:                 '_package' => $package,
437:                 '_theme'   => $theme
438:             ));
439:             if (!is_readable($filename)) {
440:                 continue;
441:             }
442:             $fileStr = file_get_contents($filename);
443:             $fileStr = str_replace($this->_subst['from'], $this->_subst['to'], $fileStr);
444:             $fileXml = simplexml_load_string($fileStr, $elementClass);
445:             if (!$fileXml instanceof SimpleXMLElement) {
446:                 continue;
447:             }
448:             $layoutStr .= $fileXml->innerXml();
449:         }
450:         $layoutXml = simplexml_load_string('<layouts>'.$layoutStr.'</layouts>', $elementClass);
451:         return $layoutXml;
452:     }
453: }
454: 
Magento 1.7.0.2 API documentation generated by ApiGen 2.8.0