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
Verwendung SetEnv MAGE_MODE developer
in .htaccess
(oder nginx Äquivalent) und dann einloggen, um den Verwaltungsbereich (oder aktualisieren jede Admin Strecke) zu Trigger Magento\Theme\Model\Theme\Plugin\Registration::beforeDispatch()
.
Die Thementabelle in der Datenbank wird aufgrund von aktualisiert
\\Magento\Theme\Model\Theme\Plugin\Registration::updateThemeData()
\\...
$themeData->setParentId($parentTheme->getId());`.
\\...
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()
die updateThemeData()
aber nur aufruftif ($this->appState->getMode() != AppState::MODE_PRODUCTION)
//namespace: namespace Magento\Theme\Model\Theme\Plugin;
//class: Registration
//file: app/code/Magento/Theme/Model/Theme/Plugin/Registration.php
/**
* Add new theme from filesystem and update existing
*
* @param AbstractAction $subject
* @param RequestInterface $request
*
* @return void
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function beforeDispatch(
AbstractAction $subject,
RequestInterface $request
) {
try {
if ($this->appState->getMode() != AppState::MODE_PRODUCTION) {
$this->themeRegistration->register();
$this->updateThemeData();
}
} catch (LocalizedException $e) {
$this->logger->critical($e);
}
}
Wahrscheinlich haben Sie diesen Code durchlaufen.
beforeDispatch()
wird nur über Admin-Routen und nicht über Front-End-Routen aufgerufen. Hier ist eine Spur:
#0 [internal function]: Magento\Theme\Model\Theme\Plugin\Registration->beforeDispatch(Object(Magento\Backend\Controller\Adminhtml\Dashboard\Index\Interceptor), Object(Magento\Framework\App\Request\Http))
#1 \magento2\lib\internal\Magento\Framework\Interception\Interceptor.php(122): call_user_func_array(Array, Array)
#2 \magento2\var\generation\Magento\Backend\Controller\Adminhtml\Dashboard\Index\Interceptor.php(39): Magento\Backend\Controller\Adminhtml\Dashboard\Index\Interceptor->___callPlugins('dispatch', Array, Array)
#3 \magento2\lib\internal\Magento\Framework\App\FrontController.php(55): Magento\Backend\Controller\Adminhtml\Dashboard\Index\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#4 [internal function]: Magento\Framework\App\FrontController->dispatch(Object(Magento\Framework\App\Request\Http))
#5 \magento2\lib\internal\Magento\Framework\Interception\Interceptor.php(74): call_user_func_array(Array, Array)
#6 \magento2\lib\internal\Magento\Framework\Interception\Chain\Chain.php(70): Magento\Framework\App\FrontController\Interceptor->___callParent('dispatch', Array)
#7 \magento2\lib\internal\Magento\Framework\Interception\Interceptor.php(136): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'dispatch', Object(Magento\Framework\App\FrontController\Interceptor), Array, 'install')
#8 \magento2\lib\internal\Magento\Framework\Module\Plugin\DbStatusValidator.php(69): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#9 [internal function]: Magento\Framework\Module\Plugin\DbStatusValidator->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#10 \magento2\lib\internal\Magento\Framework\Interception\Interceptor.php(141): call_user_func_array(Array, Array)
#11 \magento2\var\generation\Magento\Framework\App\FrontController\Interceptor.php(26): Magento\Framework\App\FrontController\Interceptor->___callPlugins('dispatch', Array, Array)
#12 \magento2\lib\internal\Magento\Framework\App\Http.php(115): Magento\Framework\App\FrontController\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#13 \magento2\lib\internal\Magento\Framework\App\Bootstrap.php(258): Magento\Framework\App\Http->launch()
#14 \magento2\index.php(39): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http))
Eigentlich sehe ich beforeDispatch()
Aufrufe, updateThemeData()
die dieses Nugget enthalten:
//namespace: namespace Magento\Theme\Model\Theme\Plugin;
//class: Registration
//file: app/code/Magento/Theme/Model/Theme/Plugin/Registration.php
//function: updateThemeData()
//...
if ($themeData->getParentTheme()) {
$parentTheme = $this->themeLoader->getThemeByFullPath(
$themeData->getParentTheme()->getFullPath()
);
$themeData->setParentId($parentTheme->getId());
}
//...
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 deklarierte Magento\Theme\Model\Theme::getParentTheme()
implementiert getParentId()
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 finden getParentId()
. Vielleicht wird es ja immer per updateTheme()
ODER aus der Sammlung (via DB) gesetzt wenn dein appState->getMode() == AppState::MODE_PRODUCTION
.
Ich fand es nützlich, Informationen von innen heraus zu lesen, updateThemeData()
indem ich eine Protokollausgabe hinzufügte:
//namespace: namespace Magento\Theme\Model\Theme\Plugin;
//class: Registration
//file: app/code/Magento/Theme/Model/Theme/Plugin/Registration.php
//function: updateThemeData()
//...
if ($themeData->getParentTheme()) {
$parentTheme = $this->themeLoader->getThemeByFullPath(
$themeData->getParentTheme()->getFullPath()
);
$this->logger->addDebug("Theme parent full path ".$themeData->getParentTheme()->getFullPath());
$this->logger->addDebug("Theme parent new ID ".$parentTheme->getId()); $themeData->setParentId($parentTheme->getId());
}
//...
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 wurde theme.xml
oder nicht. Mit Anwendungsstatus wird production
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 wird updateThemeData()
natürlich auch ausgelöst . Beim weiteren Debuggen habe ich den vollständigen Pfad des Themas für das übergeordnete Thema von Luma aufgezeichnet frontend/Magento/blank
. Die Hauptstadt hat M
mich also vielleicht etwas überrascht, auf das man achten sollte.