1

製品とカテゴリの 2 つのエンティティがあります。各エンティティは、Symfony Form Builderを使用してカスタム フォームをレンダリングします。

コレクション フィールド typeを使用して Products フォーム内に Categories フォームを含めようとしています。インクルード行は次のようになります。

$builder->add('idCategory', 'collection', array('type' => new CategoryType());

正常に動作しています( Symfony のドキュメントによると)。しかし、私は JavaScript でフォームを作成したくありません。小枝テンプレートを変更せずに、フォームの残りの部分でレンダリングしたいのです。

<form action="{{ path('product_create') }}" method="post" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
    <button type="submit">Create</button>
</form>

それは可能ですか?何かご意見は?

4

2 に答える 2

0

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

于 2013-08-11T14:57:05.897 に答える