Cursos Magento

Como criar um Controller no 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:

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:

  1. Criar um novo módulo Magento
  2. Definir a nossa rota no config.xml do módulo
  3. 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&parametro2=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.

Layout padrão renderizado no controller

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:

 

Espero que tenha aproveitado.

Grande abraço e até a próxima.

Últimos posts por Ricardo Martins (exibir todos)
Comentários

Deixe seu comentário

[fbcomments url="https://www.magenteiro.com/blog/magento-1/desenvolvimento/criando-controller-no-magento-1/"]