Em primeiro lugar, eu recomendo que você compre o PDF / E-Book do PHP Architect . São US $ 20, mas é o único recurso direto "Eis como o Magento funciona" que consegui encontrar. Eu também comecei a escrever tutoriais Magento no meu próprio site .
Segundo, se você tem uma escolha e não é um programador experiente ou não tem acesso a um programador experiente (idealmente em PHP e Java), escolha outro carrinho . O Magento é bem projetado, mas foi projetado para ser uma solução de carrinho de compras, na qual outros programadores podem construir módulos. Não foi projetado para ser facilmente compreendido por pessoas inteligentes, mas não programadores.
Terceiro, o Magento MVC é muito diferente do modelo MVC do Ruby on Rails , Django , CodeIgniter , CakePHP , etc. Atualmente, é popular entre os desenvolvedores de PHP. Eu acho que é baseado no modelo Zend , e tudo é muito parecido com Java OOP. Tem dois controladores que você precisa para se preocupar. O controlador module / frontName e, em seguida, o controlador MVC.
Quarto, o próprio aplicativo Magento é construído usando o mesmo sistema de módulos que você usará, portanto, bisbilhotar o código principal é uma tática de aprendizado útil. Além disso, muito do que você fará com o Magento está substituindo as classes existentes. O que estou abordando aqui é a criação de novas funcionalidades, não substituindo. Lembre-se disso quando estiver analisando os exemplos de código existentes.
Começarei com sua primeira pergunta, mostrando como configurar um controlador / roteador para responder a um URL específico. Este será um pequeno romance. Talvez eu tenha tempo mais tarde para os tópicos relacionados ao modelo / modelo, mas, por enquanto, não tenho. No entanto, falarei brevemente de sua pergunta sobre SQL.
Magento usa uma arquitetura de banco de dados EAV . Sempre que possível, tente usar os objetos de modelo que o sistema fornece para obter as informações necessárias. Eu sei que está tudo lá nas tabelas SQL, mas é melhor não pensar em pegar dados usando consultas SQL brutas, ou você ficará louco.
Isenção de responsabilidade final. Estou usando o Magento há cerca de duas ou três semanas, portanto, ressalte o emptor. Este é um exercício para esclarecer isso tanto na minha cabeça quanto para ajudar o Stack Overflow.
Crie um módulo
Todas as adições e personalizações no Magento são feitas através de módulos. Portanto, a primeira coisa que você precisará fazer é criar um novo módulo. Crie um arquivo XML com o app/modules
nome da seguinte maneira
cd /path/to/store/app
touch etc/modules/MyCompanyName_HelloWorld.xml
<?xml version="1.0"?>
<config>
<modules>
<MyCompanyName_HelloWorld>
<active>true</active>
<codePool>local</codePool>
</MyCompanyName_HelloWorld>
</modules>
</config>
MyCompanyName é um espaço de nome exclusivo para suas modificações, não precisa ser o nome da sua empresa, mas sim a convenção recomendada, meu magento. HelloWorld
é o nome do seu módulo.
Limpe o cache do aplicativo
Agora que o arquivo do módulo está no lugar, precisamos informar ao Magento (e verificar nosso trabalho). No aplicativo de administração
- Vá para Sistema-> Gerenciamento de Cache
- Selecione Atualizar no menu Todo o cache
- Clique em Salvar configurações de cache
Agora, garantimos que o Magento conheça o módulo
- Vá para Sistema-> Configuração
- Clique em Avançado
- Na caixa de configuração "Desativar saída de módulos", procure seu novo módulo chamado "MyCompanyName_HelloWorld"
Se você pode conviver com o desempenho mais lento, desative o cache do aplicativo durante o desenvolvimento / aprendizado. Nada é mais frustrante do que esquecer a limpeza do cache e se perguntar por que suas alterações não estão aparecendo.
Configurar a estrutura de diretórios
Em seguida, precisaremos configurar uma estrutura de diretórios para o módulo. Você não precisará de todos esses diretórios, mas não há mal algum em configurá-los agora.
mkdir -p app/code/local/MyCompanyName/HelloWorld/Block
mkdir -p app/code/local/MyCompanyName/HelloWorld/controllers
mkdir -p app/code/local/MyCompanyName/HelloWorld/Model
mkdir -p app/code/local/MyCompanyName/HelloWorld/Helper
mkdir -p app/code/local/MyCompanyName/HelloWorld/etc
mkdir -p app/code/local/MyCompanyName/HelloWorld/sql
E adicione um arquivo de configuração
touch app/code/local/MyCompanyName/HelloWorld/etc/config.xml
e dentro do arquivo de configuração, adicione o seguinte, que é essencialmente uma configuração "em branco".
<?xml version="1.0"?>
<config>
<modules>
<MyCompanyName_HelloWorld>
<version>0.1.0</version>
</MyCompanyName_HelloWorld>
</modules>
</config>
Simplificando as coisas, esse arquivo de configuração permitirá que você diga ao Magento qual código você deseja executar.
Configurando o roteador
Em seguida, precisamos configurar os roteadores do módulo. Isso permitirá que o sistema saiba que estamos lidando com qualquer URL na forma de
http://example.com/magento/index.php/helloworld
Portanto, no seu arquivo de configuração, adicione a seção a seguir.
<config>
<!-- ... -->
<frontend>
<routers>
<!-- the <helloworld> tagname appears to be arbitrary, but by
convention is should match the frontName tag below-->
<helloworld>
<use>standard</use>
<args>
<module>MyCompanyName_HelloWorld</module>
<frontName>helloworld</frontName>
</args>
</helloworld>
</routers>
</frontend>
<!-- ... -->
</config>
O que você está dizendo aqui é "qualquer URL com o nome da frente do helloworld ...
http://example.com/magento/index.php/helloworld
deve usar o controlador frontName MyCompanyName_HelloWorld ".
Portanto, com a configuração acima, quando você carregar a página helloworld acima, você obterá uma página 404. Isso porque não criamos um arquivo para o nosso controlador. Vamos fazer isso agora.
touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php
Agora tente carregar a página. Progresso! Em vez de um 404, você receberá uma exceção PHP / Magento
Controller file was loaded but class does not exist
Então, abra o arquivo que acabamos de criar e cole o código a seguir. O nome da classe precisa ser baseado no nome que você forneceu no seu roteador.
<?php
class MyCompanyName_HelloWorld_IndexController extends Mage_Core_Controller_Front_Action{
public function indexAction(){
echo "We're echoing just to show that this is what's called, normally you'd have some kind of redirect going on here";
}
}
O que acabamos de configurar é o controlador module / frontName. Este é o controlador padrão e a ação padrão do módulo. Se você deseja adicionar controladores ou ações, lembre-se de que a primeira parte da árvore de uma URL do Magento é imutável e sempre será assim.http://example.com/magento/index.php/frontName/controllerName/actionName
Então, se você quiser combinar esse URL
http://example.com/magento/index.php/helloworld/foo
Você precisará ter um FooController, que pode ser feito desta maneira:
touch app/code/local/MyCompanyName/HelloWorld/controllers/FooController.php
<?php
class MyCompanyName_HelloWorld_FooController extends Mage_Core_Controller_Front_Action{
public function indexAction(){
echo 'Foo Index Action';
}
public function addAction(){
echo 'Foo add Action';
}
public function deleteAction(){
echo 'Foo delete Action';
}
}
Observe que o controlador padrão IndexController e a ação padrão indexAction podem estar implícitos, mas precisam ser explícitos se algo vier depois dele. Portanto http://example.com/magento/index.php/helloworld/foo
, corresponderá ao controlador FooController e à ação indexAction, e NÃO à ação fooAction do IndexController. Se você deseja obter uma fooAction, no controlador IndexController, é necessário chamar esse controlador explicitamente da seguinte maneira:
http://example.com/magento/index.php/helloworld/index/foo
porque a segunda parte da URL é e sempre será o controllerName. Esse comportamento é uma herança do Zend Framework incluído no Magento.
Agora você deve conseguir acessar os seguintes URLs e ver os resultados de suas instruções de eco
http://example.com/magento/index.php/helloworld/foo
http://example.com/magento/index.php/helloworld/foo/add
http://example.com/magento/index.php/helloworld/foo/delete
Portanto, isso deve lhe dar uma idéia básica de como o Magento envia para um controlador. A partir daqui, eu recomendo procurar nas classes existentes do controlador Magento para ver como os modelos e o sistema de modelo / layout devem ser usados.