Zend_Form -> 优雅地更改 setRequired() 验证消息

26

假设我创建一个文本元素,像这样:

$firstName = new Zend_Form_Element_Text('firstName');
$firstName->setRequired(true);

如何更改默认错误消息的最佳方法:

值为空,但需要非空值

如何替换为自定义消息?我在某个地方读到要替换消息,只需使用addValidator(...,而不是(NO setRequired),像这样:

$firstName = new Zend_Form_Element_Text('firstName');
$firstName->addValidator('NotEmpty', false, array('messages'=>'Cannot be empty'));

但在我的测试中,这并不起作用 - 它根本没有验证 - 它会通过一个空的文本字段。 同时使用(addValidator('NotEmp.. + setRequired(true))不起作用,它会进行两次验证,并给出两个错误消息。

有什么想法吗?

谢谢!


你的发现与我的相反。$foo->setRequired(true)->addValidator('NotEmpty', false, array('messages' => 'bar')); 的效果符合预期,没有重复的信息。 - monzee
我会在新的“回答”中发布,以回应此评论,因为我的评论显然太长了。 - dittonamed
10个回答

19

设置这个“站点范围”更容易的方法可能是在引导程序或基本的 zend_controller 中执行以下操作:

<?php    
$translateValidators = array(
                        Zend_Validate_NotEmpty::IS_EMPTY => 'Value must be entered',
                        Zend_Validate_Regex::NOT_MATCH => 'Invalid value entered',
                        Zend_Validate_StringLength::TOO_SHORT => 'Value cannot be less than %min% characters',
                        Zend_Validate_StringLength::TOO_LONG => 'Value cannot be longer than %max% characters',
                        Zend_Validate_EmailAddress::INVALID => 'Invalid e-mail address'
                    );
    $translator = new Zend_Translate('array', $translateValidators);
    Zend_Validate_Abstract::setDefaultTranslator($translator);
?>

1
是的,但错误链接很长,而且可能会越来越多。希望自定义错误界面会改变。如果默认错误消息可用于向非工程师用户呈现,则过于细粒度将是可以接受的。 - joedevon
非常好的答案。一举解决了我的自定义消息问题。谢谢。 - t j
这是我在整个互联网上找到的最佳答案。 - AntonioJunior
这是一个惊人的回复。令人惊讶的是它没有更多的赞。 - SoWhat
虽然这个方法可以工作,但遗憾的是它忽略了内置的翻译,因此无法仅修复消息的一部分!很遗憾没有“addTranslator”方法或添加翻译... - user133408
显示剩余3条评论

16

试一试这个:

$firstName = new Zend_Form_Element_Text('firstName');
$firstName->setLabel('First Name')
          ->setRequired(true)
          ->addValidator('NotEmpty', true)
          ->addErrorMessage('Value is empty, but a non-empty value is required.');

关键在于如果你将验证器中的"true"设置为true,它将在之后终止其他验证。如果你添加了多个验证方法,但将其设置为false,则会验证所有方法。


太好了! addErrorMessage 就是我正在寻找的。尽管我能够删除 "->addValidator('NotEmpty', true)" 这一行。谢谢。 - dittonamed

10

Zend_Form将必须验证错误设置为“isEmpty”,因此您可以使用setErrorMessages()覆盖其消息。例如:

//Your Required Element
$element->setRequired(true)->setErrorMessages(array(
'isEmpty'=>'Please fill this field'
));

在我使用ZF 1.11的情况下,它对我有效。


它在某种意义上是有效的,因为它使表单元素返回此消息。但是,即使不同的验证器失败,仍会返回相同的消息。 - Naktibalda

9

尝试

->addValidator('Digits', false);

或者
->addValidator('Digits');

您认为检查数字必须具有字符串长度。

另外,我喜欢编写一些自定义错误消息,例如:

$firstName->getValidator('NotEmpty')->setMessage('Please enter your first name');

这个功能允许你“获取”验证器并且可以对其进行属性“设置”。

你的第二个建议非常好 - 可以很好地更改消息并完成其预期的功能。再次感谢。 - dittonamed
5
值得一提的一个怪癖是,尽管 setRequired(true) 应该在后台使用 NotEmpty 类,但如果仅使用 setRequired() 而没有使用 setValidator('NotEmpty'),则无法使用 getValidator('NotEmpty')。天哪,这是一个多么奇怪的接口。 - dittonamed
故事的寓意是 - 如果您同时验证空集和其他内容,请不要更改默认错误消息。 - dittonamed
关于你的第二条评论。这是因为setRequired()在最后一刻添加了NotEmpty验证器,即在调用isValid()时才添加。 - monzee
糟糕,太遗憾了,这个无法工作:$firstName->setRequired(true, false, array('messages'=>'必须只包含字母')); - dittonamed

5
请尝试以下方法。
$subjectElement->setRequired(true)->addErrorMessage('Please enter a subject for your message');

这对我很有帮助。

1

如果你输入:

$element->setRequired(false);

验证根本不起作用,您必须定义:

$element->setAllowEmpty(false);

为了获得正确的验证行为。

1

试试这个...

$ausPostcode = new Zend_Form_Element_Text('aus_postcode'); $ausPostcode->setLabel('Australian Postcode')
->setRequired(true)
->addValidator('StringLength', false, array(4, 4))
->addValidator(new Zend_Validate_Digits(), false)
->getValidator('digits')->setMessage('Postcode can only contain digits');

这仅为数字验证器设置自定义错误消息。


1

不过试试这个:

$firstName->setRequired(true)
          ->addValidator('NotEmpty', false, array('messages' => 'bar'))
          ->addValidator('Alpha', false, array('messages'=>'Must contain only letters'));

如果留空并提交,它将会给出两个消息bar和' '是一个空字符串 。正是来自setRequired(true)的第二条消息导致了问题。

0

使用Zend翻译器与ZendFramework-1.11.3\resources\languages\en\Zend_Validate.php中的zend_validate.php一起使用,然后根据需要修改此文件。

然后根据您的需求进行相应的修改。


0

有一个小问题。这段代码:

$zipCode->setLabel('Postal Code')
        ->addValidator('StringLength', true, array( 5, 5 ) )
        ->addErrorMessage('More than 5')
        ->addValidator('Digits', true)
        ->addErrorMessage('Not a digit');

如果任何一个验证失败,它将生成两个错误消息。难道不应该在第一个失败后停止吗?


2
据我所读,addErrorMessage() 添加了一个通用的验证错误消息。无论哪个验证器失败,它都会出现。 - monzee
是的,看起来是这样。我本来希望在addValidator中将第二个参数设置为true可以防止它显示下一个错误,但实际上并没有。 - dittonamed
如果是真的,它可以解决我正在遇到的问题...但我能否以某种方式从form.ini文件中设置它? - joedevon
你会收到两条消息,因为即使链路中断了,你仍然将消息附加到单个元素的队列上。尝试在验证器而不是元素上设置消息。请参见http://bit.ly/d8vNBJ。 - David Weinraub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接