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_Design_Package
 29: {
 30:     const DEFAULT_AREA    = 'frontend';
 31:     const DEFAULT_PACKAGE = 'default';
 32:     const DEFAULT_THEME   = 'default';
 33:     const BASE_PACKAGE    = 'base';
 34: 
 35:     /**
 36:      * @deprecated after 1.4.0.0-alpha3
 37:      */
 38:     const FALLBACK_THEME  = 'default';
 39: 
 40:     private static $_regexMatchCache      = array();
 41:     private static $_customThemeTypeCache = array();
 42: 
 43:     /**
 44:      * Current Store for generation ofr base_dir and base_url
 45:      *
 46:      * @var string|integer|Mage_Core_Model_Store
 47:      */
 48:     protected $_store = null;
 49: 
 50:     /**
 51:      * Package area
 52:      *
 53:      * @var string
 54:      */
 55:     protected $_area;
 56: 
 57:     /**
 58:      * Package name
 59:      *
 60:      * @var string
 61:      */
 62:     protected $_name;
 63: 
 64:     /**
 65:      * Package theme
 66:      *
 67:      * @var string
 68:      */
 69:     protected $_theme;
 70: 
 71:     /**
 72:      * Package root directory
 73:      *
 74:      * @var string
 75:      */
 76:     protected $_rootDir;
 77: 
 78:     /**
 79:      * Directory of the css file
 80:      * Using only to transmit additional parametr in callback functions
 81:      * @var string
 82:      */
 83:     protected $_callbackFileDir;
 84: 
 85:     protected $_config = null;
 86: 
 87:     /**
 88:      * Whether theme/skin hierarchy should be checked via fallback mechanism
 89:      * @TODO: implement setter for this value
 90:      * @var bool
 91:      */
 92:     protected $_shouldFallback = true;
 93: 
 94:     /**
 95:      * Set store
 96:      *
 97:      * @param  string|integer|Mage_Core_Model_Store $store
 98:      * @return Mage_Core_Model_Design_Package
 99:      */
100:     public function setStore($store)
101:     {
102:         $this->_store = $store;
103:         return $this;
104:     }
105: 
106:     /**
107:      * Retrieve store
108:      *
109:      * @return string|integer|Mage_Core_Model_Store
110:      */
111:     public function getStore()
112:     {
113:         if ($this->_store === null) {
114:             return Mage::app()->getStore();
115:         }
116:         return $this->_store;
117:     }
118: 
119:     /**
120:      * Set package area
121:      *
122:      * @param  string $area
123:      * @return Mage_Core_Model_Design_Package
124:      */
125:     public function setArea($area)
126:     {
127:         $this->_area = $area;
128:         return $this;
129:     }
130: 
131:     /**
132:      * Retrieve package area
133:      *
134:      * @return unknown
135:      */
136:     public function getArea()
137:     {
138:         if (is_null($this->_area)) {
139:             $this->_area = self::DEFAULT_AREA;
140:         }
141:         return $this->_area;
142:     }
143: 
144:     /**
145:      * Set package name
146:      * In case of any problem, the default will be set.
147:      *
148:      * @param  string $name
149:      * @return Mage_Core_Model_Design_Package
150:      */
151:     public function setPackageName($name = '')
152:     {
153:         if (empty($name)) {
154:             // see, if exceptions for user-agents defined in config
155:             $customPackage = $this->_checkUserAgentAgainstRegexps('design/package/ua_regexp');
156:             if ($customPackage) {
157:                 $this->_name = $customPackage;
158:             }
159:             else {
160:                 $this->_name = Mage::getStoreConfig('design/package/name', $this->getStore());
161:             }
162:         }
163:         else {
164:             $this->_name = $name;
165:         }
166:         // make sure not to crash, if wrong package specified
167:         if (!$this->designPackageExists($this->_name, $this->getArea())) {
168:             $this->_name = self::DEFAULT_PACKAGE;
169:         }
170:         return $this;
171:     }
172: 
173:     /**
174:      * Set store/package/area at once, and get respective values, that were before
175:      *
176:      * $storePackageArea must be assoc array. The keys may be:
177:      * 'store', 'package', 'area'
178:      *
179:      * @param array $storePackageArea
180:      * @return array
181:      */
182:     public function setAllGetOld($storePackageArea)
183:     {
184:         $oldValues = array();
185:         if (array_key_exists('store', $storePackageArea)) {
186:             $oldValues['store'] = $this->getStore();
187:             $this->setStore($storePackageArea['store']);
188:         }
189:         if (array_key_exists('area', $storePackageArea)) {
190:             $oldValues['area'] = $this->getArea();
191:             $this->setArea($storePackageArea['area']);
192:         }
193:         if (array_key_exists('package', $storePackageArea)) {
194:             $oldValues['package'] = $this->getPackageName();
195:             $this->setPackageName($storePackageArea['package']);
196:         }
197:         return $oldValues;
198:     }
199: 
200:     /**
201:      * Retrieve package name
202:      *
203:      * @return string
204:      */
205:     public function getPackageName()
206:     {
207:         if (null === $this->_name) {
208:             $this->setPackageName();
209:         }
210:         return $this->_name;
211:     }
212: 
213:     public function designPackageExists($packageName, $area = self::DEFAULT_AREA)
214:     {
215:         return is_dir(Mage::getBaseDir('design') . DS . $area . DS . $packageName);
216:     }
217: 
218:     /**
219:      * Declare design package theme params
220:      * Polymorph method:
221:      * 1) if 1 parameter specified, sets everything to this value
222:      * 2) if 2 parameters, treats 1st as key and 2nd as value
223:      *
224:      * @return Mage_Core_Model_Design_Package
225:      */
226:     public function setTheme()
227:     {
228:         switch (func_num_args()) {
229:             case 1:
230:                 foreach (array('layout', 'template', 'skin', 'locale') as $type) {
231:                     $this->_theme[$type] = func_get_arg(0);
232:                 }
233:                 break;
234: 
235:             case 2:
236:                 $this->_theme[func_get_arg(0)] = func_get_arg(1);
237:                 break;
238: 
239:             default:
240:                 throw Mage::exception(Mage::helper('core')->__('Wrong number of arguments for %s', __METHOD__));
241:         }
242:         return $this;
243:     }
244: 
245:     public function getTheme($type)
246:     {
247:         if (empty($this->_theme[$type])) {
248:             $this->_theme[$type] = Mage::getStoreConfig('design/theme/'.$type, $this->getStore());
249:             if ($type!=='default' && empty($this->_theme[$type])) {
250:                 $this->_theme[$type] = $this->getTheme('default');
251:                 if (empty($this->_theme[$type])) {
252:                     $this->_theme[$type] = self::DEFAULT_THEME;
253:                 }
254: 
255:                 // "locale", "layout", "template"
256:             }
257:         }
258: 
259:         // + "default", "skin"
260: 
261:         // set exception value for theme, if defined in config
262:         $customThemeType = $this->_checkUserAgentAgainstRegexps("design/theme/{$type}_ua_regexp");
263:         if ($customThemeType) {
264:             $this->_theme[$type] = $customThemeType;
265:         }
266: 
267:         return $this->_theme[$type];
268:     }
269: 
270:     public function getDefaultTheme()
271:     {
272:         return self::DEFAULT_THEME;
273:     }
274: 
275:     public function updateParamDefaults(array &$params)
276:     {
277:         if ($this->getStore()) {
278:             $params['_store'] = $this->getStore();
279:         }
280:         if (empty($params['_area'])) {
281:             $params['_area'] = $this->getArea();
282:         }
283:         if (empty($params['_package'])) {
284:             $params['_package'] = $this->getPackageName();
285:         }
286:         if (empty($params['_theme'])) {
287:             $params['_theme'] = $this->getTheme( (isset($params['_type'])) ? $params['_type'] : '' );
288:         }
289:         if (empty($params['_default'])) {
290:             $params['_default'] = false;
291:         }
292:         return $this;
293:     }
294: 
295:     public function getBaseDir(array $params)
296:     {
297:         $this->updateParamDefaults($params);
298:         $baseDir = (empty($params['_relative']) ? Mage::getBaseDir('design').DS : '').
299:             $params['_area'].DS.$params['_package'].DS.$params['_theme'].DS.$params['_type'];
300:         return $baseDir;
301:     }
302: 
303:     public function getSkinBaseDir(array $params=array())
304:     {
305:         $params['_type'] = 'skin';
306:         $this->updateParamDefaults($params);
307:         $baseDir = (empty($params['_relative']) ? Mage::getBaseDir('skin').DS : '').
308:             $params['_area'].DS.$params['_package'].DS.$params['_theme'];
309:         return $baseDir;
310:     }
311: 
312:     public function getLocaleBaseDir(array $params=array())
313:     {
314:         $params['_type'] = 'locale';
315:         $this->updateParamDefaults($params);
316:         $baseDir = (empty($params['_relative']) ? Mage::getBaseDir('design').DS : '').
317:             $params['_area'].DS.$params['_package'].DS.$params['_theme'] . DS . 'locale' . DS .
318:             Mage::app()->getLocale()->getLocaleCode();
319:         return $baseDir;
320:     }
321: 
322:     public function getSkinBaseUrl(array $params=array())
323:     {
324:         $params['_type'] = 'skin';
325:         $this->updateParamDefaults($params);
326:         $baseUrl = Mage::getBaseUrl('skin', isset($params['_secure'])?(bool)$params['_secure']:null)
327:             .$params['_area'].'/'.$params['_package'].'/'.$params['_theme'].'/';
328:         return $baseUrl;
329:     }
330: 
331:     /**
332:      * Check whether requested file exists in specified theme params
333:      *
334:      * Possible params:
335:      * - _type: layout|template|skin|locale
336:      * - _package: design package, if not set = default
337:      * - _theme: if not set = default
338:      * - _file: path relative to theme root
339:      *
340:      * @see Mage_Core_Model_Config::getBaseDir
341:      * @param string $file
342:      * @param array $params
343:      * @return string|false
344:      */
345:     public function validateFile($file, array $params)
346:     {
347:         $fileName = $this->_renderFilename($file, $params);
348:         $testFile = (empty($params['_relative']) ? '' : Mage::getBaseDir('design') . DS) . $fileName;
349:         if (!file_exists($testFile)) {
350:             return false;
351:         }
352:         return $fileName;
353:     }
354: 
355:     /**
356:      * Get filename by specified theme parameters
357:      *
358:      * @param array $file
359:      * @param $params
360:      * @return string
361:      */
362:     protected function _renderFilename($file, array $params)
363:     {
364:         switch ($params['_type']) {
365:             case 'skin':
366:                 $dir = $this->getSkinBaseDir($params);
367:                 break;
368: 
369:             case 'locale':
370:                 $dir = $this->getLocaleBasedir($params);
371:                 break;
372: 
373:             default:
374:                 $dir = $this->getBaseDir($params);
375:                 break;
376:         }
377:         return $dir . DS . $file;
378:     }
379: 
380:     /**
381:      * Check for files existence by specified scheme
382:      *
383:      * If fallback enabled, the first found file will be returned. Otherwise the base package / default theme file,
384:      *   regardless of found or not.
385:      * If disabled, the lookup won't be performed to spare filesystem calls.
386:      *
387:      * @param string $file
388:      * @param array &$params
389:      * @param array $fallbackScheme
390:      * @return string
391:      */
392:     protected function _fallback($file, array &$params, array $fallbackScheme = array(array()))
393:     {
394:         if ($this->_shouldFallback) {
395:             foreach ($fallbackScheme as $try) {
396:                 $params = array_merge($params, $try);
397:                 $filename = $this->validateFile($file, $params);
398:                 if ($filename) {
399:                     return $filename;
400:                 }
401:             }
402:             $params['_package'] = self::BASE_PACKAGE;
403:             $params['_theme']   = self::DEFAULT_THEME;
404:         }
405:         return $this->_renderFilename($file, $params);
406:     }
407: 
408:     /**
409:      * Use this one to get existing file name with fallback to default
410:      *
411:      * $params['_type'] is required
412:      *
413:      * @param string $file
414:      * @param array $params
415:      * @return string
416:      */
417:     public function getFilename($file, array $params)
418:     {
419:         Varien_Profiler::start(__METHOD__);
420:         $this->updateParamDefaults($params);
421:         $result = $this->_fallback($file, $params, array(
422:             array(),
423:             array('_theme' => $this->getFallbackTheme()),
424:             array('_theme' => self::DEFAULT_THEME),
425:         ));
426:         Varien_Profiler::stop(__METHOD__);
427:         return $result;
428:     }
429: 
430:     /**
431:      * Default theme getter
432:      * @return string
433:      */
434:     public function getFallbackTheme()
435:     {
436:         return Mage::getStoreConfig('design/theme/default', $this->getStore());
437:     }
438: 
439:     public function getLayoutFilename($file, array $params=array())
440:     {
441:         $params['_type'] = 'layout';
442:         return $this->getFilename($file, $params);
443:     }
444: 
445:     public function getTemplateFilename($file, array $params=array())
446:     {
447:         $params['_type'] = 'template';
448:         return $this->getFilename($file, $params);
449:     }
450: 
451:     public function getLocaleFileName($file, array $params=array())
452:     {
453:         $params['_type'] = 'locale';
454:         return $this->getFilename($file, $params);
455:     }
456: 
457:     /**
458:      * Get skin file url
459:      *
460:      * @param string $file
461:      * @param array $params
462:      * @return string
463:      */
464:     public function getSkinUrl($file = null, array $params = array())
465:     {
466:         Varien_Profiler::start(__METHOD__);
467:         if (empty($params['_type'])) {
468:             $params['_type'] = 'skin';
469:         }
470:         if (empty($params['_default'])) {
471:             $params['_default'] = false;
472:         }
473:         $this->updateParamDefaults($params);
474:         if (!empty($file)) {
475:             $result = $this->_fallback($file, $params, array(
476:                 array(),
477:                 array('_theme' => $this->getFallbackTheme()),
478:                 array('_theme' => self::DEFAULT_THEME),
479:             ));
480:         }
481:         $result = $this->getSkinBaseUrl($params) . (empty($file) ? '' : $file);
482:         Varien_Profiler::stop(__METHOD__);
483:         return $result;
484:     }
485: 
486:     /**
487:      * Design packages list getter
488:      * @return array
489:      */
490:     public function getPackageList()
491:     {
492:         $directory = Mage::getBaseDir('design') . DS . 'frontend';
493:         return $this->_listDirectories($directory);
494:     }
495: 
496:     /**
497:      * Design package (optional) themes list getter
498:      * @param string $package
499:      * @return string
500:      */
501:     public function getThemeList($package = null)
502:     {
503:         $result = array();
504: 
505:         if (is_null($package)){
506:             foreach ($this->getPackageList() as $package){
507:                 $result[$package] = $this->getThemeList($package);
508:             }
509:         } else {
510:             $directory = Mage::getBaseDir('design') . DS . 'frontend' . DS . $package;
511:             $result = $this->_listDirectories($directory);
512:         }
513: 
514:         return $result;
515:     }
516: 
517:     /**
518:      * Directories lister utility method
519:      *
520:      * @param string $path
521:      * @param string|bool $fullPath
522:      * @return array
523:      */
524:     private function _listDirectories($path, $fullPath = false)
525:     {
526:         $result = array();
527:         $dir = opendir($path);
528:         if ($dir) {
529:             while ($entry = readdir($dir)) {
530:                 if (substr($entry, 0, 1) == '.' || !is_dir($path . DS . $entry)){
531:                     continue;
532:                 }
533:                 if ($fullPath) {
534:                     $entry = $path . DS . $entry;
535:                 }
536:                 $result[] = $entry;
537:             }
538:             unset($entry);
539:             closedir($dir);
540:         }
541: 
542:         return $result;
543:     }
544: 
545:     /**
546:      * Get regex rules from config and check user-agent against them
547:      *
548:      * Rules must be stored in config as a serialized array(['regexp']=>'...', ['value'] => '...')
549:      * Will return false or found string.
550:      *
551:      * @param string $regexpsConfigPath
552:      * @return mixed
553:      */
554:     protected function _checkUserAgentAgainstRegexps($regexpsConfigPath)
555:     {
556:         if (empty($_SERVER['HTTP_USER_AGENT'])) {
557:             return false;
558:         }
559: 
560:         if (!empty(self::$_customThemeTypeCache[$regexpsConfigPath])) {
561:             return self::$_customThemeTypeCache[$regexpsConfigPath];
562:         }
563: 
564:         $configValueSerialized = Mage::getStoreConfig($regexpsConfigPath, $this->getStore());
565: 
566:         if (!$configValueSerialized) {
567:             return false;
568:         }
569: 
570:         $regexps = @unserialize($configValueSerialized);
571: 
572:         if (empty($regexps)) {
573:             return false;
574:         }
575: 
576:         return self::getPackageByUserAgent($regexps, $regexpsConfigPath);
577:     }
578: 
579:     /**
580:      * Return package name based on design exception rules
581:      *
582:      * @param array $rules - design exception rules
583:      * @param string $regexpsConfigPath
584:      * @return bool|string
585:      */
586:     public static function getPackageByUserAgent(array $rules, $regexpsConfigPath = 'path_mock')
587:     {
588:         foreach ($rules as $rule) {
589:             if (!empty(self::$_regexMatchCache[$rule['regexp']][$_SERVER['HTTP_USER_AGENT']])) {
590:                 self::$_customThemeTypeCache[$regexpsConfigPath] = $rule['value'];
591:                 return $rule['value'];
592:             }
593: 
594:             $regexp = '/' . trim($rule['regexp'], '/') . '/';
595: 
596:             if (@preg_match($regexp, $_SERVER['HTTP_USER_AGENT'])) {
597:                 self::$_regexMatchCache[$rule['regexp']][$_SERVER['HTTP_USER_AGENT']] = true;
598:                 self::$_customThemeTypeCache[$regexpsConfigPath] = $rule['value'];
599:                 return $rule['value'];
600:             }
601:         }
602: 
603:         return false;
604:     }
605: 
606:     /**
607:      * Merge specified javascript files and return URL to the merged file on success
608:      *
609:      * @param $files
610:      * @return string
611:      */
612:     public function getMergedJsUrl($files)
613:     {
614:         $targetFilename = md5(implode(',', $files)) . '.js';
615:         $targetDir = $this->_initMergerDir('js');
616:         if (!$targetDir) {
617:             return '';
618:         }
619:         if ($this->_mergeFiles($files, $targetDir . DS . $targetFilename, false, null, 'js')) {
620:             return Mage::getBaseUrl('media', Mage::app()->getRequest()->isSecure()) . 'js/' . $targetFilename;
621:         }
622:         return '';
623:     }
624: 
625:     /**
626:      * Merge specified css files and return URL to the merged file on success
627:      *
628:      * @param $files
629:      * @return string
630:      */
631:     public function getMergedCssUrl($files)
632:     {
633:         // secure or unsecure
634:         $isSecure = Mage::app()->getRequest()->isSecure();
635:         $mergerDir = $isSecure ? 'css_secure' : 'css';
636:         $targetDir = $this->_initMergerDir($mergerDir);
637:         if (!$targetDir) {
638:             return '';
639:         }
640: 
641:         // base hostname & port
642:         $baseMediaUrl = Mage::getBaseUrl('media', $isSecure);
643:         $hostname = parse_url($baseMediaUrl, PHP_URL_HOST);
644:         $port = parse_url($baseMediaUrl, PHP_URL_PORT);
645:         if (false === $port) {
646:             $port = $isSecure ? 443 : 80;
647:         }
648: 
649:         // merge into target file
650:         $targetFilename = md5(implode(',', $files) . "|{$hostname}|{$port}") . '.css';
651:         $mergeFilesResult = $this->_mergeFiles(
652:             $files, $targetDir . DS . $targetFilename,
653:             false,
654:             array($this, 'beforeMergeCss'),
655:             'css'
656:         );
657:         if ($mergeFilesResult) {
658:             return $baseMediaUrl . $mergerDir . '/' . $targetFilename;
659:         }
660:         return '';
661:     }
662: 
663:     /**
664:      * Merges files into one and saves it into DB (if DB file storage is on)
665:      *
666:      * @see Mage_Core_Helper_Data::mergeFiles()
667:      * @param array $srcFiles
668:      * @param string|bool $targetFile - file path to be written
669:      * @param bool $mustMerge
670:      * @param callback $beforeMergeCallback
671:      * @param array|string $extensionsFilter
672:      * @return bool|string
673:      */
674:     protected function _mergeFiles(array $srcFiles, $targetFile = false,
675:         $mustMerge = false, $beforeMergeCallback = null, $extensionsFilter = array())
676:     {
677:         if (Mage::helper('core/file_storage_database')->checkDbUsage()) {
678:             if (!file_exists($targetFile)) {
679:                 Mage::helper('core/file_storage_database')->saveFileToFilesystem($targetFile);
680:             }
681:             if (file_exists($targetFile)) {
682:                 $filemtime = filemtime($targetFile);
683:             } else {
684:                 $filemtime = null;
685:             }
686:             $result = Mage::helper('core')->mergeFiles(
687:                 $srcFiles,
688:                 $targetFile,
689:                 $mustMerge,
690:                 $beforeMergeCallback,
691:                 $extensionsFilter
692:             );
693:             if ($result && (filemtime($targetFile) > $filemtime)) {
694:                 Mage::helper('core/file_storage_database')->saveFile($targetFile);
695:             }
696:             return $result;
697: 
698:         } else {
699:             return Mage::helper('core')->mergeFiles(
700:                 $srcFiles,
701:                 $targetFile,
702:                 $mustMerge,
703:                 $beforeMergeCallback,
704:                 $extensionsFilter
705:             );
706:         }
707:     }
708: 
709:     /**
710:      * Remove all merged js/css files
711:      *
712:      * @return  bool
713:      */
714:     public function cleanMergedJsCss()
715:     {
716:         $result = (bool)$this->_initMergerDir('js', true);
717:         $result = (bool)$this->_initMergerDir('css', true) && $result;
718:         return (bool)$this->_initMergerDir('css_secure', true) && $result;
719:     }
720: 
721:     /**
722:      * Make sure merger dir exists and writeable
723:      * Also can clean it up
724:      *
725:      * @param string $dirRelativeName
726:      * @param bool $cleanup
727:      * @return bool
728:      */
729:     protected function _initMergerDir($dirRelativeName, $cleanup = false)
730:     {
731:         $mediaDir = Mage::getBaseDir('media');
732:         try {
733:             $dir = Mage::getBaseDir('media') . DS . $dirRelativeName;
734:             if ($cleanup) {
735:                 Varien_Io_File::rmdirRecursive($dir);
736:                 Mage::helper('core/file_storage_database')->deleteFolder($dir);
737:             }
738:             if (!is_dir($dir)) {
739:                 mkdir($dir);
740:             }
741:             return is_writeable($dir) ? $dir : false;
742:         } catch (Exception $e) {
743:             Mage::logException($e);
744:         }
745:         return false;
746:     }
747: 
748:     /**
749:      * Before merge css callback function
750:      *
751:      * @param string $file
752:      * @param string $contents
753:      * @return string
754:      */
755:     public function beforeMergeCss($file, $contents)
756:     {
757:        $this->_setCallbackFileDir($file);
758: 
759:        $cssImport = '/@import\\s+([\'"])(.*?)[\'"]/';
760:        $contents = preg_replace_callback($cssImport, array($this, '_cssMergerImportCallback'), $contents);
761: 
762:        $cssUrl = '/url\\(\\s*(?!data:)([^\\)\\s]+)\\s*\\)?/';
763:        $contents = preg_replace_callback($cssUrl, array($this, '_cssMergerUrlCallback'), $contents);
764: 
765:        return $contents;
766:     }
767: 
768:     /**
769:      * Set file dir for css file
770:      *
771:      * @param string $file
772:      */
773:     protected function _setCallbackFileDir($file)
774:     {
775:        $file = str_replace(Mage::getBaseDir().DS, '', $file);
776:        $this->_callbackFileDir = dirname($file);
777:     }
778: 
779:     /**
780:      * Callback function replaces relative links for @import matches in css file
781:      *
782:      * @param array $match
783:      * @return string
784:      */
785:     protected function _cssMergerImportCallback($match)
786:     {
787:         $quote = $match[1];
788:         $uri = $this->_prepareUrl($match[2]);
789: 
790:         return "@import {$quote}{$uri}{$quote}";
791:     }
792: 
793:     /**
794:      * Callback function replaces relative links for url() matches in css file
795:      *
796:      * @param array $match
797:      * @return string
798:      */
799:     protected function _cssMergerUrlCallback($match)
800:     {
801:         $quote = ($match[1][0] == "'" || $match[1][0] == '"') ? $match[1][0] : '';
802:         $uri = ($quote == '') ? $match[1] : substr($match[1], 1, strlen($match[1]) - 2);
803:         $uri = $this->_prepareUrl($uri);
804: 
805:         return "url({$quote}{$uri}{$quote})";
806:     }
807: 
808:     /**
809:      * Prepare url for css replacement
810:      *
811:      * @param string $uri
812:      * @return string
813:      */
814:     protected function _prepareUrl($uri)
815:     {
816:         // check absolute or relative url
817:         if (!preg_match('/^https?:/i', $uri) && !preg_match('/^\//i', $uri)) {
818:             $fileDir = '';
819:             $pathParts = explode(DS, $uri);
820:             $fileDirParts = explode(DS, $this->_callbackFileDir);
821:             $store = $this->getStore();
822:             if ($store->isAdmin()) {
823:                 $secure = $store->isAdminUrlSecure();
824:             } else {
825:                 $secure = $store->isFrontUrlSecure() && Mage::app()->getRequest()->isSecure();
826:             }
827: 
828:             if ('skin' == $fileDirParts[0]) {
829:                 $baseUrl = Mage::getBaseUrl('skin', $secure);
830:                 $fileDirParts = array_slice($fileDirParts, 1);
831:             } elseif ('media' == $fileDirParts[0]) {
832:                 $baseUrl = Mage::getBaseUrl('media', $secure);
833:                 $fileDirParts = array_slice($fileDirParts, 1);
834:             } else {
835:                 $baseUrl = Mage::getBaseUrl('web', $secure);
836:             }
837: 
838:             foreach ($pathParts as $key=>$part) {
839:                 if ($part == '.' || $part == '..') {
840:                     unset($pathParts[$key]);
841:                 }
842:                 if ($part == '..' && count($fileDirParts)) {
843:                     $fileDirParts = array_slice($fileDirParts, 0, count($fileDirParts) - 1);
844:                 }
845:             }
846: 
847:             if (count($fileDirParts)) {
848:                 $fileDir = implode('/', $fileDirParts).'/';
849:             }
850: 
851:             $uri = $baseUrl.$fileDir.implode('/', $pathParts);
852:         }
853:         return $uri;
854:     }
855: }
856: 
Magento 1.7.0.2 API documentation generated by ApiGen 2.8.0