2012-01-12 60 views
1

我有更改密码的一种形式,它会检查password领域min_lengthrequired。然后它将password字段与confirm字段进行比较。的Symfony验证处理

如果我张贴到这种形式具有小于所需的最小字符(和密码,并确认框匹配),它会因最小长度(预计)和密码不匹配(意外)错误。

谁能告诉为什么?

<?php 

class ChangeMyPasswordForm extends sfForm { 

    const PASSWORD_MIN_LENGTH_MSG = "<li>We could not update your password because your password must be at least 8 characters long. Please choose a different password.</li>"; 
    const PASSWORD_MISMATCH_MSG = "<li>We could not update your password because your passwords didn't match. Please try again.</li>"; 
    const PASSWORD_REQUIRED_MSG = "<li>We could not update your password because your password was blank. Please enter a password.</li>"; 

    protected static $labels = array(
     'password' => 'Your Password', 
     'confirm' => 'Re-enter Password', 
    ); 

    /** 
    * Called in sfForm's constructor. 
    */ 
    public function configure() 
    { 
     $this->setWidgets(array(
      'password' => new sfWidgetFormInputPassword(array()), 
      'confirm' => new sfWidgetFormInputPassword(array()), 
     )); 

     $this->setValidators(array(
      'password' => $this->_setPasswordValidator(), 
       'confirm' => new sfValidatorPass(), 
     )); 

     $this->mergePostValidator(
      new sfValidatorSchemaCompare('password', sfValidatorSchemaCompare::EQUAL, 
       'confirm', array(), array(
        'invalid' => self::PASSWORD_MISMATCH_MSG, 
       ) 
      ) 
     ); 

     $this->widgetSchema->setLabels(self::$labels); 
    } 

    /** 
    * Returns validators for the password field. 
    * @return sfValidatorString 
    */ 
    private function _setPasswordValidator() 
    { 
     $v = new sfValidatorString(); 
     $v->setOption('min_length', 8); 
     $v->setMessage('min_length', self::PASSWORD_MIN_LENGTH_MSG); 
     $v->setMessage('required', self::PASSWORD_REQUIRED_MSG); 

     return $v; 
    } 
} 

编辑:这可能有助于=>认为在那里我抛出错误

<?php if ($form->hasGlobalErrors() || $form->hasErrors()): ?> 
<div class="error"> 
    <p class="bottom"><b>Oops!</b></p> 
    <ul> 
    <?php foreach ($form->getGlobalErrors() as $name => $error): ?> 
     <?php echo $error ?> 
    <?php endforeach; ?> 

     <?php foreach ($form->getErrorSchema()->getErrors() as $error): ?> 
     <?php echo $error; ?> 
    <?php endforeach; ?> 
    </ul> 
</div> 
<? endif; ?> 

回答

0

终于想通了。它看起来像sfValidatorSchemaCompare比较整个小部件,验证器和所有(不只是他们返回的值)。所以,如果我比较两个窗口小部件,并且他们不具有相同的验证程序(即一个MIN_LENGTH = 3,其他的MIN_LENGTH = 6),它就会失败。

1

验证过程接受两个phaces的地方:正常验证器和后validatos,所述第一预期错误来自验证(每场)的正相。另一个意外的错误来自后验证器。当你将表单与请求值绑定在一起,并且作为$ form-> isValid()处理所有验证器(正常和post)时,所以如果这些(或者在这两种情况下)都有错误,它们将被存储在现场以供稍后显示。

希望这是非常明显的

编辑:对不起,我的英语也不怎么好,也是我的脑子好使,在这里它的东西非常有用(Symfony Forms in Action - Advanced Validaton)。无论如何,当我第一次读它时,我没有注意到“两个密码马克”部分,所以我的答案并不准确。下面是登记表格小窗口配置的一个例子,我有Symfony registration form widget configuration

+0

它有点模糊。 。 。你能多解释一下,还是指点我一篇文章? – TuK 2012-01-12 16:53:39

+0

希望它更清楚一点! – guiman 2012-01-12 17:05:23

+1

感谢吨吉尔曼! http://www.rankmycode.com.ar/code/symfony-registration-form-widget-configuration是我希望看到的! – TuK 2012-01-12 17:34:13