在Zend表单验证中只显示一个错误

时间:2012-04-27 20:55:59

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

我正在为表单设置单个错误消息,但仍然验证每个字段。

该表格是一项包含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;
}

仍然不确定这是最优雅的方式,但它适用于我的特定情况。

3 个答案:

答案 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装饰器应该为你做好工作。