Cursos Magento

Recursividade infinita de temas e pacotes no Magento. Já ouviu falar?

, ,

Atualizado em 16 de fevereiro de 2022

Ninguém nega que o Magento evoluiu muito ao longo dos anos. Quando comecei a desenvolver para Magento, ainda no Magento 1.4, era muito comum e recomendado que ao iniciar um novo tema, ou um novo pacote, que copiássemos os arquivos de tema e layout blank, tema existente dentro do pacote default de qualquer instalação.

O tempo passou, um monte de coisa mudou, e no Magento 1.9 veio o package responsivo rwd, equipado com Sass para pré-processamento de CSS, jQuery para as customizações JavaScript do tema.

Com isso, muita gente começou a duplicar o conteúdo do rwd em outro pacote, afinal não é possível estender um tema de outro pacote, exceto o base/default que é onde tudo termina, certo?

Com a chegada do Magento 1.9, veio também uma mudança importante no sistema de fallback de temas e pacotes., que vem sendo ignorada há muito tempo.

Seleção de pacote
Configuração de pacote disponível em Sistema->Configurações->Visual

Ao criar um novopacote qualquer arquivo que não exista em app/design/frontend/[layout|template]/novopacote/default seria redirecionado para o tema base/default.

A partir da versão 1.9, você pode ter um nível antes de chegar lá. Para isso, basta adicionar um arquivo chamado theme.xml na pasta etc do seu template, da seguinte forma:

<?xml version="1.0"?>
<theme>
    <parent>rwd/default</parent>
</theme>

E salvar em app/design/frontend/novopacote/default/etc/theme.xml

Desta forma, antes de seguir para o base/default, o Magento agora procura por herdeiros, conforme podemos constatar em app/code/core/Mage/Core/Model/Design/Config.php.

if (!$this->loadCache()) {
    $this->loadString('<theme />');
    $path = str_replace('/', DS, $this->_designRoot . '/*/*/*/etc/theme.xml');
    $files = glob($path);
    foreach ($files as $file) {
        $config = new Varien_Simplexml_Config();
        $config->loadFile($file);
        list($area, $package, $theme) = $this->_getThemePathSegments($file);
        $this->setNode($area . '/' . $package . '/' . $theme, null);
        $this->getNode($area . '/' . $package . '/' . $theme)->extend($config->getNode());
    }
    $this->saveCache();
}

Ao debugar os arquivos que estão sendo lidos ($files) temos:

$files = {array} [8]
0 = "/var/www/magento1923/app/design/adminhtml/default/default/etc/theme.xml"
1 = "/var/www/magento1923/app/design/frontend/base/default/etc/theme.xml"
2 = "/var/www/magento1923/app/design/frontend/default/blank/etc/theme.xml"
3 = "/var/www/magento1923/app/design/frontend/default/default/etc/theme.xml"
4 = "/var/www/magento1923/app/design/frontend/default/iphone/etc/theme.xml"
5 = "/var/www/magento1923/app/design/frontend/default/modern/etc/theme.xml"
6 = "/var/www/magento1923/app/design/frontend/rwd/default/etc/theme.xml"
7 = "/var/www/magento1923/app/design/install/default/default/etc/theme.xml"

E ao acrescentarmos o theme.xml como mostrado acima, temos:

$files = {array} [9]
0 = "/var/www/magento1923/app/design/adminhtml/default/default/etc/theme.xml"
1 = "/var/www/magento1923/app/design/frontend/base/default/etc/theme.xml"
2 = "/var/www/magento1923/app/design/frontend/default/blank/etc/theme.xml"
3 = "/var/www/magento1923/app/design/frontend/default/default/etc/theme.xml"
4 = "/var/www/magento1923/app/design/frontend/default/iphone/etc/theme.xml"
5 = "/var/www/magento1923/app/design/frontend/default/modern/etc/theme.xml"
6 = "/var/www/magento1923/app/design/frontend/<strong>novopacote</strong>/default/etc/theme.xml"
7 = "/var/www/magento1923/app/design/frontend/rwd/default/etc/theme.xml"
8 = "/var/www/magento1923/app/design/install/default/default/etc/theme.xml"

Desta forma, podemos ir estendendo nossos templates como quisermos e com um fallback praticamente infinito, sem ter que ficar duplicando código.

Veja isso e muito mais no meu curso de Criação de Temas e Desenvolvimento Frontend Para Magento 1.x.

Últimos posts por Ricardo Martins (exibir todos)
Comentários

Deixe seu comentário

[fbcomments url="https://www.magenteiro.com/blog/magento-1/recursividade-infinita-de-temas-e-pacotes-no-magento/"]