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(player.name) }}
</div>
{% endfor %}
My problem is that data-prototype attribute doesn’t include the span tag; it only contains the output of {{ form_row(player.name) }}. Is there a way to include the whole content of div#template in the data-prototype attribute?
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’.
Then in your prototypePlayer.html.twig, just render each field as you normally would in a form view.
My template has a different data structure to your question, but it should help 🙂
Cheers,
Chris
Deprecation Warning:
As of Symfony 2.1,
.get()is deprecated and the above will not work. Replaceform.players.get('prototype')withform.players.vars.prototypeto fix this in later versions of Symfony.