CakePHP – Validando um formulá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 linha 1 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