Symfony2 如何将父 formType 包含到另一个

Symfony2 how to include a parent formType into another

我正在为某些领域写一个包。 现在我得到了一个可以扩展的 class。 class 有一些字段,例如头衔、姓名等

现在我想写一个 formType,它可以被另一个 formType 扩展。

喜欢

class newsgroupType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('unusername','text',array(
                'required' => true))
        ->add('unactive','checkbox',array(
                'required' => false));
...

我要扩展的 FormType 是

class mainType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('unurl','text',array(
              'required' => false,
              'disabled' => true))
        ->add('untitle','text',array(
              'required' => false))
...

有没有办法扩展 mainType 以将所有字段从它获取到我的新闻组类型中?

非常感谢=)

我觉得你应该有不同的看法。

您可以使用嵌套表单类型来完成您想要的操作。

例如:

class newsgroupType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('main', new MainType())
            ->add('unusername','text',array(
                    'required' => true))
            ->add('unactive','checkbox',array(
                    'required' => false));
...

您还应该以正确的方式命名您的 类,使用 CamelCase (在我的示例中,使用 MainType 而不是 mainType)

Symfony 网站上有一个 cookbook article,它给出了如何将公共字段提取到单独的表单定义中的示例,然后可以将其包含到其他表单定义中。

创建一个单独的 Form class,其中包含使用构建器的公共字段。然后,您可以使用 inherit_data 选项配置该表单:

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'inherit_data' => true
    ));
}

然后其他表单可以在构建器中添加该表单:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    // ...

    $builder->add('foo', new CommonType(), array(
        'data_class' => 'AppBundle\Entity\Foo'
    ));
}