我正在为表单设置单个错误消息,但仍然验证每个字段。
该表格是一项包含10个问题的调查。它们中的每一个都以相同的方式验证(->setRequired(true)
)。所以基本上,我只是验证每个问题都有答案,如果其中一个没有回答,则在表单顶部显示一条消息。
我尝试了几种解决方案并得到了相同的结果。我的错误已添加到表单中,但同时也会显示所有单个错误。
这是我最近拍摄的照片:
public function isValid($data)
{
$errors = 0;
parent::isValid($data);
foreach ($this->getElements() as $element) {
if ($element->hasErrors()) {
$element->clearErrorMessages();
$element->setErrors(array());
$errors++;
}
}
if (count($errors) > 0) {
$this->setErrorMessages(array('Please answer all questions before proceeding.'));
return false;
}
return true;
}
任何人都可以解释为什么这不符合我的预期吗?必须有一种更优雅的方式来做到这一点。
编辑:
这就是我最终的结果。可能与大多数情况略有不同,因为我的表单元素是基于一系列问题动态填充的,但总体思路应该适用。通常,您可以只计算无线电元素的数量,但在我的情况下,不是循环遍历元素并检查类型,而是更容易计算我的问题数组。
public function isValid($data)
{
$valid_values = 0;
parent::isValid($data);
foreach ($this->getValues() as $value) {
if ($value >= 1 && $value <= 10) {
$valid_values++;
}
}
if ($valid_values <> count($this->_questions)) {
$this->setErrorMessages(array('Please answer all questions before proceeding.'));
return false;
}
return true;
}
仍然不确定这是最优雅的方式,但它适用于我的特定情况。
答案 0 :(得分:0)
我看到它的方式,如果你真的每个字段只有一个验证器,为什么不在控制器中管理它,而不是覆盖isValid?
if ($form->isValid($_POST))
{ /* success */ }
else
{ /* error as at least one field is missing */ }
答案 1 :(得分:0)
您可以在创建表单元素时从表单元素中删除“错误”装饰器来删除错误元素。这将验证所有元素,但不会产生任何错误消息。但是你必须不能在表单元素中显示错误。你必须找到另一种方法来反馈错误。
答案 2 :(得分:0)
您可以从每个元素中删除Error
装饰器(因此不会显示这些错误)。然后将自定义装饰器添加到检查$form->isValid()
的表单(!)中(尽管在装饰器本身中,$this->getElement()->isValid();
会让getElement()
返回装饰器所属的实体,这会让人感到困惑。附加)然后呈现您的单个邮件(可能在您的表单上方,使用默认展示位置PREPEND
)。
听起来你已经处理了第二部分(在表单级别渲染你的单个消息),所以简单地从元素本身删除Error
装饰器应该为你做好工作。