2012-03-23 5 views
6

tengo un campo password forma (no asignada a User contraseña) para ser utilizado en un formulario de cambio de contraseña, junto con otros dos campos (mapeadas), first y last.¿Cómo agregar validadores sobre la marcha en Symfony2?

Tengo que agregar validadores sobre la marcha: si el valor para la contraseña está en blanco, entonces no debe haber validación. De lo contrario, se deben agregar MinLength y MaxLength validadores.

Esto es lo que he hecho hasta ahora: crear el password campo repetido, añadir un CallbackValidator y return si es $form->getData()null.

Entonces, ¿cómo puedo agregar validadores de longitud mínima y máxima a $ campo?

$builder = $this->createFormBuilder($user); 

    $field = $builder->create('new_password', 'repeated', array(
      'type'   => 'password', 
      'first_name' => 'Password', 
      'second_name' => 'Confirm password', 
      'required'  => false, 
      'property_path' => false // Not mapped to the entity password 
     )); 

    // Add a callback validator the the password field 
    $field->addValidator(new Form\CallbackValidator(function($form) { 
     $data = $form->getData(); 

     if(is_null($data)) return; // Field is blank 

     // Here password is provided and match confirm, check min = 3 max = 10 

    })); 

    // Add fields to the form 
    $form = $builder 
     ->add('first', 'text', array('required' => false)) // Mapped 
     ->add('last', 'text', array('required' => false)) // Mapped 
     ->add($field)          // Not mapped 
     ->getForm(); 

Respuesta

9

Bueno, encontraron una solución a mí mismo después de algunos experimentos.

voy a dejar esta pregunta sin respuesta durante un par de días como uno puede publicar una mejor solución, que sería muy, muy bienvenida :)

En particular, me encontré con la parte redundat new FormError, no sé si hay una mejor manera de agregar el error al formulario. Y, sinceramente, no sé por qué new Form\CallbackValidator funciona, mientras que new CallbackValidator no lo hará.

Por lo tanto, no se olvide de añadir use declaraciones como éstas:

use Symfony\Component\Form as Form, // Mendatory 
    Symfony\Component\Form\FormInterface, 
    Symfony\Component\Validator\Constraints\MinLength, 
    Symfony\Component\Validator\Constraints\MinLengthValidator; 

Y la devolución de llamada es:

$validation = function(FormInterface $form) { 

    // If $data is null then the field was blank, do nothing more 
    if(is_null($data = $form->getData())) return; 

    // Create a new MinLengthValidator 
    $validator = new MinLengthValidator(); 

    // If $data is invalid against the MinLength constraint add the error 
    if(!$validator->isValid($data, new MinLength(array('limit' => 3)))) : 

     $template = $validator->getMessageTemplate(); // Default error msg 
     $parameters = $validator->getMessageParameters(); // Default parameters 

     // Add the error to the form (to the field "password") 
     $form->addError(new Form\FormError($template, $parameters)); 

    endif; 

}; 

Bueno, y esta es la parte no puedo entender (¿por qué estoy obligado a prefijar con Form), pero está bien:

$builder->get('password')->addValidator(new Form\CallbackValidator($validation)); 
+0

Sólo tiene que añadir: use Symfony \ Component \ Form \ CallbackValidator; para soltar el prefijo del formulario. Los espacios de nombres PHP funcionan bien, pero no están orientados a "paquetes" como java. Lo mejor es que tiene una declaración de uso para cada clase utilizada. – Cerad

+3

Desafortunadamente, recibo: 'Llamada al método indefinido Symfony \ Component \ Form \ FormBuilder :: addValidator' cuando llamo' $ builder-> get ('contraseña') -> addValidator (...) ' – Athlan

5

addValidator quedó en desuso y completamente eliminado desde Symfony 2.3.

Usted puede hacer que al escuchar el evento POST_SUBMIT

$builder->addEventListener(FormEvents::POST_SUBMIT, function ($event) { 
    $data = $event->getData(); 
    $form = $event->getForm(); 

    if (null === $data) { 
     return; 
    } 
    if ("Your logic here") { 
     $form->get('new_password')->addError(new FormError()); 
    } 
}); 
+0

Esto no responde la consulta original. Parece que debería ser un comentario a un comentario sobre una de las otras respuestas. – DavidPostill

+0

Lo hace, como he migrado algunos proyectos a la versión de symfony2.5, addValidator ya no está disponible por lo que usa $ builder-> addEventListener (FormEvents :: POST_BIND, función ($ event) en lugar de $ field-> addValidator do el trabajo – ghaliano

+0

La pregunta original era para symfony2 ** not ** 2.3 or 2.5 – DavidPostill

Cuestiones relacionadas