Symfony2: Añadir a un formulario un campo que no está definido en el modelo
He estado desarrollando mi propio bundle para el registro de usuarios en Symfony2 y me he encontrado con el problema de querer añadir campos al formulario de registro que no he definido en el modelo. Uno de estos campos es un checkbox para aceptar los términos de uso de la aplicación. No me interesa guardar este campo en la base de datos por lo que no está definido en el modelo.
Así es como lo he hecho:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class RegisterFormType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder ->add('email', 'email') ->add('password', 'repeated', array( 'type' => 'password', 'invalid_message' => 'Las dos contraseñas deben coincidir', 'options' => array('label' => 'Contraseña'), 'required' => false)) ->add("accept_tos", "checkbox", array( "property_path" => false, ) ); $builder ->addValidator(new CallbackValidator(function(FormInterface $form){ if (!$form["accept_tos"]->getData()) { $form->addError(new FormError('Debes aceptar los términos de uso')); } }) ); } } |
Como vemos, añadimos un campo checkbox con nombre «accept_tos» y le indicamos la opción «property_path» a false, por lo que no validará este campo con el modelo. Eso sí, debemos añadir un validador para este campo para asegurarnos de que el usuario acepta las condiciones de uso.
Fuente: http://www.richsage.co.uk/2011/07/20/adding-non-entity-fields-to-your-symfony2-forms/
Excelente!!!!!!!!!!!!!
Hay otra manera de hacer esto. Escribo de memoria, por lo que no es demasiado fiable, pero la filosofía es ésta: Tienes tu formulario ProfileFormType y necesitas los mismos campos más el de aceptar condiciones. Pues creas el RegisterFormType que tendrá dos campos:
->add(‘profile’, new ProfileFormType())
->add(‘accept_tos’,’chekcbox’)
Puedes crearte una entidad «virtual» para poder usar el bind() al procesar el formulario y usar los validadores por annotations por ejemplo:
AcmeBundle/Entity/Model/Register
el cual tiene dos propiedades, $profile de tipo Entity/Profile y $accept de tipo booleano.
Luego creas el controlador RegisterController donde procesará el formulario.
De esta manera tienes el formulario de Profiles intacto para seguir usándolo en otras partes (mantenimientos, etc).
No recuerdo si en el dockbook de Symfony2 está explicado lo mismo que te digo.
Muy buen truco, sabía el método que dice Cristian pero me parece demasiado trabajo extra para un simple campo de control.
Me lo guardo muchas gracias por compartirlo.