继承表单或向每个表单添加类型

CSc*_*ulz 9 symfony-forms symfony silex symfony-2.4

我正在寻找一种简单的方法来为每个表单添加一组字段.

我找到了一种扩展AbstractTypebuildForm方法,并使用该方法添加更多字段.
在创建表单时,我给出了我的新类型的名称(如何创建自定义表单字段类型).

在我看来,这是一种简单的方法,但每种形式仅限于一种类型.

是否有更好的方法来实现这样的目标?
我已经阅读了symfony的食谱,但我只找到了如何扩展现有表单而不是如何使用我的字段创建自己的表单"模板".

A.L*_*A.L 19

你尝试过使用继承吗?

这非常简单,首先你必须定义一个表单类型:

# file: Your\Bundle\Form\BaseType.php
<?php

namespace Your\Bundle\Form\Type;

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

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

        $builder->add('add', 'submit');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Your\Bundle\Entity\YourEntity',
        ));
    }

    public function getName()
    {
        return 'base';
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以extend这个表单类型:

# file: Your\Bundle\Form\ExtendType.php
<?php

namespace Your\Bundle\Form\Type;

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

class ExtendType extends BaseType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        # you can also remove an element from the parent form type
        # $builder->remove('some_field');

        $builder->add('number', 'integer');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Your\Bundle\Entity\YourEntity',
        ));
    }

    public function getName()
    {
        return 'extend';
    }
}
Run Code Online (Sandbox Code Playgroud)

BaseType会显示一个名称字段和添加提交按钮.该ExtendType会显示一个名称字段,添加提交按钮和一个场.

  • 如果你像现在一样使用`ExtendType`扩展`BaseType`那么你将用子代码覆盖父`buildForm`.要正确地扩展它,你需要在子`buildForm`的开头包含`parent :: buildForm($ builder,$ options)`. (3认同)

小智 8

您可以使用 getParent() 函数执行此操作。

<?php

namespace Your\Bundle\Form;

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


class ChildType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // $builder->remove('field');
        // $builder->add('field);
    }

    public function getParent()
    {
        return ParentType::class;
    }
}
Run Code Online (Sandbox Code Playgroud)