Отобразить ошибки формы Zend_Form в ViewScript - PullRequest
5 голосов
/ 11 августа 2010

Я пытаюсь отобразить все ошибки формы перед формой, используя ViewScript. Вот код, который я сейчас пытаюсь использовать в своем ViewScript:

<div class="errors">
<?php echo $this->formErrors($this->element->getMessages()); ?>
</div>

Этот звонок дает мне сообщение об ошибке:

Предупреждение: htmlspecialchars () ожидает, что параметр 1 будет строкой, задан массив

Я видел, как этот код предлагал другие места, но он не работает для меня. Если я распечатываю $ this-> element-> getMessages (), я вижу сообщения об ошибках следующим образом:

Array ([myField] => Array ([isEmpty] => Значение является обязательным и не может быть пустым))

Есть идеи?

Ответы [ 2 ]

7 голосов
/ 12 августа 2010

getMessages () возвращает массив имен элементов формы в виде ключей, каждый из которых содержит массив ошибок для этого элемента. Таким образом, в основном вместо передачи помощника вида formErrors:

Array ( [isEmpty] => Value is required and can't be empty )

Вы передаете это:

Array ( [myField] => Array ( [isEmpty] => Value is required and can't be empty ) )

Вы хотели бы сделать что-то вроде этого:

$arrMessages = $this->myForm->getMessages();
foreach($arrMessages as $field => $arrErrors) {
    echo sprintf(
        '<ul><li>%s</li>%s</ul>',
        $this->myForm->getElement($field)->getLabel(),
        $this->formErrors($arrErrors)

    );
}
0 голосов
/ 23 января 2015

Поскольку Mark указывает в своем ответе, getMessages () возвращает массив имен элементов формы в виде ключей, каждый из которых содержит массив ошибок для этого элемента;и его решение:

$arrMessages = $this->myForm->getMessages();
foreach($arrMessages as $field => $arrErrors) {
    echo sprintf(
        '<ul><li>%s</li>%s</ul>',
        $this->myForm->getElement($field)->getLabel(),
        $this->formErrors($arrErrors)

    );
}

Это работает, пока getMessages() приводит к двумерному массиву.Однако, если форма основана на наборах реляционных данных, сгенерированных Doctrine (или каким-либо другим плагином), сообщение об ошибке, связанное с полем, также может быть массивом, и приведенный выше код завершится сбоем, поскольку при обработке он обрабатывает $arrErrors как строкуоказывается массивом.

Чтобы захватить сообщения об ошибках, если есть второй набор данных, мы могли бы ввести оператор foreach, вложенный в первый оператор foreach, но это не сработает, когда getMessages() приведет кдвумерный массив;и не работает, если наборы данных имеют глубину более двух.

В сценарии реляционных данных, в котором мы не знаем, насколько глубоким является сообщение об ошибке, масштабируемое решение имеет значение

$arrMessages = $this->myForm->getMessages();
print_r ($arrMessages);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...