Symfony2: тип поля формы коллекции с прототипом данных - PullRequest
15 голосов
/ 13 декабря 2011

У меня есть команда, в которую я хотел бы добавить игроков (объекты Player). Я настроил форму "тип" классы правильно. Вот соответствующая часть моего взгляда:

{% 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) }}. Есть ли способ включить все содержимое div#template в атрибут data-prototype?

1 Ответ

32 голосов
/ 26 января 2012

Это меня тоже беспокоило. Я настроил тип поля и даже сделал простые типы форм с уменьшенным набором полей (для более сложных объектов), но он просто не был правильным. Я придумал решение, которое должно сработать :))

Во-первых, я думаю, что ваш <div id="team" data-prototype="..."> должен быть вне вашей петли.

Далее, ваш прототип - это просто объект представления формы, поэтому, если вы передадите его в шаблон, вы сможете отрисовывать поля вручную и настраивать вывод. Примечание: autoescape не влияет на включенный контент, поэтому используйте 'escape-фильтр'.

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

Мой шаблон имеет другую структуру данных, но это должно помочь:)

Приветствия

Chris


Предупреждение об устаревании:

Начиная с Symfony 2.1, .get() устарело, и вышеописанное не будет работать. Замените form.players.get('prototype') на form.players.vars.prototype, чтобы исправить это в более поздних версиях Symfony.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...