Reputation: 1085
I'm trying to use a choice list in a form with the entity type but it's not working if I add data to the form. It's giving me a "could not convert object to int" error.
My buildForm method
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('department', 'entity', array(
'label' => 'Form.department',
'class' => 'HotfloSystemCoreBundle:Department',
'choice_list' => $this->departmentChoiceList,
'multiple' => true,
'required' => false,
'attr' => array(
'class' => 'selectpicker',
'data-actions-box' => true,
'data-live-search' => true,
'data-selected-text-format' => 'count'
),
'horizontal' => false,
));
}
My ChoiceList
class DepartmentChoiceList extends LazyChoiceList
{
/**
* @var EntityManager
*/
protected $em;
public function __construct($em)
{
$this->em = $em;
}
/**
* Loads the choice list
* Should be implemented by child classes.
*
* @return ChoiceListInterface The loaded choice list
*/
protected function loadChoiceList()
{
$departments = $this->getDepartments();
$departmentChoices = [];
foreach ($departments as $department) {
$departmentChoices[$department->getId()] = $department;
}
// Return the choice list
return new SimpleChoiceList($departmentChoices);
}
/**
* Get the departments available in the poli appointment data
*
* @return Department[]
*/
protected function getDepartments()
{
// Get the used department out of the appointment table by using a group by SQL statement
/** @var $qb QueryBuilder */
$qb = $this->em->getRepository('MyBundle:PoliAnalyzeAppointment')
->createQueryBuilder('appointment');
$qb->select('DISTINCT IDENTITY(appointment.department)');
// Get the actual departments
/** @var $qb2 QueryBuilder */
$qb2 = $this->em->getRepository('MyBundle:Department')
->createQueryBuilder('department');
$qb2->where($qb2->expr()->in('department.id', $qb->getDQL()));
$qb2->orderBy('department.name', 'ASC');
return $qb2->getQuery()->getResult();
}
}
I'm using the entity type because it should be converted to an entity and back. If I use the choice type I have to do this myself (which I don't want).
How can I achieve this?
Upvotes: 0
Views: 802
Reputation: 823
In the buildForm method I would fill it with the standard options array:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('department', 'entity', array(
'label' => 'Form.department',
'choice_list' => $options['departmentChoiceList'],
'multiple' => true,
'required' => false,
'attr' => array(
'class' => 'selectpicker',
'data-actions-box' => true,
'data-live-search' => true,
'data-selected-text-format' => 'count'
),
'horizontal' => false,
));
}
And then in the same formType add another method:
public function setDefaultOptions(OptionsResolverInterface $resolver) {
/*
* Instantiate DepartmentChoiceList and
* Implement the logic to build your Array and then set it this way
*/
$resolver->setDefaults(array(
'departmentChoiceList' => $yourDepartamentChoiceArray,
'data_class' => 'HotfloSystemCoreBundle:Department'
));
}
Note: I declared also the data_class here for the whole form, but you can also leave it out of the setDefaults if you want. I suggest taking a look into the Entity type so you don't have to use a Transformer to convert object to int -> int to object for choice fields.
Upvotes: 0
Reputation: 976
Use query_builder option to filter entity choice list. Something like:
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('a')
->select(array('DISTINCT IDENTITY(a.department)', 'd'))
->from('MyBundle:PoliAnalyzeAppointment', 'a')
->innerJoin('a.department', 'd')
->groupBy('a.department')
->orderBy('d.name', 'ASC');
}
Upvotes: 1