Views, FormHelper e Actions - Introdução ao CakePHP
Veja nesse artigo a continuação da nossa introdução ao CakePHP. Nessa continuação veremos como criar nossas páginas personalizadas, ou seja, nossas views utilizado o FormHelper e veremos também os que são as actions no CakePHP.
Criando as Views
As views não são nada mais do que as páginas de visualização dos clientes. Para criarmos as views devemos seguir alguns padrões obrigatórios. Vejamos a criação de uma view para nosso exemplo do artigo anterior.
Veja o post anterior nesse link Instalação e Scaffold - Introdução ao CakePHP
Vamos criar a view de cadastro de autores. Para isso primeiro crie uma pasta chamada Autors dentro de app/View. Agora crie um arquivo com o conteúdo abaixo.
Listagem 1: Criando view de cadastro de autores
Cadastro de autor<br/>
<?php
/*
não se assute com a linha abaixo, estaremos fazendo uso de metodos
do FormHelper, a seguir e em outros posts veremos esse e outros
helpers detalhadamente.
*/
echo $this->Form->create(“Autor”);
//criando o form para o model Autor.
echo $this->Form->input(“name”);
//criando um input text para o campo name da tabela.
echo $this->Form->end(“Salvar”);
//fecha o form e coloca um botão submit.
?>
E salve-o com o nome de cadastrar.ctp, isso mesmo .ctp, essa é a extensão usada nas views do cake, mas não é nada de mais é como um arquivo .php.
Por padrão o arquivo .ctp deve ficar numa pasta com o nome da tabela.
Um pouco sobre o FormHelper.
Na criação do arquivo no exemplo anterior usamos métodos do FormHelper que é um dos ajudantes padrões do Cake e já vem definido para ser usado em todas as views. O FormHelper, assim como os outros helpers, nos ajuda a economizar muitas linhas de código, nesse caso linhas de html na construção de formulários e também deixa o código bem mais enxuto. Vamos analisar o que fizemos anteriormente.
Listagem 2: Analise da view de cadastro de autores
Cadastro de autor<br/>
<?php
/*
Aqui criamos o form e o referenciamos ao model Autor, assim ele já sabe
qual é o tipo de campo do banco e dessa forma tenta criar um input
adequado a ele, caso não seja suficiente essa criação pode ser
feita manualmente.
Esse método corresponde a <form>
*/
echo $this->Form->create(“Autor”);
/*
O método input tenta criar um input html adequado a coluna no banco
de dados e coloca uma label com o nome da tabela.
Podemos definir propriedades caso seja necessário. Por exemplo,
podemos definir uma label específica através do segundo
parâmetro do método(Veja abaixo).
Também podemos definir tipo, tamanho, classe css entre outros atributos.
O primeiro parâmetro serve alem de indicar qual o campo está se
referenciando o input também para como setarmos o nome do input que
segui a nomenclatura padrão do cake data['NomeDoModel']['NomeDoCampo'].
Podemos usar array('name'=>'NomeDoCampo') para setarmos o nome do campo.
Podemos setar o tipo usando também o segundo parâmetro, assim:
array('type'=>'hidden'), se quisermos um campo oculto.
*/
echo $this->Form->input(“name”,array(
'label'=>”Nome”
)
);
//com essa modificação ao invés de aparecer “Name” como label aparecerá “Nome”
/*
Método end() fecha o form e se for passado o parâmetro será gerado
automaticamente um botão submit por form.
Seria como um </form>.
*/
echo $this->Form->end(“Salvar”);
//fecha o form e coloca um botão submit.
?>
O relacionamento entre o campo da tabela e o input html é baseado na tabela abaixo.
Coluna | Input Html |
Varchar,char. | Text |
Boolean,tinyint(1) | Checkbox |
Text | Textarea |
Varchar com o nome de pass,password ou psword | Password |
Date | Select com dia,mês e ano |
Datetime ou timestamp | Select com dia,mês, ano, hora, minuto e segundo. |
Time | Select com hora, minuto e segundo. |
Chaves estrangeiras | select |
Agora vamos criar a view de cadastro de receita.
Primeiramente criamos a pasta Receitas(Nome da tabela) dentro de View, e agora um arquivo cadastro.ctp com o seguinte conteúdo:
Listagem 3: Criando view de cadastro de Receitas
Cadastro de Receitas<br/>
<?php
echo $this->Form->create(“Receita”);
echo $this->Form->input(“titile”,array('label'=>'Título'));
echo $this->Form->input('texto',array('label'=>'Receita'));
//aqui estamos criando um select com o relaciomaneto
echo $this->Form->input(“autor_id”,array(“label”=>'Autor'));
echo $this->Form->end('Postar');
?>
Pronto Views terminadas. Mas espera aí, não vimos em momento algum para que action seriam enviados nossos dados e nem o tipo de método.
O tipo de método por padrão é post ao menos que você especifique com Form->create(“Model”,array(‘method’=>”get”)), a action vamos ver agora mesmo.
Actions
Bem, aqui vamos trabalhar nos controllers. Vamos abrir o arquivo AutorsController.php criado no artigo anterior.
Vamos criar uma action seguindo as especificações do CakePHP.
Uma action não é nada mais do que um função publica (public function) que pode ser acessada por uma view. As action tem o mesmo nome do arquivo .ctp e é dessa forma que que o form se comunica com a action e vice-versa. Veja o Exemplo:
Listagem 4: Criando action de cadastro de autores
class AutorsController extends AppController {
public function cadastrar(){
// verifica se a requisição é do tipo post
if($this->request->is(“POST”)){
//salva os dados que vem no array data, nesse caso data são os
//dados do post, usando o método save() de Autor, herdado de //Model.
$this->Autor->save($this->request->data);
}
}
}
Na Listagem 3 vimos a criação da action cadastrar do controller autors, nós verificamos se o tipo de requisição foi um POST usando o método is de Request, tema par outro post, ai então salvamos usando save($data) de Autor, por padrão todo controller tem um model atrelado a ele por meio da nomenclatura das classes. Request também trás um array data que são os dados do POST e no final da action o controller renderiza a view de mesmo nome.
Obs: retiramos a variável scaffold.
Vamos ver como fica a action de receita.
Listagem 5: criação da action para cadastro de receita
class ReceitasController extends AppController {
public function cadastrar(){
if($this->request->is(“POST”)){
$this->Receita->save($this->request->data);
}
$autores = $this->Receita->Autor->find(‘list’);
$this->set(‘autors’,$autores);
}
}
Na Listagem 4 temos uma lógica muito parecida com o dá Listagem 3 diferenciando apenas nas ultimas linhas da função. Na penúltima linha estamos usando o método find(); de Model para recuperar nosso autores cadastrados, o parâmetro ‘list’ indica que ele deve retornar um array no formato de lista, algo como ID=>NOME, que é ideal para selects HTML. Na próxima linha estamos enviando uma variável para a view usando o método set() para passarmos o array $autors para a view assim podemos usa-la na view. Lembrando que a variável passa para a view com o nome do primeiro parâmetro do método set() mas com o conteúdo do segundo parâmetro. Na view a variável á convertida automaticamente para select no campo autor_id devido s todas as padronização que estamos seguindo, mas claro que tudo isso pode ser configurável.
Obs: Usamos $this->Receita->Autor->find(‘list’) pois o controlador receita tem o model Receita atrelado a ele e Receita tem um relacionamento com Autor do tipo 1:n, então todo model de Receita terá um model de Autor.
Agora podemos acessar nossas views pela url /projeto/autors/cadastrar, ou seja, /nomeDoProjeto/controller/action.
Vamos lá testem.
Ops! Deu um erro na hora de recuperar os autores não é?
Faltou mapearmos o relacionamento entre Receita e Autor, isso foi proposital pois não é o foco desse post mas cole o código abaixo no model Receita que tudo deve funcionar.
Listagem 6: relacionamento entre Receita e Autor
public $hasOne = array(
'Autor' => array(
'className' => 'Autor',
)
);
Então é isso por enquanto até o próximo post, no qual falarei sobre mais sobre o Model e terminaremos nosso CRUD. Até lá.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo