Pi Wi
Pi Wi

Reputation: 1085

Use ChoiceList for entity type

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

Answers (2)

Martin Fasani
Martin Fasani

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

Jarek Jakubowski
Jarek Jakubowski

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

Related Questions