Zend_Form: идентичные поля, возвращающие false, когда фактически идентичны

Я боролся с этим в течение часа и до сих пор не могу понять, что не так.
Вот как я устанавливаю свои два поля:

$password = $this->createElement('password', 'password');
$password->setLabel('Password');
$password->setRequired('true');
$password->addValidator(new Zend_Validate_Regex('/^([a-zA-Z0-9]*[0-9]+[a-z]*[A-Z]+[a-zA-Z0-9]*)|([a-zA-Z0-9]*[A-Z]+[a-z]*[0-9]+[a-zA-Z0-9]*)$/'));
$password->setAttrib('size', 25);
$password->setAttrib('length', 150);
$this->addElement($password);

$confirm_password = $this->createElement('password', 'confirm_password');
$confirm_password->setLabel('Confirm');
$confirm_password->setRequired('true');
$confirm_password->setAttrib('size', 25);
$confirm_password->setAttrib('length', 150);

$confirm_password->addValidator('Identical', false, array('token' => 'password'));
//$confirm_password->addValidator(new Zend_Validate_Identical(array('token' => 'password')));

$this->addElement($confirm_password);

Я пробовал оба валидатора (+ тот, что прокомментировал), но ни один не работает. Эти заявления поступили с http://www.wjgilmore.com/blog/entry/validating_identical_passwords_with_the_zend_framework и /questions/13865041/kak-proverit-pole-parolya-v-forme-zend/13865070#13865070

Оба объявления всегда возвращают "два заданных токена не совпадают", хотя я уверен, что эти два поля содержат одинаковую строку.

Есть предположения? Спасибо!

РЕДАКТИРОВАТЬ: только что заметил благодаря XDebug, что когда Zend_Validate_Identical "s isValid() функция называется, мой $token равно "пароль", а мой $value равняется 'P4ssword' (пароль, который я ввел в своем поле verify_password. Что происходит?

EDIT2: пробовал с этими двумя решениями: http://emanaton.com/code/php/validateidenticalfield и /questions/13865041/kak-proverit-pole-parolya-v-forme-zend/13865058#13865058, но ни одно из них также не работает для меня. С помощью универсального валидатора IdenticalField он не может найти мое поле "пароль", а второй валидатор просто возвращает, что два поля не совпадают, и снова с XDebug я обнаружил, что он все еще ищет, что мой пароль "P4ssword" соответствует слову "пароль", который я дал в качестве имени поля...

1 ответ

Возможно ли, что вы не используете текущую версию Zend Framework? Код в классе выглядит так, как будто он должен работать так, как вы ожидаете (1.11). Вы используете $form->isValid() или ->isValidPartial()? Попробуйте отредактировать код ZF и вывести содержимое переменной $context. Похоже, ваш код не заполняет переменную $context так, как должно.

public function isValid($value, $context = null)
{
    $this->_setValue((string) $value);

    if (($context !== null) && isset($context) && array_key_exists($this->getToken(), $context)) {
        $token = $context[$this->getToken()];
    } else {
        $token = $this->getToken();
    }

    if ($token === null) {
        $this->_error(self::MISSING_TOKEN);
        return false;
    }

    $strict = $this->getStrict();
    if (($strict && ($value !== $token)) || (!$strict && ($value != $token))) {
        $this->_error(self::NOT_SAME);
        return false;
    }

    return true;
}
Другие вопросы по тегам