Welcome to the Cookbook

loading...

{10127} - 10.1.10 Validação de Dados

O CakePHP percorreu uma longa estrada combatendo a monotonia da validação de dados de formulário. Todo mundo detesta codificar formulários intermináveis e suas rotinas de validação. O CakePHP torna tudo isso mais fácil e mais rápido.

Para usufruir das vantagens dos recursos de validação, você vai precisar usar o FormHelper do Cake em suas views. O FormHelper está disponível por padrão em todas as suas views na variável $form.

Aqui está nossa view add:

<!-- Arquivo: /app/views/posts/add.ctp -->	
	
<h1>Adicionar Post</h1>
<?php
echo $form->create('Post');
echo $form->input('title');
echo $form->input('body', array('rows' => '3'));
echo $form->end('Salvar Post');
?>
  1. <!-- Arquivo: /app/views/posts/add.ctp -->
  2. <h1>Adicionar Post</h1>
  3. <?php
  4. echo $form->create('Post');
  5. echo $form->input('title');
  6. echo $form->input('body', array('rows' => '3'));
  7. echo $form->end('Salvar Post');
  8. ?>

Aqui, usamos o FormHelper para gerar a tag de abertura para um formulário que o $form->create() gera:

<form id="PostAddForm" method="post" action="/posts/add">
  1. <form id="PostAddForm" method="post" action="/posts/add">

Se create() for chamado sem quaisquer parâmetros, o CakePHP assume que você está criando um formulário que submete para a action add() do controller atual (ou para a action edit() se um campo id for incluído nos dados do formulário), via POST.

O método $form->input() é usado para criar elementos de formulário de mesmo nome. O primeiro parâmetro informa ao CakePHP qual o campo correspondente e o segundo parâmetro permite que você especifique um extenso array de opções - neste caso, o número de linhas para o textarea. Há alguma introspecção automágica envolvida aqui: o input() irá exibir diferentes elementos de formulário com base no campo do model em questão.

A chamada à $form->end() gera um botão de submissão e encerra o formulário. Se uma string for informada como primeiro parâmetro para o end(), o FormHelper exibe um botão de submit apropriadamente rotulado junto com a tag de fechamento do formulário. Novamente, confira o capítulo sobre os "Helpers Principais" disponíveis no CakePHP para mais informações sobre os helpers.

Agora vamos voltar e atualizar nossa view /app/views/posts/index.ctp para incluir um novo link para "Adicionar Post". Antes de <table>, adicione a seguinte linha:

<?php echo $html->link('Adicionar Post',array('controller' =>
      'posts', 'action' => 'add'))?>
  1. <?php echo $html->link('Adicionar Post',array('controller' =>
  2. 'posts', 'action' => 'add'))?>

Você pode estar imaginando: como eu informo ao CakePHP sobre os requisitos de validação de meus dados? Regras de validação são definidas no model. Vamos olhar de volta nosso model Post e fazer alguns pequenos ajustes:

<?php
class Post extends AppModel
{
	var $name = 'Post';

	var $validate = array(
		'title' => array(
			'rule' => 'notEmpty'
		),
		'body' => array(
			'rule' => 'notEmpty'
		)
	);
}
?>
  1. <?php
  2. class Post extends AppModel
  3. {
  4. var $name = 'Post';
  5. var $validate = array(
  6. 'title' => array(
  7. 'rule' => 'notEmpty'
  8. ),
  9. 'body' => array(
  10. 'rule' => 'notEmpty'
  11. )
  12. );
  13. }
  14. ?>

O array $validate diz ao CakePHP sobre como validar seus dados quando o método save() for chamado. Aqui, eu especifiquei que tanto os campos body e title não podem ser vazios. O mecanismo de validação do CakePHP é robusto, com diversas regras predefinidas (números de cartão de crédito, endereços de e-mail, etc.) além de ser bastante flexível, permitindo adicionar suas próprias regras de validação. Para mais informações, confira o capítulo sobre Validação de Dados.

Agora que você incluiu as devidas regras de validação, tente adicionar um post com um título ou com o corpo vazio para ver como funciona. Uma vez que usamos o método input() do FormHelper para criar nossos elementos de formulário, nossas mensagens de erros de validação serão mostradas automaticamente.