Reputation: 3564
I have a field (EntityType
=> select in the view) in my FormBuilder
that I want it to be in initialized with empty data so I can fill it after that in the view via ajax.
So I have read symfony's documentation about EntityType
and I found the choices
attribute that receives an array of data, so I gave it an empty one 'choices' => array()
and it did the trick.
Now the problem is when I submit the form, symfony don't know anymore the type of the field and give me null
.
This is the builder:
$buidler->add('supplier', EntityType::class, array(
'class' => 'SBC\TiersBundle\Entity\Supplier',
'attr' => array(
'class' => 'uk-select uk-select-supplier'
),
'choices' => array(),
))
As you can see the the type of the field is SBC\TiersBundle\Entity\Supplier
but after submit symfony gives me null !
What should I do to achieve my goal?
Upvotes: 2
Views: 1583
Reputation: 3564
All right, this is the solution:
First, I need to pass the EntityManager
to my form, and to do this I have created a service:
services:
payment.supplier.form:
class: SBC\PaymentBundle\Form\PaymentSupplierType
tags:
- { name: form.type, alias: form_em }
arguments: ["@doctrine.orm.entity_manager"]
Then call the EntityManager
in the __construct
function:
private $em;
private $supplier;
function __construct(EntityManager $em)
{
$this->em = $em;
}
Second, I need to add two events to the form:
PRE_SUBMIT (to get supplier's code and create Supplier object using the EntityManager):
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function(FormEvent $event){
$data = $event->getData();
$code = $data['supplier'];
$this->supplier = $this->em->getRepository('TiersBundle:Supplier')->find($code);
}
);
And finally, use the POST_SUBMIT event to set the supplier object in the submitted data:
$builder->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event){
$object = $event->getData();
$object->setSupplier($this->supplier);
$event->setData($object);
}
);
Thanx to Виталий Бойко who gave me a hint about the form events.
So this is what I did with my knowledge and if you have a better solution please share it with us.
Upvotes: 3
Reputation: 36
Symfony by default use security for forms, so if you didn't have choices in form builder, you can't pass custom choices to the form after render only via javascript, because you get not valid form. You need to create eventlistener for the form. Check this link for more informationenter link description here, here you can find how to add choices. P.S. sorry for my English)
Upvotes: 0