我一直在努力奋斗一个小时,但仍然无法理解什么是错的 以下是我设置两个字段的方法:
$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);
我已经尝试了两个验证器(+评论的一个),但没有一个工作。 这些声明来自www.wjgilmore.com/blog/entry/validating_identical_passwords_with_the_zend_framework和https://stackoverflow.com/a/3653416/1300454
两个声明总是返回“两个给定的令牌不匹配”eventho我确定这两个字段包含完全相同的字符串。
有什么猜测?谢谢!
修改:
刚刚感谢XDebug,当Zend_Validate_Identical
的{{1}}函数被调用时,我的isValid()
等于'密码',而我的$token
等于'P4ssword'(我输入的密码)我的confirm_password字段。发生了什么事?
EDIT2 : 试过这两个解决方案:emanaton.com/code/php/validateidenticalfield和stackoverflow.com/a/1628611/1300454,但它们都不适用于我。使用通用的IdenticalField验证器,它找不到我的“密码”字段,第二个验证器只返回两个字段不匹配,再次使用XDebug我发现它仍然希望将我的密码“P4ssword”与单词匹配我提供的'密码'作为字段名称......
答案 0 :(得分:0)
您是否有可能不使用当前的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;
}