php - 如何根据从 Symfony2 中的另一个列表中选择的值从一个选择列表中获取值?

标签 php jquery symfony twig

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

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

在我的 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 路线编写一个 Action 。它可以是一个简单的选择,给定 $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

关于php - 如何根据从 Symfony2 中的另一个列表中选择的值从一个选择列表中获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29834981/

相关文章:

javascript - 如何高亮:active element using javascript?

mysql - Symfony2 doctrine2 数组数据可用并在 Twig 文件中工作但呈现空白页面

symfony - 在 DBAL 和 session 处理程序 Symfony2 之间共享数据库连接

php - curl 错误 : OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 54

php - 子数组中所有元素的总和 - PHP

当有属性 block 时,jquery + div 不会用 .hide() 正确隐藏?

javascript - 在 Symfony 2 中生成动态 javascript 的正确方法?

php - 从引荐来源创建 session

php - 确定我是否应该创建新的 Drupal 模块的最佳实践是什么?

jquery - 我什么时候应该进行延迟加载?这将如何影响谷歌搜索结果?