У меня есть команда, в которую я хотел бы добавить игроков (объекты Игрока). Я правильно настроил классы типа «тип». Вот часть моего мнения:
{% 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 %}
Моя проблема заключается в том, что атрибут data-prototype не включает тег span; он содержит только результат {{ form_row(player.name) }}
. Есть ли способ включить в контент data-prototype
весь контент div#template
?
Меня это тоже раздражало. Я настроил тип поля и даже сделал простые типы форм с уменьшенным набором полей (для более сложных объектов), но он просто не чувствовал себя хорошо. Я придумал решение, которое должно сделать трюк 🙂
Во-первых, я думаю, что ваша <div id="team" data-prototype="...">
должна находиться вне вашей петли.
Затем ваш прототип – это просто объект вида формы, поэтому, если вы передадите его в шаблон, вы можете визуализировать поля вручную и настраивать вывод. Примечание. Autoescape не влияет на включенный контент, поэтому используйте «escape filter».
<div id="playerFields" data-prototype="{% filter escape %}{% include 'AcmeTeamBundle:Team:prototypePlayer.html.twig' with {'form': form.players.get('prototype')} %}{% endfilter %}">
Затем в вашем prototypePlayer.html.twig просто визуализируйте каждое поле, как обычно, в виде формы.
<div> <span class="title">{{ form_label(form.name) }}</span> {{ form_row(form.name) }} <span class="age">{{ form_label(form.age) }}</span> {{ form_row(form.age) }} {# render whatever else you like from your Form/PlayerType class... #} <div>
Мой шаблон имеет другую структуру данных на ваш вопрос, но он должен помочь 🙂
Ура,
Крис
Начиная с Symfony 2.1, .get()
устарел, и выше не будет работать. Замените form.players.get('prototype')
на form.players.vars.prototype
чтобы исправить это в более поздних версиях Symfony.