【问题标题】:Symfony2 how to include a parent formType into anotherSymfony2如何将父formType包含到另一个中
【发布时间】:2015-10-29 15:36:44
【问题描述】:

我很想为某些领域编写一个捆绑包。 现在我有一个可以扩展的类。 该课程有一些领域,例如职称、姓名等

现在我想写一个可以被另一个表单类型扩展的表单类型。

喜欢

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 以将其中的所有字段都放入我的 newsgroupType 中?

非常感谢 =)

【问题讨论】:

    标签: forms symfony formbuilder


    【解决方案1】:

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

    使用构建器创建一个单独的Form 类,其中包括公共字段。然后,您可以使用 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'
        ));
    }
    

    【讨论】:

    • 太棒了!!你拯救了我的夜晚!非常感谢。
    • @cRsakaWolf 如果这是您正在寻找的答案,请投票并接受它。除非没有不同,否则无需发布您自己的答案。
    【解决方案2】:

    我觉得你应该换个思路。

    您可以使用嵌套的表单类型来做您想做的事情。

    例如:

    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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2012-08-14
      • 2015-11-05
      • 1970-01-01
      • 2011-11-24
      • 2017-04-06
      相关资源
      最近更新 更多