Haben Sie eine Idee, warum Mage::app()->getStore()
die Geschäftsansicht mit der ID 1 zurückgegeben wird, wenn sich in den Upgrade-Skripten unabhängig von der Geschäftsansicht, in der ich das Upgrade-Skript ausführe, (auch Administrator)?
Ich meine, ich weiß, wo der Code ist, der das tut. Darin Mage_Core_Model_App::getStore()
ist folgendes:
if (!Mage::isInstalled() || $this->getUpdateMode()) {
return $this->_getDefaultStore();
}
und _getDefaultStore
sieht so aus:
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
ist bei Erreichen der obigen Methode immer leer.
Ich erhalte das gleiche Ergebnis, auch wenn ich dies oben im Upgrade-Skript hinzufüge:
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
Ich bin neugierig auf die Geschäftslogik, diese 'Funktion' zu haben.
store-view
install-script
Marius
quelle
quelle
Antworten:
NB: Vergessen Sie nicht, dass der Gültigkeitsbereich des Administrationsspeichers erst festgelegt wird, wenn der Versand erfolgt und eine Controllererweiterung
Mage_Adminhtml_Controller_Action
ausgeführt wird (sieheadminhtml_controller_action_predispatch_start
Ereignis und zugehörigen Beobachter inMage_Adminhtml_Controller_Action::preDispatch()
).Du bist nicht der einzige; Das heißt, wir werden es vielleicht nie erfahren, es sei denn, Moshe oder Dima wollen darüber diskutieren.
Setup-Skripte werden zu Beginn der Anwendungsinitialisierung ausgeführt. Das Design dafür ist wahrscheinlich darauf zurückzuführen, dass zum Zeitpunkt der Ausführung des restlichen Stacks die erforderlichen Migrationen und andere Arbeiten "erledigt" sind - was bedeutet, dass das System sofort einsatzbereit war, selbst wenn ein Modul installiert wurde oder aufgerüstet. Ich frage mich, ob die ursprünglichen Architekten anfangs gedacht haben, dass ein stärker initialisiertes System erforderlich ist. Ich nehme an, dass während ein Großteil des Codes davon ausgeht, dass eine Geschäftsinstanz verfügbar ist, die
_getDefaultStore()
Logik sicherstellt, dass eine Geschäftsinstanz vorhanden ist.Die vollständigen Bereichseinstellungen sind in 1.4.0.0 und höher über Daten-Setup-Skripts verfügbar.
quelle
Ok, um den Admin-Store in deinen Upgrade-Skripten zu verwenden, benutze einfach
Ihr Ansatz
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
kann nicht erfolgreich sein, da für den Administrator keine wirklich ladbare Speicheransicht vorhanden istOft benutze ich ein Muster wie dieses:
Andernfalls werden Ihre Besucher nach dem Ausführen eines Upgrade-Skripts manchmal auf die Administrationsseite anstatt auf das Frontend umgeleitet.
Aktualisieren:
Ich habe die folgende Frage falsch interpretiert, daher hier ein neuer Versuch, ^^ zu erklären
Die Upgrade-Skripte werden von einer Methode aufgerufen, die sich tiefer in core (
Mage_Core_Model_Resource_Setup::_modifyResourceDb(...)
) befindet.Hier habe ich versucht, den Stack aufzulisten
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)
und jetzt schauen Sie sich an
Mage_Core_model_App::run($params)
:Die Methode
_initModules()
wird vor dem aufgerufen$scopeCode
und$scopeType
bestimmt.Derzeit kann ich nicht herausfinden, wo der angenommene Fallback definiert ist.
quelle
core_store
Tabelle. Es gibt einen Datensatz mit der ID0
. Auch wenn Sie dies versuchen, erhaltenvar_dump(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID))
Sie eine gültige Instanz des Administrationsspeichers. Auch versucht,Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
aber ich bekomme das gleiche Ergebnis. Meine Frage bezog sich jedoch nicht darauf, wie der Administratorspeicher in Upgrade-Skripten eingerichtet werden soll. Ich habe gefragt, warumMage::app()->getStore()
der Shop mit der ID 1 in Upgrade-Skripten zurückgegeben wird.0
(admin) und ist eine Speicheransicht, die leicht von der Benutzeroberfläche des Administrators gelöscht werden kann? +1 für das Öffnen meiner Augen. Wenn ich dazu keine andere klare Antwort bekomme, werde ich das akzeptieren.Mage::app()->getCurrentStore();
scheint nicht definiert zu sein und führt beim Aufruf zu einem schwerwiegenden Fehler. Stattdessen habe ich die ID mit$currentStoreId = Mage::app()->getStore()->getId();
.Die grundlegende Antwort ist also, dass es tatsächlich in die 3. geht, wenn ... warte was :(
Für mich ist es wahr
Mage::isInstalled()
und falsch,$this->getUpdateMode()
was falsch klingt. Dies geschieht aber erst beim ersten Treffer vongetStore
.Es sieht also so aus, als würde der Store eingerichtet, bevor der Update-Modus eingestellt wurde. Wenn er dann im Setup-Skript zurückkommt, wird der Standard-Store-Aufruf verwendet, der den folgenden Code verwendet:
Der Wert von
self::DISTRO_STORE_ID
ist 1, ich denke, weil es etwas braucht und uns der Admin-Store nicht eingerichtet hat :(Ich habe also tatsächlich ein System, das nicht mit ID 1 gespeichert wurde und das Aktualisierungsskript scheint gut zu funktionieren. Wenn wir Tabellen / Attribute hinzufügen, ist dies in Ordnung, und selbst beim Hinzufügen von standortspezifischen CMS-Blöcken funktioniert dies. Wir erhalten jedoch alle Geschäfts-IDs und legen sie beim Speichern von geschäftsspezifischen Daten fest.
quelle
core_store
aber Setup-Skripte funktionieren