Esempio n. 1
0
 /**
  * Get renderer for Mime-Type specified in Accept header of request.
  *
  * @return Mage_Webapi_Controller_Response_Rest_RendererInterface
  * @throws Mage_Webapi_Exception
  * @throws LogicException
  */
 public function get()
 {
     $acceptTypes = $this->_request->getAcceptTypes();
     $availableRenderers = (array) $this->_applicationConfig->getNode(self::XML_PATH_WEBAPI_RESPONSE_RENDERS);
     if (!is_array($acceptTypes)) {
         $acceptTypes = array($acceptTypes);
     }
     foreach ($acceptTypes as $acceptType) {
         foreach ($availableRenderers as $rendererConfig) {
             $rendererType = (string) $rendererConfig->type;
             if ($acceptType == $rendererType || $acceptType == current(explode('/', $rendererType)) . '/*' || $acceptType == '*/*') {
                 $rendererClass = (string) $rendererConfig->model;
                 break 2;
             }
         }
     }
     if (!isset($rendererClass)) {
         /** If server does not have renderer for any of the accepted types it SHOULD send 406 (not acceptable). */
         throw new Mage_Webapi_Exception($this->_helper->__('Server cannot understand Accept HTTP header media type.'), Mage_Webapi_Exception::HTTP_NOT_ACCEPTABLE);
     }
     $renderer = $this->_objectManager->get($rendererClass);
     if (!$renderer instanceof Mage_Webapi_Controller_Response_Rest_RendererInterface) {
         throw new LogicException('The renderer must implement "Mage_Webapi_Controller_Response_Rest_RendererInterface".');
     }
     return $renderer;
 }
Esempio n. 2
0
 /**
  * Redirect type options
  *
  * @return array
  */
 public function toOptionArray()
 {
     $values = (array) $this->_config->getNode('redirect_type', 'default');
     if (isset($values['@attributes'])) {
         unset($values['@attributes']);
     }
     return $values;
 }
Esempio n. 3
0
 /**
  * Search a code pool for modules and enable them
  *
  * @param string $codePool
  * @param OutputInterface $output
  *
  * @return int|void
  */
 protected function enableCodePool($codePool, OutputInterface $output)
 {
     $modules = $this->config->getNode('modules')->asArray();
     foreach ($modules as $module => $data) {
         if (isset($data['codePool']) && $data['codePool'] == $codePool) {
             $this->enableModule($module, $output);
         }
     }
 }
Esempio n. 4
0
 /**
  * Prepares "edit" block.
  *
  * @return Mage_Core_Block_Abstract
  */
 protected function _prepareLayout()
 {
     $type = $this->getRequest()->getParam('type');
     if (!empty($type)) {
         $blockClassName = (string) $this->_config->getNode(self::XML_PATH_REDIRECT_TYPE_BLOCK . $type);
         if (!empty($blockClassName)) {
             $editBlock = $this->getLayout()->createBlock($blockClassName);
             $this->setChild('edit', $editBlock);
         }
     }
     return parent::_prepareLayout();
 }
Esempio n. 5
0
 /**
  * Return Backend area front name
  *
  * @return string
  */
 public function getAreaFrontName()
 {
     if (null === $this->_areaFrontName) {
         $this->_areaFrontName = (bool) (string) $this->_config->getNode(self::XML_PATH_USE_CUSTOM_ADMIN_PATH) ? (string) $this->_config->getNode(self::XML_PATH_CUSTOM_ADMIN_PATH) : (string) $this->_config->getNode(self::XML_PATH_BACKEND_FRONTNAME);
     }
     return $this->_areaFrontName;
 }
Esempio n. 6
0
 /**
  * Add a logger by specified key
  *
  * Second argument is a file name (relative to log directory) or a PHP "wrapper"
  *
  * @param string $loggerKey
  * @param string $fileOrWrapper
  * @return Mage_Core_Model_Logger
  * @link http://php.net/wrappers
  */
 public function addStreamLog($loggerKey, $fileOrWrapper = '')
 {
     $file = $fileOrWrapper ?: "{$loggerKey}.log";
     if (!preg_match('#^[a-z][a-z0-9+.-]*\\://#i', $file)) {
         $file = $this->_config->getOptions()->getLogDir() . DIRECTORY_SEPARATOR . $file;
     }
     $writerClass = (string) $this->_config->getNode('global/log/core/writer_model');
     if (!$writerClass || !is_subclass_of($writerClass, 'Zend_Log_Writer_Stream')) {
         $writerClass = 'Zend_Log_Writer_Stream';
     }
     /** @var $writer Zend_Log_Writer_Stream */
     $writer = $writerClass::factory(array('stream' => $file));
     $writer->setFormatter(new Zend_Log_Formatter_Simple('%timestamp% %priorityName% (%priority%): %message%' . PHP_EOL));
     $this->_loggers[$loggerKey] = new Zend_Log($writer);
     return $this;
 }
Esempio n. 7
0
 /**
  * Disable modules updates (reindex issue)
  *
  * @param null $path
  * @param string $scope
  * @param null $scopeCode
  * @return bool|Mage_Core_Model_Config_Element
  */
 public function getNode($path = null, $scope = '', $scopeCode = null)
 {
     if ($path == Mage_Core_Model_App::XML_PATH_SKIP_PROCESS_MODULES_UPDATES) {
         return true;
     }
     return parent::getNode($path, $scope, $scopeCode);
 }
Esempio n. 8
0
 /**
  * Override frontend configuration with VDE area data
  */
 protected function _overrideConfiguration()
 {
     $vdeNode = $this->_configuration->getNode(Mage_DesignEditor_Model_Area::AREA_VDE);
     if ($vdeNode) {
         $this->_configuration->getNode(Mage_Core_Model_App_Area::AREA_FRONTEND)->extend($vdeNode, true);
     }
 }
Esempio n. 9
0
 /**
  * Get current directory scanner. Initialize if it was not initialized previously.
  *
  * @return Zend\Code\Scanner\DirectoryScanner
  */
 public function getDirectoryScanner()
 {
     if (!$this->_directoryScanner) {
         $this->_directoryScanner = new Zend\Code\Scanner\DirectoryScanner();
         /** @var Mage_Core_Model_Config_Element $module */
         foreach ($this->_applicationConfig->getNode('modules')->children() as $moduleName => $module) {
             if ($module->is('active')) {
                 /** Invalid type is specified to retrieve path to module directory. */
                 $moduleDir = $this->_applicationConfig->getModuleDir('invalid_type', $moduleName);
                 $directory = $moduleDir . DS . 'Controller' . DS . 'Webapi';
                 if (is_dir($directory)) {
                     $this->_directoryScanner->addDirectory($directory);
                 }
             }
         }
     }
     return $this->_directoryScanner;
 }
Esempio n. 10
0
 /**
  * Init router from config
  *
  * @param Mage_Core_Model_Config $config Config
  * @return void
  */
 public function initFromConfig(Mage_Core_Model_Config $config)
 {
     $routerConfig = $config->getNode('global/messenger/publish_router');
     if (!$routerConfig) {
         return;
     }
     foreach ($routerConfig->children() as $_route) {
         $this->addMap(new Varien_Object($_route->criterion->asArray()), $_route->queue);
     }
 }
Esempio n. 11
0
 /**
  * @param PugMoRe_Mageploy_Model_Io_RecordingInterface $io
  * @param Mage_Core_Model_Config $config
  * @return PugMoRe_Mageploy_Model_Request_Funnel $this
  */
 public function init($io, $config)
 {
     $this->_io = $io;
     $this->_config = $config;
     Mage::dispatchEvent('mageploy_funnel_collect_actions_before', array('funnel' => $this));
     $actionsInfo = $this->_config->getNode(self::XML_ACTIONS_PATH)->asArray();
     Varien_Profiler::start('mageploy::funnel::collect_actions');
     foreach ($actionsInfo as $actionCode => $actionInfo) {
         if (isset($actionInfo['disabled']) && $actionInfo['disabled']) {
             continue;
         }
         if (isset($actionInfo['class'])) {
             $action = new $actionInfo['class']();
             $this->addAction($actionCode, $action);
         }
     }
     Varien_Profiler::stop('mageploy::funnel::collect_actions');
     Mage::dispatchEvent('mageploy_funnel_collect_actions_after', array('funnel' => $this));
     return $this;
 }
Esempio n. 12
0
 public function isModuleIgnored($observer)
 {
     $ignores = $this->_config->getNode('global/ignoredModules/entities')->asArray();
     if (is_array($ignores) && $observer) {
         $curModule = $observer->getEvent()->getControllerAction()->getRequest()->getRouteName();
         if (isset($ignores[$curModule])) {
             return true;
         }
     }
     return false;
 }
Esempio n. 13
0
 /**
  * Get information about all declared cache types
  *
  * @return array
  */
 public function getTypes()
 {
     $types = array();
     $config = $this->_config->getNode(self::XML_PATH_TYPES);
     if ($config) {
         foreach ($config->children() as $type => $node) {
             $types[$type] = new Varien_Object(array('id' => $type, 'cache_type' => $this->_helper->__((string) $node->label), 'description' => $this->_helper->__((string) $node->description), 'tags' => strtoupper((string) $node->tags), 'status' => (int) $this->canUse($type)));
         }
     }
     return $types;
 }
Esempio n. 14
0
 /**
  * Get list of available fonts.
  *
  * Return format:
  * [['arial'] => ['label' => 'Arial', 'path' => '/www/magento/fonts/arial.ttf']]
  *
  * @return array
  */
 public function getFonts()
 {
     $node = $this->_config->getNode(Mage_Captcha_Helper_Data::XML_PATH_CAPTCHA_FONTS);
     $fonts = array();
     if ($node) {
         foreach ($node->children() as $fontName => $fontNode) {
             $fonts[$fontName] = array('label' => (string) $fontNode->label, 'path' => $this->_config->getOptions()->getDir('base') . DIRECTORY_SEPARATOR . $fontNode->path);
         }
     }
     return $fonts;
 }
Esempio n. 15
0
 /**
  * Init observers from Magento config
  *
  * @param Mage_Core_Model_Config $config Config
  * @return Oggetto_Messenger_Model_Event_Observer
  */
 public function initFromConfig(Mage_Core_Model_Config $config)
 {
     $configNodes = $config->getNode()->xpath('global/messenger/event_observers/*');
     if (!$configNodes) {
         return $this;
     }
     $observers = [];
     foreach ($configNodes as $_observer) {
         $observers[$_observer->getName()] = Mage::getSingleton('messenger/di')->get((string) $_observer->class);
     }
     $this->setObservers($observers);
     return $this;
 }
Esempio n. 16
0
 /**
  * Retrieve proper interpreter for the specified content type.
  *
  * @param string $contentType
  * @return Mage_Webapi_Controller_Request_Rest_InterpreterInterface
  * @throws LogicException|Mage_Webapi_Exception
  */
 public function get($contentType)
 {
     $interpretersMetadata = (array) $this->_applicationConfig->getNode(self::XML_PATH_WEBAPI_REQUEST_INTERPRETERS);
     if (empty($interpretersMetadata) || !is_array($interpretersMetadata)) {
         throw new LogicException('Request interpreter adapter is not set.');
     }
     foreach ($interpretersMetadata as $interpreterMetadata) {
         $interpreterType = (string) $interpreterMetadata->type;
         if ($interpreterType == $contentType) {
             $interpreterClass = (string) $interpreterMetadata->model;
             break;
         }
     }
     if (!isset($interpreterClass) || empty($interpreterClass)) {
         throw new Mage_Webapi_Exception($this->_helper->__('Server cannot understand Content-Type HTTP header media type "%s"', $contentType), Mage_Webapi_Exception::HTTP_BAD_REQUEST);
     }
     $interpreter = $this->_objectManager->get($interpreterClass);
     if (!$interpreter instanceof Mage_Webapi_Controller_Request_Rest_InterpreterInterface) {
         throw new LogicException('The interpreter must implement "Mage_Webapi_Controller_Request_Rest_InterpreterInterface".');
     }
     return $interpreter;
 }
 /**
  * Save custom redirects when url key was changed (for category, children and assigned products)
  *
  * @param Mage_Catalog_Model_Category $category
  * @param int $storeId
  */
 public function saveCustomRedirects($category, $storeId)
 {
     $this->_createRedirectTemporaryTable();
     $categoryPriority = (int) $this->_config->getNode(sprintf(Enterprise_UrlRewrite_Model_Url_Rewrite::REWRITE_MATCHERS_PRIORITY_PATH, 'category'), 'default');
     $productsPriority = (int) $this->_config->getNode(sprintf(Enterprise_UrlRewrite_Model_Url_Rewrite::REWRITE_MATCHERS_PRIORITY_PATH, 'product'), 'default');
     if ($categoryPriority < $productsPriority) {
         $this->_insertProductRedirectsToTemporaryTable($category, $storeId);
         $this->_insertCategoryRedirectsToTemporaryTable($category, $storeId);
     } else {
         $this->_insertCategoryRedirectsToTemporaryTable($category, $storeId);
         $this->_insertProductRedirectsToTemporaryTable($category, $storeId);
     }
     $this->_copyRedirectsToMainTable();
 }
Esempio n. 18
0
 /**
  * Constructor
  *
  * @param array $args
  */
 public function __construct(array $args = array())
 {
     $this->_categoryResource = isset($args['resource']) ? $args['resource'] : Mage::getResourceSingleton('enterprise_catalog/category');
     $this->_request = !empty($args['request']) ? $args['request'] : Mage::app()->getFrontController()->getRequest();
     $this->_response = !empty($args['response']) ? $args['response'] : Mage::app()->getFrontController()->getResponse();
     $this->_storeId = isset($args['storeId']) ? $args['storeId'] : Mage::app()->getStore()->getId();
     $fromStore = $this->_request->getQuery('___from_store');
     $this->_prevStoreId = isset($args['prevStoreId']) ? $args['prevStoreId'] : (!empty($fromStore) ? Mage::app()->getStore($fromStore)->getId() : $this->_storeId);
     $this->_config = isset($args['config']) ? $args['config'] : Mage::app()->getConfig();
     $this->_seoSuffix = (string) $this->_config->getNode(Mage_Catalog_Helper_Category::XML_PATH_CATEGORY_URL_SUFFIX, 'store', (int) $this->_prevStoreId);
     $this->_newStoreSeoSuffix = (string) $this->_config->getNode(Mage_Catalog_Helper_Category::XML_PATH_CATEGORY_URL_SUFFIX, 'store', (int) $this->_storeId);
     if (isset($args['baseUrl'])) {
         $this->_baseUrl = $args['baseUrl'];
     }
 }
Esempio n. 19
0
 /**
  * Get scope name and scopeId
  *
  */
 protected function _getScope()
 {
     if ($this->getStore()) {
         $scope = 'stores';
         $scopeId = (int) $this->_appConfig->getNode('stores/' . $this->getStore() . '/system/store/id');
     } elseif ($this->getWebsite()) {
         $scope = 'websites';
         $scopeId = (int) $this->_appConfig->getNode('websites/' . $this->getWebsite() . '/system/website/id');
     } else {
         $scope = 'default';
         $scopeId = 0;
     }
     $this->setScope($scope);
     $this->setScopeId($scopeId);
 }
Esempio n. 20
0
 /**
  * Save cron settings for start change log model
  *
  * @return Enterprise_Index_Model_Config_Backend_Cron
  * @throws Mage_Core_Exception
  */
 protected function _saveCronSettings()
 {
     try {
         //save schedule cron expression
         $this->_saveConfig(self::CRON_STRING_PATH, $this->_getCronExpr());
         //save ChangeLog model
         $this->_saveConfig(self::CRON_MODEL_PATH, (string) $this->_config->getNode(self::CRON_MODEL_PATH));
     } catch (Exception $e) {
         /* @var $logger Mage_Core_Model_Logger */
         $logger = $this->_factory->getModel('core/logger');
         $logger->logException($e);
         throw new Mage_Core_Exception($this->helper('enterprise_index')->__('Unable to save the cron expression.'));
     }
     return $this;
 }
Esempio n. 21
0
 public function loadCrontabConfig()
 {
     $crontabFile = realpath($this->_etcModuleDir . DIRECTORY_SEPARATOR . 'crontab.xml');
     if (!is_readable($crontabFile)) {
         return;
     }
     /** @var Mage_Core_Model_Config_Element $jobs */
     $jobs = $this->_config->getNode('crontab/jobs');
     $newConfig = Mage::getModel('core/config_base');
     $newConfig->loadFile($crontabFile);
     /* @var Mage_Core_Model_Config_Element $group */
     foreach ($newConfig->getNode('group/job') as $job) {
         /** @var Mage_Core_Model_Config_Element $newJob */
         $newJob = $jobs->addChild((string) $job['name']);
         $newJob->addChild('schedule');
         $newJob->schedule->addChild('cron_expr', (string) $job->schedule);
         $newJob->addChild('run');
         $newJob->run->addChild('model', (string) $job['instance'] . '::' . (string) $job['method']);
     }
 }
Esempio n. 22
0
 /**
  * Apply configuration rewrites to current url
  *
  * @return bool
  */
 protected function _rewriteConfig()
 {
     $config = $this->_config->getNode('global/rewrite');
     if (!$config) {
         return false;
     }
     foreach ($config->children() as $rewrite) {
         $from = (string) $rewrite->from;
         $to = (string) $rewrite->to;
         if (empty($from) || empty($to)) {
             continue;
         }
         $from = $this->_processRewriteUrl($from);
         $to = $this->_processRewriteUrl($to);
         $pathInfo = preg_replace($from, $to, $this->_request->getPathInfo());
         if (isset($rewrite->complete)) {
             $this->_request->setPathInfo($pathInfo);
         } else {
             $this->_request->rewritePathInfo($pathInfo);
         }
     }
     return true;
 }
Esempio n. 23
0
 /**
  * @return string
  */
 public function getIndexClassAlias()
 {
     return (string) $this->_config->getNode(self::XML_PATH_INDEX_INDEX_MODEL);
 }
Esempio n. 24
0
 /**
  * Load configuration values into xml config object
  *
  * @param Mage_Core_Model_Config $xmlConfig
  * @param string $condition
  * @return Mage_Core_Model_Resource_Config
  */
 public function loadToXml(Mage_Core_Model_Config $xmlConfig, $condition = null)
 {
     $read = $this->_getReadAdapter();
     if (!$read) {
         return $this;
     }
     $websites = array();
     $select = $read->select()->from($this->getTable('core_website'), array('website_id', 'code', 'name'));
     $rowset = $read->fetchAssoc($select);
     foreach ($rowset as $w) {
         $xmlConfig->setNode('websites/' . $w['code'] . '/system/website/id', $w['website_id']);
         $xmlConfig->setNode('websites/' . $w['code'] . '/system/website/name', $w['name']);
         $websites[$w['website_id']] = array('code' => $w['code']);
     }
     $stores = array();
     $select = $read->select()->from($this->getTable('core_store'), array('store_id', 'code', 'name', 'website_id'))->order('sort_order ' . Varien_Db_Select::SQL_ASC);
     $rowset = $read->fetchAssoc($select);
     foreach ($rowset as $s) {
         if (!isset($websites[$s['website_id']])) {
             continue;
         }
         $xmlConfig->setNode('stores/' . $s['code'] . '/system/store/id', $s['store_id']);
         $xmlConfig->setNode('stores/' . $s['code'] . '/system/store/name', $s['name']);
         $xmlConfig->setNode('stores/' . $s['code'] . '/system/website/id', $s['website_id']);
         $xmlConfig->setNode('websites/' . $websites[$s['website_id']]['code'] . '/system/stores/' . $s['code'], $s['store_id']);
         $stores[$s['store_id']] = array('code' => $s['code']);
         $websites[$s['website_id']]['stores'][$s['store_id']] = $s['code'];
     }
     $substFrom = array();
     $substTo = array();
     // load all configuration records from database, which are not inherited
     $select = $read->select()->from($this->getMainTable(), array('scope', 'scope_id', 'path', 'value'));
     if (!is_null($condition)) {
         $select->where($condition);
     }
     $rowset = $read->fetchAll($select);
     // set default config values from database
     foreach ($rowset as $r) {
         if ($r['scope'] !== 'default') {
             continue;
         }
         $value = str_replace($substFrom, $substTo, $r['value']);
         $xmlConfig->setNode('default/' . $r['path'], $value);
     }
     // inherit default config values to all websites
     $extendSource = $xmlConfig->getNode('default');
     foreach ($websites as $id => $w) {
         $websiteNode = $xmlConfig->getNode('websites/' . $w['code']);
         $websiteNode->extend($extendSource);
     }
     $deleteWebsites = array();
     // set websites config values from database
     foreach ($rowset as $r) {
         if ($r['scope'] !== 'websites') {
             continue;
         }
         $value = str_replace($substFrom, $substTo, $r['value']);
         if (isset($websites[$r['scope_id']])) {
             $nodePath = sprintf('websites/%s/%s', $websites[$r['scope_id']]['code'], $r['path']);
             $xmlConfig->setNode($nodePath, $value);
         } else {
             $deleteWebsites[$r['scope_id']] = $r['scope_id'];
         }
     }
     // extend website config values to all associated stores
     foreach ($websites as $website) {
         $extendSource = $xmlConfig->getNode('websites/' . $website['code']);
         if (isset($website['stores'])) {
             foreach ($website['stores'] as $sCode) {
                 $storeNode = $xmlConfig->getNode('stores/' . $sCode);
                 /**
                  * $extendSource DO NOT need overwrite source
                  */
                 $storeNode->extend($extendSource, false);
             }
         }
     }
     $deleteStores = array();
     // set stores config values from database
     foreach ($rowset as $r) {
         if ($r['scope'] !== 'stores') {
             continue;
         }
         $value = str_replace($substFrom, $substTo, $r['value']);
         if (isset($stores[$r['scope_id']])) {
             $nodePath = sprintf('stores/%s/%s', $stores[$r['scope_id']]['code'], $r['path']);
             $xmlConfig->setNode($nodePath, $value);
         } else {
             $deleteStores[$r['scope_id']] = $r['scope_id'];
         }
     }
     if ($deleteWebsites) {
         $this->_getWriteAdapter()->delete($this->getMainTable(), array('scope = ?' => 'websites', 'scope_id IN(?)' => $deleteWebsites));
     }
     if ($deleteStores) {
         $this->_getWriteAdapter()->delete($this->getMainTable(), array('scope=?' => 'stores', 'scope_id IN(?)' => $deleteStores));
     }
     return $this;
 }
 /**
  * Retrieve application website object
  *
  * @return Mage_Core_Model_Website
  */
 public function getWebsite($id = null)
 {
     if (is_null($id)) {
         $id = $this->getStore()->getWebsiteId();
     } elseif ($id instanceof Mage_Core_Model_Website) {
         return $id;
     } elseif ($id === true) {
         return $this->_website;
     }
     if (empty($this->_websites[$id])) {
         $website = Mage::getModel('core/website');
         if (is_numeric($id)) {
             $website->load($id);
             if (!$website->hasWebsiteId()) {
                 throw Mage::exception('Mage_Core', 'Invalid website id requested.');
             }
         } elseif (is_string($id)) {
             $websiteConfig = $this->_config->getNode('websites/' . $id);
             if (!$websiteConfig) {
                 throw Mage::exception('Mage_Core', 'Invalid website code requested: ' . $id);
             }
             $website->loadConfig($id);
         }
         $this->_websites[$website->getWebsiteId()] = $website;
         $this->_websites[$website->getCode()] = $website;
     }
     return $this->_websites[$id];
 }
Esempio n. 26
0
 /**
  * Get config value by indexer name and node name
  *
  * @param string $indexerNodeName
  * @param string $nodeName
  * @return string
  */
 public function getIndexerConfigValue($indexerNodeName, $nodeName)
 {
     return (string) $this->_config->getNode(self::XML_PATH_INDEXER_DATA . '/' . $indexerNodeName . '/' . $nodeName);
 }
Esempio n. 27
0
 /**
  * Get expiration days count
  *
  * @return string
  */
 public function getDaysToExpire()
 {
     return (int) $this->_configuration->getNode(self::XML_PATH_DAYS_TO_EXPIRE);
 }
 /**
  * Retrieve clean schedule enabled flag
  *
  * @return bool
  */
 protected function _isCleanChangelogEnabled()
 {
     return (bool) (string) $this->_config->getNode(self::XML_PATH_INDEX_CLEAN_SCHEDULE_ENABLED);
 }
 /**
  * @return bool
  */
 private function _isTestEnvironment()
 {
     return (string) $this->_config->getNode(self::ENVIRONMENT_NODE) === self::TEST_ENVIRONMENT;
 }
Esempio n. 30
0
 /**
  * Load configuration values into xml config object
  *
  * @param Mage_Core_Model_Config $xmlConfig
  * @param string $cond
  * @return Mage_Core_Model_Mysql4_Config_Collection
  */
 public function loadToXml(Mage_Core_Model_Config $xmlConfig, $cond = null)
 {
     $read = $this->_getReadAdapter();
     if (!$read) {
         return $this;
     }
     $websites = array();
     $rows = $read->fetchAssoc("select website_id, code, name from " . $this->getTable('website'));
     foreach ($rows as $w) {
         $xmlConfig->setNode('websites/' . $w['code'] . '/system/website/id', $w['website_id']);
         $xmlConfig->setNode('websites/' . $w['code'] . '/system/website/name', $w['name']);
         $websites[$w['website_id']] = array('code' => $w['code']);
     }
     $stores = array();
     $rows = $read->fetchAssoc("select store_id, code, name, website_id from " . $this->getTable('store') . " order by sort_order asc");
     foreach ($rows as $s) {
         if (!isset($websites[$s['website_id']])) {
             continue;
         }
         $xmlConfig->setNode('stores/' . $s['code'] . '/system/store/id', $s['store_id']);
         $xmlConfig->setNode('stores/' . $s['code'] . '/system/store/name', $s['name']);
         $xmlConfig->setNode('stores/' . $s['code'] . '/system/website/id', $s['website_id']);
         $xmlConfig->setNode('websites/' . $websites[$s['website_id']]['code'] . '/system/stores/' . $s['code'], $s['store_id']);
         $stores[$s['store_id']] = array('code' => $s['code']);
         $websites[$s['website_id']]['stores'][$s['store_id']] = $s['code'];
     }
     $subst_from = array();
     $subst_to = array();
     // load all configuration records from database, which are not inherited
     $rows = $read->fetchAll("select scope, scope_id, path, value from " . $this->getMainTable() . ($cond ? ' where ' . $cond : ''));
     // set default config values from database
     foreach ($rows as $r) {
         if ($r['scope'] !== 'default') {
             continue;
         }
         $value = str_replace($subst_from, $subst_to, $r['value']);
         $xmlConfig->setNode('default/' . $r['path'], $value);
     }
     // inherit default config values to all websites
     $extendSource = $xmlConfig->getNode('default');
     foreach ($websites as $id => $w) {
         $websiteNode = $xmlConfig->getNode('websites/' . $w['code']);
         $websiteNode->extend($extendSource);
     }
     $deleteWebsites = array();
     // set websites config values from database
     foreach ($rows as $r) {
         if ($r['scope'] !== 'websites') {
             continue;
         }
         $value = str_replace($subst_from, $subst_to, $r['value']);
         if (isset($websites[$r['scope_id']])) {
             $xmlConfig->setNode('websites/' . $websites[$r['scope_id']]['code'] . '/' . $r['path'], $value);
         } else {
             $deleteWebsites[$r['scope_id']] = $r['scope_id'];
         }
     }
     // extend website config values to all associated stores
     foreach ($websites as $website) {
         $extendSource = $xmlConfig->getNode('websites/' . $website['code']);
         if (isset($website['stores'])) {
             foreach ($website['stores'] as $sCode) {
                 $storeNode = $xmlConfig->getNode('stores/' . $sCode);
                 /**
                  * $extendSource DO NOT need overwrite source
                  */
                 $storeNode->extend($extendSource, false);
             }
         }
     }
     $deleteStores = array();
     // set stores config values from database
     foreach ($rows as $r) {
         if ($r['scope'] !== 'stores') {
             continue;
         }
         $value = str_replace($subst_from, $subst_to, $r['value']);
         if (isset($stores[$r['scope_id']])) {
             $xmlConfig->setNode('stores/' . $stores[$r['scope_id']]['code'] . '/' . $r['path'], $value);
         } else {
             $deleteStores[$r['scope_id']] = $r['scope_id'];
         }
     }
     if ($deleteWebsites) {
         $this->_getWriteAdapter()->delete($this->getMainTable(), array($this->_getWriteAdapter()->quoteInto('scope=?', 'websites'), $this->_getWriteAdapter()->quoteInto('scope_id IN(?)', $deleteWebsites)));
     }
     if ($deleteStores) {
         $this->_getWriteAdapter()->delete($this->getMainTable(), array($this->_getWriteAdapter()->quoteInto('scope=?', 'stores'), $this->_getWriteAdapter()->quoteInto('scope_id IN(?)', $deleteStores)));
     }
     return $this;
 }