1

我希望为表单设置一条错误消息,但仍会验证每个字段。

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

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

4

3 回答 3

0

在我看来,如果你真的每个字段只有一个验证器,为什么不在控制器中管理它,而不是覆盖 isValid ?

if ($form->isValid($_POST)) { /* success */ } else { /* error as at least one field is missing */ }

于 2012-04-30T09:03:56.240 回答
0

您可以通过在创建表单元素时从表单元素中移除“错误”装饰器来移除错误元素。这将验证所有元素,但不会产生任何错误消息。但是您必须不能在表单元素中显示错误。您必须找到其他方法来反馈错误。

于 2012-09-11T12:22:05.023 回答
0

您可以从每个元素中删除Error装饰器(因此不会显示这些错误)。然后将自定义装饰器添加到检查的表单(!)中$form->isValid()(尽管在装饰器本身中,返回装饰器所附加的实体会$this->getElement()->isValid();有点令人困惑getElement())然后呈现您的单个消息(可能在您的表单上方,使用默认位置PREPEND)。

听起来您已经处理了第二部分(在表单级别呈现您的单个消息),因此只需Error从元素本身中删除装饰器就可以为您完成工作。

于 2012-09-11T13:46:18.023 回答