7

トピックに多くの質問 (1 対多) があり、質問に多くの回答 (1 対多) があるデータ構造があります。

トピック フォームに埋め込みコレクションとして質問を設定しました。クックブック エントリのおかげで、すべてが 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__同じ値に置き換えられます。そのため、データ プロトタイプが回答フォーム用に作成されると、すべてのプレースホルダーが既に置き換えられています。

これは、クリックして実際の質問フォームを追加したときの、回答フォームのデータ プロトタイプの外観です。

<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 が提供するメカニズムを使用して、この種の複数の深さの埋め込みコレクションを実現することは可能ですか?

「レベル」ごとに同じプレースホルダーを使用しようとする限り、方法がわかりません。

4

1 に答える 1

12

少なくとも Symfony 2.1 を使用していますか? その場合、次__name__のプロパティでラベルを変更できますprototype_name

http://symfony.com/doc/master/reference/forms/types/collection.html#プロトタイプ名

あなたのフォームで:

->add('answers', 'collection', array(
    'type' => new AnswerType(),
    'allow_add' => true,
    'prototype_name' => 'another_name'
))
于 2012-11-03T11:20:34.703 に答える