1

I'm looking to set a single error message for a form, but still validate each field.

The form is a survey with 10 questions. Each of them validates the same way (->setRequired(true)). So basically, I just to validate that each questions has an answer and display one message at the top of the form if one of them is not answered.

I've tried several solutions and gotten the same result. My error is added to the form, but also, all of the individual errors show as well.

This is my latest shot at it:

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;
}

Can anyone shed some light on why this isn't working as I'd expect? There has to be a more elegant way of doing this.

EDIT:

This is what I ended up with. Probably a little different than most since my form elements are dynamically populated based on an array of questions, but the general idea should apply. Normally, you could just count the number of radio elements, but in my case, rather than looping through the elements and checking the type, it was just easier to count my array of questions.

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;
}

Still not sure this is the most elegant way, but it works for my particular case.

4

3 に答える 3

0

作成中にフォーム要素から 'Error' デコレータを削除することで、エラー要素を削除できます。これにより、すべての要素が検証されますが、エラー メッセージは生成されません。ただし、フォーム要素にエラーを表示することはできません。エラーをフィードバックする別の方法を見つける必要があります。

于 2012-09-11T12:22:05.023 に答える
0

私の見方では、実際に各フィールドに 1 つのバリデーターしかない場合、 isValid をオーバーライドする代わりに、コントローラーでそれを管理しないのはなぜですか?

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

于 2012-04-30T09:03:56.240 に答える
0

各要素からデコレータを削除できErrorます (そのため、これらのエラーは表示されません)。次に、カスタム デコレータをフォーム (!) に追加してチェックします$form->isValid()(ただし、デコレータ自体では、デコレータがアタッチされているエンティティを返すのは$this->getElement()->isValid();ちょっと混乱しgetElement()ます)、単一のメッセージをレンダリングします (おそらくフォームの上で、デフォルトの配置PREPEND)。

2 番目の部分 (フォーム レベルで単一のメッセージをレンダリングする) を処理したように聞こえるのでError、要素自体からデコレータを削除するだけで作業が完了します。

于 2012-09-11T13:46:18.023 に答える