2013-12-06 4 views
0

Я новичок в Symfony2. Я читал поваренную книгу и искал в Интернете, но я не нашел ответа на мою проблему.Symfony2 Валидация не работает в восстановленном поле (подтверждение пароля)

Вот мой тип формы:

/** 
* Builds a form with given fields. 
* 
* @param object $builder A Formbuilder interface object 
* @param array $options An array of options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('password', 'repeated', array(
     'first_name' => 'password', 
     'second_name' => 'confirm', 
     'type' => 'password', 
     'invalid_message' => 'Passwords do not match' 
    )); 
} 
/** 
* Sets the default form options 
* 
* @param object $resolver An OptionsResolver interface object 
*/ 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Opit\Notes\UserBundle\Entity\User', 
    )); 
} 
/** 
* Get the name 
* 
* @return string name 
*/ 
public function getName() 
{ 
    return 'user'; 
} 

Пользователь является юридическим лицом

Это веточка:

<form name="changePassword_frm" id="changePassword_frm" method="post"> 
<div class="modalwindow width-98 default-border height-auto overflow-hidden"> 
     {{ form_widget(form) }} 
</div> 

И функция в мой контроллер пользователя (Это вызывается по запросу ajax)

public function updatePasswordAction() 
{ 
    $result = array('response' => 'error'); 
    $request = $this->getRequest();   
    $em = $this->getDoctrine()->getManager(); 

    $user = $this->getUserObject($request->attributes->get('id')); 

    $form = $this->createForm(new ChangePasswordType(), $user); 

    if ($request->isMethod("POST")) { 
     $form->handleRequest($request);   

     if ($form->isValid()) { 
      $encoder = $this->container->get('security.encoder_factory')->getEncoder($user); 
      $newPassword = $encoder->encodePassword($user->getPassword(), $user->getSalt()); 
      $user->setPassword($newPassword); 

      // Save the user. 
      $em->persist($user); 
      $em->flush(); 
      $result['response'] = 'success'; 
     } 
    } 
    return new JsonResponse(array($result)); 
} 

Проверка не работает, например, если я заполнил только первое поле (подтверждение - второе - нет). Это действительно! ... Поэтому метод valid() не проверяет, что значение двух полей равно или равно ...

Однако, если я заполню только поле «пароль» и «подтвердите», field not ... Тогда пароль в базе данных будет хэшированной пустой строкой. Если я заполню оба, и они одинаковые. Это будет пароль в базе данных. (Это работает, потому что я могу войти с ним на мою страницу).

Но я не знаю, почему не работает проверка? И почему я не получил сообщение об ошибке? Я проверил и всегда перехожу в метод isValid() ... всегда.

ответ

0

В качестве параметров вы должны использовать first_options и second_options. Похоже, вы используете first_name и second_name. Попробуйте изменить FormType:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('password', 'repeated', array(
     'type' => 'password', 
     'first_options' => array('label' => 'Password'), 
     'second_options' => array('label' => 'Confirm'), 
     'invalid_message' => 'Passwords do not match' 
    )); 
} 

Это даст вам имя поля через фактическое поле, а не только имя поля. По умолчанию этот метод включен.

+0

Это решение проблемы? –

+0

Почти единственная проблема, в которой не отображается недопустимое сообщение. –

+0

Вы уверены, что не оставите это с Twig? Сделайте {{form (form)}} или {{form_row (form.password)}}, и это будет включать в себя раздел form_error, который, я думаю, вам не хватает. –

Смежные вопросы