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

7
SonataAdminBundle提供了一个方法configureFormFields,当你扩展Admin类时使用该方法。
该方法需要一个FormMapper类。
我已经按照典型的Symfony方式为我创建的实体构建了一个FormType类。
我该如何使用那个类,而不是再次使用FormMapper来定义表单属性呢?

配置自字段与旧式公共函数buildForm(FormBuilderInterface $builder, array $options)相同。 { $builder ->add('first_name') } - Liutas
3个回答

1

类似于以下内容:

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

0

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

You can add Symfony FormBuilderInterface instances to the FormMapper. This allows you to re-use a model form type. When adding a field using a FormBuilderInterface, the type is guessed.

Given you have a PostType like this:

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)
        ;
    }
}

you can reuse it like this:

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


0
今天我也遇到了完全相同的问题(定义了一个自定义表单类型并尝试在Sonata中使用),经过数小时的寻找最佳方法,我想出了以下解决方案:
formMapper->add('your_field', new YourType($your_params), array(                    
                ), array('type' => 'form'))

用你的字段名称替换 your_field

用你的自定义字段类型替换 new YourType

用你的字段构造函数参数替换 $your_params

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接