JavaScript を使用せずにフォームを自動レンダリングすることは不可能と思われるため、これに対する回避策を見つけました。
を使用してフォーム全体を一度にレンダリングする代わりに、{{ form_widget(form) }}
フィールドごとにレンダリングし、 を使用{{ form_widget(form.categoy.vars.prototype) }}
して Category コレクションをレンダリングしています。テンプレート コードは次のようになります。
<div id="form">
{{ form_start(form) }}
{{ form_errors(form) }}
...
{{ form_row(form.name) }}
{{ form_row(form.price) }}
...
<h2>Categories</h2>
{{ form_row(form.idCategory) }}
{{ form_widget(form.idCategoryNew.vars.prototype) }}
...
<button type="submit">Create</button>
{{ form_end(form) }}
</div>
そして、ProductType:
$builder
->add('name'))
->add('price'))
...
->add('idCategory', 'entity', array('class' => 'MyBundle\Entity\Category'))
->add('idCateogryNew', 'collection', array('type' => new CategoryType(), 'allow_add' => true))
...
編集:
コレクションフォームを小枝テンプレートに渡すことで構成されるより良い回避策を見つけました。この方法は、フォーム送信後の投稿リクエストを簡単に処理できます。コードが必要な場合は、お問い合わせください:)
編集2:
@agapitocandemor リクエストごと:
(私の場合は ProductController)内MainEntityController
で、フォームをレンダリングするメソッド (私の場合) を検索し、レンダリングするnewAction
エンティティ フォームを作成します。
public function newAction()
{
$entity = new Product();
$entityform = $this->createForm(new ProductType(), $entity);
$subentityform = $this->createForm(new CategoryType(), new Category);
return $this->render('MyBundle:Product:new.html.twig', array(
'entity' => $entity,
'entityform' => $entityform->createView(),
'subentityform' => $subentityform->createView()
));
}
最後に、 をレンダリングするには、メイン エンティティのテンプレートsubentityform
から呼び出すだけです。{{ form_widget(subentityform) }}
new