对于zend形式,相同的字段检查不能正常工作

时间:2012-09-21 14:12:02

标签: zend-framework zend-form

我创建了一个zend表单,我有一个密码并确认密码。我使用相同的表单来添加和更新/编辑数据库。当我想添加新密码时,我的代码工作正常,但当我想编辑现有密码时,我的代码无效。

我的表格:

    $password = new Zend_Form_Element_Password('password');
    $password->setRequired(true)
    ->addFilter('StringTrim')
    ->addFilter('StripTags')
    ->addValidator('NotEmpty', false, array('messages'=>'password cannot be empty'))
    ->addValidator('StringLength', false, array(5, 25, 'messages'=>'password must be 5-30 character'))
    ->setLabel('Password:');
    $this->addElement($password);

    $confirmPassword = new Zend_Form_Element_Password('confirmPassword');
    $confirmPassword->setRequired(true)
    ->addFilter('StringTrim')
    ->addFilter('StripTags')
    ->addValidator('NotEmpty', false, array('messages'=>'password don\'t match'))
    ->addValidator(new School_Validate_PasswordConfirmation())
    ->setLabel('Confirm Password');
    $this->addElement($confirmPassword);

my School_Validate_PasswordConfirmation class:

class School_Validate_PasswordConfirmation extends Zend_Validate_Abstract
{
     const NOT_MATCH = 'notMatch';

     protected $_messageTemplates = array(
     self::NOT_MATCH => 'Password confirmation does not match'
     );

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

         if (is_array($context)) {
            if (isset($context['password'])&& ($value == $context['password']))
            {
                return true;
            }
         } elseif (is_string($context) && ($value == $context)) {
                return true;
           }

         $this->_error(self::NOT_MATCH);
         return false;
     }
}

当我想编辑除密码以外的其他字段时,它会给出以下错误消息。但是这些消息只会在我第一次进入用户时显示。

错误:

password cannot be empty
password don't match

提前致谢。

1 个答案:

答案 0 :(得分:1)

当表单处于编辑模式时,只需从元素中删除验证器。

public function someAction()
{
    $form = new Application_Form_YourForm();

    if ('in edit mode') {
        $form->getElement('password')->clearValidators();
        $form->getElement('confirmPassword')->clearValidators();
    }

    if ($this->getRequest()->isPost()) {
        $valid = $form->isValid($this->getRequest()->getPost());

        if ($valid) {
            // ...
        } else {
            // ...
        }
    }
}

如果您允许某人通过填写这些字段来更改密码,请在编辑模式下添加额外的检查以查看是否在密码字段中输入了任何内容。如果他们填写了密码,请保留验证器,否则将其删除。

希望有所帮助。