In Magento 2 können Sie ein übergeordnetes Thema in der theme.xml
Datei eines Themas angeben .
<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>
Wenn Magento zum ersten Mal ein Thema sieht, verwendet es diesen Wert, um ein Thema parent_id
in der theme
Tabelle festzulegen. Dies ist die Quelle der Wahrheit, wo die Eltern eines Themas sind.
Wenn Sie jedoch versuchen, diesen Wert zu ändern, nachdem ein Thema zum System hinzugefügt wurde, kann Magento die parent_id
Spalte nicht aktualisieren , und instanziierte Magento\Theme\Model\Theme
Objekte haben weiterhin das ursprüngliche übergeordnete Thema. (Auch wenn Sie den Cache leeren.)
Ich kann das beheben, indem ich den parent_id
Wert manuell ändere - das scheint ein Hack zu sein. Wo wird parent_id
normalerweise im Kerncode von Magento festgelegt, und welche Benutzeraktionen lösen dies aus? Dh gibt es eine Möglichkeit, Magento mitzuteilen "Bitte lade dieses Thema neu"
quelle
Antworten:
AKTUALISIERT AM 20160310
Fazit
Es wird immer entweder über
updateTheme()
oder aus der Sammlung (über DB) gesetzt, wenn SieappState->getMode() == AppState::MODE_PRODUCTION
Antworten
So beantworten Sie die Frage: Wie kann Magento die Datei theme.xml neu laden? Die Antwort lautet:
Stellen Sie den Anwendungszustand zu
developer
VerwendungSetEnv MAGE_MODE developer
in.htaccess
(oder nginx Äquivalent) und dann einloggen, um den Verwaltungsbereich (oder aktualisieren jede Admin Strecke) zu TriggerMagento\Theme\Model\Theme\Plugin\Registration::beforeDispatch()
.Die Thementabelle in der Datenbank wird aufgrund von aktualisiert
Einzelheiten finden Sie in der folgenden Analyse.
Analyse
Wow, der Magento 2-Code scheint mir wirklich komplex zu sein. Hast du diese Funktion studiert
beforeDispatch()
dieupdateThemeData()
aber nur aufruftif ($this->appState->getMode() != AppState::MODE_PRODUCTION)
Wahrscheinlich haben Sie diesen Code durchlaufen.
beforeDispatch()
wird nur über Admin-Routen und nicht über Front-End-Routen aufgerufen. Hier ist eine Spur:Eigentlich sehe ich
beforeDispatch()
Aufrufe,updateThemeData()
die dieses Nugget enthalten:Das scheint eigentlich (endlich) auf einen Konfigurations-XML-Pfad zu verweisen,
$themeData->getParentTheme()->getFullPath()
aber diese Funktion wird immer noch verwendet$themeData->getParentTheme()
. Oh, ich denke, die Logik lautet ' Wenn ich ein registriertes Thema aktualisiere, das eine parentId in der Sammlung hat (über die DB), dann suche einen übergeordneten Pfad in der Konfiguration und aktualisiere die Sammlung '.Also vielleicht ist es das.Ansonsten bin ich völlig ratlos, wie das in der Theme-Oberfläche deklarierteMagento\Theme\Model\Theme::getParentTheme()
implementiertgetParentId()
wird. Sicher ist es keine Magie. Wie Sie sagen, muss es entweder aus der Datenbank über die Auflistung oder aus dem XML-Konfigurationspfad des Themas stammen (wenn es geändert wurde oder noch nicht definiert wurde), aber ich kann keine Definition von findengetParentId()
. Vielleicht wird es ja immer perupdateTheme()
ODER aus der Sammlung (via DB) gesetzt wenn deinappState->getMode() == AppState::MODE_PRODUCTION
.Ich fand es nützlich, Informationen von innen heraus zu lesen,
updateThemeData()
indem ich eine Protokollausgabe hinzufügte:Welches wird sich anmelden
/var/log/debug.log
. Wenn der Anwendungsstatus auf "developer
Ich kann sehen, dass die übergeordnete ID bei jeder Aktualisierung der Verwaltungsseite immer festgelegt wird, ob sie geändert wurdetheme.xml
oder nicht. Mit Anwendungsstatus wirdproduction
die Funktion nie ausgeführt, daher komme ich zu folgendem Schluss:Es wird immer per
updateTheme()
ODER aus der Sammlung (via DB) gesetzt also schade wenn deinappState->getMode() == AppState::MODE_PRODUCTION
Ich denke, Sie sind wahrscheinlich alle im
developer
App-Status.default
Der App-Status wirdupdateThemeData()
natürlich auch ausgelöst . Beim weiteren Debuggen habe ich den vollständigen Pfad des Themas für das übergeordnete Thema von Luma aufgezeichnetfrontend/Magento/blank
. Die Hauptstadt hatM
mich also vielleicht etwas überrascht, auf das man achten sollte.quelle
Das Obige schien für mich nicht zu funktionieren, also habe ich mich für den Hack entschieden.
Hoffe es hilft jemandem.
Wenn nicht, ändern Sie es.
oder
quelle