Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony表单提交后提交填充的实体类型_Php_Forms_Symfony - Fatal编程技术网

Php Symfony表单提交后提交填充的实体类型

Php Symfony表单提交后提交填充的实体类型,php,forms,symfony,Php,Forms,Symfony,我想用这种结构制作一个“两级”动态符号窗体: 技能卡:EntityType 会话:EntityType 回合:选择类型 选择技能卡时,我填充会话字段,选择会话后,我填充回合字段 就在这个时候,我做了这个 $builder->add('skillCard', EntityType::class, [ 'class' => SkillCard::class, 'choices' => $student->getSkillCards()->

我想用这种结构制作一个“两级”动态符号窗体:

  • 技能卡:EntityType
  • 会话:EntityType
  • 回合:选择类型
  • 选择技能卡时,我填充会话字段,选择会话后,我填充回合字段

    就在这个时候,我做了这个

    $builder->add('skillCard', EntityType::class, [
            'class' => SkillCard::class,
            'choices' => $student->getSkillCards()->filter(function (SkillCard $skillCard) {
                return $skillCard->getStatus() != EnumSkillCard::EXPIRED &&
                    count($skillCard->getSkillCardModulesNotPassed()) > 0;
            }),
            'placeholder' => ''
        ]);
    $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $formEvent) {
                /** @var Booking */
                $data = $formEvent->getData();
                $this->addSessionField($formEvent->getForm(), $data->getSkillCard());
                $this->formModifierBySession($formEvent->getForm(), $data->getSession());
            }
        );
    $builder->get('skillCard')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $formEvent) {
                $skillCard = $formEvent->getForm()->getData();
                $this->addSessionField($formEvent->getForm()->getParent(), $skillCard);
            }
        );
    
    protected function addSessionField(FormInterface $form, SkillCard $skillCard = null)
    {
        $builder = $form->getConfig()->getFormFactory()->createNamedBuilder('session', EntityType::class, null, [
            'auto_initialize' => false,
            'class' => Session::class,
            'placeholder' => '',
            'query_builder' => function (EntityRepository $er) use ($skillCard) {
                $qb = $er->createQueryBuilder('s');
                if (is_null($skillCard)) {
                    $qb->where('s = 0');
                } else {
                    $qb->where('s.certification = :id')
                        ->andWhere('s.subscribeExpireDate > :date')
                        ->setParameter('id', $skillCard->getCertification())
                        ->setParameter('date', new DateTime());
                }
                return $qb;
            },
        ]);
    
        $builder->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $formEvent) {
                $session = $formEvent->getForm()->getData();
                $this->formModifierBySession($formEvent->getForm()->getParent(), $session);
            }
        );
        $form->add($builder->getForm());
    }
    
    protected function formModifierBySession(FormInterface $form, Session $session = null)
    {
        $form->add('turn', ChoiceType::class, [
            'choices' => is_null($session) ? [] : range(0, $session->getRounds()),
        ]);
    }
    
    这是javascript代码(用于ajax调用):

    当我选择skillCard时,没有问题,但是当我选择会话时,我得到一个TransformationFailedException:“无法反转属性路径“会话”的值:选择“x”不存在或不唯一”,因此不会填充turn字段,因为
    $session=$formEvent->getForm()->getData()为空

    任何建议都将不胜感激

    $(document).ready(function () {
        const $skillCard = $('#booking_skillCard');
        const $form = $('form[name = "booking"]');
    
        $skillCard.change(function () {
            sendAjax($skillCard, $form, function (html) {
                replaceFormField('#booking_module', html);
                replaceFormField('#booking_session', html);
                sessionField($form);
            });
        });
    });
    
    function sessionField($form) {
        const $session = $('#booking_session');
        $session.change(function () {
            sendAjax($session, $form, function (html) {
                replaceFormField('#booking_turn', html);
            });
        });
    }
    
    function sendAjax($jObj, $form, successCallBack) {
        let data = {};
        data[$jObj.attr('name')] = $jObj.val();
        console.log($form);
        $.ajax({
            url: $form.prop('action'),
            type: $form.prop('method'),
            data: data,
            success: successCallBack
        })
    }
    
    function replaceFormField(selector, html) {
        $(selector).replaceWith(
            $(html).find(selector)
        );
    }