Dans Magento 2, vous pouvez spécifier un thème parent dans le theme.xml
fichier d' un thème .
<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>
La première fois que Magento voit un thème, il utilise cette valeur pour définir un parent_id
dans le theme
tableau. C'est la source de vérité pour savoir où se trouve le parent d'un thème.
Cependant, si vous essayez de modifier cette valeur après l'ajout d'un thème au système , Magento ne met pas à jour la parent_id
colonne et les Magento\Theme\Model\Theme
objets instanciés auront toujours le thème parent d'origine. (Même si vous videz le cache.)
Je peux résoudre ce problème en modifiant manuellement la parent_id
valeur - cela semble être un hack. Où est parent_id
normalement défini dans le code de base de Magento, et quelles actions utilisateur déclenchent cela? c'est-à-dire qu'il existe un moyen de dire à Magento "veuillez recharger ce thème"
la source
Réponses:
MISE À JOUR AU 20160310
Conclusion
Il est toujours défini via
updateTheme()
ou depuis la collection (via DB) si votreappState->getMode() == AppState::MODE_PRODUCTION
Répondre
Pour répondre à la question Comment faire pour que Magento recharge le fichier theme.xml la réponse est:
Définissez l'état de l'application sur
developer
usingSetEnv MAGE_MODE developer
in.htaccess
(ou équivalent nginx), puis connectez-vous à la zone d'administration (ou actualisez n'importe quelle route d'administration) pour le déclencherMagento\Theme\Model\Theme\Plugin\Registration::beforeDispatch()
.La table thématique de la base de données est mise à jour en raison de
Voir l'analyse ci-dessous pour plus de détails.
Une analyse
Wow, le code Magento 2 me semble vraiment complexe. Avez-vous étudié cette fonction
beforeDispatch()
qui appelleupdateThemeData()
mais seulementif ($this->appState->getMode() != AppState::MODE_PRODUCTION)
Vous avez probablement parcouru ce code.
beforeDispatch()
est appelé uniquement via les routes d'administration et non sur les routes frontales. Voici une trace:En fait, je vois des
beforeDispatch()
appelsupdateThemeData()
qui contiennent ce nugget:Ce qui semble faire (enfin) référence à un chemin XML de configuration,
$themeData->getParentTheme()->getFullPath()
mais cette fonction utilise toujours$themeData->getParentTheme()
. Oh je pense que la logique est ' Si je mets à jour un thème enregistré qui a un parentId dans la collection (via la base de données), recherchez un chemin parent dans la configuration et mettez à jour la collection ''.Alors peut-être que c'est ça.Sinon, je ne sais absolument pas commentMagento\Theme\Model\Theme::getParentTheme()
implémentergetParentId()
ce qui est déclaré dans l'interface du thème. Ce n'est certainement pas magique. Comme vous le dites, il doit provenir de la base de données via la collection ou du chemin XML de configuration du thème (s'il a changé ou n'est pas encore défini), mais je ne trouve pas de définition degetParentId()
. Peut-être qu'il est toujours défini viaupdateTheme()
OR à partir de la collection (via DB), tant pis si votreappState->getMode() == AppState::MODE_PRODUCTION
.J'ai trouvé utile de glaner des informations de l'intérieur
updateThemeData()
en ajoutant une sortie de journal:Qui se connectera
/var/log/debug.log
. Lorsque l'état de l'application est défini surdeveloper
Je peux voir que l'ID parent est toujours défini à chaque actualisation de la page d'administration, qu'il ait été modifiétheme.xml
ou non. Avec l'état deproduction
l' application, la fonction n'est jamais exécutée, je conclus donc:Il est toujours défini via
updateTheme()
OR à partir de la collection (via DB), tant pis si votreappState->getMode() == AppState::MODE_PRODUCTION
Je pense que vous êtes probablement tous en
developer
état d'application.default
l'état de l'application se déclencheraupdateThemeData()
aussi bien sûr. Lors du débogage, j'ai enregistré le chemin complet du thème pour le thème parent de Luma qui étaitfrontend/Magento/blank
. La capitaleM
m'a surpris alors peut-être quelque chose à surveiller.la source
Ce qui précède ne semble pas fonctionner pour moi, alors je suis allé avec le hack.
J'espère que cela aide quelqu'un.
sinon, changez-le.
ou
la source