如何根据 Symfony2 中另一个列表的值 select 从一个 select 列表中获取值?

How to get a value from one select list based on value selected from another list in Symfony2?

当我 select 成员列表中的成员时,我需要从 'Add new member' 表单上的另一个 select 部门列表中获取他的默认部门,如果有必要,可以更改该成员的部门selected 委员会的隶属关系。

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

在 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 来解决这个问题的方法。非常感谢任何帮助!

不幸的是,它需要一点样板。

首先,您需要在表单中添加两个事件 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 更改事件的 js 片段中,我们删除了现有的出发选项,并加载了新的选项:

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 路由编写一个动作。它可以是一个简单的 select 给定 $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;
}

P.S。

  1. 要使 js 路由正常工作,您需要安装:FOSJsRoutingBundle