W Magento 2 możesz określić motyw nadrzędny w motywie theme.xml
pliku .
<theme xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Config/etc/theme.xsd">
<title>Theme Title</title>
<parent>Package/base-theme</parent>
<media>
<preview_image>media/preview.jpg</preview_image>
</media>
</theme>
Gdy Magento po raz pierwszy widzi motyw, używa tej wartości do ustawienia parent_id
w theme
tabeli. To jest źródło prawdy dla tego, gdzie jest rodzic tematu.
Jeśli jednak spróbujesz zmienić tę wartość po dodaniu kompozycji do systemu , Magento nie zaktualizuje parent_id
kolumny, a Magento\Theme\Model\Theme
obiekty utworzone w postaci instancji nadal będą miały oryginalny motyw nadrzędny. (Nawet jeśli wyczyścisz pamięć podręczną).
Mogę to naprawić, ręcznie zmieniając parent_id
wartość - to wygląda na włamanie. Gdzie parent_id
zwykle jest ustawiony w głównym kodzie Magento i jakie działania użytkownika to powodują? tzn. czy istnieje sposób, aby powiedzieć Magento „ponownie załaduj ten motyw”
źródło
Odpowiedzi:
ZAKTUALIZOWANO W 20160310
Wniosek
Jest zawsze ustawiany za pośrednictwem
updateTheme()
lub z kolekcji (przez DB), jeśli maszappState->getMode() == AppState::MODE_PRODUCTION
Odpowiedź
Aby odpowiedzieć na pytanie Jaki jest sposób na to, aby Magento ponownie załadował plik theme.xml, odpowiedź brzmi:
Ustaw stan aplikacji na
developer
użycieSetEnv MAGE_MODE developer
w.htaccess
(lub odpowiednik nginx), a następnie zaloguj się do obszaru administratora (lub odśwież dowolną trasę administratora), aby uruchomićMagento\Theme\Model\Theme\Plugin\Registration::beforeDispatch()
.Tabela motywów w bazie danych została zaktualizowana z powodu
Zobacz szczegóły poniżej.
Analiza
Wow, kod Magento 2 wydaje mi się naprawdę skomplikowany. Czy studiowałeś tę funkcję,
beforeDispatch()
która wywołuje,updateThemeData()
ale tylkoif ($this->appState->getMode() != AppState::MODE_PRODUCTION)
Prawdopodobnie przeszedłeś przez ten kod.
beforeDispatch()
jest wywoływany tylko przez trasy administracyjne, a nie na trasach frontonu. Oto ślad:Właściwie widzę
beforeDispatch()
połączenia,updateThemeData()
które zawierają ten samorodek:Co wydaje się faktycznie (w końcu) odwoływać się do ścieżki XML konfiguracji,
$themeData->getParentTheme()->getFullPath()
ale ta funkcja nadal używa$themeData->getParentTheme()
. Och, myślę, że logika brzmi: „ Jeśli aktualizuję zarejestrowany motyw, który ma ParentId w kolekcji (poprzez DB), to poszukaj ścieżki nadrzędnej w konfiguracji i zaktualizuj kolekcję ”.Więc może to jest to.W przeciwnym razie mam całkowitą utratę tego, jakMagento\Theme\Model\Theme::getParentTheme()
implementujegetParentId()
deklarowane w interfejsie kompozycji. Na pewno to nie jest magia. Jak mówisz, musi pochodzić albo z DB poprzez kolekcję, albo ze ścieżki XML konfiguracji motywu (jeśli się zmieniło lub nie zostało jeszcze zdefiniowane), ale nie mogę znaleźć definicjigetParentId()
. Może zawsze jest ustawiony przezupdateTheme()
OR z kolekcji (przez DB), więc szkoda, jeśli maszappState->getMode() == AppState::MODE_PRODUCTION
.Za przydatne uznałem zbieranie informacji od wewnątrz
updateThemeData()
poprzez dodanie danych wyjściowych dziennika:Który zaloguje się do
/var/log/debug.log
. Po ustawieniu stanu aplikacji nadeveloper
Widzę, że identyfikator nadrzędny jest zawsze ustawiony na każdym odświeżeniu strony administratora, niezależnie od tego, czy został zmienionytheme.xml
czy nie. Ze stanem aplikacjiproduction
funkcja nigdy nie jest uruchamiana, więc wnioskuję:Zawsze jest ustawiane przez
updateTheme()
OR z kolekcji (przez DB), więc szkoda, jeśli takappState->getMode() == AppState::MODE_PRODUCTION
Myślę, że prawdopodobnie wszyscy jesteście w
developer
stanie aplikacji. Oczywiściedefault
stan aplikacji również się uruchomiupdateThemeData()
. Podczas dalszego debugowania zapisałem pełną ścieżkę motywu dla motywu nadrzędnego Luma, który byłfrontend/Magento/blank
. StolicaM
mnie zaskoczyła, więc może warto na nią uważać.źródło
Powyższe wydaje się nie działać dla mnie, więc poszedłem z hakiem.
Mam nadzieję, że to komuś pomoże.
jeśli nie jest, zmień to.
lub
źródło