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;
}