好的,要在升级脚本中使用管理存储,只需使用
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
您的方法Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
无法成功,因为没有真正可用于管理员的可加载商店视图
我经常使用这样的模式:
// remembering old current store
$currentStore = Mage::app()->getCurrentStore();
// switching to admin store
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
// switching back to old current store
Mage::app()->setCurrentStore($currentStore->getStoreId());
否则,有时在执行升级脚本后,有时会将您的访问者重定向到管理页面,而不是前端。
更新:
我误解了以下问题,因此这是一种尝试解释^^的新方法
升级脚本是从核心(Mage_Core_Model_Resource_Setup::_modifyResourceDb(...)
)中更深层的方法调用的
在这里我试图列出堆栈
Mage_Core_Model_App::run($params)
Mage_Core_Model_App::_initModules()
Mage_Core_Model_Resource_Setup::applyAllUpdates()
Mage_Core_Model_Resource_Setup::applyUpdates()
Mage_Core_Model_Resource_Setup::_upgradeResourceDb($oldVersion, $newVersion)
Mage_Core_Model_Resource_Setup::_modifyResourceDb($actionType, $fromVersion, $toVersion)
现在看看Mage_Core_model_App::run($params)
:
public function run($params)
{
$options = isset($params['options']) ? $params['options'] : array();
$this->baseInit($options);
Mage::register('application_params', $params);
if ($this->_cache->processRequest()) {
$this->getResponse()->sendResponse();
} else {
$this->_initModules();
$this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);
if ($this->_config->isLocalConfigLoaded()) {
$scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';
$scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';
$this->_initCurrentStore($scopeCode, $scopeType);
$this->_initRequest();
Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
}
$this->getFrontController()->dispatch();
}
return $this;
}
该方法_initModules()
在$scopeCode
和$scopeType
确定之前被调用。
目前,我无法弄清楚假定的回退定义在哪里。