【问题标题】:Identical field checking is not working properly for zend formzend 表单的相同字段检查无法正常工作
【发布时间】:2012-09-21 14:12:01
【问题描述】:

我创建了一个 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);

我的 School_Validate_PasswordConfirmation 课程:

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

提前致谢。

【问题讨论】:

    标签: zend-framework zend-form


    【解决方案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 {
                // ...
            }
        }
    }
    

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

    希望对您有所帮助。

    【讨论】:

    • 这个函数的放置位置。我把它放在控制器中。但它不起作用并给出以下错误“值是必需的,不能为空”“值是必需的,不能为空”
    • 一件事,我的表单中有 setRequired(true)
    • 把它放在你现在验证表单的任何地方。同时添加$form->getElement('password')->setRequired(false);
    • 那我怎么调用这个函数
    • 怎么调用什么函数呢?如果您在谈论 setRequired(),只需将其放在同一个位置,其他验证器就会被删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多