type symfony2 form entitytype symfony symfony-forms symfony-2.1

symfony2 - symfony using form



¿Cómo agrego un campo no enlazado a un formulario en Symfony que de otra manera está vinculado a una entidad? (3)

Desde Symfony 2.1, usa la opción mapped :

$builder->add(''extra'', ''text'', [ ''mapped'' => false, ]);

Tal vez me esté perdiendo lo obvio, pero ¿cómo puedo (o puedo) agregar un campo adicional "no enlazado" a un formulario de Symfony que de otra manera está vinculado a una entidad?

Digamos que tengo una entidad con los campos first_name y last_name . Hago lo típico en mi clase de buildForm método buildForm .

$builder ->add(''first_name'') ->add(''last_name'') ;

Y esto en mi controlador:

$editForm = $this->createForm(new MyType(), $entity);

Eso funciona bien, pero me gustaría agregar otro cuadro de texto, llamémoslo "extra" y recibiremos el valor en la acción POST. Si hago $builder->add(''extra'')‍ se queja de que

NoSuchPropertyException en la línea 479 de PropertyAccessor.php:

Ni la propiedad "extra" ni uno de los métodos "getExtra ()", "extra ()", "isExtra ()", "hasExtra ()", "__get ()" existen y tienen acceso público en clase ...

Cual es correcta. Solo quiero usarlo para recopilar información adicional del usuario y hacer algo con él que no sea almacenarlo con la entidad.

Sé cómo hacer una forma completamente independiente, pero no una que sea "mixta". es posible?


En su formulario, agregue un campo de texto con una ruta de propiedad falsa:

$builder->add(''extra'', ''text'', array(''property_path'' => false));

A continuación, puede acceder a los datos en su controlador:

$extra = $form->get(''extra'')->getData();

ACTUALIZAR

La nueva forma desde Symfony 2.1 es usar la opción mapped y establecerla en false .

->add(''extra'', null, array(''mapped'' => false))

Créditos por la información actualizada a Henrik Bjørnskov (comente a continuación)


Según la Documentation :

allow_extra_fields

Por lo general, si envía campos adicionales que no están configurados en su formulario, obtendrá un "Este formulario no debe contener campos adicionales". Error de validacion.

Puede silenciar este error de validación habilitando la opción allow_extra_fields en el formulario.

mapeado

Si desea que se ignore el campo al leer o escribir en el objeto, puede establecer la opción mapped en falso.

class YourOwnFormType extends AbstractType { public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults( array( ''allow_extra_fields'' => true ) ); } public function buildForm(FormBuilderInterface $builder, array $options) { $form = $builder ->add(''extra'', TextType::class, array( ''label'' => ''Extra field'' ''mapped'' => false )) ; return $form; } }