代码之家  ›  专栏  ›  技术社区  ›  opHASnoNAME

验证Zend表单中的一组字段/一组字段

  •  0
  • opHASnoNAME  · 技术社区  · 14 年前

    对于以下要求是否有任何好的解决方案:

    • 一个包含一个邮政编码字段和默认验证器(如数字、长度等)的表单。
    • 提交后,将根据数据库检查表单。
    • 如果邮政编码不是唯一的,我们必须要一个城市。

    实例:

    案例1:提交的邮政编码在数据库中是唯一的。一切都好。工艺形式

    案例2:提交的邮政编码不唯一。在表单中添加城市的第二个字段。回到窗体。

    我们希望以一种通用的方式(而不是在控制器内部)处理这个问题。我们需要这个逻辑 很多形式。首先想到的是将它添加到每个窗体的isvalid()中,或者编写一个 带有逻辑的验证器,用于向表单添加字段。子窗体对我们来说是不可能的,因为我们需要它用于不同的字段(例如名称和街道)。

    2 回复  |  直到 13 年前
        1
  •  2
  •   Keyne Viana    14 年前

    目前,我正在表单内使用isvalid方法来验证用户表单的密码和确认密码字段。此外,当表单显示在新操作中时,没有修改,但在编辑操作中显示时,会向表单添加新字段。

    我认为这是对isvalid方法的一个很好的选择,当验证返回false时添加字段,如果您想要更易于维护的东西,您应该为此编写自己的验证程序。

    看看我的代码:

    class Admin_Form_User extends Zf_Form 
    {
        public function __construct($options = NULL)
        {
            parent::__construct($options);
            $this->setName('user');
    
            $id = new Zend_Form_Element_Hidden('id');
    
            $user = new Zend_Form_Element_Text('user');
            $user->setLabel('User:')
            ->addFilter('stripTags')
            ->addFilter('StringTrim')
            ->setAllowEmpty(false)
            ->setRequired(true);
    
            $passwordChange = new Zend_Form_Element_Radio('changePassword');
            $passwordChange->setLabel('Would you like to change the password?')
            ->addMultiOptions(array(1 => 'Sim', 2 => 'Não'))
            ->setValue(2)
            ->setSeparator('');
    
            $password = new Zend_Form_Element_Password('password');
            $password->setLabel('Password:')
            ->addFilter('stripTags')
            ->addFilter('StringTrim')
            ->setRequired(true);
    
            $confirm_password = new Zend_Form_Element_Password('confirm_password');
            $confirm_password->setLabel('Confirm the password:')
            ->addFilter('stripTags')
            ->addFilter('StringTrim')
            ->addValidator('Identical')
            ->setRequired(true);
    
            $submit = new Zend_Form_Element_Submit('submit');
            $submit->setLabel('Save');
    
            $this->addElements(array($id,$name,$lastname,$group,$user,$passwordChange,$password,$confirm_password,$submit));
    
            $this->addDisplayGroup(array('password','confirm_password'),'passwordGroup');
            $this->submit->setOrder(8);
    
            $this->setDisplayGroupDecorators(array(
                'FormElements',
                array('HtmlTag', array('tag' => 'div','id' => 'div-password'))
                )
            );
    
            $passwordChange->clearDecorators();
    
        }
    
        public function addPasswordOption()
        {
            $this->changePassword->loadDefaultDecorators();
    
            $this->getDisplayGroup('passwordGroup')
            ->addDecorators(array(
                array('HtmlTag', array('tag' => 'div','id' => 'div-password'))
                )
            );
    
            $this->password->setRequired(false);
            $this->confirm_password->setRequired(false);
        }
    
        public function setPasswordRequired($flag = true)
        {
            $this->password->setRequired($flag);
            $this->confirm_password->setRequired($flag);
        }
    
        public function isValid($data)
        {
            $confirm = $this->getElement('confirm_password');
            $confirm->getValidator('Identical')->setToken($data['password']);
            return parent::isValid($data);
        }
    
    }
    

    所以,在我的控制器中:

    public function newAction()
        {
            $this->view->title = "New user";
            $this->view->headTitle($this->view->title, 'PREPEND');
    
            $form = $this->getForm();
    
            if($this->getRequest()->isPost()) 
            {
                $formData = $this->_request->getPost();
    
                if($form->isValid($formData))
                {
                    $Model = $this->getModel();
                    $id = $Model->insert($formData);
    
                    $this->_helper->flashMessenger('The user data has beed updated.');
                    $this->_helper->redirector('list');
                }
            }
    
            $this->view->form = $form;
        }
    
        public function editAction()
        {       
            $this->view->title = "Edit user";
            $this->view->headTitle($this->view->title, 'PREPEND');
    
            $id = $this->getRequest()->getParam('id');
    
            $form = $this->getForm();
    
            // Add yes or no password change option
            $form->addPasswordOption();
    
            $Model = $this->getModel();
    
            if($this->getRequest()->isPost()) 
            {
                $formData = $this->getRequest()->getPost();
    
                // Change password?
                if($formData['changePassword'] == 2) $form->setPasswordRequired(false);
    
                if($form->isValid($formData)) 
                {
                    $Model->update($formData);
    
                    $this->_helper->flashMessenger('The user data has beed updated.');
                    $this->_helper->redirector('list');
                } 
    
            }
    
            $data = $Model->getById($id)->toArray();
    
            $form->populate($data);
    
            $this->view->form = $form;
        }
    
        2
  •  1
  •   zwip    14 年前

    您可能需要一个javascript表单验证器。在submit函数中,执行一个Ajax调用来检查zipcode是否唯一。如果没有,则显示一个额外的城市字段。

    但是您仍然必须执行验证服务器端:永远不要信任用户输入,即使它是在客户端验证的。