В Magento 2 вы можете указать родительскую тему в theme.xml
файле темы .
<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>
Когда Magento видит тему в первый раз, она использует это значение для установки parent_id
в theme
таблице. Это источник правды о том, где находится родитель темы.
Однако если вы попытаетесь изменить это значение после добавления темы в систему , Magento не удастся обновить parent_id
столбец, и у созданных Magento\Theme\Model\Theme
объектов все равно будет исходная родительская тема. (Даже если вы очистите кеш.)
Я могу исправить это, вручную изменив parent_id
значение - это похоже на взлом. Где parent_id
обычно установлен основной код Magento, и какие действия пользователя вызывают это? т.е. есть ли способ сказать Magento "пожалуйста, перезагрузите эту тему"
magento2
theme
parent-child-theme
Алан Сторм
источник
источник
Ответы:
ОБНОВЛЕНО В 20160310
Вывод
Он всегда устанавливается через
updateTheme()
или из коллекции (через БД), если вашappState->getMode() == AppState::MODE_PRODUCTION
Ответ
Чтобы ответить на вопрос, как заставить Magento перезагрузить файл theme.xml, ответ:
Установите состояние приложения на
developer
использованиеSetEnv MAGE_MODE developer
in.htaccess
(или эквивалент nginx), а затем войдите в административную область (или обновите любой маршрут администратора) для запускаMagento\Theme\Model\Theme\Plugin\Registration::beforeDispatch()
.Таблица тем в базе данных обновляется в связи с
Смотрите анализ ниже для деталей.
Анализ
Ух ты, код Magento 2 кажется мне действительно сложным. Вы изучили эту функцию,
beforeDispatch()
которая вызывает,updateThemeData()
но толькоif ($this->appState->getMode() != AppState::MODE_PRODUCTION)
Возможно, вы прошли через этот код.
beforeDispatch()
вызывается только через маршруты администратора, а не на интерфейсных маршрутах. Вот след:На самом деле я вижу
beforeDispatch()
вызовы,updateThemeData()
которые содержат этот самородок:Который, кажется, на самом деле (наконец) ссылается на путь конфигурации XML,
$themeData->getParentTheme()->getFullPath()
но эта функция все еще использует$themeData->getParentTheme()
. О, я думаю, что логика такова: « Если я обновляю зарегистрированную тему, у которой есть родительский идентификатор в коллекции (через БД), тогда найдите родительский путь в конфигурации и обновите коллекцию ».Так что, возможно, это оно и есть.Иначе я в полной растерянности относительно того, какMagento\Theme\Model\Theme::getParentTheme()
реализуется,getParentId()
что объявлено в интерфейсе темы. Конечно, это не волшебство. Как вы говорите, он должен поступать либо из БД через коллекцию, либо из XML-пути конфигурации темы (если он изменился или еще не определен), но я не могу найти определениеgetParentId()
. Может быть, это всегда устанавливается черезupdateTheme()
ИЛИ из коллекции (через БД), так что плохо, если вашappState->getMode() == AppState::MODE_PRODUCTION
.Я нашел полезным получить информацию изнутри
updateThemeData()
, добавив некоторые выходные данные журнала:Который будет входить в
/var/log/debug.log
. При установленном для приложения состоянииdeveloper
я вижу, что родительский идентификатор всегда устанавливается при каждом обновлении страницы администратора независимо от того, был ли он измененtheme.xml
или нет. С состоянием приложенияproduction
функция никогда не запускается, поэтому я заключаю:Он всегда устанавливается через
updateTheme()
ИЛИ из коллекции (через БД), так что плохо, если вашappState->getMode() == AppState::MODE_PRODUCTION
Я думаю, что вы, вероятно, все в
developer
состоянии приложения.default
Состояние приложенияupdateThemeData()
тоже сработает, конечно. В дальнейшей отладке я записал полный путь темы для родительской темы Lumafrontend/Magento/blank
. СтолицаM
удивила меня, так что, может быть, на что-то стоит обратить внимание.источник
Вышеупомянутое, похоже, не работает для меня, поэтому я пошел с взломать.
Надеюсь, это поможет кому-то.
если это не так, измените его.
или
источник