为集合类型动态创建类型

时间:2012-10-24 21:56:46

标签: php symfony

是否可以动态创建FormType并避免手动创建新的表单类型类。

目前我必须这样做:

MyController.php

$builder = $this->createBuilder(new ParentEntity());
$builder
  ->add('parentfield1')
  ->add('parentfield2');
  ->add('children', 'collection', array('type' => new ChildType());

ChildType.php

class ChildType extends \Symfony\Component\Form\AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('childname1')
                ->add('childname2');
    }

    public function getDefaultOptions(array $options) {
        return array(
            'data_class' => 'ChildEntity',
        );
    }

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

}

我想避免手动创建ChildType类,而是执行类似的操作:

MyController.php

$childBuilder = $this->createBuilder(new ChildEntity());
$childBuilder
   ->add('childfield1')
   ->add('childfield2');

// how to create FormType from builder???
$childType = $childBuilder->??????;

$builder = $this->createBuilder(new ParentEntity());
$builder
  ->add('parentfield1')
  ->add('parentfield2');
  ->add('children', 'collection', array('type' => $childType);

我尝试使用以下类型获取类型:

$childBuilder->->getFormConfig()->getType(); 

但这不起作用。我收到错误:

表单的视图数据应该是Namespace \ Bundle \ Entity \ ChildEntity类的实例,但是是Doctrine \ Common \ Collections \ ArrayCollection类的实例。您可以通过将“data_class”选项设置为null或通过添加将类Doctrine \ Common \ Collections \ ArrayCollection的实例转换为Namespace \ Bundle \ Entity \ ChildEntity实例的视图转换器来避免此错误。

目前我提出的最好的方法是创建自定义FormType,接受字段数组作为构造函数但是有更好的方法吗?

0 个答案:

没有答案