2

フォームにドロップダウン メニューがあり、フォームの構造はその値に依存します。ドロップダウンの値に従ってメインフォームを更新しようとしているイベントサブスクライバー/リスナークラスで「フォーム更新の問題」を解決することができました。

主な問題は、データベースに保持されている値からフォームを変更する必要があることです。私のDBスキーマ:

ModelModelCategoryModelCategoryKeyModelParameterの4つのテーブルがあります。

  • ModelCategory 1--n モデル 1--m ModelParameter
  • ModelCategory 1--n ModelCategoryKey
  • ModelCategoryKey 1--n ModelParameter

ユーザーがフォーム (Model エンティティに基づくフォーム) のドロップダウンから ModelCategory を選択した後、フォームを ModelParamater 行で更新する必要がありますが、その数とデフォルト値は ModelCategory 1--n ModelCategoryKey の関連付けに依存します。

PRE_BIND イベント中に新しい ModelParameter エンティティをメインの Model エンティティにアタッチしようとしました (デフォルト値も設定します)。正常に動作しているように見えますが、「コレクション」型の要素を持つ「パラメータ」をフォームに追加すると、次のエラーを取得します。

選択フィールドに渡されるエンティティは管理する必要があります。たぶんエンティティマネージャーでそれらを永続化しますか?

明らかに、現時点ではエンティティを永続化することはできません (永続化すべきではありません)。

すべてのアイデアを歓迎します!

更新: preSubmit/preBind 後のフォームの変更:

$form->add('parameters','collection',array(
    'type' => new ModelParameterType(),         
));

また

$form->add(
            $this->factory->createNamed('parameters','collection',null,
                array(
                    'type' => new ModelParameterType()
                    ))
        );

ここで、「factory」属性は FormFactoryInterface です。エラーメッセージは同じです。

更新 2:

さらに調査した結果、関連付けに「デフォルト」エンティティを追加しないと判明しました。その後、エラーなく動作します。

これが私のフォーム変更メソッドのソースです:

public function preSubmit(FormEvent $event) {
    $form = $event->getForm();  
    $id = $event->getData()['modelCategory'];       
    $entity = $form->getData();
    $categoryKeys = $this->em->getRepository('MyBundle:ModelCategoryKey')->findByModelCategory(
        $this->em->getReference('MyBundle:modelCategory',$id)
    );      
    foreach ($categoryKeys as $key) {
        $param = new ModelParameter();
        $param->setModel($entity);
        $param->setKey($key); 
        $entity->addParameter($param);
    }

    $form->add(
        $this->factory->createNamed('parameters','collection',null,
            array(
                'type' => new ModelParameterType(),
                'allow_add' => true,
                'cascade_validation' => true
                ))
    );

}

$ param- >setModel($entity); をコメントアウトしました。ラインとそれは正常に動作しているようです。私はこれをさらに解決し、実際に機能する場合はその経験を共有します.

4

2 に答える 2

0

choiceフィールドは、送信後に値がエンティティに設定されるため、管理されたエンティティのみを受け入れ、フォームはエンティティ ID のみを投稿するため、事前に保存する必要があります。

選択フィールドは必要ありません。パラメーター サブフォームのコレクションが必要です。

$formBuilder
    ->add('category', 'category_select')
    ->add('parameters', 'collection', array('type' => 'parameter'))
;

ここでは、パラメーター構造に応じて、category_selectカテゴリを持つ選択フィールドであり、独自の値を持つサブフォームであると想定しています。parameter

keyコントローラーにカテゴリがある場合、ModelCategoryKey に応じて、新しく作成されたエンティティを追加されたパラメータ エンティティとそのセットにバインドできます。

于 2013-09-06T21:16:56.523 に答える
0

私は自分の問題を解決することができたので、ここに私が見つけたものがあります:

  • 新たに作成したオブジェクトを逆側の adder 関数で追加すればよい。所有側のセッターを呼び出す必要はありません。
  • 所有側のセッターを呼び出すように、逆側の加算器関数を変更する必要があります。
  • Inverse side adder 関数は、オブジェクトがまだコレクションにないかどうかを確認する必要があります。
  • フォームが作成されると、PRE_SET_DATA イベントが発生します。(したがって、新しいエンティティでは空であり、古いエンティティでは満たされています)
于 2013-09-08T20:47:11.830 に答える