如何在Sonata Admin Bundle configureFormFields中使用现有的Symfony FormType?

时间:2012-12-15 22:44:40

标签: php forms symfony sonata-admin

当您扩展configureFormFields类时,SonataAdminBundle会提供方法Admin

该方法需要FormMapper类。

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

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

3 个答案:

答案 0 :(得分:1)

类似的东西:

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

答案 1 :(得分:0)

我今天做了完全相同的事情(定义了一个自定义表单类型,并试图在奏鸣曲中使用)经过几个小时的寻找干净的方式后,我想出了这个:

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

your_field替换为您的字段名称

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

$your_params使用您的字段的构造函数的参数

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

答案 2 :(得分:0)

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

  

您可以将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