En Magento 2, puede especificar un tema principal en el theme.xml
archivo de un tema .
<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 primera vez que Magento ve un tema, usa este valor para establecer un parent_id
en la theme
tabla. Esta es la fuente de la verdad sobre dónde está el padre de un tema.
Sin embargo, si intenta cambiar este valor después de que se haya agregado un tema al sistema , Magento no puede actualizar la parent_id
columna y los Magento\Theme\Model\Theme
objetos instanciados seguirán teniendo el tema principal original. (Incluso si borra el caché).
Puedo arreglar esto cambiando manualmente el parent_id
valor, eso parece un truco. ¿Dónde se parent_id
establece normalmente en el código central de Magento y qué acciones del usuario desencadenan esto? es decir, ¿hay alguna manera de decirle a Magento "vuelva a cargar este tema"
fuente
Respuestas:
ACTUALIZADO EN 20160310
Conclusión
Siempre se establece a través de
updateTheme()
o desde la colección (a través de DB) si suappState->getMode() == AppState::MODE_PRODUCTION
Responder
Para responder la pregunta ¿Cuál es la forma de hacer que Magento vuelva a cargar el archivo theme.xml? La respuesta es:
Establezca el estado de la aplicación en
developer
usarSetEnv MAGE_MODE developer
in.htaccess
(o nginx equivalente) y luego inicie sesión en el área de administración (o actualice cualquier ruta de administración) para activarMagento\Theme\Model\Theme\Plugin\Registration::beforeDispatch()
.La tabla de temas en la base de datos se actualiza debido a
Vea el análisis a continuación para más detalles.
Análisis
Wow, el código de Magento 2 me parece realmente complejo. ¿Has estudiado esta función
beforeDispatch()
que llamaupdateThemeData()
pero soloif ($this->appState->getMode() != AppState::MODE_PRODUCTION)
Probablemente hayas leído este código.
beforeDispatch()
se llama solo a través de rutas de administrador y no en rutas de front-end. Aquí hay un rastro:En realidad, veo
beforeDispatch()
llamadasupdateThemeData()
que contienen esta pepita:Lo que parece referirse realmente (finalmente) a una ruta XML de configuración,
$themeData->getParentTheme()->getFullPath()
pero esa función aún se usa$themeData->getParentTheme()
. Oh, creo que la lógica es ' Si estoy actualizando un tema registrado que tiene un parentId en la colección (a través de la base de datos), busque una ruta principal en la configuración y actualice la colección '.Entonces tal vez esto es todo.De lo contrario, estoy completamente perdido en cuanto a cómo seMagento\Theme\Model\Theme::getParentTheme()
implementa logetParentId()
que se declara en la interfaz del tema. Seguramente no es magia. Como usted dice, debe provenir de la base de datos a través de la colección o de la ruta XML de configuración del tema (si cambió o aún no está definida), pero no puedo encontrar una definición degetParentId()
. Tal vez siempre se establece a través deupdateTheme()
OR de la colección (a través de DB), por lo que es muy malo si suappState->getMode() == AppState::MODE_PRODUCTION
.Me resultó útil obtener información desde adentro
updateThemeData()
agregando algunos resultados de registro:Que se registrará en
/var/log/debug.log
. Con el estado de la aplicación configurado endeveloper
Puedo ver que la ID principal siempre se establece en cada actualización de la página de administración, ya sea que se haya cambiadotheme.xml
o no. Con el estado deproduction
la aplicación, la función nunca se ejecuta, así que concluyo:Siempre se establece a través de
updateTheme()
OR desde la colección (a través de DB), por lo que es muy malo si suappState->getMode() == AppState::MODE_PRODUCTION
Creo que probablemente todos estén en
developer
estado de aplicación.default
el estado de la aplicación también se activará,updateThemeData()
por supuesto. En la depuración adicional, registré la ruta completa del tema para el tema principal de Luma que erafrontend/Magento/blank
. La capitalM
me sorprendió, así que tal vez algo a tener en cuenta.fuente
Lo anterior no parecía funcionar para mí, así que fui con el truco.
Espero que ayude a alguien.
si no es así, cámbielo.
o
fuente