El documento trata sobre los formularios en Symfony. Explica los diferentes tipos de formularios, incluyendo los tipos de campos incorporados y cómo crear tipos de formularios propios. También cubre los diferentes formatos de datos, la creación e instanciación de formularios, el renderizado de formularios en plantillas, y el procesamiento de submit incluyendo la vinculación, validación y persistencia de datos.
13. Tipos de formularios
•
•
•
Describen el elemento a mostrar
Existen solamente una vez en la aplicación
Existe un tipo base: form
13
Monday, October 14, 13
14. Tipos de formularios
•
•
•
•
Describen el elemento a mostrar
Existen solamente una vez en la aplicación
Existe un tipo base: form
Se pueden heredar
14
Monday, October 14, 13
15. Tipos de formularios
•
•
•
•
•
Describen el elemento a mostrar
Existen solamente una vez en la aplicación
Existe un tipo base: form
Se pueden heredar
Inyectar dependencias si y solo si son comunes a todas las
instancias
15
Monday, October 14, 13
16. Tipos de formularios
•
•
•
•
•
Describen el elemento a mostrar
•
Symfony incorpora muchos campos built-in
Existen solamente una vez en la aplicación
Existe un tipo base: form
Se pueden heredar
Inyectar dependencias si y solo si son comunes a todas las
instancias
16
Monday, October 14, 13
17. Tipos de formularios
Grupos de campos
Campos texto
text
textarea
integer
money
number
password
percent
collection
email
search
Campos button
button
url
checkbox
datetime
time
choice
entity
country
language
locale
timezone
hidden
birthday
Campos choice
currency
17
Monday, October 14, 13
reset
submit
file
radio
Otros campos
Campos date & time
date
repeated
18. Tipos de formularios
Tipos de formularios propios
<?php
namespace IsmaAmbrosiMyBundleForm;
use SymfonyComponentFormAbstractType;
class MyFormType extends AbstractType
{
public function getName()
{
return 'my_form';
}
}
18
Monday, October 14, 13
19. Tipos de formularios
Tipos de formularios propios
<?php
namespace IsmaAmbrosiMyBundleForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
class MyFormType extends AbstractType
{
/**
* Construye el formulario
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
# Agrega un campo text para ingresar el nombre
$builder->add('name', 'text');
}
public function getName(){...}
}
Monday, October 14, 13
20. Tipos de formularios
Tipos de formularios propios asociados a una entidad
<?php
namespace IsmaAmbrosiMyBundleForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolverInterface;
class MyFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name');
$builder->add('last_name');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array('data_class' => 'IsmaAmbrosiMyBundleEntityUser'));
}
public function getName(){...}
}
Monday, October 14, 13
21. Tipos de formularios
Tipos de formularios propios asociados a una entidad
<?php
<?php
namespace IsmaAmbrosiMyBundleForm;
namespace IsmaAmbrosiMyBundleEntity;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolverInterface;
use DoctrineORMMapping as ORM;
/**
class MyFormType extends AbstractType
* @ORMEntity
{
*/
public function buildForm(FormBuilderInterface $builder, array $options)
class User
{
{
$builder->add('name');
/**
$builder->add('last_name');
}
* @ORMColumn(type="string", length=100)
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
private $name;
{
$resolver->setDefaults(array('data_class' => 'IsmaAmbrosiMyBundleEntityUser'));
/**
}
public function getName(){...}
}
Monday, October 14, 13
* @ORMColumn(type="string", length=100)
*/
private $lastName;
}
22. Tipos de formularios
Tipos de formularios propios
¡Se pueden crear como servicios!
Monday, October 14, 13
23. Tipos de formularios
Tipos de formularios propios como servicios
•
Monday, October 14, 13
Puedo inyectar dependencias
24. Tipos de formularios
Tipos de formularios propios como servicios
•
•
Monday, October 14, 13
Puedo inyectar dependencias
Puedo configurar un logger exclusivo
25. Tipos de formularios
Tipos de formularios propios como servicios
•
•
•
Monday, October 14, 13
Puedo inyectar dependencias
Puedo configurar un logger exclusivo
Puedo testear mi aplicacion sin depender de ellos
26. Tipos de formularios
Tipos de formularios propios como servicios
•
•
•
•
Monday, October 14, 13
Puedo inyectar dependencias
Puedo configurar un logger exclusivo
Puedo testear mi aplicacion sin depender de ellos
Y más...
27. Instancias de Formularios
•
•
•
Existen una o más veces en la aplicación
Los datos pueden cambiar luego de su creación
Son creados a partir del tipo de formulario
27
Monday, October 14, 13
29. Formatos de datos
• Formato del modelo (model format)
• Formato de la vista (view format)
• Formato normalizado (normalized format)
29
Monday, October 14, 13
30. Formatos de datos
Model format
Formato que existe en nuestro modelo.
Ej: Tal cual querémos que sea persistido por nuestro ORM
30
Monday, October 14, 13
31. Formatos de datos
View format
Tal cual va a ser mostrado al usuario en los elementos de nuestra vista.
Ej: Un objeto DateTime se transforma en un array("year" => 2013, "month" => 10, "day" => 12)
31
Monday, October 14, 13
32. Formatos de datos
Normalized format
Formato intermedio entre la vista y el modelo.
Se recomienda que este formato guarde cuanta información sea posible.
32
Monday, October 14, 13
33. Formatos de datos
Al crear el formulario
Model data
Normalized
data
33
Monday, October 14, 13
View data
34. Formatos de datos
Al crear el formulario
Model data
Normalized
data
34
Monday, October 14, 13
View data
41. Renderizado
Creamos la vista del formulario para enviarla al template
<?php
namespace IsmaAmbrosiMyBundleController;
use IsmaAmbrosiMyBundleFormMyFormType;
use SymfonyBundleFrameworkBundleControllerController;
class DefaultController extends Controller
{
public function indexAction()
{
$form = $this->createForm(new MyFormType(), $data, $options);
return $this->render('IsmaAmbrosiMyBundle:Default:index.html.twig', array(
'form' => $form->createView()
));
}
}
41
Monday, October 14, 13
42. Renderizado
Mostrando el formulario dentro de un tag form
<form action="/post" method="post">
{{ form_widget(form) }}
<button type="submit">Submit</button>
</form>
42
Monday, October 14, 13
43. Renderizado
Mostrando cada elemento del formulario
<form action="/post" method="post">
{{ form_row(form.name) }}
{{ form_row(form.last_name) }}
{{ form_rest(form) }}
<button type="submit">Submit</button>
</form>
43
Monday, October 14, 13
44. Renderizado
Mostrando cada elemento del formulario
<form action="/post" method="post">
{{ form_row(form.name) }}
{{ form_row(form.last_name) }}
{{ form_rest(form) }}
<button type="submit">Submit</button>
</form>
44
Monday, October 14, 13
Muestra los elementos
restantes
60. Eventos
•
•
Permiten construir el formulario basandose en los datos
•
Permiten configurar el modelo en base a los datos recibidos
Permiten construir el formulario basandose en el estado de la
aplicación
60
Monday, October 14, 13
61. Eventos
Eventos lanzados por el EventDispatcher
•
•
•
•
•
PRE_SET_DATA (form.pre_set_data)
POST_SET_DATA (form.post_set_data)
PRE_SUBMIT (form.submit)
SUBMIT (form.bind)
POST_SUBMIT (form.post_bind)
61
Monday, October 14, 13
62. Eventos
PRE_SET_DATA
•
Permite modificar los datos asignados al formulario desde
nuestro modelo.
•
•
Permite modificar el formulario en base a los datos del modelo
Permite modificar el formulario en base al estado de mi
aplicación
62
Monday, October 14, 13
69. Resumen
Vista
1. Creamos el formulario basado en un tipo
2. Creamos la vista para ese formulario
3. Mostramos el template
69
Monday, October 14, 13
70. Resumen
Submit
1. Creamos el formulario basado en un tipo
2. Enlazamos el $request
3. Validamos
1. Error
1. Mostramos el formulario indicando errores
2. Retornamos STATUS 400
2. Éxito
1. Persistimos entidades
2. Mensaje de éxito (Ej: Redirección a un listado)
70
Monday, October 14, 13