3

Symfony2.1 の FormBuilder を使用して、コントローラーに動的フォームを作成します。

$form = $this->createFormBuilder($defaultData);
$form->add('field','text');

別のフォームも同じように埋め込み、メインのフォームに埋め込みたいです。

$subForm = $this->createFormBuilder();
$subForm->add('subfield','text');

// Does not work
$form->add('subform', $subForm);

残念ながら、このセットアップは正しく機能しません。上記の例のように、動的に生成されたサブフォームを動的に生成されたフォームに追加する方法が見つかりませんでした。

私が見逃している関数呼び出しは何ですか?

上記のコード例によってスローされる例外は次のとおりです。

UnexpectedTypeException: タイプ "string または Symfony\Component\Form\FormTypeInterface" の予期される引数、"Symfony\Component\Form\Form" が指定されました。

4

3 に答える 3

9

2つの別々のフィールドに2つのフォームクラスを作成します。

<?php

namespace Acme\DemoBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class FirstFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('field', 'text')
            ->add('subform', new SecondFormType());
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\DemoBundle\Entity\FirstEntity'
        ));
    }

    public function getName()
    {
        return 'first';
    }
}



<?php

namespace Acme\DemoBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class SecondFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('subfield', 'text');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\DemoBundle\Entity\SecondEntity',
        ));
    }

    public function getName()
    {
        return 'second';
    }
}

この作成後、フォームを作成するために、次の行を使用して任意のコントローラーからフォームを作成できます。

$form = $this->createForm(new FirstFormType());

またはエディションフォームの場合:

$form = $this->createForm(new FirstFormType(), $first);

サンプルコードでは、フォームタイプではなくフォーム全体をフィールドに割り当てようとしています。

それが役に立てば幸い

于 2012-11-15T22:43:41.050 に答える
1

クラスを作成せずに...コントローラーアクション内:

$subFormBuilder = $this->createFormBuilder(
        null /* default data */, 
        ['label' => 'Sub Form'] /* options */
    )
    ->add('name');

$form = $this->createFormBuilder()
    ->add($subFormBuilder)
    ->add('number')
    ->getForm();
于 2015-06-22T14:29:09.763 に答える