Você está na página 1de 26

21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)


(/)
(https://sensiolabs.com)

Caution: You are browsing the legacy symfony 1.x part of this website.

(https://symfony.com/blog/big-summer-sale-on-all-certifications-and-most-items-from-the-symfony-store)

Legacy homepage (/legacy) Home (/)



symfony 1.x (/legacy)

Legacy Documentation (/legacy/doc)

Forms

Getting started
(/legacy/doc/getting-started)
Capítulo 1 - Criação do Form
Jobeet (/legacy/doc/jobeet? Um form é feitos de campos como inputs hidden, inputs text, combos e 1.1
orm=Propel) checkboxes. Esse capítulo ensina a você a criação e manipulação de campos de
formulário usando o framework de forms symfony.
A gentle Intro to symfony
(/legacy/doc/gentle- É necessário o Symfony 1.1 para seguir os passos desse capítulo do livro. Você também ira precisar
introduction) criar um projeto e um aplicativo chamado frontend para continuar. Por favor, olhe a introdução para
mais informações sobre a criação de um projeto symfony.
More with Symfony
(/legacy/doc/more-with- Antes de Iniciar
symfony)
Vamos começar adicionando um formulário de contato em uma aplicação symfony
https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 1/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

Figura 1-1 Mostra o formulário de contato como visto pelos usuário que querem enviar uma
The Reference Book SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)
SymfonyHub
mensagem.
(/legacy/doc/reference)
(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
Figura 1-1 - Formulário de contato
Tutorials (/legacy/doc/tutorial)

Forms (/legacy/doc/forms)

Cookbook (<= 1.2)


(/legacy/doc/cookbook/1_2)

The definitive Guide (1.0)


(/legacy/doc/book/1_0)

Askeet (1.0)
(/legacy/doc/askeet/1_0)

Table of Contents
Nós vamos criar 3 campos para este formulário: o nome do usuário, o email do usuário e a mensagem
Antes de Iniciar
que o usuário quer enviar. Vamos simplesmente mostrar a informação submetida no formulário para
Widgets
o propósito deste exercício como mostrado na figura 1-2.
Classes sfForm e sfWidget
Mostrando o Formulário
Figura 1-2 - Página de Agradecimento
Rótulos(Labels)
Indo além das tabelas
geradas
Submetendo o formulário
Outra solução
configurando os Widgets
Figura 1-3 - Interação entre a aplicação e o usuário
Opções dos Widgets
Os atributos HTML dos
Widgets
Definindo valores padrão
para os campos

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 2/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub
This work is licensedSymfonyCloud
under the hosts your Symfony project (https://symfony.com/cloud/)
Creative Commons
Attribution-Share
(/)
Alike 3.0
About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
Unported License license.

Widgets
Classes sfForm e sfWidget
(https://certification.symfony.com)
O usuário digita informação nos campos que compõe os formulários. No symfony um form é uma
30% discount in Symfony
herança de objeto da classe sfForm . No nosso exemplo, nós vamos criar uma classe ContactForm que
certifications (ends June 18)
herda a classe sfForm .
(https://certification.symfony.com)

Nota
sfForm é a classe base de todos os formulários e torna facil gerenciar a configuração e vida
dos seus formulários.

Você pode iniciar a configuração de seu formulário adicionando widgets com o método configura()

Um widget representa um campo do formulário. Para nosso formulário de exemplo, nós precisamos
(https://symfony.com/cloud/? adicionar 3 widgets que representam nossos três campos: name , email , e message . Listagem 1-1
mostra a primeira implementação da classe ContactForm
utm_source=ad&utm_medium=banner&utm_campaign=cloud&utm_content=focus)
Focus now on your code, we
Listagem 1-1 - Classe ContactForm com três campos
take care of the rest
(https://symfony.com/cloud/?
utm_source=ad&utm_medium=banner&utm_campaign=cloud&utm_content=focus)

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 3/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)


// lib/form/ContactForm.class.php

class ContactForm extends sfForm

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
{

public function configura()

$this->setWidgets(array(

'name' => new sfWidgetFormInput(),

'email' => new sfWidgetFormInput(),

'message' => new sfWidgetFormTextarea(),

));

Os widgets são definidos no método configura() . Esse método é automaticamente chamado pelo
construtor da classe sfForm

O método setWidgets() é usado para definir os widgets usados no form. O método setWidgets()
aceita um array associativo onde as chaves são os nomes do campos e os valores são classes widget.
Cada widget é um objeto que herda a classe sfWidget . Para esse exemplo nós usamos dois tipos de
widgets:

sfWidgetFormInput : Esse widget representa um campo input .

sfWidgetFormTextarea : Esse widget representa um campo textarea .

Nota
Como convenção, nós guardamos as classes de form no diretório lib/form . Você pode
guardar elas em qualquer diretório gerenciado pelo mecanismo de autoloading do symfony, mas
como vamos ver mais tarde, o symfony usa o diretório lib/form para gerar formulários
baseados em objetos de modelo(ORM)

Mostrando o Formulário
Nosso formulário agora esta pronto para ser usado. Nós agora podemos criar um módulo symfony
para mostrar o formulário:

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 4/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)


$ cd ~/CAMINHO/PARA/O/PROJETO

$ php symfony generate:module frontend contact

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)

No módulo contact , vamos modificar a action index para passar uma instancia do formulário para o
template, conforme a Listagem 1-2.

Listagem 1-2 - Classe Actions do módulo contact

// apps/frontend/modules/contact/actions/actions.class.php

class contactActions extends sfActions

public function executeIndex()

$this->form = new ContactForm();

Quando criando um formulário, o método configura() , definido anteriormente, vai ser chamado
automaticamente.

Agora nós só precisamos criar um template para mostrar o formulário, como mostrado na Listagem
1-3.

Listagem 1-3 - Template mostrando o formulário

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 5/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)


// apps/frontend/modules/contact/templates/indexSuccess.php

<form action="<?php echo url_for('contact/submit') ?>" method="POST">

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
<table>

<?php echo $form ?>

<tr>

<td colspan="2">

<input type="submit" />

</td>

</tr>

</table>

</form>

Um formulário do symfony somente gerencia os widgets mostrando informações ao usuário. No


template indexSuccess , a linha <?php echo $form ?> mostra apenas três campos. Os outros
elementos, como a tag form e o botão de submit precisam ser adicionados pelo desenvolvedor. Isso
não parece óbvio no inicio, mas como vamos depois como é fácil injetar formulários.

Usar essa construção <?php echo $form ?> é muito bom para criação de protótipos e definindo os
formulários. Isso permite que os desenvolvedores se concentrem nas regras de negócio sem se
preocupar com aspectos visuais. O capitulo três vai explicar como personalizaro template e o layout
do formulário.

Nota
Ao mostrar um objeto usando <?php echo $form ?> , a engine PHP vai realmente mostrar a
representação textual do objeto $form . Para converter um objeto em uma string, o PHP tenta
executar o metódo mágico __toString() . Cada widget implementa este método mágico para
converter o objeto em código HTML. Chamando <?php echo $form ?> é o mesmo que chamar <?
php echo $form->__toString() ?> .

Agora nós podemos ver o formulário em um navegador (Figura 1-4) e verificar o resultado digitando
o endereço da ação contact/index ( /frontend_dev.php/contact ).

Figura 1-4 - Formulário de Contato(Contact) Gerado

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 6/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)

Listagem 1-4 Mostra o código gerado no template.

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 7/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)


<form action="/frontend_dev.php/contact/submit" method="POST">

<table>

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
 

<!-- Beginning of generated code by <?php echo $form ?>

-->

<tr>

<th><label for="name">Name</label></th>

<td><input type="text" name="name" id="name" /></td>

</tr>

<tr>

<th><label for="email">Email</label></th>

<td><input type="text" name="email" id="email" /></td>

</tr>

<tr>

<th><label for="message">Message</label></th>

<td><textarea rows="4" cols="30" name="message" id="message"></textarea></td>

</tr>

<!-- End of generated code by <?php echo $form ?>

-->

<tr>

<td colspan="2">

<input type="submit" />


</td>

</tr>

</table>

</form>

Podemos ver que o formulário é exibido com três linhas <tr> de uma tabela HTML. Esse é o motivo
de termos que fechar a tag <table> . Cada linha inclui uma tag <label> e uma tag de formulário
( <input> ou <textarea> ).

Rótulos(Labels)

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 8/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub
Os rótulos de cada campo são gerados automaticamente. Por padrão, rótulos são a transformação do
SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)
nome do campo seguindo as seguintes regras: Capitalizar a primeira letra e traço é trocado para
(/)
espaço.
About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)

Exemplo:

$this->setWidgets(array(
'first_name' => new sfWidgetFormInput(), // rótulo gerado: "First name"

'last_name' => new sfWidgetFormInput(), // rótulo gerado: "Last name"

));

Mesmo se a geração automática de rótulos é útil, o framework permite que você defina rótulos
personalizados com o método setLabels() :

Como definir:

$this->widgetSchema->setLabels(array(

'name' => 'Your name',

'email' => 'Your email address',

'message' => 'Your message',

));

Você pode também modificar somente um único rótulo com o método setLabel() ;

$this->widgetSchema->setLabel('email', 'Your email address');

Finalmente, iremos ver no capítulo três que você pode extender os rótulos no template para
personalizar o form.

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 9/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

Widget Schema
SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)
Quando usamos o método setWidgets() , o symfony cria um objeto sfWidgetFormSchema .
(/) About
(/what-is-symfony) Esse objeto é Connect
um widget que permite que você
Documentation
(/doc/current/index.html) represente um grupo de widgets. EmCloud
(/cloud/)
Screencasts
(https://symfonycasts.com/) nosso
(/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
formulário de contato, nós chamamos o método setWidgets() . Isso é equivalente ao código
a seguir:

$this->setWidgetSchema(new sfWidgetFormSchema(array(

'name' => new sfWidgetFormInput(),

'email' => new sfWidgetFormInput(),

'message' => new sfWidgetFormTextarea(),

)));

// também equivalente há:

$this->widgetSchema = new sfWidgetFormSchema(array(

'name' => new sfWidgetFormInput(),

'email' => new sfWidgetFormInput(),

'message' => new sfWidgetFormTextarea(),

));

O método setLabels() é aplicado a coleção de widgets incluídos no objeto widgetSchema .

Vamos ver no capítulo 5 que a noção de "schema widget" faz o gerenciamento de


formulários agrupados bem mais simples.

Indo além das tabelas geradas


Mesmo o formulário sendo mostrado por padrão como uma tabela HTML, o formato do layout pode
ser modificado. Esse diferentes tipos de layout são definidos em classes que herdam a classe
sfWidgetFormSchemaFormatter . Por padrão, um formulário o formato table como definido na classe
sfWidgetFormSchemaFormatterTable . Você pode também usar o formato list :

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 10/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)


class ContactForm extends sfForm

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
public function configura()

$this->setWidgets(array(

'name' => new sfWidgetFormInput(),

'email' => new sfWidgetFormInput(),

'message' => new sfWidgetFormTextarea(),

));

$this->widgetSchema->setFormFormatterName('list');

Esses dois formatos vem por padrão, no capítulo 5 vamos ver como criar nossos próprios classes de
formato. Agora que sabemos como mostrar um formulário, vamos ver como controlar a submissão.

Submetendo o formulário
Quando criamos um template para mostrar um formulário, usamos a URL interna contact/submit na
tag form para enviar o form. Agora precisamos criar a action submit no módulo contact . A Listagem
1-5 mostra como a ação pode pegar a informação do usuário e redirecionar para uma pagina de
agradecimento onde apenas mostramos as informações novamente pro usuário.

Listagem 1-5 - Uso da action submit no módulo contact

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 11/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)


public function executeSubmit($request)

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
$this->forward404Unless($request->isMethod('post'));

$params = array(

'name' => $request->getParameter('name'),

'email' => $request->getParameter('email'),

'message' => $request->getParameter('message'),

);

$this->redirect('contact/thankyou?'.http_build_query($params));
}

public function executeThankyou()

// apps/frontend/modules/contact/templates/thankyouSuccess.php

<ul>

<li>Name: <?php echo $sf_params->get('name') ?></li>

<li>Email: <?php echo $sf_params->get('email') ?></li>

<li>Message: <?php echo $sf_params->get('message') ?></li>

</ul>

Nota
http_build_query é uma função nativa do PHP que gera uma string codificada como URL a
partir de um array de paramêtros.

o método executeSubmit() executa três ações:

Por razões de segurança, checamos se a página foi submetida usando o método HTTP POST . Se
não foi usado este método, o usuário é redirecionado para uma pagina de erro 404. No template
indexSuccess , declaramos o método de envio como POST ( <form ... method="POST"> ):

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 12/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)


$this->forward404Unless($request->isMethod('post'));

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
A seguir pegamos os valores digitados pelo usuário e guardamos na tabela params :

$params = array(

'name' => $request->getParameter('name'),

'email' => $request->getParameter('email'),

'message' => $request->getParameter('message'),

);

Por fim, redirecionamos o usuário para a página de agradecimento( contact/thankyou ) para


mostrar as informações dele:

$this->redirect('contact/thankyou?'.http_build_query($params));

Ao invés de redirecionar o usuário para outra página, poderiamos ter criado um template
submitSuccess.php . Mesmo sendo isso possível, é uma boa prática sempre redirecionar o usuário
após uma requisição do método POST :

Isso previne a dupla requisição caso o usuário recarrege a página de agradecimento.

O usuário pode clicar no botão de Voltar sem precisar ficar clicando na pop-up de aviso de
reenvio de informações de formulário.

Dica
Voçê deve ter notado que o método executeSubmit() é diferente do executeIndex() . Ao
chamar esses métodos o symfony passa o objeto sfRequest atual como primeiro argumento dos
métodos executeXXX() . Em PHP, você não precisa coletar todos os parametrôs, por isso que você
não define a variavel request no método executeIndex() ja que você não precisa dela.

Figura 1-5 mostra o fluxo dos métodos ao interagir com o usuário.

Figura 1-5 - Fluxo dos métodos

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 13/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)

Nota
Ao mostrar novamente as informações que o usuário digitou no template, você corre o
risco de um ataque XSS(Cross-Site Scripting). Você pode achar maiores informações sobre como
previnir esses tipos de ataque implementando uma estratégia de escape no capítulo Inside the
View Layer (http://www.symfony-project.org/book/1_1/07-Inside-the-View-
Layer#Output%20Escaping) do livro "The Definitive Guide to symfony".

Após submeter o formulário, você deve ver agora a pagina conforme a Figura 1-6.

Figura 1-6 - Página mostrada após enviar o formulário

Invés de criar o array params , é mais fácil pegar a informação vinda do usuário diretamente em um
array.
Listagem1-6 modifica o atributo HTML name dos widgets para armazenar os valores dos
campos no array contact .

Listagem1-6 - Modifica o atributo HTML name dos widgets

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 14/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)


class ContactForm extends sfForm

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
public function configura()

$this->setWidgets(array(

'name' => new sfWidgetFormInput(),

'email' => new sfWidgetFormInput(),

'message' => new sfWidgetFormTextarea(),

));

$this->widgetSchema->setNameFormat('contact[%s]');

Chamando setNameFormat() nos permite modificar o atributo HTML name de todos os widgets. %s vai
ser automaticamente trocado pelo nome do campo durante a geração do formulário. Por exemplo, o
atributo name sera contact[email] para o campo email . O PHP automaticamente cria um array com
os valores do request incluindo um no formato contact[email] . Dessa forma os valores dos campo
estarão disponíves no array contact .

Nós agora podemos acessar diretamente o array contact do objeto request como mostrado na
Listagem 1-7

Listagem 1-7 - Novo formato dos atributos name na action

public function executeSubmit($request)

$this->forward404Unless($request->isMethod('post'));

$this->redirect('contact/thankyou?'.http_build_query($request->getParameter('contact')));

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 15/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

Ao olhar o fonte HTML do formulário, você podera ver que o symfony gerou o atributo name
SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)
dependendo não apenas do nome do campo e do formato, mas também do atributo id . O atributo
(/) About
(/what-is-symfony)
id é automaticamente criado
Connect a partir do atributo name trocando os caracteres invalidos por traços
(/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
( _ ):

Nome Atributo name Atributo id

name contact[name] contact_name

email contact[email] contact_email

message contact[message] contact_message

Outra solução
Neste exemplo, usamos duas actions para controlar o formulário: index para mostra-lo, submit para
enviar-lo. Sendo o formulário mostrado com o método GET e enviado com o método POST , podemos
mesclar esses dois métodos no index , como mostrado na Listagem 1-8.

Listagem 1-8 - Mesclagem de duas actions usadas no formulário

class contactActions extends sfActions

public function executeIndex($request)

$this->form = new ContactForm();

if ($request->isMethod('post'))

$this->redirect('contact/thankyou?'.http_build_query($request->getParameter('contact')));

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 16/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

Você também precisa mudar o atributo action do formulário no template indexSuccess.php :


SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)

(/) About
(/what-is-symfony) <form Connect
action="<?php (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html)
echo Screencasts
(https://symfonycasts.com/)
url_for('contact/index') ?>" method="POST"> Cloud
(/cloud/)

Como veremos depois, nós preferimos usar essa forma ja que ela é menor e torna o código mais
coerente e legivel.

configurando os Widgets
Opções dos Widgets
Se website é controlado por varios webmasters, nós com certeza gostariamos de adicionar uma
combo com temas para redirecionar a mensagem de acordo com o que é pedido.(Figura 1-7). A
Listagem 1-9 adiciona um subject com uma combo usando o widget sfWidgetFormSelect .

Figura 1-7 - Adicionado o campo subject ao Formulário

Listagem 1-9 - Adicionado o campo subject ao Formulário

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 17/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)


class ContactForm extends sfForm

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
protected static $subjects = array('Subject A', 'Subject B', 'Subject C');

public function configura()

$this->setWidgets(array(

'name' => new sfWidgetFormInput(),

'email' => new sfWidgetFormInput(),

'subject' => new sfWidgetFormSelect(array('choices' => self::$subjects)),

'message' => new sfWidgetFormTextarea(),

));

$this->widgetSchema->setNameFormat('contact[%s]');

A opção choices do widget sfWidgetFormSelect

O PHP não diferencia um array de um array associativo, então o array que usamos na lista de
subjects é o mesmo que o código a seguir:

$subjects = array(0 => 'Subject A', 1 => 'Subject B', 2 => 'Subject C');

O widget gerado pega a chave do array para o atributo value da tag option e o valor como
conteudo da tag:

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 18/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

<select name="contact[subject]" id="contact_subject">

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)


<option value="0">Subject A</option>

(/) About
(/what-is-symfony)
<option value="1">Subject B</option>

Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
<option value="2">Subject C</option>

</select>

Para alterar o atributo value , só precisamos definir as chaves do array:

$subjects = array('A' => 'Subject A', 'B' => 'Subject B', 'C' => 'Subject C');

Que gera o seguinte HTML:

<select name="contact[subject]" id="contact_subject">

<option value="A">Subject A</option>

<option value="B">Subject B</option>

<option value="C">Subject C</option>

</select>

O widget sfWidgetFormSelect', assim como todos os outros, pega uma lista de opções como primeiro
argumento. Uma opção pode ser obrigatória ou opcional. O widget sfWidgetFormSelect possui uma
opção obrigatória, choices`. Aqui esta as opções disponíveis para todos os widgets que usamos até
aqui:

Widget Opções Obrigatórias Opções Adicionais

sfWidgetFormInput - type (padrão é text )

is_hidden (padrão é false )

sfWidgetFormSelect choices multiple (padrão é false )

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 19/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub Widget
SymfonyCloud hosts your Opções Obrigatórias
Symfony project (https://symfony.com/cloud/) Opções Adicionais

(/) About
(/what-is-symfony) sfWidgetFormTextarea -
Documentation
(/doc/current/index.html) -
Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)

Dica
Se você que conhecer todas as opções para um widget, você olhar documentação completa
da API disponível online em (/api/1_1/ (http://www.symfony-project.org/api/1_1/)). Todas as
opções são explicadas, assim como os valores padrões da opções adicionais. Por exemplo, todas
as opções do widget sfWidgetFormSelect estão aqui: (/api/1_1/sfWidgetFormSelect
(http://www.symfony-project.org/api/1_1/sfWidgetFormSelect)).

Os atributos HTML dos Widgets


Cada widget também pega uma lista de atributos HTML como segundo parametro opcional. Isso é
extremamente útil para definir valores padrão da tag gerada. A Listagem 1-10 mostra como adicionar
o atributo class no campo email

Listagem 1-10 - Definindo atributos para um Widget

$emailWidget = new sfWidgetFormInput(array(), array('class' => 'email'));

// Generated HTML
<input type="text" name="contact[email]" class="email" id="contact_email" />

Atributos HTML permitem também que nós sobrescrevamos o identificador gerado automaticamente,
como mostrado na Listagem 1-11.

Listagem 1-11 - Sobrescrevendo o atributo id

$emailWidget = new sfWidgetFormInput(array(), array('class' => 'email', 'id' => 'email'));

// Generated HTML
<input type="text" name="contact[email]" class="email" id="email" />

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 20/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

É possivel ainda colocar valores padrão nos campos usando o atributo value , como mostra a
SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)
Listagem 1-12.
(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
Listagem 1-12 - Valores Default nos Widgets via atributos HTML

$emailWidget = new sfWidgetFormInput(array(), array('value' => 'Your Email Here'));

// Generated HTML
<input type="text" name="contact[email]" value="Your Email Here" id="contact_email" />

Essa opção funciona para widgets input , mas é dificil fazer o mesmo com os widgets checkbox ou
radio , e é impossivel com o widget textarea . A classe sfForm tem métodos especificos para definir
valores padrão para cada campo de um forma uniforme para qualquer tipo de widget.

Nota
Recomendamos definir os atributos HTML dentro dos templates e não no formulário(se
forpossível) para presevar a separação em camadas, que vamos ver no capítulo três.

Definindo valores padrão para os campos


Muitas vezes é util definir valores padrão para cada campo. Por exemplo quando vamos mostrar uma
mensagem de ajuda em cada campo quando o usuário estiver naquele campo. A Listagem 1-13
mostra como definir valores padão com os métodos setDefault() e setDefaults() .

Listagem 1-13 - Valores padrão para Widget via setDefault() e setDefaults()

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 21/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)


class ContactForm extends sfForm

(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
public function configura()

// ...

$this->setDefault('email', 'Your Email Here');

$this->setDefaults(array('email' => 'Your Email Here', 'name' => 'Your Name Here'));

Os métodos setDefault() e setDefaults() são muitos para definir valores padrão iguais para cada
instancia de uma mesma classe de formulário. Se você quer modificar um objeto existente usando um
formulário, os valores padrão irão depender dessa instancia, portanto, eles devem ser dinâmicos. A
listagem 1-14 mostra que o construtor da classe sfForm recebe como primeiro argumento uma lista
de valores padrões que seta dinamicamente os valores padrão

Listagem 1-14 - Valores padrão via construtor da classe sfForm

public function executeIndex($request)

$this->form = new ContactForm(array('email' => 'Your Email Here', 'name' => 'Your Name Here'))
 

// ...

Proteção XSS (Cross-Site Scripting)

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 22/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub
Ao setr atributos HTML para widgets ou definindo valores padrão, a classe sfForm
SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)
automaticamente protege esses valores contra ataques XSS durante a geração do código
(/) About
(/what-is-symfony) HTML. Essa proteção
Connect não depende da configuração escaping_strategy do arquivo Cloud
(/cloud/)
(/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/)
settings.yml . Se um valor ja foi protegido por outro método, essa proteção não sera
aplicada novamente.

Ele também protege contra os caracteres ' and " que podem invalidar o HTML gerado.

Um exemplo dessa proteção:

$emailWidget = new sfWidgetFormInput(array(), array(

'value' => 'Hello "World!"',

'class' => '<script>alert("foo")</script>',

));

// HTML gerado

<input

value="Hello &quot;World!&quot;"

class="&lt;script&gt;alert(&quot;foo&quot;)&lt;/script&gt;"

type="text" name="contact[email]" id="contact_email"

/>

Latest from the Symfony Blog They Help Us Make Symfony Get Involved in the Community
Our ephemeral online shop closes at the A passionate group of over 600,000
end of the month! (/blog/our-ephemeral- developers from more than
120 countries,
online-shop-closes-at-the-end-of-the- all committed to helping PHP surpass the
month) impossible.
https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 23/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

June 21, 2021 Getting involved →


SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)
Thanks n-aleha
for being a
A Week of Symfony #755 (14-20 June Symfony contributor
(/) About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
2021) (/blog/a-week-of-symfony-755- (/contributors).
14-20-june-2021) 1 commit
· 2 lines
June 20, 2021

Symfony™ is a trademark of Symfony SAS. All rights reserved (/trademark).

What is Symfony? (/what-is-symfony) Learn Symfony (/doc/current/index.html)


Symfony at a Glance
(/at-a-glance) Getting Started (/doc/current/setup.html)
Symfony Components
(/components) Components (/doc/current/components/index.html)
Case Studies
(/blog/category/case-studies) Best Practices (/doc/current/best_practices/index.html)
Symfony Releases
(/releases) Bundles (/doc/bundles/)
Security Policy
(/doc/current/contributing/code/security.html) Reference (/doc/current/reference/index.html)
Logo & Screenshots
(/logo) Training (https://training.sensiolabs.com/en/)
Trademark & Licenses
(/license) eLearning Platform (https://university.sensiolabs.com/e-learning-platform)
symfony1 Legacy
(/legacy) Certification (https://certification.symfony.com/)

Symfony Store (https://shop.symfony.com)

Screencasts (https://symfonycasts.com) Community (/community)


Learn Symfony (https://symfonycasts.com/tracks/symfony) SymfonyConnect
(https://connect.symfony.com/)
Learn PHP (https://symfonycasts.com/tracks/php) Support
(/support)
Learn JavaScript (https://symfonycasts.com/tracks/javascript) How to be Involved
(/doc/current/contributing/index.html)
Learn Drupal (https://symfonycasts.com/tracks/drupal) Code of Conduct
(/doc/current/contributing/code_of_conduct/code_of_conduct.html)
Learn RESTful APIs (https://symfonycasts.com/tracks/rest) Events & Meetups
(/events/)
Projects using Symfony
(/projects)
Downloads Stats
(/stats/downloads)
Contributors
(/contributors)
Backers
(/backers)

Blog (/blog/)
https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 24/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)
g (/ g/)
Events & Meetups (/events)
SymfonyHub SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)
A week of symfony (/blog/category/a-week-of-symfony)
Case studies
(/) (/blog/category/case-studies)
About
(/what-is-symfony) Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html) Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)
Cloud (/blog/category/cloud)
Community (/blog/category/community)
Conferences (/blog/category/conferences)
Diversity (/blog/category/diversity)
Documentation (/blog/category/documentation)
Living on the edge (/blog/category/living-on-the-edge)
Releases (/blog/category/releases)
Security Advisories (/blog/category/security-advisories)
SymfonyInsight (/blog/category/symfony-insight)
Twig (/blog/category/twig)
SensioLabs (https://blog.sensiolabs.com/)

Services (https://sensiolabs.com)
Our services (https://sensiolabs.com)
Train developers (https://training.sensiolabs.com/en)
Manage your project quality (https://insight.symfony.com/)
Improve your project performance (https://blackfire.io/?utm_source=symfony&utm_medium=symfonycom_footer&utm_campaign=profiler)
Host Symfony projects (/cloud/)

About (/about)
SensioLabs
(https://sensiolabs.com/en/join_us/join_us.html)
Careers
(https://sensiolabs.com/en/join_us/our_job_offers.html)
Support
(/support)
Cloud TOS
(/cloud/tos)

Deployed on


(/cloud/)

Follow Symfony

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 25/26
21/06/2021 Capítulo 1 - Criação do Form (1_1)

SymfonyHub
(https://github.com/symfony)

(https://stackoverflow.com/questions/tagged/symfony)

SymfonyCloud hosts your Symfony project (https://symfony.com/cloud/)



(/slack)

(https://twitter.com/symfony)

(https://www.facebook.com/SymfonyFramework)

(/) About
(/what-is-symfony)
(https://www.youtube.com/user/SensioLabs)
Connect (/connect/login?target=https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation)
Documentation
(/doc/current/index.html)

(https://symfonycasts.com/)
Screencasts
(https://symfonycasts.com/) Cloud
(/cloud/)

(https://feeds.feedburner.com/symfony/blog)


Dynamic (same as OS)

Copyright © 2005 – 2021. Symfony SAS. All rights reserved.

https://symfony.com/legacy/doc/forms/1_1/pt_BR/01-form-creation 26/26

Você também pode gostar