symfony级联下拉列表

时间:2016-08-11 12:55:25

标签: symfony symfony-forms

我正在使用Synfony3。我有3个实体称为"类别,"服务","个人资料"并且C< 1-n>之间的关系是S< 1-n> P.换句话说,1个类别可以有多个服务,1个服务可以有多个个人资料。

当我显示表单以保存配置文件时,我将有1个下拉列表包含所有服务,1个下拉列表包含所有类别

为此,我已将ProfileType放入服务下拉列表中,如下所示

class ProfileType extends AbstractType {
       //...
       ->add('service',        EntityType::class, array(
            'class'        => 'xxxBundle:Service',
            'choice_label' => 'name',
            'multiple'     => false,
        ))

如何添加类别,因为类别和个人资料

之间没有直接连接

提前感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您可以调整提供的示例以便能够处理实体(将侦听器放在单独的服务中并注入EntityManger以加载选项......):

如何级联选择字段

这是一个示例,说明如何根据类别选择字段的值更改子类别选择字段上的允许选项。 要做到这一点,你必须为客户端和服务器端选择动态的子类别。

  1. 在客户端使表单动态显示 客户端动态表单示例(使用Javascript / JQuery):

    $('#category').change(function(){
        switch($(this).val()){
            case '1': // If category == '1'
                var choice = {
                    'choice1_1':'1_1',
                    'choice1_2':'1_2',
                    'choice1_3':'1_3',
                };
            break;
            case '2': // If category == '2'
                var choice = {
                    'choice2_1':'2_1',
                    'choice2_2':'2_2',
                    'choice2_3':'2_3',
                };
            break;
            case '3': // If category == '3'
                var choice = {
                    'choice3_1':'3_1',
                    'choice3_2':'3_2',
                    'choice3_3':'3_3',
                };        
            break;
        }
    
        var $subCategorySelect = $('#subCategory');
    
        $subCategorySelect.empty();
        $.each(choice, function(key, value) {
            $subCategorySelect.append($('<option></option>')).attr('value',value).text(key);
        });
    });
    

    当然,您可以从AJAX调用中获得选择。这不是这个例子的目的。

  2. 使表单在服务器端动态化以进行初始化和验证 服务器端动态表单示例:

    namespace AppBundle\Form;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    
    use Symfony\Component\Form\FormEvent;
    use Symfony\Component\Form\FormEvents;
    
    class MyBaseFormType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('category',ChoiceType::class,array('choices'=>array(
                        'choice1'=>'1',
                        'choice2'=>'2',
                        'choice3'=>'3',
                    )))
            ;
    
            $addSubCategoryListener = function(FormEvent $event){
                $form = $event->getForm();
                $data = $event->getData();
    
                switch($data['category']){
                    case '1': // If category == '1'
                        $choices = array(
                            'choice1_1'=>'1_1',
                            'choice1_2'=>'1_2',
                            'choice1_3'=>'1_3',
                        );
                    break;
                    case '2': // If category == '2'
                        $choices = array(
                            'choice2_1'=>'2_1',
                            'choice2_2'=>'2_2',
                            'choice2_3'=>'2_3',
                        );                        
                    break;
                    case '3': // If category == '3'
                        $choices = array(
                            'choice3_1'=>'3_1',
                            'choice3_2'=>'3_2',
                            'choice3_3'=>'3_3',
                        );                        
                    break;
                }
    
                $form->add('subCategory',ChoiceType::class,array('choices'=>$choices));
            };
    
            // This listener will adapt the form with the data passed to the form during construction :
            $builder->addEventListener(FormEvents::PRE_SET_DATA, $addSubCategoryListener);
    
            // This listener will adapt the form with the submitted data :
            $builder->addEventListener(FormEvents::PRE_SUBMIT, $addSubCategoryListener);
        }
    }
    

答案 1 :(得分:0)

根据对Alsatian和Dbrumann的回应,我用一些简短的解释构建了一些例子here