¿Alguna idea de por qué Mage::app()->getStore()
devuelve la vista de la tienda con el ID 1 cuando está dentro de los scripts de actualización independientes de la vista de la tienda en la que estoy ejecutando el script de actualización (incluso el administrador)?
Quiero decir, sé dónde está el código que hace esto. En Mage_Core_Model_App::getStore()
está esto:
if (!Mage::isInstalled() || $this->getUpdateMode()) {
return $this->_getDefaultStore();
}
y se _getDefaultStore
ve así:
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
siempre está vacío cuando se llega al método anterior.
Obtengo el mismo resultado incluso si agrego esto en la parte superior del script de actualización:
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
Tengo curiosidad sobre la lógica empresarial de tener esta 'característica'.
store-view
install-script
Marius
fuente
fuente
Respuestas:
NB: no olvide que el alcance de la tienda de administración no se establece hasta que se realiza el despacho y se
Mage_Adminhtml_Controller_Action
ejecuta un controlador que se extiende (consulte eladminhtml_controller_action_predispatch_start
evento y el observador relacionado enMage_Adminhtml_Controller_Action::preDispatch()
).No eres el único; Dicho esto, es posible que nunca lo sepamos a menos que Moshe o Dima quieran discutir.
Los scripts de instalación se ejecutan temprano en la inicialización de la aplicación. El diseño de esto probablemente se deba a que, para cuando se ejecute el resto de la pila, se realizarán las migraciones necesarias y otros trabajos, lo que significa que el sistema estaba listo para usar de inmediato, incluso cuando se estaba instalando un módulo o actualizado. Me pregunto si los arquitectos originales inicialmente alguna vez pensaron que sería necesario un sistema más inicializado. Supondré que, si bien gran parte del código supone que hay una instancia de tienda disponible, la
_getDefaultStore()
lógica garantiza que haya una instancia de tienda.La configuración de alcance total está disponible en 1.4.0.0 y versiones posteriores mediante scripts de configuración de datos.
fuente
Ok, para usar la tienda de administración en tus scripts de actualización solo usa
Su enfoque
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
no puede tener éxito, porque no hay realmente una vista de tienda cargable para el administradorA menudo uso un patrón como este:
De lo contrario, a veces, después de ejecutar un script de actualización, sus visitantes serán redirigidos a la página de administración en lugar de a la interfaz.
Actualizar:
Interpreté mal la pregunta a continuación, así que aquí hay un nuevo intento de explicar ^^
Los scripts de actualización se invocan desde un método más profundo en el núcleo (
Mage_Core_Model_Resource_Setup::_modifyResourceDb(...)
)Aquí intenté enumerar la pila
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)
y ahora echa un vistazo a
Mage_Core_model_App::run($params)
:el método
_initModules()
se llama antes$scopeCode
y$scopeType
se determina el.Actualmente no puedo entender dónde se define el retroceso supuesto.
fuente
core_store
mesa. Hay un registro con id0
. Además, si intenta estovar_dump(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID))
, obtendrá una instancia válida de la tienda de administración. También lo intentéMage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
pero obtengo el mismo resultado. Pero mi pregunta no era sobre cómo configurar la tienda de administración en los scripts de actualización. Estaba preguntando por quéMage::app()->getStore()
devuelve la tienda con id 1 en los scripts de actualización.0
(admin) y es una vista de tienda que podría eliminarse fácilmente de la interfaz de usuario de administrador? +1 por abrir mis ojos. Si no obtengo otra respuesta clara sobre esto, aceptaré esto.Mage::app()->getCurrentStore();
no parece estar definido y da un error fatal cuando se llama. En cambio, obtuve la identificación usando$currentStoreId = Mage::app()->getStore()->getId();
.Entonces, la respuesta básica es que realmente se mete en el 3er si ..... espere qué :(
Para mí, devuelve verdadero para
Mage::isInstalled()
y falso para lo$this->getUpdateMode()
que suena mal. Pero esto solo ocurre en el primer golpe degetStore
.Por lo tanto, parece que configura la tienda antes de que se haya configurado el modo de actualización, luego, cuando regresa en el script de configuración, usa la llamada de tienda predeterminada que usa el siguiente código:
El valor de
self::DISTRO_STORE_ID
es 1, supongo porque necesita algo y no se configuró para nosotros en la tienda de administración :(Así que en realidad tengo un sistema que no se ha almacenado con la identificación 1 y parece que el script de actualización funciona bien. Si estamos agregando tablas / atributos, está bien e incluso al agregar un bloque de cms específico del sitio, esto también está funcionando, pero obtenemos toda la identificación de la tienda y los configuramos específicamente al guardar datos específicos de la tienda.
fuente
core_store
pero los scripts de configuración funcionan