【问题标题】:Messages not working on Zend_Form_Element_Text消息在 Zend_Form_Element_Text 上不起作用
【发布时间】:2011-09-14 01:21:32
【问题描述】:

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

    $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)

问题是我总是收到相同的消息“您必须输入有效的电子邮件”(第一个)。有谁知道错在哪里??

【问题讨论】:

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


    【解决方案1】:

    其实你在做的事情如下:

    1. 您在元素上设置了错误
    2. Zend 现在认为元素没有正确验证,第一个错误是 "您必须输入有效的电子邮件"
    3. 当您显示表单时,由于您设置了错误,Zend 将找到它们并显示它找到的第一个。如果您切换顺序,那么您会发现无论您放在最前面的哪个错误都会是您得到的错误。

    更正确的方法是在验证器中设置自定义消息。当调用验证器对元素进行验证时,如果验证失败,验证器将调用元素上的 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'
    )
    ) ) );
    

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

    【讨论】:

      【解决方案2】:

      基本上通过将'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());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-18
        • 1970-01-01
        相关资源
        最近更新 更多