Symfony2 form_errors - PullRequest
       0

Symfony2 form_errors

5 голосов
/ 28 декабря 2011

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

    <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 with form_errors ()) как:

  • Это значение не должно быть пустым

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

Я знаю, что есть пример, подобный этому:

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

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

{{myErrorFor form.dueDate}}

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

Ответы [ 4 ]

13 голосов
/ 29 декабря 2011

Вы можете настроить отображение ошибок формы, предоставив собственную тему формы с блоком 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 больше не нужен.

2 голосов
/ 29 декабря 2011

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

    // 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>

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

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

1 голос
/ 20 февраля 2016

Другое простое решение (протестировано с Symfony 3):

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

Замените 'username' на ваше поле формы.

1 голос
/ 17 апреля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...