フォームにドロップダウン メニューがあり、フォームの構造はその値に依存します。ドロップダウンの値に従ってメインフォームを更新しようとしているイベントサブスクライバー/リスナークラスで「フォーム更新の問題」を解決することができました。
主な問題は、データベースに保持されている値からフォームを変更する必要があることです。私のDBスキーマ:
Model、ModelCategory、ModelCategoryKey、ModelParameterの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); をコメントアウトしました。ラインとそれは正常に動作しているようです。私はこれをさらに解決し、実際に機能する場合はその経験を共有します.