As Configs do Magento

As configs são praticamente o coração do sistema do Magento. Ele descreve, em geral, quase todos os módulos/model/classe/template/etc que você precisa acessar. É um nível de abstração com a qual a maioria dos programadores PHP não estão acostumados a trabalhar, e de vez em quando aumenta o tempo de desenvolvimento em forma de confusão fazendo muitos coçarem a cabeça, mas também permite uma flexibilidade muito maior perante seus concorrentes como a sobrescrição do comportamento padrão de qualquer parte do sistema.

Para iniciarmos, vamos criar um módulo no Magento que nos permita visualizar as configurações do sistema em nosso navegador. Como trata-se apenas de um processo de copiar e colar, você pode escrever seu próprio módulo, dessa forma você estará mais confortável com as coisas que você fará enquanto trabalha com o Magento, além de aprender algumas terminologias-chaves.

Para os impacientes, o módulo completo pode ser baixado clicando aqui.

Definindo a estrutura de diretórios do módulo

Estamos prestes a criar um módulo para Magento. Um módulo é um grupo de arquivos php e xml destinados á sobrescrever ou estender o comportamento padrão do sistema do core do Magento. Isto pode significar adicionar models de dados para rastrear informações de vendas, alterar o comportamento de classes existentes ou adicionar funcionalidades inteiramente novas.

É importante destacar que a maior parte do sistema do Magento é construído utilizando o mesmo sistema  de módulos que você usará neste tutorial. Se você olhar em

app/code/core/Mage

Cada pasta é um módulo separado do Magento desenvolvido pela equipe da Varien. Juntos, estes módulos formam a versão community do Magento que você está utilizando. Seu módulo deve ser colocado na seguinte pasta:

app/code/local/Packagename

“Packagename” (também conhecido como Namespace) deve ser uma string única para identificar seu módulo. Uma convenção não oficial é que esta pasta deve conter o nome de sua empresa. A idéia é utilizar um nome que ninguém mais no mundo inteiro utilizaria.

app/code/local/Microsoft

Quando estou trabalhando em meus próprios projetos Magento eu costumo utilizar TiagoSampaio ou OsStudios como “Packagename”
Então, para adicionar um módulo em seu Magento, crie a seguinte estrutura de diretórios

app/code/local/TiagoSampaio/Configviewer/Block
app/code/local/TiagoSampaio/Configviewer/controllers
app/code/local/TiagoSampaio/Configviewer/etc
app/code/local/TiagoSampaio/Configviewer/Helper
app/code/local/TiagoSampaio/Configviewer/Model
app/code/local/TiagoSampaio/Configviewer/sql

Você não precisará de todas estas pastas para todo módulo que criar, mas criá-las no início do projeto é uma boa idéia.
O próximo passo consiste em criar dois arquivos. O primeiro, config.xml, deve ser criado na pasta etc que você acabou de criar.

app/code/local/TiagoSampaio/Configviewer/etc/config.xml

O segundo arquivo deve ser criado no seguinte local

app/etc/modules/TiagoSampaio_Configviewer.xml

O nome convencional para este arquivo é Packagename_Modulename.xml.

O arquivo config.xml deve conter o seguinte XML. Não se preocupe muito, por agora, com o que isto faz, pois nós chegaremos lá

<config>
    <modules>
        <TiagoSampaio_Configviewer>
            <version>0.1.0.0</version>
        </TiagoSampaio_Configviewer>
    </modules>
</config>

Finalmente, TiagoSampaio_Configviewer.xml deve conter o seguinte XML:

<config>
    <modules>
        <TiagoSampaio_Configviewer>
            <active>true</active>
            <codePool>local</codePool>
        </TiagoSampaio_Configviewer>
    </modules>
</config>

É isto aí, agora você tem um módulo totalmente esquelético que não faz absolutamente nada, mas que o Magento já identifica como um de seus módulos. Para ter certeza que você fez tudo certo

  1. Limpe o cache de seu Magento
  2. No Admin do Magento navegue até System->Configuration->Advanced
  3. Expanda “Disable modules output” (se já não estiver expandido)
  4. Certifique-se que TiagoSampaio_Configviewer está sendo mostrado

Parabéns, você criou seu primeiro módulo Magento!

Criando o Config do Módulo

Certamente este módulo não faz absolutamente nada ainda. Quando terminarmos, nosso módulo:

  1. Analisará a existência de uma variável querystring chamada “showConfig”
  2. Se showConfig existir, mostrará nossas Configs do Magento e parará a execução do processo
  3. Analisará a existência de uma variável querystring adicionar, showConfigFormat que especificará se a saída deverá ser em xml ou em texto

Primeiramente, iremos adicionar a seguinte seçãoao nosso arquivo config.xml.

<config>
    <modules>...</modules>
    <global>
        <events>
            <controller_front_init_routers>
                <observers>
                    <tiagosampaio_configviewer_model_observer>
                        <type>singleton</type>
                        <class>TiagoSampaio_Configviewer_Model_Observer</class>
                        <method>checkForConfigRequest</method>
                    </tiagosampaio_configviewer_model_observer>
                </observers>
            </controller_front_init_routers>
        </events>
    </global>
</config>

Então, crie um arquivo em

TiagoSampaio/Configviewer/Model/Observer.php

E insira o seguinte código

<?php
    class TiagoSampaio_Configviewer_Model_Observer {
        const FLAG_SHOW_CONFIG = 'showConfig';
        const FLAG_SHOW_CONFIG_FORMAT = 'showConfigFormat';

        private $request;

        public function checkForConfigRequest($observer) {
            $this->request = $observer->getEvent()->getData('front')->getRequest();
            if($this->request->{self::FLAG_SHOW_CONFIG} === 'true'){
                $this->setHeader();
                $this->outputConfig();
            }
        }

        private function setHeader() {
            $format = isset($this->request->{self::FLAG_SHOW_CONFIG_FORMAT}) ?
            $this->request->{self::FLAG_SHOW_CONFIG_FORMAT} : 'xml';
            switch($format){
                case 'text':
                    header("Content-Type: text/plain");
                    break;
                default:
                    header("Content-Type: text/xml");
            }
        }

        private function outputConfig() {
            die(Mage::app()->getConfig()->getNode()->asXML());
        }
    }

É isso aí. Limpe os caches de seu Magento novamente e acesse a url de sua loja Magento adicionando a querystring &showConfig=true

http://local.magentoexample.com/?showConfig=true

Para o que estou olhando?

Você deve estar olhando um arquivo XML gigante. Ele desvreve o estado de seu Magento atualmente. Ele lista todos os módulos, models, calsses, observers, eventos ou quase qualquer coisa que você pensar.
Por exemplo, considere o arquivo config.xml que você criou axima. Se você procurar no código XML gigante mostrado na tela pelo texto Configviewer_Model_Observer você encontrará sua classe listada. Todos os arquivos config.xml dos módulos são analisados pelo Magento e incluídos na configuração global.

Por que eu me importo?

No momento parece ser esotérico, mas o config é a chave para se entender o Magento. Todo módulo que você criar será adicionado á este config, e a qualquer momento que você precisar acessar um pedaço da funcionalidade do Core do sistema, o Magento recorrerá ao config para procurar alguma coisa.

Um exemplo rápido antes de passar as coisas mais práticas. Como um desenvolvedor MVC você provavelmente trabalhou com algum tipo de classes de helper, instanciando alguma coisa como

$helper_sales = new HelperSales();

Uma das coisas que o Magento faz é abstrair as declarações de classes do PHP. No Magento, o código acima será mais ou menos assim

$helper_sales = Mage::helper('sales/data');

Em português claro, o método stático helper

  1. Procura na seção do config
  2. Dentro de , procura por um seção
  3. Dentro de procura por uma seção
  4. Utiliza o nome da classe base encontrada em #3 (Mage_Sales_Helper) para construir o nome completo da classe Mage_Sales_Helper_Data

Enquanto isto parece um trabalho danado (e realmente é), a vantagem chave é sempre procurar no arquivo de config pelos nomes das classes, nós podemos sobrescrever as funcionalidades do Core do Magento sem mesmo tocar nos arquivos do Core. Este nível de meta-programação, não usualmente encontrado no PHP, nos permite claramente estender apenas as partes do sistema que precisarmos.

Espero que este artigo tenha esclarecido um pouco suas dúvidas sobre as configs do Magento.

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

Tiago Sampaio

1 Comment

  1. Tiago, boa noite!

    Primeiramente parabéns pelo post.

    Fiquei com a seguinte dúvida:
    Qual documento explica para que server cada tag? Existe alguma API para criação do módulo?

    Obrigado.

Leave A Reply

Navigate