3

私のProductエンティティには次の構造があります。

private $id;

private $title;

/**
 * @ManyToOne(targetEntity="Category")
 * @JoinColumn(name="cat_id", referencedColumnName="id")
 */
private $category;

Category入れ子構造になっています。ネストの各レベルは、5 つの個別のフィールドに表示されます。

ここに画像の説明を入力

クラス形式のコードでは、次のように解決します。

$builder
->add('cat_1', 'entity', array(
    ...
    'query_builder' => function() { return someSelectLogic1(); }
))
->add('cat_2', 'entity', array(
    ...
    'query_builder' => function() { return someSelectLogic2(); }
))
->add('cat_3', 'entity', array(
    ...
    'query_builder' => function() { return someSelectLogic3(); }
))
->add('cat_4', 'entity', array(
    ...
    'query_builder' => function() { return someSelectLogic4(); }
))
->add('cat_5', 'entity', array(
    ...
    'query_builder' => function() { return someSelectLogic5(); }
))

ここで、最後のターンで入力されたフィールドを把握し、そのフィールドの値をエンティティ プロパティに渡す必要があります。

私が好きではないすべての点で:

  • 最後にどのフィールドにカテゴリが入力されたかを判断するための複雑なロジック

  • これらの各フィールドはエンティティに関連付けられていません'mapped' => false

1)フォームのコードを整理する正しい方法は?

2)そして、これらのフィールドを、最終的に選択されたカテゴリを決定するロジックを処理する別のクラスに入れる方法はありますか?

4

1 に答える 1

3

次のことをお勧めします。

1) 新しいカスタム フォーム フィールド タイプを作成し、それらすべてentityをそこに配置します。

このプロセスは、通常の帳票タイプの作成と大差ありません。それらのフィールドをそれ自体で囲むだけでbuildForm()、うまくいくはずです。ドキュメント.

2) これらすべてのentityフィールドをプロパティ " property_path=> false" でマークします。

明らかに、これらの値をモデル内に保存することはありません。

3) さらに 2 つのフィールドを追加します:chosenlastOne.

さて、これはトリッキーかもしれません: chosentotext型 (基本的にはジェネリック型) を設定するか、同様に使用entityします。あなたが行くなら、すべてのエンティティフィールドentityからのすべての可能な回答を含める必要があります。に設定すると、最後に選択されたフィールド (名前) が反映されます。lastOnetext

いずれにせよ、これら 2 つのフィールドは非表示になります。forフィールドに設定property_pathすることを忘れないでください。falselastOne

4) 最後に、最後に選択されたフィールドを「確認」するためのロジックを含むValueTransformer( docs ) を追加します。

今、私はそれを一度だけ扱ったので、まだ完全に理解していないので、残念ながら公式ドキュメントの例で試行錯誤するのが最善の策です.

基本的にすべきことは、 value-transformer 内で field の値を読み取ることですlastOne。これにより、最後に選択されたフィールドの名前が表示されます。次に、その値を使用して、選択された実際の最後の値を読み取ります。最後に、その値 (entityタイプの場合はオブジェクト、それ以外の場合は ID) をchosenフィールドに設定します。

基本的にはそれでうまくいくはずです。

JSに関しては、フレームワークを使用しているかどうかはわかりませんが、jQueryを想定しています。lastOneフォームの選択項目としてフィールドを設定する必要があります。

$(function(){
    $('#myform').find('select').on('change', function(){
        var $this = $(this);
        $this.closest('form').find('#__ID_OF_YOUR_LASTONE_FIELD').val($this.attr('name'));
    });
});

申し訳ありませんが、現時点ではコード サンプルを提供できませんPHP。ここでは少し遅れており、明日この回答をさらに更新するために最善を尽くします。

于 2013-03-11T01:43:09.180 に答える