No Magento 2, você pode especificar um tema pai no theme.xml
arquivo de um 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>
A primeira vez que o Magento vê um tema, ele usa esse valor para definir um parent_id
na theme
tabela. Essa é a fonte da verdade para onde está o pai de um tema.
No entanto, se você tentar alterar esse valor após a adição de um tema ao sistema , o Magento não atualizará a parent_id
coluna e os Magento\Theme\Model\Theme
objetos instanciados ainda terão o tema pai original. (Mesmo se você limpar o cache.)
Eu posso corrigir isso alterando manualmente o parent_id
valor - isso parece um hack. Onde parent_id
normalmente está definido no código principal do Magento, e quais ações do usuário acionam isso? ou seja, existe uma maneira de dizer ao Magento "por favor recarregue esse tema"
fonte
Respostas:
ATUALIZADO EM 20160310
Conclusão
É sempre definido via
updateTheme()
ou a partir da coleção (via DB) se o seuappState->getMode() == AppState::MODE_PRODUCTION
Responda
Para responder à pergunta Qual é o caminho para o Magento recarregar o arquivo theme.xml, a resposta é:
Definir o estado de aplicação para
developer
usarSetEnv MAGE_MODE developer
em.htaccess
(ou nginx equivalente) e, em seguida, em log para a área de administração (ou actualizar qualquer via de administração) de gatilhoMagento\Theme\Model\Theme\Plugin\Registration::beforeDispatch()
.A tabela de temas no banco de dados é atualizada devido a
Veja a análise abaixo para obter detalhes.
Análise
Uau, o código Magento 2 parece realmente complexo para mim. Você estudou esta função
beforeDispatch()
que chamaupdateThemeData()
mas apenasif ($this->appState->getMode() != AppState::MODE_PRODUCTION)
Provavelmente você já passou por esse código.
beforeDispatch()
é chamado apenas através de rotas administrativas e não nas rotas de front-end. Aqui está um rastro:Na verdade, vejo
beforeDispatch()
chamadasupdateThemeData()
que contêm esse nugget:O que parece realmente (finalmente) se referir a um caminho XML de configuração,
$themeData->getParentTheme()->getFullPath()
mas essa função ainda usa$themeData->getParentTheme()
. Ah, acho que a lógica é ' Se estou atualizando um tema registrado que tenha um parentId na coleção (via DB), procure um caminho pai na configuração e atualize a coleção '.Então talvez seja isso.Caso contrário, estou completamente desapontado com a forma comoMagento\Theme\Model\Theme::getParentTheme()
implementa ogetParentId()
que é declarado na interface do tema. Certamente não é mágico. Como você diz, ele precisa vir do banco de dados por meio da coleção ou do caminho XML de configuração do tema (se ele foi alterado ou ainda não está definido), mas não consigo encontrar uma definição degetParentId()
. Talvez seja sempre definido viaupdateTheme()
OR da coleção (via DB) tão ruim que seja o seuappState->getMode() == AppState::MODE_PRODUCTION
.Achei útil recolher informações de dentro
updateThemeData()
adicionando alguma saída de log:O qual fará o logon
/var/log/debug.log
. Com o estado do aplicativo definido comodeveloper
, posso ver que o ID pai é sempre definido em todas as atualizações da página de administração, independentemente de terem sido alteradastheme.xml
ou não. Com o estadoproduction
do aplicativo, a função nunca é executada, então concluo:É sempre definido via
updateTheme()
OR da coleção (via DB) tão ruim se o seuappState->getMode() == AppState::MODE_PRODUCTION
Eu acho que você provavelmente está no
developer
estado de aplicativo.default
o estado do aplicativo será acionadoupdateThemeData()
também, é claro. Na depuração adicional, registrei o caminho completo do tema para o tema pai do Luma, que erafrontend/Magento/blank
. A capitalM
me surpreendeu, então talvez algo para observar.fonte
O exposto acima não pareceu funcionar para mim, então fui com o hack.
Espero que ajude alguém.
caso contrário, mude.
ou
fonte