Zend_Dojo_Form passwordTextBox验证器不起作用

时间:2012-10-19 11:36:19

标签: zend-framework dojo passwords token validation

我是zf的新手,最近我使用zend_dojo_form创建了一个注册表单,并且有两个passwordtextbox元素,你知道,一个用于输入密码,另一个用于确认前一个,然后我使用验证器'令牌'但失败了,这是我的代码的一部分。

$this->addElement('PasswordTextBox','password',array(
            'label'=>'password:',
            'required'=>true,
            'trim'=>true,
            'regExp'=>'^[a-z0-9]{6,18}$',
            'invalidMessage'=>'password should be 6-18',
            'Decorators' => array(
                'DijitElement',
                'Errors',
                array(array('data'=>'HtmlTag'),array('tag'=>'td','align'=>'left')),
                array('Label',array('tag'=>'td')),
                array(array('row'=>'HtmlTag'),array('tag'=>'tr','align'=>'right'))
                )
            )
        );
    //$this->addElement($password1);

    $this->addElement('PasswordTextBox','password2',array(
        'label'=>'confirm password:',
        'required'=>true,
        'trim'=>true,
        //'regExp'=>'^[a-z0-9]{6,18}$',
        'validators'=>array(array('identical',false,array('token'=>'password'))),
        'invalidMessage'=>'the password you enter not the same',
        'Decorators' => array(
            'DijitElement',
            'Errors',
            array(array('data'=>'HtmlTag'),array('tag'=>'td','align'=>'left')),
            array('Label',array('tag'=>'td')),
            array(array('row'=>'HtmlTag'),array('tag'=>'tr','align'=>'right'))
            )
        )
    );

1 个答案:

答案 0 :(得分:0)

这是一个应该起作用的样本:

class Application_Form_Register extends Zend_Dojo_Form {

    public function init() {
            $this
                            ->setOptions(array('name' => 'registerForm'))
                            // username
                            ->addElement('TextBox', 'first_name', array(
                                    'filters' => array('StringTrim', 'StringToLower'),
                                    'id' => 'name_register',
                                    'required' => true,
                                    'label' => 'Fornavn(e):',
                            ))
                            ->addElement('TextBox', 'last_name', array(
                                    'filters' => array('StringTrim', 'StringToLower'),
                                    'id' => 'surname_register',
                                    'label' => 'Efternavn:',
                            ))
                            ->addElement('ValidationTextBox', 'email', array(
                                    'filters' => array('StringTrim', 'StringToLower'),
                                    'validators' => array(
                                            'EmailAddress',
                                            array('StringLength', false, array(3, 60)),
                                    ),
                                    'regExp' => "^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$",
                                    'id' => 'email_register',
                                    'required' => true,
                                    'label' => 'E-mail:',
                            ))
                            //password
                            ->addElement('PasswordTextBox', 'password', array(
                                    'filters' => array('StringTrim'),
                                    'validators' => array(
                                            'Alnum',
                                            array('StringLength', false, array(6, 20)),
                                    ),
                                    'regExp' => "^([a-zA-Z0-9_\-!-=]){4,32}$",
                                    'tooltipPosition' => 'above',
                                    'invalidMessage' => 'Krav til password: mellem 4 og 32 i længde og kun karakterer som tal, bogstaver eller blandt [ _-!"#%&/()=] er tilladt',
                                    'id' => 'password_register',
                                    'onKeyDown' => 'arguments[0].keyCode == dojo.keys.ENTER && application.submitRegistration(dijit.byId(\'registerForm\'));',
                                    'required' => true,
                                    'label' => 'Password:',
                            ))
                           ->addElement('PasswordTextBox', 'password_confirm', array(
                                    'filters' => array('StringTrim'),
                                    'validators' => array(
                                            'Alnum',
                                            array('StringLength', false, array(6, 20)),
                                    ),
                                    'id' => 'passwordconfirm_register1',
                                    'onKeyDown' => 'arguments[0].keyCode == dojo.keys.ENTER && application.submitRegistration(dijit.byId(\'registerForm\'));',
                                    'required' => true,
                                    'label' => 'Gentag password:',
                            ))

                           ->addElement('PasswordTextBox', 'password_confirm', array(
                                    'filters' => array('StringTrim'),
                                    'validators' => array(
                                            'Alnum',
                                            array('StringLength', false, array(6, 20)),
                                    ),
                                    'id' => 'passwordconfirm_register2',
                                    'onKeyDown' => 'arguments[0].keyCode == dojo.keys.ENTER && application.submitRegistration(dijit.byId(\'registerForm\'));',
                                    'required' => true,
                                    'label' => 'Gentag password:',
                            ))
                            ->addElement('Hidden', 'action', array(
                                    'id' => 'action_register',
                                    'value' => 'register',
                            ))
                            ->addElement('Button', 'foo', array(
                                    'id' => 'foo_register',
                                    'onClick' => 'application.submitRegistration(dijit.byId(\'registerForm\'))',
                                    'label' => 'Register'
                                            )
            );
            $this->_decorate();

    }
    // renders nulled empty labels and adds classnames, related to element name
    protected function _decorate() {
            $this->setDecorators(array(
                    'FormElements',
                    array('HtmlTag', array('tag' => 'div', 'class' => 'zend_form_contents')),
                    'DijitForm'
            ));

            foreach ($this->getElements() as $el) {

                    $el->addDecorator('HtmlTag', array('tag' => 'div', 'class' => $el->getName() . '-wrap'));
                    if ($el->helper == 'Button')
                            continue;
                    else if (strlen(trim($el->getLabel())) == 0)
                            $el->addDecorator('Label', array('tag' => null));
                    else
                            $el->addDecorator('Label', array('tag' => 'div', 'class' => $el->getName() . '-label'));
            }
    }
}

关注两个密码字段 - 根据客户端验证的内容,让我们过滤掉Zend_Form_Element属性:

 ->addElement('PasswordTextBox', 'password_2_', array(
       // strictly serverside, only accepts alphanumerical pwds lengths 6 through 20
       'validators' => array(
           'Alnum',
           array('StringLength', false, array(6, 20)),
       ),
       // widget id
       'id' => 'passwordconfirm_register1',
       // both client-/server-side - triggers 'emptyMessage' validation
       'required' => true,
       // runs with the form.validate() and events onblur, oninit, onkeypress
       // if ! dijit.get("value").match(dijit.regExp) show 'invalidMessage'
       // this example matches the serverside reqs
       'regExp' => "^([a-zA-Z0-9_\-!-=]){6,32}$",
       // shown with form.validate(), dijit.validate() and input.blur() if regExp is not  a match against value
       'invalidMessage' => 'Password musts: 6 to 32 chars and only numbers, letters or amongst [ _-!"#%&/()=]',
  ))

第二个pwd字段,相同的属性但具有不同的验证器

 ->addElement('PasswordTextBox', 'password_2_', array(
       // strictly serverside, only accepts alphanumerical pwds lengths 6 through 20
       'validators' => array(
           array('identical',false,array('token'=>'password'))
       ),
       // widget id
       'id' => 'passwordconfirm_register2',
       'required' => true,
       // in theory, we would define 'validator' in programmatic construct of
       // the validationtextbox. but this will not work with the way Zend handles dojo
       // 'validator' => 'function(value, constraints) { return "BAD PRACTICE" }'
  ));
  // add javascript code to run onload and to extend the 'register2' properly
  $this->getElement()
      ->getView()
      ->headScript()
      ->appendFile($baseUrl . '/js/Validator.js');

到目前为止,只有'required'在passwordconfirm_register2小部件中验证了客户端。让我们解决一下标记工厂在上述行中对“不良做法”的看法。删除该行并添加javascript代码,包含:

// file: baseUrl/js/Validator.js
dojo.addOnLoad(function() {
  dijit.byId('passwordconfirm_register2').validate = function(value, constraints) {

     if(dijit.byId('passwordconfirm_register1').get("value") != value) {
            this.invalidMessage = "Passwords are not identical";
            return false;
     }

     return true

  });
});