Symfony2 form_errors

Я думаю, что это простой вопрос. О выпуске ошибок. Это мой файл с twig:

<table> <tr> <td>{{ form_label(form.dueDate) }}</td> <td>{{ form_widget(form.dueDate) }}</td> <td>{{ form_errors(form.dueDate) }}</td> </tr> <tr> <td>{{ form_label(form.task) }}</td> <td>{{ form_widget(form.task) }}</td> <td>{{ form_errors(form.task) }}</td> </tr> </table> 

Теперь каждая ошибка отображается (td с помощью form_errors ()) как:

<ul> <li> Это значение не должно быть пустым </ li> </ ul>

Мой вопрос: я хочу вывести ошибку как обычный текст (без ul и li).

Я знаю, что есть пример:

 {% for error in errors %} {{ error.message }} {% endfor %} 

Но это будет выводить ошибки один за другим. Я хочу показать их там, где конкретный вход:

<td> {{myErrorFor form.dueDate}} </ td>

Большое спасибо за любую помощь

Solutions Collecting From Web of "Symfony2 form_errors"

Вы можете настроить способ визуализации ошибок формы, предоставив свою собственную тему field_errors блоку field_errors .

Вы можете сделать это только для текущего шаблона:

 {# tell the form to look for theme blocks in the current template #} {% form_theme form _self %} {% block field_errors %} {% for error in errors %} {{ error.messageTemplate|trans(error.messageParameters, 'validators') }}<br> {% endfor %} {% endblock %} {# the rest of your template... #} 

Или, задав тему глобальной формы в config.yml :

 twig: form: { resource: "::form_theme.html.twig" } 

В этом случае вам нужно переместить блок field_errors выше в app/Resources/views/form_theme.html.twig и тег form_theme больше не нужен.

Вот мое решение. Я решил создать массив с ошибками и передать его в представление (twig). Мне потребовалось некоторое время, чтобы выяснить, как получить сообщения об ошибках … но здесь мы идем:

  // Controller example: public function indexAction(Request $request) { $task = new \Michael\MikeBundle\Entity\Task(); $task->setTask('Write a blog post'); $task->setDueDate(new \DateTime('tomorrow')); $form = $this->createFormBuilder($task) ->add('task', 'text', array('attr' => array('title' => 'Enter Task'))) ->add('dueDate', 'date', array( 'widget' => 'single_text', 'required' => false, 'attr' => array('title' => 'Insert due date'))) ->getForm(); // If user submitted code if ($request->getMethod() == 'POST') { // Get form part from request $request->request->get('form'); // Bind request into the form $form->bindRequest($request); } // Pass into the view return array('errors' => $this->_getErrors($form), 'form' => $form->createView()); } protected function _getErrors($form) { // Validate form $errors = $this->get('validator')->validate($form); // Prepare collection $collection = array(); // Loop through each element of the form foreach ($form->getChildren() as $key => $child) { $collection[$key] = ""; } foreach ($errors as $error) { $collection[str_replace("data.", "", $error->getPropertyPath())] = $error->getMessage(); } return $collection; } 

Важной частью является метод _getErrors ($ form), поскольку он возвращает такой массив (если есть ошибки)

$ errors ['task'] = Это значение не должно быть пустым

$ errors ['dueDate'] = ""

И вот ветка:

  <table> <tr> <td>{{ form_label(form.dueDate) }}</td> <td>{{ form_widget(form.dueDate) }}</td> <td>{{ errors[form.dueDate.vars["name"]] }}</td> </tr> <tr> <td>{{ form_label(form.task) }}</td> <td>{{ form_widget(form.task) }}</td> <td>{{ errors[form.task.vars["name"]] }}</td> </tr> </table> 

Надеюсь, он достаточно ясен. Дайте мне знать, если вам нужна помощь.

Пожалуйста, напишите ответ, если есть более простой способ сделать это.

Не могу добавить комментарии, но я хотел бы обновить ответ Криса Валлсмита. В настоящее время этот блок называется form_errors , поэтому в третьей строке он должен быть {% block field_errors %} . Мне потребовалось некоторое время, чтобы расследовать, надеюсь, кто-то выиграет от этого.

Еще одно простое решение (проверено на symfony 3):

 {% for error in form.username.vars.errors %} {{ error.message }} <br/> {% endfor %} 

Замените «имя пользователя» на поле формы.