消息不在Zend_Form_Element文本上

时间:2011-09-14 01:21:32

标签: php zend-framework validation zend-form zend-form-element

在表单中,我有以下元素:

    $email = new Zend_Form_Element_Text('username');
            $email
                    ->setLabel($this->getView()->l('E-mail'))
                    ->setRequired(TRUE)
                    ->addValidator('EmailAddress')
                    ->addValidator('Db_NoRecordExists', true,
                            array(
                                'table' => 'pf_user',
                                'field' => 'email',
                                'messages' => array(
                                    'recordFound' => 'This username is already registered',
                                )
                    ))
                    ->setErrorMessages(array(
                        'emailAddressInvalidFormat' => 'You must enter a valid e-mail',
                        'isEmpty' => 'You must enter an e-mail',
                        'recordFound' => 'This e-mail has already registered in out database'
                    ));
$form->addElement($email)

问题是我总是得到相同的消息“你必须输入有效的电子邮件”(第一个)。有人知道这是什么错误吗?

2 个答案:

答案 0 :(得分:1)

实际上,您正在做的是以下内容:

  1. 您在元素上设置错误
  2. Zend现在认为元素没有正确验证,第一个错误是 “您必须输入有效的电子邮件”
  3. 当您显示表单时,由于您设置了错误,Zend将找到它们并显示它找到的第一个。如果你切换订单,那么你会发现你提出的错误就是你得到的错误。
  4. 更正确的方法是在验证程序中设置自定义消息。调用验证器验证元素时,如果验证失败,验证器将调用元素上的setErrorMessages来设置您指定的自定义错误。请使用以下此类代码设置自定义消息。

    $element->addValidator( array( 'Db_NoRecordExists', true, array( 
    'messages' = array(
    Zend_Validate_Db_Abstract::ERROR_NO_RECORD_FOUND => 'Myy custom no error record',
    Zend_Validate_Db_Abstract::ERROR_RECORD_FOUND    => 'My custom record error'
    )
    ) ) );
    

    你会发现通常在每个验证器类中都有一些consts指定一种类型的错误。在这种情况下,consts位于DB_NoRecordExists类的父类中,但通常您可以直接在顶部附近的类中找到它们。

答案 1 :(得分:0)

基本上通过将'true'作为第二个参数传递给addValidator(),你会说验证器在验证器失败时打破链。由于“”不是有效的电子邮件地址,因此第一个电子邮件验证程序失败并打破链

来自Zend Doc http://framework.zend.com/manual/en/zend.validate.validator_chains.html

  

在某些情况下,如果有一个验证器打破链条是有道理的   其验证过程失败。 Zend_Validate支持此类用例   使用addValidator()方法的第二个参数。通过设置   $ breakChainOnFailure为TRUE,添加的验证器将打破链   失败时执行,避免运行任何其他验证   被认定为不必要或不适合的人   情况。如果上面的例子写成如下,那么   如果字符串长度不会发生字母数字验证   验证失败:

$validatorChain->addValidator(
                    new Zend_Validate_StringLength(array('min' => 6,
                                                         'max' => 12)),
                    true)
               ->addValidator(new Zend_Validate_Alnum());