显示所有错误的Zend表单/ Zend表单在每个输入字段上方显示错误

时间:2011-02-11 20:07:18

标签: php zend-framework zend-form

对于表单,我使用以下代码:

class Application_Form_User_Register extends Zend_Form 
{
     public function init() 
     {
        $email = new Zend_Form_Element_Text('email');
        $email->setLabel('Email adres: (*)')
        ->setRequired(true)
        ->addErrorMessage('Het veld Email adres is verplicht')
        ->addValidator('StringLength', false,array(6,100))
        ->addErrorMessage('Het email adres dient uit minstens 6 karakters te bestaan')
        ->addValidator('EmailAddress')
        ->addErrorMessage('Het veld Email adres moet een geldig email adres bevatten')
        ->addFilter('StringTrim');
        $this->addElement($email);
    }
}

当我从此表单发布错误的电子邮件地址时,它会显示所有3条错误消息。

例如:如果我发布“thisisa @ nonvalidadress”,则会显示所有错误,包括错误“电子邮件地址应至少为6个字符”。

有没有办法改变这种行为?

然后是第二个问题......有没有办法在相应的输入字段上方显示错误消息? 默认情况下,错误消息显示在下方。

3 个答案:

答案 0 :(得分:2)

首先回答了问题。第二个应该是这样的:

$element->getDecorator('Errors')->setPlacement('prepend');

答案 1 :(得分:1)

addValidator()方法的第二个参数是breakChainOnFailure metacommand。只需设置if为true。所以你会这样做

class Application_Form_User_Register extends Zend_Form 
{
 public function init() 
 {
    $email = new Zend_Form_Element_Text('email');
    $email->setLabel('Email adres: (*)')
    ->setRequired(true)
    //->addErrorMessage('Het veld Email adres is verplicht')
    ->addValidator('StringLength', true, array(6,100))
    //->addErrorMessage('Het email adres dient uit minstens 6 karakters te bestaan')
    ->addValidator('EmailAddress', true)
    //->addErrorMessage('Het veld Email adres moet een geldig email adres bevatten')
    ->addFilter('StringTrim');
    $this->addElement($email);
}

}

如果失败,这将破坏验证器链。

以下是Zend Framework网站关于自定义验证程序消息的说明:

注意:提供自定义验证程序错误消息 一些开发人员可能希望为验证器提供自定义错误消息。 Zend_Form_Element :: addValidator()方法的$ options参数允许您通过提供键“消息”并将其映射到键/值对数组来设置消息模板。您需要知道特定验证器的各种验证错误类型的错误代码。 更好的选择是在表单中使用Zend_Translate_Adapter。错误代码由默认的错误装饰器自动传递给适配器;然后,您可以通过为验证程序的各种错误代码设置翻译来指定自己的错误消息字符串。

详情请见:http://framework.zend.com/manual/en/zend.form.elements.html

您的第二个问题,即更改错误消息显示的位置,需要在这些表单元素上自定义装饰器。你绝对可以做到这一点,并不像最初看起来那么困难。这篇文章真的帮助我理解装饰器:http://devzone.zend.com/article/3450

答案 2 :(得分:1)

Sudol是关于传递breakChainOnFailure参数的,如果您想在第一次失败后停止验证。

但是你的问题出在你调用元素的addErrorMessage()方法中。此方法设置将在元素验证失败时显示的错误消息但是它未指定消息与失败的验证器之间的任何连接。这就是为什么每次验证器失败时都会收到所有三条消息。

所以你需要做的是为每个验证器而不是元素指定错误消息。

$emailValidator = new Zend_Validate_EmailAddress();
$emailValidator->setMessage( 'Het veld Email adres moet een geldig email adres bevatten' );

$email->addValidator( $emailValidator );

或者,您可能希望使用Zend_Translate来翻译标准错误消息。