【问题标题】:How to get a value from one select list based on value selected from another list in Symfony2?如何根据从 Symfony2 中的另一个列表中选择的值从一个选择列表中获取一个值?
【发布时间】:2015-07-02 07:40:11
【问题描述】:

当我从成员列表中选择成员时,我需要从“添加新成员”表单上的另一个选择部门列表中获取他的默认部门,并在必要时更改该成员在选定委员会的部门隶属关系。

我有两个实体,成员和部门。部门也是成员实体中的一个属性。两个下拉列表都是从数据库中填写的。

在我的 FormType.php 文件中:

class CommMemberType extends AbstractType

    /**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('member','entity', array(
                'label' => 'Member Name',
                'empty_value' => ' ',
                'class' => 'CommitteesBundle:Member',
                'query_builder' => function(EntityRepository $er) {
                    return $er->createQueryBuilder('m')
                        ->orderBy('m.fname', 'ASC');
                },
            )
        )

        ->add('dept', 'entity', array(
            'label' => 'Department',
            'empty_value' => '---Select Department---',
            'required' => true,
            'class' => 'CommitteesBundle:Lookup\Dept',
            'property' => 'meaning',
            'query_builder' => function(EntityRepository $er) {
                return $er->createQueryBuilder('dept')
                    ->orderBy('dept.meaning', 'ASC');
            },
        ));

不幸的是,我找不到任何使用 jQuery 来解决此问题的解决方案。非常感谢任何帮助!

【问题讨论】:

    标签: php jquery symfony twig


    【解决方案1】:

    不幸的是,它需要一些样板文件。

    首先,您需要在表单中添加两个事件FormEvents::PRE_SET_DATAFormEvents::PRE_SUBMIT,以便在提交表单或设置实体时使用相关选项填充相关下拉列表。

    在下面的示例中,出发日期取决于所选的行程。

    class ExampleType extends AbstractType
    {
       public function buildForm(FormBuilderInterface $builder, array $options)
       {
            $builder->add('tripsFk', 'entity', array(
                'class'         => 'ExampleBundle:Trips',
                'query_builder' => function(EntityRepository $er) {
                        return $er->createQueryBuilder('t')
                            ->orderBy('t.id', 'DESC');
                },
                'label'       => 'Trip',
                'attr' => array(
                    'class' => 'booking_trip'
                )
            ));
    
            $builder->addEventListener(FormEvents::PRE_SET_DATA, array($this, 'onPreSetData'));
            $builder->addEventListener(FormEvents::PRE_SUBMIT, array($this, 'onPreSubmit'));
    
        }
    
        function onPreSubmit(FormEvent $event)
        {
            $form = $event->getForm();
            $data = $event->getData();
    
            $trip = $data['tripsFk'];
            $this->populateChoices($form, $trip);
        }
    
        function onPreSetData(FormEvent $event)
        {
            $entity = $event->getData();
            $form = $event->getForm();
    
    
            $tripId = $entity->getTripsFk() ? $entity->getTripsFk() : null;
    
            $this->populateChoices($form, $tripId);
        }
    
        public function populateChoices($form, $tripId)
        {
            $form->add('departIdFk', 'entity', array(
                'label'         => 'Departure Code',
                'class'         => 'ExampleBundle:Departures',
                'query_builder' => function(EntityRepository $er) use ($tripId) {
                        return $er->createQueryBuilder('t')
                            ->andWhere('t.trip_id', ':trip_id')
                            ->setParameter('trip_id', $tripId);
                },
                'attr' => array(
                    'class' => 'booking_date'
                )
            ));
        }
    }
    

    接下来你要做的是编写一个 javascript 来改变 .booking_date 淹没旅行变化的选项。在下面.booking_trip change 事件的 js sn-p 中,我们删除现有的离开选项,并加载新的选项:

    var bookingTripChange = (function () {
            var $trip = $('.booking_trip');
            var $dates = $('.booking_date');
    
    
            init = function () {
                $trip.on('change', function () {
    
                    $dates.attr('disabled', 'disabled');
    
                    $.ajax({
                        url: Routing.generate('load_departures', {tripId: $trip.val()}),
                        type: 'GET',
                        dataType: 'json',
                        success: function (response) {
                            $dates.find('option').remove();
    
                            $("<option/>", {value: '', text: 'Specify Departure Code'}).appendTo($dates);
    
                            $.each(response.tripdates, function (index, entity) {
                                $("<option/>", {value: entity.id, text: entity.label}).appendTo($dates);
                            });
    
                            $dates.removeAttr('disabled');
    
                        }
                    });
                });
            };
            return {
                init: init
            };
        })();
    
    bookingTripChange.init();
    

    最后要做的是为load_departures 路由写一个动作。它可以是一个简单的选择,给定$tripId 并水合到array

    public function loadChoicesAction(Request $request, $tripId)
    {
            $tripdates = $this->getDoctrine()
                ->getRepository('ExampleBundle:Departures')
                ->getTripsDatesOptions($tripId);
    
    
    
            $content = json_encode(array(
                'tripdates' => $tripdates
            ));
    
            $reponse = new Response($content, 200);
    
            return $reponse;
    }
    

    附:

    1. 要让js路由工作你需要安装:FOSJsRoutingBundle

    【讨论】:

    • 非常感谢!这绝对有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多