Boteco Digital

CakePHP – Validando um formlário com Model sem Controller

Muitas vezes precisamos criar um formulário de contato ou qualquer outro formulário que não será gravado no banco e sim enviado para um e-mail ou coisa parecida. Nestes casos também é interessante validar os campos e nada melhor do que utilizar a validação do próprio CakePHP.

Para isso precisaremos criar um Model para o formulário. Para o exemplo criaremos um formulário simples de contato com nome, e-mail, telefone e mensagem.

/app/models/contato.php

<?php
class Contato extends AppModel {
	public $useTable = false;
	public $validate = array(
		'nome' => array(
				'rule' => 'notempty',
			  	'message' => "O nome deve ser preenchido",
		),
		'email' => array(
				'rule' => array('email'),
				'message' => "O e-mail deve ser preenchido",
		),
	   	'mensagem' => array(
				'rule' => 'notempty',
				'message' => "A mensagem deve ser preenchida",
		)
	);
}
?>

Na Model acima não temos nada que alguém que já lide com o CakePHP não conheça, o que devemos observar é a linha 3 $useTable=false que informa que este Model não está associado a uma tabela do banco de dados.

Vamos agora a criação de nosso formulário(view).

/app/view/home/contato.ctp (por exemplo)

<?php echo $form->create('Contato',array('url'=>'/contato'))?>
	
	<?php echo $form->input('nome',array('label'=>'Nome:'))?>

	<?php echo $form->input('email',array('label'=>'E-mail:'))?>

	<?php echo $form->input('telefone',array('label'=>'Telefone:'))?>

  	<?php echo $form->textarea('mensagem',array('cols'=>'40','rows'=>'3') )?>

<?php echo $form->end('Enviar'); ?> 

Também nenhuma novidade, só devemos ressaltar a linha1 onde estamos utilizando o Model Contato para o formulário.

Vamos agora para o action do controller onde iremos validar os campos.

/app/controller/home.ctp

…
var $uses = array('Contato');
...	
function faleconosco() {
	if( $this->data){
		$erros ="";
		$this->Contato->set($this->data);
		if ( $this->Contato->validates() ) {
			//envia o e-mail ou faz qualquer outra coisa com os dados
		}else{
			foreach( $this->Contato->invalidFields() as $e){
				$erros .= $e."<br />";							
			}					
		$this->Session->setFlash($erros);
	}
}				

Bom esta parte vale uma pequena explicação!

Na linha 2 declaramos que iremos utilizar no controller o Model Contato.

Na linha 5 verificamos se foi enviado algum dado pelo formulário, na linha 6 inicializamos uma variável para armazenar os erros encontrados no formulário. Na linha 7 configuramos o Model contato com os dados vindo do formulário.

Na linha 8 utilizamos o método validates() que verifica os dados conforme as regras estipuladas no Model e retorna true não houver erro e false se alguma das regras não foi satisfeita.

Na linha 11 estamos no bloco onde alguma regra não foi satisfeita então devemos listas para o usuário. O método que nos devolve esta lista de erros é o invalidFields() que retorna um array com as mensagem estipuladas no Model. Percorremos este array concatenamos estas mensagens na variável $erros e na linha 14 salvamos na sessão para ser mostrada na view.

Bom era isso pessoal

Categorias PHP
comments powered by Disqus