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á.