Php 如何在zend表单中对添加和编辑操作使用相同的字段验证?

Php 如何在zend表单中对添加和编辑操作使用相同的字段验证?,php,zend-framework,zend-form,zend-validate,Php,Zend Framework,Zend Form,Zend Validate,我是zend框架的新手。我正在zend中开发一个简单的用户注册应用程序。我的应用程序中有添加和编辑功能。我可以使用我的应用程序完美地添加新用户。但是,当我试图编辑除密码以外的用户信息时,用于密码和密码确认字段的验证器会出错。只有当我想编辑除密码以外的用户信息时,我才需要删除/禁用密码和密码确认字段的验证程序 我的表格: $password = new Zend_Form_Element_Password('password'); $password->setRequired

我是zend框架的新手。我正在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(2, 20, 'messages'=>'password must be 2-20 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 do not match'))
        ->addValidator(new Application_Validate_PasswordConfirmation())
        ->setLabel('Retype password');
我的验证器类:

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

在编辑模式下提交表单时,在调用
$form->isValid()
之前,请使用以下代码删除验证程序:


这就是我在@drew010的帮助下明确解决这个问题的方法,我如何识别表单是以编辑模式提交的。除了表单填充,我看不出编辑和提交之间有什么区别。因为我对zend框架非常陌生,您能解释一下吗。感谢在一个实例中,您没有数据,需要创建一个用户,而在另一个实例中,您必须预先填充它,并且可能此人已登录?是的,但我从控制器填充表单。我是否应该在控制器中添加您的代码可能在控制器中,无论您当前在哪里验证表单。我在应用程序中验证表单\u验证\u密码确认我已经在我的问题中发布了类应用程序\u验证\u密码确认。你能告诉我如何在那门课上使用你的代码吗
$password = $this->getRequest()->getPost('password');
if (trim($password) == '') { // password field empty, remove validators
    $form->getElement('password')
         ->setRequired(false)
         ->clearValidators();

    $form->getElement('confirmPassword')
         ->setRequired(false)
         ->clearValidators();
}

if ($form->isValid($this->getRequest()->getPost())) {
    // ...
}
    $modelUsers = new Model_Users();
    $userId = $this->_getParam('userId');

    if ($userId) {
        $populateData = array();

        $user = $modelUsers->fetch($userId);

        if ($user instanceof Model_User) {
            $populateData = $user->toArray();
        }
        $form = $this->_getAddForm($user->email, $user->username, $user->phone);
        $password = $this->getRequest()->getPost('password');
        if (trim($password) == '') {
            $form->getElement('password')
            ->setRequired(false)
            ->clearValidators();

            $form->getElement('confirmPassword')
            ->setRequired(false)
            ->clearValidators();
        }

    }
   else {
        $form = $this->_getAddForm($mail=null, $username=null, $phone=null);
   }
    $request = $this->getRequest();

    if ($request->isPost()) {

        $post = $request->getPost();
        if ($form->isValid($post)) {
            $values = $form->getValidValues($post);