Формы Symfony 2, встраивание коллекции во встроенную коллекцию

У меня есть структура данных, где Тема имеет много Вопросов (один для многих), и у Вопроса много ответов (один на многие).

Я задал вопросы как встроенную коллекцию в форме темы, и я все это работаю на 100% благодаря записи поваренной книги .

Когда я пытаюсь разработать это для вставки коллекции форм ответов в форме вопроса, я столкнулся с проблемой.

Атрибут-прототип данных, который содержит форму прототипа на верхнем уровне, имеет в себе всю глубину формы, поэтому включает прототип как для Вопроса, так и для ответа. Но он использует один и тот же placeholder __name__ для каждого уровня.

 <div id="topic_questions___name__"> <div class="control-group"> <label for="topic_questions___name___questionText" class="control-label">question</label> <div class="form-row-errors"></div> <div class="controls"> <textarea id="topic_questions___name___questionText" name="topic[questions][__name__][questionText]" required="required" class="input-block-level"></textarea> </div> </div> <div class="control-group"> <label class="control-label">answers</label> <div class="controls"> <div id="topic_questions___name___answers" data-prototype="&lt;div class=&quot;control-group&quot;&gt;&lt;label class=&quot;control-label&quot;&gt;__name__label__&lt;/label&gt;&lt;div class=&quot;controls&quot;&gt;&lt;div id=&quot;topic_questions___name___answers___name__&quot;&gt;&lt;div class=&quot;control-group&quot;&gt;&lt;label for=&quot;topic_questions___name___answers___name___answerText&quot; class=&quot;control-label&quot;&gt;option&lt;/label&gt;&lt;div class=&quot;form-row-errors&quot;&gt;&lt;/div&gt;&lt;div class=&quot;controls&quot;&gt;&lt;input type=&quot;text&quot; id=&quot;topic_questions___name___answers___name___answerText&quot; name=&quot;topic[questions][__name__][answers][__name__][answerText]&quot; required=&quot;required&quot; maxlength=&quot;255&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;input type=&quot;hidden&quot; id=&quot;topic_questions___name___answers___name___sortOrder&quot; name=&quot;topic[questions][__name__][answers][__name__][sortOrder]&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;"></div> </div> </div> 

Вы можете увидеть действительно длинную строку внизу, которая, я думаю, является прототипом-прототипом (!) Для формы ответа. Я не вижу возможности заменить только связанные с вопросом [__name__] заполнители, а не связанные с ответом.

Выполнение нормального

 var newForm = prototype.replace(/__name__/g, collectionHolder.children().length); 

при создании реального экземпляра формы вопроса, конечно, заменяет все экземпляры __name__ одинаковым значением, поэтому, когда прототип данных создается для формы ответа, он уже заменил все замещающие элементы.

Это то, как выглядит прототип данных для формы ответа, когда я нажал, чтобы добавить реальную форму запроса

 <div class="control-group"> <label class="control-label">1label__</label> <div class="controls"> <div id="topic_questions_1_answers_1"> <div class="control-group"> <label for="topic_questions_1_answers_1_answerText" class="control-label">option</label> <div class="form-row-errors"></div> <div class="controls"> <input type="text" id="topic_questions_1_answers_1_answerText" name="topic[questions][1][answers][1][answerText]" required="required" maxlength="255" /> </div> </div> </div> </div> 

Как вы можете видеть, заполнитель __name__ вообще не работает – он был заменен на счет для формы вопроса, когда была создана форма вопроса.

Возможно ли реализовать такую ​​коллекцию с множеством глубин с помощью механизма Symfony?

Пока он пытается использовать один и тот же заполнитель для каждого уровня, я не вижу, как это сделать.

Используете ли вы хотя бы Symfony 2.1? Если это так, вы можете изменить метку __name__ на свойство prototype_name :

http://symfony.com/doc/master/reference/forms/types/collection.html#prototype-name

В вашей форме:

 ->add('answers', 'collection', array( 'type' => new AnswerType(), 'allow_add' => true, 'prototype_name' => 'another_name' ))