SonataAdminBundle在扩展类configureFormFields
时提供了一个方法。Admin
该方法需要一个FormMapper
类。
对于我创建这个类的实体,我已经FormType
以典型的 Symfony 方式构建了一个类。
如何使用该类,而不必再次使用FormMapper
?
SonataAdminBundle在扩展类configureFormFields
时提供了一个方法。Admin
该方法需要一个FormMapper
类。
对于我创建这个类的实体,我已经FormType
以典型的 Symfony 方式构建了一个类。
如何使用该类,而不必再次使用FormMapper
?
就像是:
public function configureFormFields(FormMapper $formMapper)
{
$form = new ReviewFormType();
$form->buildForm($formMapper->getFormBuilder(),array());
}
经过数小时找到干净的方法后,我今天不得不做同样的事情(定义了一个自定义表单类型并尝试在奏鸣曲中使用),我想出了这个:
formMapper->add('your_field', new YourType($your_params), array(
), array('type' => 'form'))
替换your_field
为您的字段名称,
new YourType
使用您的自定义字段类型和
$your_params
使用您的字段的构造函数的参数,
第四个参数array('type' => 'form')
非常重要,它告诉奏鸣曲您的表单实际上是什么类型(奏鸣曲不会根据您的类型的对象自动确定)我的自定义字段扩展了form
类型(它是具有自己字段的嵌入式表单)所以我指定,如果您的类型扩展了其他内容,然后指定它,希望它能正常工作。
我在寻找完全相同的东西时遇到了这个问题,最终在文档中找到了以下内容:
您可以将 Symfony
FormBuilderInterface
实例添加到FormMapper
. 这允许您重新使用模型表单类型。使用 a 添加字段时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() ; } }