【问题标题】:How to use existing Symfony FormType in Sonata Admin Bundle configureFormFields?如何在 Sonata Admin Bundle 中使用现有的 Symfony 表单类型配置表单字段?
【发布时间】:2012-12-15 22:44:39
【问题描述】:

当你扩展 Admin 类时,SonataAdminBundle 提供了一个方法 configureFormFields

该方法采用FormMapper 类。

对于我创建这个类的实体,我已经以典型的 Symfony 方式构建了一个 FormType 类。

如何使用该类,而不必再次使用FormMapper 定义表单属性?

【问题讨论】:

  • configureFromFields 与老式公共函数 buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('first_name') 相同

标签: php forms symfony sonata-admin


【解决方案1】:

类似:

public function configureFormFields(FormMapper $formMapper)
{        
    $form = new ReviewFormType();
    $form->buildForm($formMapper->getFormBuilder(),array());
}

【讨论】:

    【解决方案2】:

    在找到一个干净的方法几个小时后,我今天不得不做同样的事情(定义了一个自定义表单类型并尝试在奏鸣曲中使用),我想出了这个:

    formMapper->add('your_field', new YourType($your_params), array(                    
                    ), array('type' => 'form'))
    

    your_field 替换为您的字段名称,

    new YourType 使用您的自定义字段类型和

    $your_params 与你的字段的构造函数的参数,

    第四个参数array('type' => 'form') 非常重要,它告诉奏鸣曲你的表单实际上是什么类型(奏鸣曲不会从你的类型的对象自动确定)我的自定义字段扩展了form 类型(它是一个嵌入的表单,它的自己的字段)所以我指定了,如果你的类型扩展了其他东西然后指定它,希望它能正常工作。

    【讨论】:

      【解决方案3】:

      我在寻找完全相同的东西时遇到了这个问题,最终在文档中找到了以下内容:

      您可以将 Symfony FormBuilderInterface 实例添加到 FormMapper。这允许您重新使用模型表单类型。添加时 使用FormBuilderInterface的字段,类型是猜测的。

      假设您有这样的PostType

      use Symfony\Component\Form\FormBuilderInterface;
      use Symfony\Bridge\Doctrine\Form\Type\EntityType;
      use Symfony\Component\Form\Extension\Core\Type\TextType;
      use Symfony\Component\Form\Extension\Core\Type\TextareaType;
      use Symfony\Component\Form\AbstractType;
      
      class PostType extends AbstractType
      {
          public function buildForm(FormBuilderInterface $builder, array $options)
          {
              $builder
                  ->add('author', EntityType::class, [
                      'class' => User::class
                  ])
                  ->add('title', TextType::class)
                  ->add('body', TextareaType::class)
              ;
          }
      }
      

      您可以像这样重复使用它:

      use Sonata\AdminBundle\Form\FormMapper;
      use Sonata\AdminBundle\Admin\AbstractAdmin;
      use App\Form\PostType;
      
      class Post extend AbstractAdmin
      {
          protected function configureFormFields(FormMapper $formMapper)
          {
              $builder = $formMapper->getFormBuilder()->getFormFactory()->createBuilder(PostType::class);
      
              $formMapper
                  ->with('Post')
                      ->add($builder->get('title'))
                      ->add($builder->get('body'))
                  ->end()
                  ->with('Author')
                      ->add($builder->get('author'))
                  ->end()
              ;
          }
      }
      

      https://symfony.com/doc/master/bundles/SonataAdminBundle/reference/form_types.html#adding-a-formbuilderinterface

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 2012-07-15
        • 1970-01-01
        • 1970-01-01
        • 2015-09-05
        • 2023-04-01
        相关资源
        最近更新 更多