php - 在symfony2中填充另一个选择的 "change"事件的选择字段并使其可以提交

标签 php jquery ajax forms symfony

使用Symfony2.3.​​4和PHP5.6.3

大家,我一直在寻找这个问题一段时间了,是的,我发现了一些类似的问题,甚至发现了 this在食谱中。

现在你会说,“这家伙太慢了”,宾果游戏,我就是。请帮助我,因为我似乎无法获取 this或我遇到的任何其他可以帮助我解决自己的问题的示例。

我需要的是当用户从另一个选择字段中选择一个项目时填充一个选择字段。所有这一切都以标准 CRUD 生成的 Symfony2 形式发生。两个选择分别代表一个实体集合(Zone 和 UEB),Zone 是独立的。

社区:别说话了,给我代码吧!

我:好的,这是我到目前为止所得到的:

//ReferenceController.php

public function newAction() {
    $entity = new Reference();
    $form = $this->createCreateForm($entity);

    return $this->render('CCBundle:Reference:new.html.twig', array(
                'entity' => $entity,
                'form' => $form->createView(),
    ));
}

public function createAction(Request $request) {
    $entity = new Reference();
    $form = $this->createCreateForm($entity);
    $form->bind($request);
    /*
    var_dump($form->get('UEB')->getData());
    var_dump($form->get('UEB')->getNormData());
    var_dump($form->get('UEB')->getViewData());
    die();
    */
    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('reference_show', array('id' => $entity->getId())));
    }

    return $this->render('CCBundle:Reference:new.html.twig', array(
                'entity' => $entity,
                'form' => $form->createView(),
    ));
}


private function createCreateForm(Reference $entity) {
    $form = $this->createForm(new ReferenceType(), $entity, array(
        'action' => $this->generateUrl('reference_create'),
        'method' => 'POST',
    ));

    return $form;
}

还有

//ReferenceType.php
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
            ->add('suffix')
            ->add('zone', null, array(
                'required' => true,
            ))
    ;

    //What follows is for populating UEB field accordingly, 
    //whether it's a "createForm" or an "editForm"

    if ($options['data']->getId() !== null) {
        $formModifier = function (FormInterface $form, Zone $zone = null) {
            $UEBs = null === $zone ? array() : $zone->getUEBs();
            $form->add('UEB', 'entity', array(
                'required' => true,
                'label' => 'UEB',
                'class' => 'CCBundle:UEB',
                //                'empty_value' => '',
                'choices' => $UEBs,
            ));
        };

        $builder->addEventListener(
                FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifier) {
            $data = $event->getData();
            $formModifier($event->getForm(), $data->getZone());
        });
    } else {
        $formModifier = function (FormInterface $form) {
            $form->add('UEB', 'entity', array(
                'required' => true,
                'label' => 'UEB',
                'class' => 'CCBundle:UEB',
                'query_builder' =>
                function(EntityRepository $er) {
            return $er->createQueryBuilder('u')
                            ->where('u.zone = :zone')
                            ->setParameter('zone', $er->findFirstZone());
        }
                    )
            );
        };

        $builder->addEventListener(
                FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifier) {
            $formModifier($event->getForm());
        });
    }

还有

//base.js
    var goalURL = "" + window.location;
        if (goalURL.slice(-13) === 'reference/new' || goalURL.match(/reference\/\d+\/edit$/))
    {

        //case new reference
        goalURL = goalURL.replace('reference/new', 'reference/update_uebs/');
        //case edit reference
        goalURL = goalURL.replace(/reference\/\d+\/edit/, 'reference/update_uebs/');

        //this is the function run every time the "new" or "edit" view is loaded
        //and every time the Zone select field is changed
        var runUpdateUEBs = function() {
            $.getJSON(goalURL, {id: $('#cc_ccbundle_reference_zone').val()}, function(response) {
            $('#cc_ccbundle_reference_UEB').children('option').remove();
            var non_selected_options = [];
            var index = 0;
            $.each(response, function(key, val) {
                var option = $('<option selected="selected"></option>');
                option.text(val);
                option.val(key);
                option.prop('selected', 'selected');
                option.appendTo($('#cc_ccbundle_reference_UEB'));
                non_selected_options[index++] = $(option);
            });

            var amount = non_selected_options.length;
            if (amount > 1)
                $.each(non_selected_options, function(key, val) {
                     if (amount - 1 === key)
                     val.attr('selected', false);
                });
            });
    };
    runUpdateUEBs();

    $('#cc_ccbundle_reference_zone').bind({
        change: runUpdateUEBs
    });
}

还有

//ReferenceController.php
//this is where "goalURL" goes
function updateUEBsAction() {
    $id = $this->getRequest()->get('id');
    $em = $this->getDoctrine()->getManager();
    $uebs = $em->getRepository('CCBundle:UEB')->findBy(array('zone' => $id));

    $ids_and_names = array();
    foreach ($uebs as $u) {
        $ids_and_names[$u->getId()] = $u->getName();
    }

    return new \Symfony\Component\HttpFoundation\Response(json_encode($ids_and_names));
}

这样我就可以加载当前显示的区域对应的 UEB,并且每次选择新区域时都可以,但只是在视觉上,而不是在内部,因此: 选择填充正常,但当我提交表单时,它不会执行它并在 UEB 字段和

上输出“此值无效”
var_dump($form->get('UEB')->getData());
var_dump($form->get('UEB')->getNormData());
var_dump($form->get('UEB')->getViewData());
die();

从上面的输出

null
null
string <the_value_of_the_option_tag> (length=1)

我需要知道如何填充选择以及要提交的内部数据。

感谢您接受这个简单的解释。

我正在听(读)。

最佳答案

Here是我一直在寻找的答案,它看起来很像食谱中的答案,但不知何故我更好地理解了这个答案,并且我能够将它应用到我自己的问题中,它只需要在 ajax 调用和相应的中进行一些调整行动,但仅针对我自己的问题。

感谢所有愿意阅读我的问题的人,特别感谢 Joshua Thijssen 的帖子。

关于php - 在symfony2中填充另一个选择的 "change"事件的选择字段并使其可以提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30379132/

相关文章:

javascript - 将 Agar.io 添加到 iframe

jquery - 需要有关 jQuery UI Accordion navigationFilter 选项的帮助

php - 使用 jquery、ajax、php、mysql 关闭后永久隐藏信息框

php - 下拉刷新不刷新 JSON 数据

php - 像 PHP 的 include 一样加载 Javascript

php - 创建 PDO 查询时参数中的数组

java - 如何将 Spring MVC View 呈现为字符串

php 数组重新整理、合并和排序

javascript - RxDom : not working when new id created

php - 在 php 中设置 base_url() 。任何php框架中的base_url()应该是什么?