2012-03-23 16 views
6

Mam pole password formularz (nie odwzorowane na User hasło) do wykorzystania w formie Zmień hasło, wraz z dwoma innymi (odwzorowanych) pól, first i last.Jak dodać weryfikatory w locie w Symfony2?

Muszę dodawać sprawdzanie poprawności w locie: jeśli wartość dla hasła jest pusta, nie powinno być sprawdzania poprawności. W przeciwnym razie należy dodać nowe walidatory MinLength i.

Oto co zrobiłem do tej pory: stworzyć password pole powtórzył dodać CallbackValidator i return jeśli $form->getData() jest null.

Jak dodać walidatory dla minimalnej i maksymalnej długości do pola $?

$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(); 

Odpowiedz

9

No cóż, znalazł rozwiązanie się po kilku eksperymentów.

Zamierzam zostawić to pytanie bez odpowiedzi na kilka dni jako można opublikować lepsze rozwiązanie, który byłby naprawdę bardzo mile widziane :)

W szczególności uważam, że część redundat new FormError, nie wiem, czy istnieje lepszy sposób na dodanie błędu do formularza. I szczerze mówiąc, nie wiem, dlaczego new Form\CallbackValidator działa, a new CallbackValidator nie.

Więc nie zapomnij dodać use stwierdzenia takie jak:

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

A zwrotna jest:

$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; 

}; 

No, i to jest część, nie mogę zrozumieć (dlaczego jestem zmuszony do prefiks z Form), ale jest w porządku:

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

Wystarczy dodać: używać Symfony \ Komponent \ Form \ CallbackValidator; aby usunąć prefiks formularza. Przestrzenie nazw PHP działają dobrze, ale nie są "pakietowe" zorientowane na java. Najlepiej po prostu mieć instrukcję użycia dla każdej używanej klasy. – Cerad

+3

Niestety, otrzymuję: 'Wezwanie do niezdefiniowanej metody Symfony \ Component \ Form \ FormBuilder :: addValidator' po wywołaniu' $ builder-> get ('password') -> addValidator (...) ' – Athlan

5

addValidator został wycofany i całkowicie usunięty od czasu Symfony 2.3.

Można to zrobić poprzez słuchanie przypadku 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

To nie odpowiada oryginalne pytanie. Wygląda na to, że powinien być komentarzem do komentarza do jednej z pozostałych odpowiedzi. – DavidPostill

+0

Robi to, ponieważ mam migrować niektóre projekty do wersji symfony2.5, addValidator nie jest już dostępny availbale więc używanie $ builder-> addEventListener (FormEvents :: POST_BIND, funkcja (wydarzenie $) unstead $ field-> addValidator do zadanie – ghaliano

+0

Pierwotne pytanie dotyczyło symfony2 ** nie ** 2.3 lub 2.5 – DavidPostill