我在Zend Framework 2中遇到了这个愚蠢的错误消息。花了两个小时而没有,我仍然使用NotEmpty验证器获得两个不同的错误消息。
$nameNotEmptyMessage = 'Pole wymagane';
$inputFilter->add(array(
'name' => 'name',
'required' => true,
'filters' => array(
new Filter\StringTrim()
),
'validators' => array(
new Validator\NotEmpty(array(
'messages' => array(
Validator\NotEmpty::INVALID => $nameNotEmptyMessage,
Validator\NotEmpty::IS_EMPTY => $nameNotEmptyMessage
)
))
)
));
什么?当我用" name"发送表单时,它的工作非常酷。里面的元素。当它空了,我收到了我的信息。但是,当我发送没有"名称"在其中的元素,消息仍然是"值是必需的,并且不能为空"!为什么呢?
我需要在两种情况下都有相同的信息,因为有时表格不会有" name"元件。
非常感谢你们!
答案 0 :(得分:1)
感谢您回复评论以澄清问题。首先我必须说,我觉得你对这个感到痛苦。在没有使用ZF2超过一年并花费一些时间来解决这个问题之后,它突显了ZF2中的另一个痛苦的事情。
那就是说,这是我的简单解决方案。没有必要正确,或者最好的方法,但它用最少的代码解决了你的问题。 在您实例化并验证表单的控制器中,在致电new Form
之前添加此代码:
if (!isset($_POST['name'])) {
$this->getRequest()
->setPost(
new \Zend\Stdlib\Parameters(
array('name' => '')
)
);
}
这似乎是最简单的路线,而不是设置默认验证转换器并添加重复消息。只是检查name
字段是否不存在,如果是,则将其设置为任何空值。
现在我们必须这样做的原因:
这是因为\Zend\InputFilter\Input
的工作原理。当InputFilter运行时,它会看到元素缺少。然后它检查required
属性,看到它是真的,但输入没有值。没有值与空不同。
当需要过滤但没有输入时,会调用\Zend\InputFilter\Input::prepareRequiredValidationFailureMessage
。如果你看一下该函数的来源,你会看到:
protected function prepareRequiredValidationFailureMessage()
{
$notEmpty = new NotEmpty();
$templates = $notEmpty->getOption('messageTemplates');
return [
NotEmpty::IS_EMPTY => $templates[NotEmpty::IS_EMPTY],
];
}
注意它如何创建新的NotEmpty
验证器并获取其默认消息,从而绕过您在InputFilter中设置的转换。
替代方案:
一种替代方案,可能更正确,但也需要更多代码,并且可能更容易让人感到困惑,以后再回过头来创建一个实现\Zend\Validator\Translator\TranslatorInterface
的新类,并设置一个包含该消息的翻译的数组,然后调用\Zend\Validator\AbstractValidator::setDefaultTranslator
传递,以便在该消息上使用默认翻译器。
这很难,因为没有简短的方法来设置该对象,因为这些类是如何继承的,而且我无法找到一个快速解决方案来设置只有该消息的默认翻译器。此外,如果你有另一个翻译,它可能会干扰它。
所以看起来最简单的事情就是检查该表单字段是否缺失,如果缺少任何空值,则将其填充。
希望有所帮助!
答案 1 :(得分:0)
其他更简单的解决方法是覆盖Form setData($ data)并检查是否设置了$ data ['name']。像这样:
public function setData($data)
{
if(!isset($data['name'])){
$data['name'] = '';
}
return parent::setData($data);
}