querybuilder - symfony using form
Symfony valida formulario con campos de formulario falso mapeados (4)
Tengo un formulario con campos adicionales agregados con la opción mapped
a false
. Pero cuando intento validar mi formulario, no pasará indicando "este valor no es válido" por encima de estos campos de formulario específicos. ¿No se supone que esta opción omite la validación?
Estos campos de formulario solo son útiles para rellenar otros campos y no es necesario guardarlos o incluso revisarlos.
La única solución que encontré es eliminar todos los campos adicionales con js en un clic de botón de envío.
Esta publicación no está actualizada con Symfony 2.3
leer los comentarios abajo
¡Una nueva versión está llegando!
Validar campos no asignados en Form (Symfony 2.1.2)
Esta es una respuesta global para algunas preguntas de sobre la forma actual de validar campos no acotados o no mapeados en formularios.
- validación en el campo de formulario independiente
- cómo agregar validación al campo de formulario independiente en symfony2
- un más ...
El rico ecosistema de Symfony 2 hace que nuestro marco de elección sea una herramienta de rápida evolución.
La versión 2.1 de Symfony trae muchas desaprobaciones. Esto significa que lo que funciona con Symfony 2.0 a 2.1.2 ya no funcionará en Symfony 2.3. Para obtener más información al respecto, lea ACTUALIZAR DE Symfony 2.0 a 2.1 y lea @deprecated comments en el código de Symfony.
Campos sin consolidar
Cuando construye un formulario, generalmente usa Entidades, y su validación puede realizarse en los tanques de la Entidad misma a las anotaciones de Validación.
namespace Dj/TestBundle/Entity;
use Doctrine/ORM/Mapping as ORM;
use Symfony/Component/Validator/Constraints as Assert;
/**
* Dj/TestBundle/Entity/Post
*
* @ORM/Table()
* @ORM/Entity(repositoryClass="Dj/TestBundle/Entity/PostRepository")
*/
class Post
{
// ... some code
/**
* @var string $title
* @ORM/Column(name="title", type="string", length=200, nullable=false)
* @Assert/NotBlank()
*/
private $title;
// .. getters and setters
}
Pero a veces (a menudo) necesita insertar algunos campos en su formulario que no están asignados al modelo.
Nuestro ejemplo de modelo es así:
namespace Dj/TestBundle/Entity;
use Doctrine/ORM/Mapping as ORM;
use Symfony/Component/Validator/Constraints as Assert;
/**
* Dj/TestBundle/Entity/Post
*
* @ORM/Table()
* @ORM/Entity(repositoryClass="Dj/TestBundle/Entity/PostRepository")
*/
class Post
{
/**
* @var integer $id
*
* @ORM/Column(name="id", type="integer")
* @ORM/Id
* @ORM/GeneratedValue(strategy="AUTO")
*/
private $id;
/**ghjkl
* @var string $title
* @ORM/Column(name="title", type="string", length=200, nullable=false)
* @Assert/NotBlank()
*/
private $title;
// ... getters and setters
}
Si queremos agregar un campo adicional llamado myExtraField a nuestro Formulario, lo hacemos:
class PostType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(''title'')
->add(''myExtraField'', ''choice'', array(
''label'' => ''myExtraField option :'',
''choices'' => array(
1 => ''Option One'',
2 => ''Option Wat !''
),
''expanded'' => true,
''mapped'' => false
));
}
// other methods
}
Nota :
- mapeado reemplaza a property_path que quedará obsoleto en Symfony 2.3
- puede agregar un valor seleccionado predeterminado a myExtraField añadiendo una entrada ''data'' => 1 en su matriz de opciones.
Código de ejemplo:
$builder->add(''title'')
->add(''myExtraField'', ''choice'', array(
''label'' => ''myExtraField option :'',
''choices'' => array(
1 => ''Option One'',
2 => ''Option Wat !''
),
''data'' => 1, // default selected option
''expanded'' => true,
''mapped'' => false
));
Si desea validar mi campo Extrarradio no puede hacerlo en las anotaciones Entidad postal, tiene que hacerlo en su forma.
Campo de validación no mapeado: el modo Symfony 2.0
La forma 2.0 fue agregar un validador al generador de formularios ($ builder-> addValidator (..)), pero este método está en desuso.
namespace Dj/TestBundle/Form;
use Symfony/Component/Form/AbstractType;
use Symfony/Component/Form/FormBuilderInterface;
use Symfony/Component/OptionsResolver/OptionsResolverInterface;
// needed namespaces for 2.0 validation
use Symfony/Component/Form/CallbackValidator;
use Symfony/Component/Form/FormInterface;
use Symfony/Component/Form/FormError;
class PostType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// ... $builder->add()
// VALIDATING NON MAPPED FIELD Symfony 2.0 way
/** @var Symfony/Component/Form/CallbackValidator $myExtraFieldValidator **/
$myExtraFieldValidator = new CallbackValidator(function(FormInterface $form){
$myExtraField = $form->get(''myExtraField'')->getData();
if (empty($myExtraField)) {
$form[''myExtraField'']->addError(new FormError("myExtraField must not be empty"));
}
});
// adding the validator to the FormBuilderInterface
$builder->addValidator($myExtraFieldValidator);
}
// ... other methods
}
Esto valida actualmente el campo myExtraField, ¡PERO $ builder-> addValidator morirá en Symfony 2.3!
El código compatible con versiones anteriores
Como se indica en MEJORAR DE Symfony 2.0 a 2.1 , ya que FormValidatorInterface está en desuso, ahora tenemos que pasar nuestra función de cierre de validación a un detector de eventos vinculado al evento FormEvents :: POST_BIND.
Este es el código.
namespace Dj/TestBundle/Form;
use Symfony/Component/Form/AbstractType;
use Symfony/Component/Form/FormBuilderInterface;
use Symfony/Component/OptionsResolver/OptionsResolverInterface;
// needed namespaces for 2.1 validation
use Symfony/Component/Form/FormInterface;
use Symfony/Component/Form/FormEvents;
use Symfony/Component/Form/FormEvent;
use Symfony/Component/Form/FormError;
class PostType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// ... $builder->add()
// VALIDATING NON MAPPED FIELD Symfony 2.1.2 way (and forward)
/** @var /closure $myExtraFieldValidator **/
$myExtraFieldValidator = function(FormEvent $event){
$form = $event->getForm();
$myExtraField = $form->get(''myExtraField'')->getData();
if (empty($myExtraField)) {
$form[''myExtraField'']->addError(new FormError("myExtraField must not be empty"));
}
};
// adding the validator to the FormBuilderInterface
$builder->addEventListener(FormEvents::POST_BIND, $myExtraFieldValidator);
}
// ... other methods
}
Esto ciertamente se puede mejorar con algunos gurús de Sf ayuda, pero por ahora valida el campo de formulario no vinculado de una manera compatible con versiones anteriores.
Espero que ayude a despejarnos a algunos de nosotros.
David
Funciona. Comprobado para Symfony 2.1. El código debería ser así:
$builder->add(''password'', ''password'', [''required'' => false, ''mapped'' => false]);
Por supuesto, no se requiere la propiedad ''requerida''. Ejemplo de la documentación.
Si ya está utilizando una restricción, puede hacer esto:
$builder
->add(''new'', ''repeated'', array(
''type'' => ''password'',
''required'' => true,
''invalid_message'' => ''crmpicco.status.password_mismatch'',
''constraints'' => array(
new NotBlank(),
new Assert/Length([
''min'' => 2,
''max'' => 50,
''minMessage'' => ''Your first name must be at least 2 characters long'',
''maxMessage'' => ''Your first name cannot be longer than 2 characters'',
])
)
))
->add(''save'', ''submit'', array(
''label'' => ''password.form.fields.save'',
))
;
Como mencioné en una pregunta sobre un tema similar , desde Symfony 2.1, debe usar la opción ''constraints'' para agregar validación a sus campos no mapeados:
use Symfony/Component/Validator/Constraints/MinLength;
use Symfony/Component/Validator/Constraints/NotBlank;
$builder
->add(''firstName'', ''text'', array(
''constraints'' => new MinLength(3),
))
->add(''lastName'', ''text'', array(
''constraints'' => array(
new NotBlank(),
new MinLength(3),
),
))
;
Espero que ayude a alguien como yo que perdió algo de tiempo en esto ...