Любая идея, почему Mage::app()->getStore()
возвращает представление магазина с идентификатором 1, когда внутри сценариев обновления, независимо от представления магазина, в котором я запускаю сценарий обновления (даже администратор)?
Я имею в виду, я знаю, где код, который делает это. В Mage_Core_Model_App::getStore()
этом есть:
if (!Mage::isInstalled() || $this->getUpdateMode()) {
return $this->_getDefaultStore();
}
и _getDefaultStore
выглядит так:
if (empty($this->_store)) {
$this->_store = Mage::getModel('core/store')
->setId(self::DISTRO_STORE_ID)
->setCode(self::DISTRO_STORE_CODE);
}
return $this->_store;
$this->_store
всегда пуст при достижении метода выше.
Я получаю тот же результат, даже если я добавлю это в верхней части сценария обновления:
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
Меня интересует бизнес-логика наличия этой «функции».
store-view
install-script
Мариус
источник
источник
Ответы:
NB: не забывайте, что область хранилища администратора не устанавливается, пока не произойдет диспетчеризация и не
Mage_Adminhtml_Controller_Action
выполнится расширение контроллера (см.adminhtml_controller_action_predispatch_start
Событие и связанный с ним наблюдатель вMage_Adminhtml_Controller_Action::preDispatch()
).Вы не единственный; Тем не менее, мы можем никогда не узнать, если Моше или Дима не хочет обсуждать.
Сценарии установки выполняются на ранней стадии инициализации приложения. Вероятно, это связано с тем, что к тому времени, когда остальная часть стека будет выполнена, необходимые «миграции» и другая работа будут «выполнены», что означает, что система была готова к использованию сразу же, даже при установке модуля. или модернизированный. Мне интересно, думали ли когда-нибудь первоначальные архитекторы о необходимости более инициализированной системы. Я предполагаю это, тогда как большая часть кода предполагает наличие доступного экземпляра хранилища,
_getDefaultStore()
логика гарантирует наличие экземпляра хранилища.Полные настройки доступны в версии 1.4.0.0 и выше через скрипты настройки данных.
источник
Хорошо, чтобы использовать хранилище администратора в ваших скриптах обновления, просто используйте
Ваш подход
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
не может быть успешным, потому что нет реально загружаемого магазина для администратораЧасто я использую такой шаблон:
В противном случае иногда после выполнения скрипта обновления ваши посетители будут перенаправлены на страницу администратора, а не на внешний интерфейс.
Обновить:
Я неверно истолковал вопрос ниже, поэтому вот новая попытка объяснить ^^
Сценарии обновления вызываются из более глубокого метода в ядре (
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)
:метод
_initModules()
вызывается до$scopeCode
и$scopeType
определяется.В настоящее время я не могу понять, где определяется предполагаемый запасной вариант.
источник
core_store
таблицу. Есть запись с id0
. Также, если вы попробуете это,var_dump(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID))
вы получите действительный экземпляр магазина администратора. Также пытался,Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
но я получаю тот же результат. Но мой вопрос был не о том, как установить хранилище администратора в сценариях обновления. Я спрашивал, почемуMage::app()->getStore()
возвращает магазин с идентификатором 1 в скриптах обновления.0
(admin) и является представлением хранилища, которое можно легко удалить из интерфейса администратора? +1 за то, что открыл глаза. Если я не получу другого четкого ответа на этот вопрос, я приму это.Mage::app()->getCurrentStore();
не представляется определенным и выдает фатальную ошибку при вызове. Вместо этого я получил идентификатор с помощью$currentStoreId = Mage::app()->getStore()->getId();
.Таким образом, основной ответ заключается в том, что он на самом деле попадает в 3-й, если ..... подождите, что :(
Для меня это возвращает истину
Mage::isInstalled()
и ложь,$this->getUpdateMode()
что звучит неправильно. Но это происходит только при первом попаданииgetStore
.Таким образом, похоже, что он устанавливает хранилище до того, как был установлен режим обновления, затем, когда он возвращается в сценарии установки, он использует вызов хранилища по умолчанию, который использует следующий код:
Значение
self::DISTRO_STORE_ID
1, я думаю, потому что это нужно что-то и не было настроено для нас в магазине администратора :(Так что на самом деле у меня есть система, в которой нет хранилища с идентификатором 1, и скрипт обновления, кажется, работает хорошо. Если мы добавляем таблицы / атрибуты, это нормально, и даже при добавлении блока cms для конкретного сайта это тоже работает, но мы получаем все идентификаторы хранилища и специально устанавливаем их при сохранении данных конкретного хранилища.
источник
core_store
но сценарии установки работают