Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Symfony3 Render multiple time same form

I would like to render the same form multiple times to handle the same action for two different tabs. The problem is that when I try, only the form of the first tab is shown, event if I change the id and name of the form. I found out it's the expected behavior of symfony, but I still need it to work.

I found that it may works with a collection but don't get how it would work.

twig:

{{ form(contactForm, {'attr': {'id': 'contactFormId' ~ Client.Id}, 'name': "contactFormName" ~ Client.Id})}}

Form:

$this->contactForm = $this->createFormBuilder($contact, array('allow_extra_fields' =>true))
->add('Nom',        TextType::class, array('mapped'=>false))
->add('Prenom',     TextType::class, array('mapped'=>false))
->add('Telephone',  TextType::class, array(
    'label' => 'Téléphone'))
->add('Email',      TextType::class)
->add('Ajouter',    SubmitType::class)
->getForm();
like image 505
Valentin BEAULE Avatar asked Mar 29 '16 13:03

Valentin BEAULE


2 Answers

It is an older question, but I just came across it facing a similar situation. I wanted to have multiple versions of one form object in a list view. For me the solution was to move the createView() call on the form object to the view instead of calling it in the controller. This is kind of a dirty solution regarding separation of concerns, but I thought to post it so it may help others anyway.

My controller action looks like this:

/**
 * @Route("", name="cart_show")
 * @Method("GET")
 */
public function showAction(Request $request)
{

    /** @var CartInterface $cart */
    $cart = $this->get('rodacker.cart');

    $deleteForm = $this->createDeleteForm();

    return $this->render(
        'AppBundle:Cart:show.html.twig',
        ['cart' => $cart, 'deleteForm' => $deleteForm]
    );

    // ...
    private function createDeleteForm()
    {
        return $this->createForm(
            OrderItemDeleteType::class,
            null,
            [
                'action' => $this->generateUrl('cart_remove_item'),
                'method' => 'DELETE',
            ]
        );
    }
}

and in the view I set the form variable by calling the createView function on the form variable (deleteForm) passed from the controller:

{% for item in items %}
    {% set form =  deleteForm.createView %}
    {{ form_start(form) }}
    {{ form_widget(form.item, {'value': item.image.filename}) }}
    <button type="submit" class="btn btn-xs btn-danger" title="Artikel entfernen">
        <i class="fa fa-trash-o"></i> entfernen
    </button>
    {{ form_end(form) }}
{% endfor %}
like image 124
lordrhodos Avatar answered Oct 19 '22 16:10

lordrhodos


Once you render a Symfony form, the same form will not render again.

I would suggest creating a form class and calling Controller::createForm() multiple times to create the desired amount of Form instances; you can call isSubmitted etc. on all forms independently. http://symfony.com/doc/current/book/forms.html#creating-form-classes

like image 37
Richard Avatar answered Oct 19 '22 16:10

Richard