I'm rendering a form in Symfony2 with data_class mapped to Reservation
entity, and this form has a entity field type, of class Service
. The relation between Reservation
and Service
class is many to many. A service then has a ServiceType
, which is another class, that is mapped as many to one from the Service
class
What I want to do is display all services as checkboxes in the reservation form, grouped by service type. So far, I can display all the services together like this (the code is from ReservationType
class):
$builder->add('services','entity', array(
'class' => 'MyBundle:Service',
'multiple' => true,
'expanded' => true
));
And displaying the form the default way:
<form action="{{ path('reservations', {'step': 2}) }}" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
<input type="submit" />
</form>
The result is something like this:
□ servicetype1 option
□ servicetype1 another option
□ servicetype2 option
□ servicetype2 another option
What I would like to achieve is:
servicetype1:
□ option
□ another option
servicetype2:
□ option
□ another option
I was trying to specify only subsets of services by using query_builder option like this:
$builder->add('services','entity', array(
'class' => 'MyBundle:Service',
'multiple' => true,
'expanded' => true,
'query_builder' => function (MyBundleEntityServiceRepository $repository)
{return $repository->createQueryBuilder('s')->where('s.serviceType = ?1')->setParameter(1, 1);} ));
$builder->add('services','entity', array(
'class' => 'MyBundle:Service',
'multiple' => true,
'expanded' => true,
'query_builder' => function (MyBundleEntityServiceRepository $repository)
{return $repository->createQueryBuilder('s')->where('s.serviceType = ?1')->setParameter(1, 2);} ));
This is wrong, because:
- I have to specify the
ServiceType
id
- Adding the
'services'
to the builder twice, will overwrite the first addition (which is logical, but cannot be solved without changing the entities)
What would be the best option for handling forms like this? There are only 2 ServiceType
-s so far, but I would like to keep it dynamic, and reusable.
See Question&Answers more detail:
os