forms - Correct way to use FormEvents to customise fields in SonataAdmin -
i have sonata admin class form fields in it, i'd utilize formevents::pre_set_data
event dynamically add together form field based on bound data.
however, i'm running several problems:
1) way can find add together form field right 'formgroup' in admin adding new field twice (once via formmapper , 1 time via form itself)... seems wrong , cannot command in formgroup appears.
2) added element doesn't seem know has connected admin (probably because added using form::add()
). means, amongst other things, renders differently other fields in form since triggers {% if sonata_admin not defined or not sonata_admin_enabled or not sonata_admin.field_description %}
status in form_admin_fields.html.twig
so, leads me believe i'm doing wrong , there must improve way.
so...
what right way utilize formevent add together field form group, ideally in preferred position within group, when using sonataadmin?
here's code, fwiw...
protected function configureformfields(formmapper $formmapper) { $admin = $this; $formmapper->getformbuilder()->addeventlistener(formevents::pre_set_data, function (formevent $event) utilize ($admin, $formmapper) { $subject = $event->getdata(); // fancy $subject $formoptions = array(/* cool stuff*/); // if don't add together field $formmapper new field doesn't appear on rendered form $formmapper ->with('myformgroup') ->add('foo', null, $formoptions) ->end() ; // if don't add together field form::add() twig exception: // key "foo" array keys "..." not exist in my_form_template.html.twig @ line xx $event ->getform() ->add('foo', null, $formoptions) ; }); $formmapper ->with('myformgroup') ->add('fieldone') ->add('fieldtwo') ->end() ; }
the aim add together new foo
field between fieldone
, fieldtwo
in myformgroup
.
edit: here's came with help of cassiano's answer
protected function configureformfields(formmapper $formmapper) { $builder = $formmapper->getformbuilder(); $ff = $builder->getformfactory(); $admin = $this; $formmapper->getformbuilder()->addeventlistener(formevents::pre_set_data, function (formevent $event) utilize ($ff, $admin) { $subject = $event->getdata(); // fancy $subject $formoptions = array( 'auto_initialize' => false, 'class' => 'my\projectbundle\entity\myentity', /* cool stuff*/ ); $event->getform()->add($ff->createnamed('foo', 'entity', null, $formoptions)); }); $formmapper ->with('myformgroup') ->add('fieldone') ->add('foo') // adding here gets field in right place, it's redefined event code ->add('fieldtwo') ->end() ; }
no time here long answer, paste piece of code , don't know if fits in case, in it's part of multi dependent selects (country, state, city, neighbor).
use symfony\component\form\formevents; utilize symfony\component\form\formevent; utilize doctrine\orm\entityrepository; protected function configureformfields(formmapper $formmapper) { $formmapper->add('myfield'); $builder = $formmapper->getformbuilder(); $ff = $builder->getformfactory(); $func = function (formevent $e) utilize ($ff) { if ($form->has('myfield')) { $form->remove('myfield'); } $form->add($ff->createnamed('myfield', 'entity', null, array( 'class' => '...', 'attr' => array('class' => 'form-control'), 'auto_initialize' => false, 'query_builder' => function (entityrepository $repository) utilize ($pais) { $qb = $repository->createquerybuilder('estado'); if ($pais instanceof ...) { $qb = $qb->where('myfield.other = :other') ->setparameter('other', $other); } elseif(is_numeric($other)) { $qb = $qb->where('myfield.other = :other_id') ->setparameter('other_id', $other); } homecoming $qb; } ))); }; $builder->addeventlistener(formevents::pre_set_data, $func); $builder->addeventlistener(formevents::pre_bind, $func); }
forms symfony2 sonata-admin
No comments:
Post a Comment