Symfony2: collection form field type with data-prototype

Posted on

Symfony2: collection form field type with data-prototype – Here in this article, we will share some of the most common and frequently asked about PHP problem in programming with detailed answers and code samples. There’s nothing quite so frustrating as being faced with PHP errors and being unable to figure out what is preventing your website from functioning as it should like php and symfony . If you have an existing PHP-based website or application that is experiencing performance issues, let’s get thinking about Symfony2: collection form field type with data-prototype.

I have a Team to which I would like to add players (objects of Player). I’ve set up the form “type” classes correctly. Here’s the relevant part of my view:

{% for index, player in form.players %}
    <div id="template" data-prototype="{{ form_widget(form.players.get('prototype')) | e }}">
        <span class="title">{{ index }}</span>
        {{ form_row( }}
{% endfor %}

My problem is that data-prototype attribute doesn’t include the span tag; it only contains the output of {{ form_row( }}. Is there a way to include the whole content of div#template in the data-prototype attribute?

Solution :

This was bugging me too. I customized a field type and even made simple form types with a reduced fieldset (for more complex objects), but it just didn’t feel right. I’ve come up with a solution that should do the trick 🙂

First – I think your <div id="team" data-prototype="..."> should be outside your loop.

Next, your prototype is just a form view object, so if you pass it to a template you can render fields by hand and customize the output. Note: autoescape has no effect on included content, so use ‘filter escape’.

<div id="playerFields" data-prototype="{% filter escape %}{% include 'AcmeTeamBundle:Team:prototypePlayer.html.twig' with {'form': form.players.get('prototype')} %}{% endfilter %}">

Then in your prototypePlayer.html.twig, just render each field as you normally would in a form view.

    <span class="title">{{ form_label( }}</span>
    {{ form_row( }}
    <span class="age">{{ form_label(form.age) }}</span>
    {{ form_row(form.age) }}
    {# render whatever else you like from your Form/PlayerType class... #}

My template has a different data structure to your question, but it should help 🙂



Deprecation Warning:

As of Symfony 2.1, .get() is deprecated and the above will not work. Replace form.players.get('prototype') with form.players.vars.prototype to fix this in later versions of Symfony.

Leave a Reply

Your email address will not be published. Required fields are marked *