0

私はこれに1時間苦労してきましたが、何が問題なのかまだ理解できません。
2 つのフィールドを設定する方法は次のとおりです。

$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からのものです。

両方の宣言は常に「指定された 2 つのトークンが一致しません」を返しますが、これら 2 つのフィールドにはまったく同じ文字列が含まれていると確信しています。

推測はありますか?ありがとうございました!

EDIT : XDebug のおかげで、Zend_Validate_Identical'sisValid()関数が呼び出されたときに、 $token'password' に$value等しいのに対し、'P4ssword' に等しいことに気付きました (confirm_password フィールドに入力したパスワード。何が起こっているのでしょうか?

EDIT2 : emanaton.com/code/php/validateidenticalfield と stackoverflow.com/a/1628611/1300454 の 2 つのソリューションを試してみましどちらもうまくいきません。一般的な IdenticalField バリデーターでは、「パスワード」フィールドが見つからず、2 番目のバリデーターは 2 つのフィールドが一致しないことを返すだけであり、XDebug を使用すると、パスワード「P4ssword」を単語と一致させようとしていることがわかりました。フィールド名として付けた「パスワード」...

4

1 に答える 1

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;
}
于 2012-05-18T21:06:42.830 に答える