Masz pojęcie, dlaczego Mage::app()->getStore()
zwraca widok sklepu o identyfikatorze 1, gdy jest on wewnątrz skryptów aktualizacji niezależnych od widoku sklepu, w którym uruchamiam skrypt aktualizacji (nawet admin)?
Wiem, gdzie jest kod, który to robi. W Mage_Core_Model_App::getStore()
tam jest taka:
if (!Mage::isInstalled() || $this->getUpdateMode()) {
return $this->_getDefaultStore();
}
i _getDefaultStore
wygląda tak:
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
jest zawsze pusty po osiągnięciu powyższej metody.
Otrzymuję ten sam wynik, nawet jeśli dodam go na górze skryptu aktualizacji:
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
Jestem ciekawy logiki biznesowej posiadania tej „funkcji”.
store-view
install-script
Marius
źródło
źródło
Odpowiedzi:
Uwaga: nie zapominaj, że zakres sklepu administratora nie jest ustawiony, dopóki nie zostanie wysłana i nie zostanie uruchomiony kontroler rozszerzający
Mage_Adminhtml_Controller_Action
(zobaczadminhtml_controller_action_predispatch_start
zdarzenie i powiązany obserwator wMage_Adminhtml_Controller_Action::preDispatch()
).Nie jesteś jedyny; powiedziawszy, możemy nigdy nie wiedzieć, chyba że Moshe lub Dima będą chcieli omówić.
Skrypty instalacyjne są uruchamiane na początku inicjalizacji aplikacji. Konstrukcja tego prawdopodobnie wynika z tego, że zanim reszta stosu zostanie wykonana, niezbędne migracje i inne prace zostaną „wykonane” - co oznacza, że system był gotowy do użycia od razu, nawet gdy moduł był instalowany lub zaktualizowane. Zastanawiam się, czy pierwotni architekci początkowo kiedykolwiek sądzili, że będzie potrzeba bardziej zainicjowanego systemu. Przypuszczę, że chociaż większość kodu zakłada, że dostępna jest instancja sklepu, to
_getDefaultStore()
logika zapewnia, że istnieje instancja sklepu.Ustawienia pełnego zakresu są dostępne w wersji 1.4.0.0 i nowszej za pośrednictwem skryptów konfiguracji danych.
źródło
Ok, aby użyć sklepu administratora w skryptach aktualizacji, wystarczy użyć
Twoje podejście
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
nie może się powieść, ponieważ nie istnieje tak naprawdę wczytywalny widok sklepu dla administratoraCzęsto używam takiego wzoru:
W przeciwnym razie czasami po wykonaniu skryptu aktualizacji odwiedzający będą czasami przekierowywani na stronę administratora zamiast do interfejsu użytkownika.
Aktualizacja:
Źle zinterpretowałem poniższe pytanie, więc oto nowa próba wyjaśnienia ^^
Skrypty aktualizacji są wywoływane z metody głębiej w rdzeniu (
Mage_Core_Model_Resource_Setup::_modifyResourceDb(...)
)Tutaj próbowałem wymienić stos
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)
a teraz spójrz na
Mage_Core_model_App::run($params)
:metoda
_initModules()
jest wywoływana przed$scopeCode
i$scopeType
jest określana.Obecnie nie mogę ustalić, gdzie zdefiniowano zakładany powrót.
źródło
core_store
tabeli. Jest rekord z identyfikatorem0
. Również jeśli spróbujesz tegovar_dump(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID))
, otrzymasz prawidłową instancję sklepu administratora. Próbowałem też,Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
ale otrzymuję ten sam wynik. Ale moje pytanie nie dotyczyło sposobu skonfigurowania sklepu administratora w skryptach aktualizacji. Pytałem, dlaczegoMage::app()->getStore()
zwraca sklep z identyfikatorem 1 w skryptach aktualizacji.0
(admin) i czy widok sklepu można łatwo usunąć z administracyjnego interfejsu użytkownika? +1 za otwarcie oczu. Jeśli nie otrzymam innej jasnej odpowiedzi na ten temat, zaakceptuję to.Mage::app()->getCurrentStore();
nie wydaje się być zdefiniowany i wywołuje błąd krytyczny po wywołaniu. Zamiast tego mam identyfikator$currentStoreId = Mage::app()->getStore()->getId();
.Więc podstawowa odpowiedź jest taka, że faktycznie dostaje się do 3. jeśli ..... poczekaj co :(
Dla mnie zwraca prawdę
Mage::isInstalled()
i fałsz, dla$this->getUpdateMode()
których brzmi to źle. Ale dzieje się to tylko przy pierwszym trafieniugetStore
.Wygląda więc na to, że konfiguruje sklep przed ustawieniem trybu aktualizacji, a następnie, gdy wraca do skryptu konfiguracji, używa domyślnego wywołania sklepu, które używa następującego kodu:
Wartość
self::DISTRO_STORE_ID
1 to chyba dlatego, że coś potrzebuje i nie została skonfigurowana dla nas w sklepie administratora :(Tak naprawdę mam system, który nie przechowuje z identyfikatorem 1 i skrypt aktualizacji wydaje się działać dobrze. Jeśli dodajemy tabele / atrybuty, jest w porządku i nawet przy dodawaniu bloku cms specyficznego dla strony działa to również działa, ale otrzymujemy cały identyfikator sklepu i ustawiamy je konkretnie podczas zapisywania specyficznych danych sklepu.
źródło
core_store
ale skrypty konfiguracyjne działają