Symfony sfValidatorSchemaCompare всегда возвращает true - PullRequest
0 голосов
/ 11 января 2012

в моем виде

<?php

    class ChangeMyPasswordForm extends sfForm {

        protected static $labels = array(
            'password' => 'Your Password',
            'confirm'  => 'Re-enter Password',
        );

        public function configure()
        {   
            $this->setWidgets(array(
                   'password'  => new sfWidgetFormInputPassword(array()),
                 'confirm' => new sfWidgetFormInputPassword(array()),
            ));

            $this->setValidators(array(
                'password' => new sfValidatorPass(),
                 'confirm' => new sfValidatorPass(),
            ));

            $this->validatorSchema->setOption('allow_extra_fields', true); 

            $this->mergePostValidator(
                new sfValidatorSchemaCompare('password', sfValidatorSchemaCompare::EQUAL, 
                    'confirm', array(), array(
                        'invalid'=>'Passwords do not match. Please try again.'
                    )
                )
            );
            $this->widgetSchema->setLabels(self::$labels);   
        }   
    }

в моем контроллере

public function executeMyAccountPassword(sfRequest $request) {
          $this->form = new ChangeMyPasswordForm();
          $this->validated=$request->getParameter('validated');

          $this->form->bind(array(
                  $request->getParameter('password'),
                  $request->getParameter('confirm'),
          ));

          if ($request->isMethod('post')) {
              if ($this->form->isValid()) {
                  $this->validated = true;                  
                  var_dump($this->form->getErrorSchema());              
              } else {
                  var_dump($this->form->getErrorSchema());              
              }
          }
      }

на мой взгляд

<?php if ($validated): ?>
<div class="success">
  <b>Success</b>
</div>
<? endif; ?>

<?php if ($form->hasGlobalErrors() || $form->hasErrors()): ?>
<div class="error">
  <b>FAIL !!</b>
  <ul>
    <?php foreach ($form->getGlobalErrors() as $name => $error): ?>
        <li>
            <?php echo $error ?>
        </li>
    <?php endforeach; ?>

    <?php if($form['password']->hasError()): ?>
        <li>
            <?php echo $form['password']->getError() ?>
        </li>
    <?php endif; ?>

  </ul>
</div>
<? endif; ?>

Я не могу понять, что я делаю неправильно, не имеет значения, совпадают пароли или нет, форма всегда возвращает успех (если я не изменю сравнение на не равное) Как я могу определить, возвращаются ли значения обратно в форму? Я делаю что-то явно не так?

1 Ответ

2 голосов
/ 11 января 2012

Ваш bind звонок отключен. Требуется одно или два значения, первое из которых представляет собой отправленные значения, второе - файлы ($request->getFiles()).

Давайте сосредоточимся на первом, так как вы не выполняете загрузку файлов.

Это должен быть массив всех значений формы. В вашей текущей ситуации вы можете сделать это следующим образом (aka. Quick-n-dirty fix):

$this->form->bind(array(
  "password" => $request->getParameter("password"),
  "confirm"  => $request->getParameter("confirm"),
));

В долгосрочной перспективе вы должны сделать вашу форму представленной в виде массива в $_POST, добавьте это к вашему configure():

$this->widgetSchema->setNameFormat("changepasswd[%s]");

Это сделает ваши входные данные именованными как changepasswd[password] и changepasswd[confirm]. Связывание становится легким:

$this->form->bind($request->getParameter($this->form->getName()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...