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

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

人们,我一直在寻找这个问题已有一段时间了,是的,我已经找到了一些类似的问题,甚至在《食谱》中也找到了this。

现在你会说,“这个家伙很慢”,宾果,我是。请帮帮我,因为我似乎无法获得this或遇到的任何其他示例来帮助我解决自己的问题。

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

社区:不要说话,给我密码!

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

//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)

我需要知道如何填充select和要提交的内部数据。

感谢您对此简单的解释。

我在听(读书)。

参考方案

Here是我一直在寻找的答案,它看起来很像菜谱中的那个,但是以某种方式我对它有了更好的理解,并且能够将其应用于我自己的问题,它只需要在ajax调用中进行一些调整即可和相应的操作,但仅针对我自己的问题。

感谢所有关心阅读我的问题的人,并特别感谢Joshua Thijssen的职位。

PHP:对数组排序 - php

请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…

PHP PDO组按列名称查询结果 - php

以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…

PHP-嵌套的foreach循环中的异常行为 - php

一些背景我有2个数组,其中包含以下信息:$x = [ ['name' => 'Fred', 'ykey' => 'A', 'rank' => '1', 'VIP' => '1'…

PHP Array重复数据计数 - php

我在PHP Array中有标题和语言数据。我需要显示重复的标题计数。请检查以下数组格式。Array ( [0] => Array ( [title] => My_title1 [language] => English ) [1] => Array ( [title] => My_title1 [language] => …

交叉加入codeigniter? - php

我正在尝试$this->db->join('tableTwo as b','','CROSS'); $result = $this->db->get('tableOne as a')->result(); 有解决办法吗? 参考方案 Codeignit…