2012-10-19 48 views
1

我是zf的新手,最近我使用zend_dojo_form製作了一個註冊表單,並且有兩個passwordtextbox元素,您知道,一個是輸入密碼,另一個是確認前者一個,然後我使用驗證器'令牌'但失敗了,這裏是我的代碼的一部分。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')) 
      ) 
     ) 
    ); 

回答

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' => "^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[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 [ _-!"#%&/()=]', 
)) 

第二個密碼字段,屬性相同但驗證器不同

->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'纔在validateconfirm_register2小部件中的clientside中進行驗證。讓我們來修正標記工廠在上面幾行中關於'壞習慣'的問題。刪除該行並添加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 

    }); 
}); 
+0

感謝您的回覆,您的代碼非常好。但也許我沒有明確表示我的問題,實際上,我的問題是關於密碼確認。我使用zend_form be4,它通過使用'相同'驗證程序(如:陣列('相同',假,數組('token'=>'密碼')),然後我切換到zend_dojo,它不會去我認爲的方式,所以任何幫助? –

+0

aha ..那麼問題是,你是不區分服務器端和客戶端驗證之間。dijit.form.ValidationTextbox沒有'相同'參數和我們定義的'驗證器' formelements是100%服務器端驗證器;僅在回發例程中使用。Ill指定dojo世界中的「鏈接」表單字段 – mschr

+0

似乎添加一個外部.js文件對我來說很困難,我試着用你的帖子:$ this-> getElement() - > getView() - > headScript() - > appendFile($ baseUrl。'/js/Validator.js');但我仍然無法弄清楚,我使用IE deveoper工具,不能在th中看到.js的ref e 標記 –