Como criar um Controller no Magento 1
Backend, Desenvolvimento, Magento 1
Atualizado em 14 de abril de 2020
Controllers são classes responsáveis por processar uma requisição à determinada URL em uma loja Magento.
Neste artigo:
- Alternativa aos Controllers do Magento
- Quando preciso de um Controller
- Criar uma página no Magento usando Controllers
- Criando um módulo no Magento 1
- Definindo rota no config.xml
- Criando a classe do Controller
- Entendendo a estrutura de uma URL no Magento
- Os métodos loadLayout e renderLayout
- Retornando um JSON em um controller
- Obtendo parâmetros POST e GET passados para um controller
- Resumo e sugestão de conteúdos
Sendo assim, quando queremos criar uma nova rota – ou URL – para fazer algo específico, os Controllers são a melhor opção.
Alternativa aos Controllers
Se a página ou endpoint que você quer criar é simples e não depende de muita inteligência, você pode simplesmente criar uma página CMS. Para isso vá em CMS > Páginas > Criar nova página, no seu menu administrativo.
Lá você poderá definir o URL, conteúdo e título da sua nova página.
Quando preciso de um Controller?
Você precisará de um Controller para:
- criar uma página que insere blocos dinâmicos
- quando uma página requer algum tipo de validação para ser exibida (ex: se o usuário está logado)
- quando quer devolver um tipo de dado não comum (ex: json, xml, etc)
- quando quer ler parâmetros de uma requisição (GET, POST, etc)
- em cenários avançados
Criar uma página no Magento usando Controllers
Neste tutorial, vamos criar uma nova URL em nossa loja e iremos inserir um bloco phtml contendo alguma informação dinâmica.
Para criar um controller nós vamos:
- Criar um novo módulo Magento
- Definir a nossa rota no config.xml do módulo
- Criar a classe do Controller
Nota: Você pode assistir uma aula inteira sobre Controllers, e criar um módulo útil no curso Criação de Módulos e Desenvolvimento Backend para Magento 1.9 (aula 11).
Tudo pronto? Vamos lá.
1. Criando um novo módulo Magento 1
Nesta aula criaremos o módulo Magenteiro_MeuController
. Veja como criar a estrutura básica de um módulo Magento 1. É bem simples, mas lembre-se de desativar os caches. 🤨
Partirei do princípio que você seguiu os passos do artigo acima e criou a estrutura do módulo como mostrado lá.
Entendendo uma URL no Magento
Uma URL no Magento é composta por:
- nome da rota
- nome do controller
- action
- parâmetros(opcionais)
Sendo assim, podemos ter: https://www.minhaloja.com.br/nomeDaRota/nomeDoController/action?parametro1=valor1¶metro2=outrovalor
No nosso exemplo, faremos um controller que exibirá a hora do sistema.
Portanto, a url que imaginei seria: /horacerta/agora/completo.
2. Definindo a rota no config.xml do módulo
No arquivo app/code/community/Magenteiro/MeuController/etc/config.xml
teremos:
<?xml version="1.0"?> <config> <modules> <Magenteiro_MeuController> <version>1.0.0</version> </Magenteiro_MeuController> </modules> <frontend> <routers> <meucontroller> <!--identificador único--> <use>standard</use> <args> <module>Magenteiro_MeuController</module> <frontName>horacerta</frontName> <!--nome da rota (primeira parte da URL)--> </args> </meucontroller> </routers> </frontend> </config>
Com isso, sempre que a rota /horacerta for chamada, o Magento irá procurar os Controllers deste módulo para tratar a requisição.
3. Criando a classe do Controller
No Magento 1, os Controllers de um módulo ficam na pasta controllers
do módulo.
Sendo assim, vamos criar app/code/community/Magenteiro/MeuController/controllers/AgoraController.php
.
Fique atento(a) às letras minúsculas e maiúsculas dos diretórios e nomes de arquivo. Se o sistema que estiver rodando a loja Magento for sensível à esta variação, você pode ter problemas (ex: Linux).
<?php class Magenteiro_MeuController_AgoraController extends Mage_Core_Controller_Front_Action { public function completoAction() { # http://php.net/manual/en/class.datetimeinterface.php#datetime.constants.types echo 'Agora são: ' . date(DATE_ISO8601); } }
Lembre que o nome da nossa action é completo. Porém o nome do método dentro da classe do controller é sempre seguido do sufixo
Action
.
Da mesma forma, o nome da classe, será o nome do controller, dentro da estrutura de diretorio.
Pronto. Se você acessar /horacerta/agora/completo verá algo como:
Indo além
Como você deve saber, o Magento monta as páginas utilizando Blocks. Cada bloco é uma união de uma classe PHP, com um arquivo de template PHTML.
Nota: Falamos muito sobre isso no curso de Front end. Se você não está familiarizado(a) este é um ótimo curso.
LoadLayout e RenderLayout
A forma como o Magento organiza os blocos é definida através de instruções XML. Sendo assim, se quisermos carregar estas instruções, podemos usar o método $this->loadLayout()
dentro do nosso controller.
public function completoAction() { $this->loadLayout(); //nada acontece }
Neste momento, poderíamos adicionar, remover, mover ou modificar blocos. antes de chamarmos a renderização da página.
Para renderizar e exibir o resultado usamos o método $this->renderLayout()
.
public function completoAction() { $this->loadLayout(); //nada acontece //podemos modificar, remover, mover ou inserir blocos $this->renderLayout(); }
Agora sim nossa página seria exibida com o layout padrão do tema utilizado, e pronta para receber outras modificações.
Se quisermos realizar modificações, inserir blocos, etc, fazemos isso através de layout xml ou dentro do nosso controller. Mas isso é assunto pra outro tutorial (ou para o curso de front end).
Retornando um JSON no Controller do Magento
Você pode alterar o tipo de conteúdo que está sendo devolvido através do método $this->getResponse()->setHeader
, e depois definindo o conteúdo da página com o método setBody
. Ficaria assim:
public function completoAction() { $this->getResponse()->setHeader('content-type', 'application/json', true); $this->getResponse()->setBody('{"meu":"json"}'); }
Obtendo parâmetros o Controller
Parâmetros podem ser enviados na requisição. Este pode ser por exemplo um parâmetro enviado via GET na URL, ou via POST.
Todos os detalhes de entrada podem ser obtidos com $this->getRequest()
.
Parâmetros GET ou POST
Para obter o valor de um parâmetro passado via GET ou via POST usamos $this->getRequest()->getParam('nomeDoParametro')
.
Parâmetros POST
$this->getRequest()->getPost('nomeDoParametro')
trará apenas o valor do parâmetro no $_POST
Valor padrão
Opcionalmente você pode especificar um valor padrão para caso o parâmetro não tenha sido passado. Isto é feito passando o valor padrão como segundo atributo.
Ex: $this->getRequest()->getParam(‘nomeDoParametro’, false)
Por padrão, o valor é false
(caso você não especifique).
Simplificando a rota
Caso queira omitir uma das partes da nossa URL, você pode fazê-lo com o controller ou action padrão, chamado Index.
Desta forma, se ao invés de chamar /horacerta/agora/completo
você quiser chamar /horacerta/agora
, basta criar um método chamado indexAction
na classe do nosso controller.
E se desejar simplificar ainda mais, fazendo com que o url seja apenas /horacerta/
, basta criar um controller chamado IndexController.php
(na pasta controllers
), com um método indexAction
.
Ficaria assim:
<?php class Magenteiro_MeuController_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { echo "foi"; } }
Note que caso tenha qualquer outro action neste controller, terá que chamá-lo da seguinte forma:
/horacerta/index/nomeDoMetodo
.
Resumo
O Magento é incrivelmente flexível, e saber trabalhar com rotas e layout XML é sem dúvida uma mão na roda.
O Magento permite alterarmos o comportamento de blocos, e passar parâmetros para eles em praticamente qualquer lugar através de instruções XML que podem ser adicionadas até mesmo via admin.
Ao criar uma nova rota como a que fizemos acima, o Magento criará também um novo handle de layout (no nosso caso meucontroller_agora_completo
) que pode ser usado no nosso tema, em atualizações de XML via módulo ou via admin.
Aproveito para convidar você para fazer estes dois cursos onde falo bastante sobre ambos assuntos:
- Torne-se um desenvolvedor Magento Front End (com Bootstrap 4)
- Criação de Módulos e Desenvolvimento Backend Magento 1.9
Espero que tenha aproveitado.
Grande abraço e até a próxima.
- PagSeguro (PagBank) para Magento 1 recebe a Nova Geração - 9 de abril de 2024
- Recorrência no WooCommerce Sem Plugins Pagos - 28 de janeiro de 2024
- Chargeback. O que é, e como se livrar deles. - 19 de dezembro de 2023
Deixe seu comentário
[fbcomments url="https://www.magenteiro.com/blog/magento-1/desenvolvimento/criando-controller-no-magento-1/"]