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
フィールドのコンストラクターのパラメーターを使用して、
4番目のパラメーターarray('type' => 'form')
は非常に重要です。それは、フォームが実際にどのタイプであるかをsonataに伝えます(sonataはタイプのオブジェクトから自動的に決定しません)私のカスタムフィールドはform
タイプを拡張します(それは独自のフィールドを持つ埋め込みフォームです)ので、私はそれを指定しますあなたの型は何か他のものを拡張し、それを指定します。うまくいけばうまくいくでしょう。
まったく同じものを探してこの質問に出くわし、最終的にドキュメントで次のことを見つけました:
に 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() ; } }