Como crio um módulo simples 'Hello World' no Magento?


305

Como o seguinte pode ser realizado no Magento?

  • Exiba uma mensagem "Hello World" usando uma abordagem de controlador / exibição / modelo. Então, se eu fosse http://example.com/myController, mostraria a string 'Hello World'. Ser capaz de mostrar essa string no modelo do meu site (por exemplo, cabeçalho, rodapé etc.) será um bônus.

  • Como adiciono um método a este controlador (ou a um novo controlador, se necessário), que interage com um modelo, executa a consulta Select * FROM articles where id='10'e retorna a linha (contendo as colunas id, title, content) ao controlador? E, em seguida, use o controlador para incluir uma exibição, que exibirá esta linha. Portanto, http://example.com/myController/show_rowacessar (ou algo semelhante) exibiria a linha em uma exibição. (Não precisa ser chique, apenas um echo $row->id;ou algo semelhante funcionaria.)

Qualquer outra informação sobre a estrutura de código do Magento também será muito útil.


6
Parece que o sistema não está recgonizando sua recompensa.
2377 Alan Alan Storm

2
Ainda não posso abrir a recompensa porque não tem 48 horas .. mas vou abri-la o mais rápido possível e atribuirei a melhor resposta
Click Upvote

Ah, eu não sabia que recompensas se aplicavam apenas a postagens antigas, desculpas.
267 Alan Alan Storm

3
Quando criança, ele sempre teve uma atração por magos; seu código funciona da mesma maneira.
vol7ron

Respostas:


539

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/modulesnome 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

  1. Vá para Sistema-> Gerenciamento de Cache
  2. Selecione Atualizar no menu Todo o cache
  3. Clique em Salvar configurações de cache

Agora, garantimos que o Magento conheça o módulo

  1. Vá para Sistema-> Configuração
  2. Clique em Avançado
  3. 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/fooporque 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.


4
Obrigado, isso é muito útil. Por favor, considere adicionar algumas informações sobre o uso de modelo / banco de dados e visualizações para que sua resposta possa ser completa
Click Upvote

7
verifique se o app / code / local / MyCompanyName / HelloWorld / etc / config.xml tem o mesmo caso que o xml localizado em etc / modules (MyCompanyName_HelloWorld NÃO mycompanyname_helloworld), caso contrário haverá entradas no back-end!
Moak 22/08/09

8
Tenho apenas um pequeno comentário sobre a resposta perfeita de Alan: "O que acabamos de configurar é o controlador module / frontName. Este não é o controlador MVC". É exatamente o mesmo tipo de controlador que o FooController. No ZF, a ação de índice no IndexController é chamada por padrão, portanto, solicitar example.com/magento/index.php/helloworld chamará IndexController :: indexAction () no módulo helloworld. Assim, chamar ... / helloworld / foo tentará encontrar o FooController no módulo helloworld e chamará indexAction () nele. Para acionar IndexController :: fooAction (), você precisa solicitar: ... / helloworld / index / foo.
Matus Zeman

2
certifique-se de ler a resposta do @Matus Zeman para entender por que fooAction não foi encontrado no IndexController, é apenas uma coisa 'normal' do Zend Framework MVC / roteador e você usou o URL incorreto; portanto, remova a mensagem "This is NOT the Parte do controlador MVC "na sua resposta.
Regilero

2
@ hypervisor666 Ligue o "modo de desenvolvedor" (pesquise no google). Com o modo de desenvolvedor ativado, o Magento trava com qualquer erro nos arquivos XML.
Alan Storm

39

Estou lutando com o Magento há um mês ou mais e ainda estou tentando descobrir. Portanto, este é um caso de cego guiando cego. Há pouco na documentação e o fórum / wiki é, na melhor das hipóteses, caótico. Não apenas isso, mas existem várias soluções que estão desatualizadas ou estão longe de ser ótimas. Não tenho certeza se você tem um projeto ou apenas está tentando descobrir, mas provavelmente será mais fácil se você começar a modificar a funcionalidade existente em vez de criar algo completamente novo. Para isso, eu definitivamente iria com os "Artigos recomendados para desenvolvedores" no wiki. O novo método de pagamento era um verdadeiro revelador.

Para depuração, eu recomendaria definitivamente o uso do FirePHP e a consulta do seu código HTML quando algo der errado. O método ole echo debug não funciona muito bem.

A arquitetura geral é tão espantosamente complexa que, mesmo que eu a entenda completamente, preciso escrever um livro para cobri-la. O melhor que posso fazer é dar-lhe conselhos que eu gostaria que alguém tivesse me dado quando comecei ...

Fique longe dos arquivos principais. Não modifique-os; em vez disso, escreva seu próprio módulo e substitua o que você precisa.

O Magento usa arquivos de configuração que consistem em XML para decidir o que precisa fazer. Para que ele execute suas próprias coisas, em oposição à funcionalidade principal, você precisa do xml correto. Infelizmente, não há um guia sobre como criar seu XML; você precisa ver exemplos e fazer alguns testes sérios. Para complicar, o conteúdo desses arquivos faz distinção entre maiúsculas e minúsculas. No entanto, se você os dominar, poderá substituir qualquer parte da funcionalidade básica que cria um sistema muito poderoso.

Magento usa métodos como Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper')para retornar objetos de certas classes. Ele os encontra por padrão em seu namespace principal. Se você quiser usar o seu próprio, precisará substituí-los no seu config.xmlarquivo.

O nome de suas classes deve corresponder à pasta em que estão.

Muitos dos objetos no Magento acabam estendendo algo chamado a Varien_Object. Esta é uma classe de uso geral (como um canivete suíço) e seu objetivo na vida é permitir que você defina seus próprios métodos / variáveis ​​em tempo real. Por exemplo, você verá que é usado como uma matriz glorificada para passar dados de um método para outro.

Durante o desenvolvimento, verifique se o cache está desabilitado. Isso tornará o magento dolorosamente lento, mas poupará muitos traumas na cabeça (de bater na sua mesa).

Você verá $thissendo muito usado. Significa uma classe diferente, dependendo do arquivo que você vê. get_class($this)é seu amigo, especialmente em conjunto com o FirePHP.

Anote as coisas no papel. Muito. Existem inúmeros pequenos factóides que você precisará de um a dois dias depois de encontrá-los.

Magento adora OO. Não se surpreenda se o rastreamento de um método o levar por 5 a 10 classes diferentes.

Leia o guia do designer aqui . É destinado principalmente a designers gráficos, mas você precisa entender onde e por que a saída do seu módulo terminará. Para isso, não esqueça de ativar as "Dicas de caminho do modelo" na seção de desenvolvedores do painel de administração.

Tem mais, mas vou parar por aqui antes que isso se transforme em uma dissertação.


Por favor, poste mais, se puder, todas as informações são muito úteis :)
Click Upvote

Misa, você provavelmente deveria se registrar aqui no Stackoverflow, se você perdesse seu cookie, todo o seu representante desapareceria;)
Click Upvote

Obrigado! Isso é muito útil. Ner
Ner

2

Prefiro recomendar o Mage2Gen , isso ajudará você a gerar o clichê e você poderá se concentrar apenas na lógica principal do negócio. isso apenas ajuda a acelerar as coisas.


0

Um módulo Magento é um grupo de diretórios que contém blocos, controladores, auxiliares e modelos necessários para criar um recurso específico de armazenamento. É a unidade de personalização na plataforma Magento. Os módulos Magento podem ser criados para executar várias funções com lógica de suporte para influenciar a experiência do usuário e a aparência da loja. Possui um ciclo de vida que permite que eles sejam instalados, excluídos ou desativados. Da perspectiva dos comerciantes e desenvolvedores de extensões, os módulos são a unidade central da plataforma Magento.

Declaração do Módulo

Temos que declarar o módulo usando o arquivo de configuração. Como Magento 2, procure o módulo de configuração no diretório etc do módulo. Então agora vamos criar o arquivo de configuração module.xml.

O código ficará assim:

<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Cloudways_Mymodule" setup_version="1.0.0"></module> </config>

Registro do módulo O módulo deve ser registrado no sistema Magento 2 usando a classe Magento Component Registrar. Agora vamos criar o arquivo registration.php no diretório raiz do módulo:

app/code/Cloudways/Mymodule/registration.php

O código ficará assim:

?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Cloudways_Mymodule',
__DIR__
);

Verificar o status do módulo Depois de seguir as etapas acima, teríamos criado um módulo simples. Agora vamos verificar o status do módulo e se ele está ativado ou desativado usando a seguinte linha de comando:

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

Compartilhe seu feedback depois de concluir o processo


0

Eu estava tentando fazer meu módulo do tutorial magaplaza olá mundo, mas algo deu errado. Eu importei o código deste módulo https://github.com/astorm/magento2-hello-world do github e funcionou. a partir desse módulo, eu criei uma subcategorias de categorias ajax selecione o módulo suspenso. Depois de instalá-lo no diretório aap / code da sua instalação do magento2, siga este URL. Http://www.example.com/hello_mvvm/hello/world Você pode fazer o download do código aqui https://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns e coloque-o na sua pasta aap / code. do que executar esses comandos ...

php bin/magento setup:update
php bin/magento setup:static-content:deploy -f
php bin/magento c:c

Agora você pode verificar a funcionalidade do módulo com o seguinte URL http: // {{www.example.com}} / hello_mvvm / hello / world


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.