7.3.1 Criando Forms

O primeiro método que você vai precisar para começar a usar o FormHelper é o create(). Este método especial retorna uma tag de abertura de formulário HTML.

create(string $model = null, array $options = array())

Todos os parâmetros são opcionais. Se o create() for chamado sem nenhum parâmetro, ele assume que você está criando um formulário que submete para o controller atual por meio de uma action chamada add() ou edit(). O método padrão para submissão de formulários é o POST. A tag form também é retornada com um DOM ID. O ID é gerado a partir do nome do model e do nome do controller, no formato CamelCase. Se chamarmos create() dentro de uma view do UsersController, veremos uma saída semelhante à esta no código renderizado da view:

<form id="UserAddForm" method="post" action="/users/add">
  1. <form id="UserAddForm" method="post" action="/users/add">

Você também pode passar false para o parâmetro $model. Isso faz com que os dados de seu formulário sejam submetidos diretamente dentro do array $this->data (ao invés de dentro de um sub-array $this->data['Model']). Isto pode ser útil para formulários pequenos e que não tenham uma correspondência direta com nenhuma entidade em sua base de dados.

O método create() nos permite ainda mais personalizações através de seus parâmetros. Primeiro, você pode especificar um nome para o model. Ao especificar um model para o form, você está criando um contexto de formulário. Assume-se que todos os campos dentro de um contexto pertençam ao model especificado (a menos que outro model seja explicitamente definido no nome do campo), além de presumir-se que demais models associados façam referência ao model em questão. Se você não especificar um model, então o Cake vai assumir que você está usando o model padrão para o controller atual.

<?php echo $form->create('Recipe'); ?>
 
// saída:
<form id="RecipeAddForm" method="post" action="/recipes/add">
  1. <?php echo $form->create('Recipe'); ?>
  2. // saída:
  3. <form id="RecipeAddForm" method="post" action="/recipes/add">

Isto irá submeter os dados do formulários via POST para a action add() do RecipesController. Mas você também pode usar a mesma lógica para criar um formulário de edição. O FormHelper utiliza a propriedade $this->data para detectar automaticamente se deve criar um form de inserção (add) ou de edição (edit). Se o $this->data contiver um elemento de array com o nome do model, e se este array for composto por um outro array contendo um índice com o mesmo nome da chave primária do model, então o FormHelper irá criar um formulário de edição para o registro atual. Por exemplo, se acessarmos http://example.com/recipes/edit/5, vamos obter o seguinte:

// controllers/recipes_controller.php:
<?php
function edit($id = null) {
	if (empty($this->data)) {
		$this->data = $this->Recipe->findById($id);
	} else {
		// Lógica para salvar o registro aqui
	}
}
?>

// views/recipes/edit.ctp:

// Como $this->data['Recipe']['id'] = 5, um form de edição é que será gerado
<?php echo $form->create('Recipe'); ?>

// saída:
<form id="RecipeEditForm" method="post" action="/recipes/edit/5">
<input type="hidden" name="_method" value="PUT" />
  1. // controllers/recipes_controller.php:
  2. <?php
  3. function edit($id = null) {
  4. if (empty($this->data)) {
  5. $this->data = $this->Recipe->findById($id);
  6. } else {
  7. // Lógica para salvar o registro aqui
  8. }
  9. }
  10. ?>
  11.  
  12. // views/recipes/edit.ctp:
  13. // Como $this->data['Recipe']['id'] = 5, um form de edição é que será gerado
  14. <?php echo $form->create('Recipe'); ?>
  15.  
  16. // saída:
  17. <form id="RecipeEditForm" method="post" action="/recipes/edit/5">
  18. <input type="hidden" name="_method" value="PUT" />

Como este é um formulário de edição, um campo escondido é gerado para sobrescrever o método HTTP padrão.

O array $options é o parâmetro que contém a maioria das configurações do formulário. Este array pode conter diversos pares de chave-valor que afetam a maneira como a tag form é gerada.

7.3.1.1 $options[‘type’]

Esta chave é usada para especificar o tipo do formulário a ser criado. Valores válidos incluem ‘post’, ‘get’, ‘file’, ‘put’ e ‘delete’.

Ao informar ‘post’ ou ‘get’, o método de submissão do formulário também é modificado de acordo.

<?php echo $form->create('User', array('type' => 'get')); ?>
 
// saída:
<form id="UserAddForm" method="get" action="/users/add">
  1. <?php echo $form->create('User', array('type' => 'get')); ?>
  2. // saída:
  3. <form id="UserAddForm" method="get" action="/users/add">

Especificar o valor ‘file’ modifica o método de submissão do formulário para ‘post’ e inclui o parâmetro enctype com o valor “multipart/form-data” na tag form. Isto deve ser usado se você tiver algum campo input do tipo file dentro de seu formulário. Sem o atributo enctype na tag form, o browser não é capaz de realizar uploads de arquivos adequadamente.

<?php echo $form->create('User', array('type' => 'file')); ?>
 
// saída:
<form id="UserAddForm" enctype="multipart/form-data" method="post" action="/users/add">
  1. <?php echo $form->create('User', array('type' => 'file')); ?>
  2. // saída:
  3. <form id="UserAddForm" enctype="multipart/form-data" method="post" action="/users/add">

Se você utilizar os valores ‘put’ ou ‘delete’, seu formulário será funcionalmente equivalente a um form 'post', mas ao ser submetido, o método da requisição HTTP será respectivamente sobrescrito por 'PUT' ou 'DELETE'. Isto permite o CakePHP emular o suporte a REST para o browser.

7.3.1.2 $options[‘action’]

Esta chave permite que você defina uma action específica em seu controller atual para a qual o formulário irá submeter. Por exemplo, se você quiser que o formulário apontasse para a action login() do controller atual, você deve informar isso um array $options desta maneira:

<?php echo $form->create('User', array('action' => 'login')); ?>
 
// saída:
<form id="UserLoginForm" method="post" action="/users/login">
</form>
  1. <?php echo $form->create('User', array('action' => 'login')); ?>
  2. // saída:
  3. <form id="UserLoginForm" method="post" action="/users/login">
  4. </form>

7.3.1.3 $options[‘url’]

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

Se a action desejada para o form não estiver no controller atual, você pode especificar uma URL para a action do formulário usando a chave ‘url’ do array $options. A URL informada deve ser relativa à sua aplicação CakePHP, ou pode ainda apontar para um domínio externo.

<?php echo $form->create(null, array('url' => '/recipes/add')); ?>
// ou
<?php echo $form->create(null, array('url' => array('controller' => 'recipes', 'action' => 'add'))); ?>


// saída:
<form method="post" action="/recipes/add">
 
<?php echo $form->create(null, array(
    'url' => 'http://www.google.com/search',
    'type' => 'get'
)); ?>
 
// saída:
<form method="get" action="http://www.google.com/search">
  1. <?php echo $form->create(null, array('url' => '/recipes/add')); ?>
  2. // ou
  3. <?php echo $form->create(null, array('url' => array('controller' => 'recipes', 'action' => 'add'))); ?>
  4.  
  5. // saída:
  6. <form method="post" action="/recipes/add">
  7. <?php echo $form->create(null, array(
  8. 'url' => 'http://www.google.com/search',
  9. 'type' => 'get'
  10. )); ?>
  11. // saída:
  12. <form method="get" action="http://www.google.com/search">

7.3.1.4 $options[‘default’]

Se ‘default’ for definido para o valor false, a action do formulário é modificada de forma que ao se pressionar o botão de submit (ou se teclar ENTER) o formulário não seja submetido. Se se pretende que o formulário seja submetido via AJAX, definir ‘default’ para false evita o comportamento padrão do formulário, e então você tem a possibilidade de capturar os dados e submeter o form via AJAX.