2012-03-01 4 views
1

Вот как выглядит мой фрагмент кода.Подтверждение пароля не подтверждается с использованием поля «repeat» с помощью построителя форм в symfony2?

// --- это код в моем контроллере ----

$registrationForm = $this->createFormBuilder() 
       ->add('email') 
       ->add('password', 'repeated', array('type' => 'password', 'invalid_message' => 'Passwords do not match')) 
       ->getForm(); 

     return $this->render('AcmeHelloBundle:Default:index.html.twig', array('form' => $registrationForm->createView())); 

// --- This is the twig file code---- 

<form action="#" method="post" {{ form_enctype(form) }}> 
    {{ form_errors(form) }} 
    {{ form_row(form.email, { 'label': 'E-Mail:' }) }} 
    {{ form_errors(form.password) }} 
    {{ form_row(form.password.first, { 'label': 'Your password:' }) }}  
    {{ form_row(form.password.second, { 'label': 'Repeat Password:' }) }}  
    {{ form_rest(form) }} 
    <input type="submit" value="Register" /> 
</form> 

Может ли один предложить, почему он не работает с помощью формы строителя?

ответ

8

В Symfony 2 проверка выполняется объектом домена. Поэтому вам нужно передать объект (объект домена) в вашу форму.

код в контроллере:

public function testAction() 
{ 
    $registration = new \Acme\DemoBundle\Entity\Registration(); 
    $registrationForm = $this->createFormBuilder($registration) 
      ->add('email') 
      ->add('password', 'repeated', array('type' => 'password', 'invalid_message' => 'Passwords do not match')) 
      ->getForm(); 

    $request = $this->get('request'); 
    if ('POST' == $request->getMethod()) { 
     $registrationForm->bindRequest($request); 
     if ($registrationForm->isValid()) { 
      return new RedirectResponse($this->generateUrl('registration_thanks')); 
     } 
    } 

    return $this->render('AcmeDemoBundle:Demo:test.html.twig', array('form' => $registrationForm->createView())); 
} 

1) Форма строитель будет отображать поля формы со свойствами вашей сущности, и увлажняют ваши значения полой формы с значениями свойств сущностей.

$registrationForm = $this->createFormBuilder($registration)... 

2) Привязать будет гидрат ваших форм поля значения со всеми данными вывешенных

$registrationForm->bindRequest($request); 

3) Для того, чтобы запустить Validation

$registrationForm->isValid() 

4), если данные размещены действительны, вам нужно перенаправить на действие, чтобы сообщить пользователю, что все в порядке, чтобы не отображать предупреждающее сообщение от вашего броузера, который спрашивает, уверены ли вы, что вы отправили данные.

return new RedirectResponse($this->generateUrl('registration_thanks')); 

Entity код:

<?php 

namespace Acme\DemoBundle\Entity; 

class Registration 
{ 
    private $email; 

    private $password; 

    public function getEmail() 
    { 
     return $this->email; 
    } 

    public function setEmail($email) 
    { 
     $this->email = $email; 
    } 

    public function getPassword() 
    { 
     return $this->password; 
    } 

    public function setPassword($password) 
    { 
     $this->password = $password; 
    } 
} 

документ для проверки: http://symfony.com/doc/current/book/validation.html

Примечание: нет необходимости добавлять некоторые проверки на пароль объекта собственности, repeatedType сделал это для вас

+0

спасибо, что помогли. – GorillaApe