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