Обработка проверки Symfony - PullRequest
       1

Обработка проверки Symfony

1 голос
/ 12 января 2012

У меня есть форма для смены паролей, она проверяет поле password для min_length и required. Затем он сравнивает поле password с полем confirm.

Если я отправляю в эту форму меньше минимально необходимых символов (а пароль и поле подтверждения совпадают), он выдает ошибки для минимальной длины (что ожидается) и для несоответствия пароля (неожиданно).

Может кто-нибудь сказать, почему?

<?php

class ChangeMyPasswordForm extends sfForm {

    const PASSWORD_MIN_LENGTH_MSG = "<li>We could not update your password because your password must be at least 8 characters long. Please choose a different password.</li>";
    const PASSWORD_MISMATCH_MSG   = "<li>We could not update your password because your passwords didn't match. Please try again.</li>";
    const PASSWORD_REQUIRED_MSG   = "<li>We could not update your password because your password was blank. Please enter a password.</li>";

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

    /**
     * Called in sfForm's constructor. 
     */
    public function configure()
    {   
        $this->setWidgets(array(
           'password'  => new sfWidgetFormInputPassword(array()),
             'confirm' => new sfWidgetFormInputPassword(array()),
        ));

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

        $this->mergePostValidator(
            new sfValidatorSchemaCompare('password', sfValidatorSchemaCompare::EQUAL, 
                'confirm', array(), array(
                    'invalid' => self::PASSWORD_MISMATCH_MSG,
                )
            )
        );

        $this->widgetSchema->setLabels(self::$labels);
    }

    /**
     * Returns validators for the password field. 
     * @return sfValidatorString 
     */
    private function _setPasswordValidator()
    {
        $v = new sfValidatorString();
        $v->setOption('min_length', 8);
        $v->setMessage('min_length', self::PASSWORD_MIN_LENGTH_MSG);
        $v->setMessage('required', self::PASSWORD_REQUIRED_MSG);

        return $v;
    }
}

edit: это может помочь => вид, куда я выкидываю ошибки

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

        <?php foreach ($form->getErrorSchema()->getErrors() as $error): ?>
      <?php echo $error; ?>
    <?php endforeach; ?>
  </ul>
</div>
<? endif; ?>

Ответы [ 2 ]

1 голос
/ 12 января 2012

Процесс проверки происходит в два этапа: обычные валидаторы и после валидации, первая ожидаемая ошибка происходит из нормальной фазы валидации (каждое поле).Другая неожиданная ошибка исходит от пост-валидатора.

Когда вы связываете форму со значениями запроса и как $ form-> isValid (), все валидаторы обрабатываются (обычный и пост), поэтому, если есть ошибки в любом из них (или в этом случае оба), они будут сохранены в поле, которое будет показано позже.

Надеюсь, что это достаточно ясно

Отредактировано: извините, мой английский не очень хороший, а также мой ум, так что здесь что-то довольнополезно ( Формы Symfony в действии - Advanced Validaton ).Во всяком случае, когда я впервые прочитал это, я не заметил часть «обоих паролей», поэтому мой ответ не настолько точен.Вот пример конфигурации виджета для формы регистрации у меня Настройка виджета формы регистрации Symfony

0 голосов
/ 12 января 2012

Наконец-то разобрался. Похоже, sfValidatorSchemaCompare сравнивает весь виджет, валидаторы и все (не только возвращаемые ими значения). Поэтому, если я сравниваю два виджета, и у них нет одинаковых валидаторов (то есть один min_length = 3, а другой min_length = 6), это не удастся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...