Quando Você Deve Sobrescrever os Arquivos do Core do Magento em app/code/local/Mage?

A resposta mais curta para esta pergunta é: nunca!

A resposta mais longa não é tão absoluta e por isso requer um pouco de explicação.

Frequentemente você lerá algum tutorial para Magento ou algum post em fóruns que ensina criar uma implementação ou alteração em algum comportamento padrão do Magento e, óbvio, altere diretamente alguma funcionalidade dos arquivos do Core do Magento. Então alguém avisa que ao invés de alterar os arquivos diretamente do Core, basta copiar os arquivos que se deseja alterar para a pasta app/code/core/Mage e fazer as alterações desejadas que, caso ocorra um upgrade de versão, os arquivos não serão sobrescritos, e a customização não será perdida.

Conhecemos este processo como sobrescrever as funcionalidades do Core do Magento e isto é baseado no fato de que o Magento define os include paths em uma ordem específica, sendo que o primeiro local aonde ele irá procurar seus arquivos é app/code/local/, o segundo app/code/community, o terceiro é app/code/core e por fim a pasta lib. Dessa forma se tivermos um arquivo na pasta app/code/core e copiarmos apenas este arquivo para app/code/local, considerando a mesma estrutura e nomenclaturas de suas pastas este arquivo será lido pelo Magento precedentemente ao original, ou seja, consideremos o arquivo app/code/core/Mage/Customer/Model/Customer.php, se copiarmos este arquivo para app/code/local/Mage/Customer/Model/Customer.php e fizermos alguma alteração, o Magento desconsiderará apenas este arquivo do Core e carregará o que se encontra na pasta local, o restante dos arquivos do módulo Customer será carregado do Core. Dessa forma podemos sobrescrever quase qualquer arquivo do Core do Magento. Eu disse quase porque os controllers, por exemplo, não seguem este padrão, portanto não é possível sobrescrevê-los dessa forma. Para aprender mais sobre como o Magento define seu sistema leia as excelentes séries das configurações do Magento por Alan Storm.

Esta é uma das formas, muitas das vezes recomendadas, de alterar as funcionalidades padrão do Magento sem tocar nos arquivos do Core. Mas agora você me pergunta: por que esta forma de sobrescrever os arquivos do Core não é uma boa opção?

Primeiramente, vamos listar aqui os cenários nos quais precisamos sobrescrever os arquivos do Core do Magento:

  1. Precisamos alterar apenas uma pequena parte da funcionalidade de um arquivo do Core do Magento, então copiamos o arquivo que contém o código que precisamos alterar e alteramos um ou mais métodos.
  2. Precisamos adicionar novas funcionalidades para os blocos do Core do Magento, dessa forma podemos capturar certas informações pelos arquivos .phtml do template do Magento.
  3. Precisamos fazer várias alterações e adicionar várias funcionalidades em vários arquivos do Core do Magento.

Então, o que estamos fazendo aqui quando sobrescrevemos os arquivos do Core do Magento?

Primeiramente, quando copiamos um arquivo temos que ter a consciência de que não estamos simplesmente sobrescrevendo apenas um método do arquivo do Core, mas sim todos os métodos constantes naquele arquivo, pois nesta forma de sobrescrever arquivos do Core do Magento não existe a possibilidade de sobrescrevê-lo parciamente, portanto se tirarmos algum método constante naquele arquivos, muito provavelmente quebraremos a loja inteira. Uma vez que este arquivo seja copiado é apenas ele que o Magento irá considerar daqui pra frente.  Dado que a maioria da classes do Magento contém inúmeros métodos e funcionalidades temos que assumir o risco de que estamos efetivamente sobrescrevendo todos os métodos daquele arquivo.

Agora, lembra quando você leu naquele post que esta seria a forma ideal de sobrescrever um arquivo do Core do Magento para que você não perdesse a customização após um possível upgrade de versão da plataforma? Bem, de fato isso é verdade, mas e se na nova versão este mesmo arquivo tiver sido modificado pela equipe do Magento? E se eles tiverem implementado novos métodos ou corrigido bugs encontrados em versões anteriores deste arquivo? Uma vez que o arquivo que customizamos será sempre precedente ao original estas novas funcionalidades ou correções nunca terão efeito uma vez que nosso arquivo o está sobrescrevendo por completo. Se você for sortudo, você verá um report de erro no momento em que tentar rodar o Magento com a nova versão, devido algum método que foi implementado e que não contém em seu arquivo precedente. Mas lhe pergunto: e se você não enxergar nenhum erro? Aparetemente o upgrade foi um sucesso, mas será verdade?

Acho que agora deu pra entender um pouco o problema aqui, certo? Após cada upgrade você precisará verificar todos os arquivos em sua pasta app/code/local/Mage e analisar um a um se houve ou não alguma alteração na nova versão para manter a integridade do sistema. Se você é um cara que só faz override dessa forma, acredito que isso vai ser um tédio pra você. Ou então se você é um desenvolvedor que sempre segue este tipo de metodologia para sobrescrever o Core do Magento, pois acha mais prático, com certeza você não deve estar feliz ao ler isso. Bom, as coisas podem ficar pior ainda se você pegou o projeto no meio do caminho e o desenvolvedor anterior já tiver feito várias modificações desse jeito… Imagine você fazendo alguns 30 diffs de arquivos. Sinceramente, ninguém mereceria tanta tortura.

Por agora acredito que você tenha uma idéia do porque pode ser arriscado utilizar dessa metodologia para sobrescrever os arquivos do Core do Magento, então vamos voltar á questão original de quando, se necessário, se beneficiar desse método.

Se você precisar fazer alguma modificação rápida apenas para ver se o código que você tem em mente resolveria seu problema, mas não pensa em criar uma extensões ainda. Quando seu código estiver pronto, você pode simplesmente implementá-lo em uma extensões e deletar o arquivo que sobrescreve o Core literalmente.

Se você está implesmentando uma alteração temporária do Core do Magento que você removerá após sua tarefa estiver completa. Um exemplo típico dessa ocasião é sobrescrever a classe do Dataflow do Magento para importação, quando você quiser alterar a forma com a qual o Magento lida com certas coisas no início de uma importação de cliente ou produto.

Portanto, o conceito para este tipo de overriding é: apenas utilizar para alterações/experimentos temporários, quando você não estiver planejando manter o arquivo definitivamente sobrescrevendo o arquivo do Core.

Nota: existem outros cenários nos quais o override local do Magento é a única maneira de alterar funcionalidades do Core do Magento. Gostaria de encorajar uma discussão nos comentários para saber o que a galera acha disso.

Conclusão

O objetivo deste artigo é encorajá-lo a nunca utilizar o app/code/local/Mage para sobrescrever um arquivo do Magento permanetemente. Se precisar utilizar desse benefício, utilize apenas para alterações temporárias e nunca se esqueça de remover o arquivo após você concluir o que precisa ser feito.

Agora a pergunta que deve pairar o ar: então como eu devo sobrescrever as funcionalidades dos arquivos do Core do Magento? A resposta é simples, crie um módulo e utilize do mecanismo de sobrescrição nativa do Magento utilizando dos configs de seu módulo, ou melhor ainda, utilize, sempre que possível, os Observers e Eventos.

Um grande abraço e até a próxima!

Tiago Sampaio

1 Comment

Leave A Reply

Navigate