How to render a multiple choice dropdown with option groups using “sonata_type_model” or symfony “entity”?

不羁的心 提交于 2019-12-24 03:51:33

问题


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

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.


回答1:


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',
       )
   ) 



回答2:


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.



来源:https://stackoverflow.com/questions/31216828/how-to-render-a-multiple-choice-dropdown-with-option-groups-using-sonata-type-m

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!