2

I'm trying to render a multiple choice selection drop-down similar to the SO question using sonata_type_model or entity type. I have the entity Property with manyToMany to Feature that is oneToMany of FeatureType. The multi-choice drop-down is being implemented in the Property create form.

I have found the group_by option. But I got the warning using entity and got the incorrect rendering using sonata_type_model.

Attempt 1

->add('features', 'entity', array(
    'class' => 'MyBundle:Feature',
    'multiple' => true,
    'group_by' => 'featureType'
))

Warning: Illegal offset type in isset or empty in vendor/symfony/symfony/src/Symfony/Component/Form/ChoiceList/Factory/DefaultChoiceListFactory.php at line 334

Attempt 2

->add('features', 'sonata_type_model', array(
    'multiple' => true,
    'btn_add' => null,
    'group_by' => 'featureType'
))

It only renders the values in the drop-down such as

enter image description here

Attempt 3

I tried the choices and but got error

->add('features', 'sonata_type_model', array(
    'multiple' => true,
    'required' => false,
    'btn_add' => null,
    'choices' => $this->getFeatureOptionsWithGroup()
))

Warning: get_class() expects parameter 1 to be object, array given in vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php at line 58

Attempt 4

I tried the choice_list and but got error

->add('features', 'sonata_type_model', array(
    'multiple' => true,
    'required' => false,
    'btn_add' => null,
    'choice_list' => $this->getFeatureOptionsWithGroup()
))

The option "choice_list" with value array is expected to be of type "null" or "Symfony\Component\Form\ChoiceList\ChoiceListInterface", but is of type "array" in vendor/symfony/symfony/src/Symfony/Component/OptionsResolver/OptionsResolver.php at line 888

The method getFeatureOptionsWithGroup() returns the array like this

array(
    'Group 1' => array(
        1 => 'Feature 1'
        2 => 'Feature 2'
    ),
    'Group 2' => array(
        3 => 'Feature 3'
        4 => 'Feature 4'
    )
)

Attempt 5

I updated the method using ModelChoiceList, but got the same error of using choices.

Warning: get_class() expects parameter 1 to be object, array given in vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php at line 58

private function getFeatureOptionsWithGroup()
{
    return new ModelChoiceList(
        $this->modelManager,
        'MyBundle:Feature',
        null,
        null,
        $this->getRepository('MyBundle:Feature')->getFeatureOptionsWithGroup()
    );
}

I hope that I would have a chance to render it without template override. Any help would be appreciated.

Community
  • 1
  • 1
Sithu
  • 4,752
  • 9
  • 64
  • 110

2 Answers2

3

Use the type entity

->add('features', 'entity', [
       'class'     => 'MyBundle:Feature',
       'property'  => 'name',
       'choices'   => $this->getFeatureOptionsWithGroup(),
       'multiple'  => true,
       'required'  => false,
       'btn_add'   => null,
])

Make sure your function getFeatureOptionsWithGroup() returns like this

array(
       'Group 1' => array(
           1 => 'Feature Entity Object 1',
           2 => 'Feature Entity Object 2',
       ),
       'Group 2' => array(
           3 => 'Feature Entity Object 3',
           4 => 'Feature Entity Object 4',
       )
   ) 
Nikita Leshchev
  • 1,784
  • 2
  • 14
  • 26
Kay
  • 196
  • 1
  • 7
1

The best way to do this is to use group_by option.

So on your case, you need to pass name of $property field in your FeatureType entity then on your Property entity, you need to implement __toString() function which should be the name of the Property as string.

Explanation:

On your FeatureType entity table, Property association is mapped by property_id as foreign key and Doctrine does the querying for you so you just need to specify how you want to group them.

Arman H
  • 5,488
  • 10
  • 51
  • 76