Symfony 2形成,在嵌入式集合中嵌入集合

时间:2012-11-03 10:44:09

标签: php symfony

我有一个数据结构,其中主题有很多问题(一对多),而一个问题有很多答案(一对多)。

我已将问题设置为主题表单中的嵌入式集合,并且由于cookbook entry,我已将其全部工作100%。

当我尝试开发这个以在问题表单中嵌入答案表单的集合时,我遇到了问题。

包含顶级原型表单的data-prototype属性在其中具有完整的表单深度,因此包括问题和答案的原型。但它为每个级别使用相同的占位符__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__的所有实例替换为相同的值,因此当为Answer表单创建数据原型时,它已经替换了所有占位符。

当我点击添加一个真实的问题表格时,这就是“答案”表格的数据原型。

<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提供的机制实现这种多深度嵌入式集合?

只要它尝试为每个“级别”使用相同的占位符,那么我就看不出如何。

1 个答案:

答案 0 :(得分:12)

您是否至少使用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'
))