Symfony2 form_errors

后端 未结 4 769
情书的邮戳
情书的邮戳 2021-02-06 14:51

I think its a simple question. Its about outputting errors. This is my twig file:

    
{{ form_label(form.d
相关标签:
4条回答
  • 2021-02-06 15:21

    Here is my solution. I have decided to create an array with errors and pass it into the view (twig). It took me a while to work out how to get error messages... but here we go:

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

    The important part is method _getErrors($form) as it returns an array like this (if there are errors)

    $errors['task'] = This value should not be blank

    $errors['dueDate'] = ""

    And here is twig part:

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

    I hope its clear enough. Let me know if you need help.

    Please post answer if there is an easier way to do it.

    0 讨论(0)
  • 2021-02-06 15:27

    Another simple solution (tested with symfony 3):

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

    Replace 'username' with your form field.

    0 讨论(0)
  • 2021-02-06 15:29

    You can customize how form errors render by providing your own form theme with a field_errors block.

    You can do this for just the current template:

    {# 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... #}
    

    Or by defining a global form theme in config.yml:

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

    In this case you would want to move the field_errors block above to app/Resources/views/form_theme.html.twig and the form_theme tag is no longer necessary.

    0 讨论(0)
  • 2021-02-06 15:31

    Can't add comments yet, but I would like to update Kris Wallsmith's answer. Nowadays this block is called form_errors, so in 3rd line it should be {% block field_errors %}. It took me a while to investigate, hopefully someone benefits from that.

    0 讨论(0)
提交回复
热议问题