Ok, để sử dụng cửa hàng quản trị trong tập lệnh nâng cấp của bạn, chỉ cần sử dụng
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
Cách tiếp cận của bạn Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
không thể thành công, vì không có kho lưu trữ có thể tải thực sự cho quản trị viên
Tôi thường sử dụng một mô hình như thế này:
// 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());
Mặt khác, đôi khi sau khi tập lệnh nâng cấp được thực thi, khách truy cập của bạn sẽ được chuyển hướng đến trang quản trị thay vì giao diện đôi khi.
Cập nhật:
Tôi đã giải thích sai câu hỏi dưới đây, vì vậy đây là một cố gắng mới để giải thích ^^
Các kịch bản nâng cấp được gọi từ một phương thức sâu hơn trong lõi ( Mage_Core_Model_Resource_Setup::_modifyResourceDb(...)
)
Ở đây tôi đã cố gắng liệt kê ngăn xếp
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)
và bây giờ hãy xem 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;
}
phương thức _initModules()
được gọi trước $scopeCode
và $scopeType
được xác định.
Hiện tại tôi không thể tìm ra nơi dự phòng giả định được xác định.