当您扩展configureFormFields
类时,SonataAdminBundle会提供方法Admin
。
该方法需要FormMapper
类。
对于我为此类创建的实体,我已经以典型的Symfony方式构建了一个FormType
类。
如何使用该类而不必使用FormMapper
再次定义表单属性?
答案 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() ; } }