2012-06-03 14 views
13

Estoy trabajando en un back-end symfony2 para una aplicación backbone.js. Tengo mi modelo y forma.Validar formularios symfony2 con campos adicionales

Sin embargo, backbone.js envía algunas propiedades adicionales a la API REST cuando está creando/actualizando un modelo y estoy luchando para obtener el formulario para validar.

¿Cómo puedo obtener un formulario en symfony2 para aceptar datos adicionales, o cómo puedo soltar determinadas claves antes de vincular los datos a un formulario?

Respuesta

12

Para obtener Symfony2 aceptar datos adicionales, agregue los campos adicionales a su constructor de la forma, y ​​puesto su opción property_path false:

Ejemplo:

$builder 
    ->add('my_additional_field', 'checkbox', array(
     'mapped' => false, 
    )); 

No es necesario dejar caer las llaves antes de enlazar los datos, serán ignorados de todos modos.

+3

+1 Nota rápida para> = 2.1: "Nuevo en la versión 2.1: desde 2.1, la opción mapeada se ha agregado para este caso de uso." http://symfony.com/doc/2.1/reference/forms/types/hidden.html#mapped –

+0

Quizás deba considerar actualizar su respuesta agregando para qué versión es válida. – xPheRe

+1

Ya no hago PHP. Por favor actualiza mi respuesta si puedes. –

2

Puede escuchar FormEvents::BIND_CLIENT_DATA (o FormEvents::PRE_BIND si está utilizando el oyente de eventos de 2.1 dev) y agregar/eliminar campos. Ver la entrada del libro de cocina this.

16

property_path ahora es obsoleto en sf 2.1, utilice "mapea" en lugar

$builder 
    ->add("firstName", "text") 
    ->add("lastName", "text") 
    ->add("tac", "checkbox", array(
     "mapped" => false 
    ) 
); 
46

Debe utilizar la opción "allow_extra_fields".

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
     $resolver->setDefaults(
     array(
      'allow_extra_fields' => true 
     ) 
    ); 
} 
+2

allow_extra_fields no se incluirán en Symfony hasta 2.6. Esta será la forma correcta de agregar campos adicionales. mapped = false sería la forma sugerida si conoce los nombres de campo adicionales que se enviarán. – Heyflynn

+1

Como 2.6 ahora se ha marcado como una versión estable, esta debería marcarse como la respuesta correcta. @ user1432227 – Chausser

+0

@krun también podría agregar el ejemplo de Symfony 2.8/3. * donde está: 'configureOptions (OptionsResolver $ resolver)' en lugar de la función setDefaultOptions. –

Cuestiones relacionadas