通过 post 将外键的 id 传递给表单

Posted

技术标签:

【中文标题】通过 post 将外键的 id 传递给表单【英文标题】:pass id of foreign key to the form via post 【发布时间】:2021-02-12 05:36:35 【问题描述】:

我在我的数据库上为这个实体(“Multa”)创建了一个新字段(“responsavel”),“responsavel”是另一个表(Usuario)的外键,我希望它显示在我的表单上作为一个只有一些对象的选择(这就是为什么$desligados我传递到前面)供用户选择,然后将其传递到后面。

我已经能够使用 $.post 来完成它,但是在提交传递给控制器​​之后我正在做其他事情,所以我已经包含了 $(this).unbind('submit').submit(); 但现在就像我提交表单二一样次,其中之一未使用“responsavel”值提交。

这是我的表格:

class MultaType extends AbstractType

    public function buildForm(FormBuilderInterface $builder, array $options)
    
        $builder
            ->add('usuario')
            ->add('departamento')
            ->add('cliente')
            ->add('responsavel',null, ['attr'=>['style'=>'display:none;'], 'label'=> false])
            ->add('razaoSocial', null, ['label'=>'Cliente'])
            ->add('valor',null, ['label'=>'Valor Pago'])
            ->add('tipoPagamento', ChoiceType::class, ['choices'=>['Selecionar'=>0,'Integral'=>1,'Somente Encargos'=>2], 'required' => true], ['label' => 'Tipo de Pagamento'])
            ->add('dtRegistro', DateTimeType::class, ['widget'=>'single_text','input' => 'datetime','html5'=>false, 'label'=>'Data de Registro'])
            ->add('competencia', null, ['label'=>'Competência'])
            ->add('motivo', TextareaType::class, ['required'=>true])
            ->add('dtCiencia', DateTimeType::class, ['widget'=>'single_text','input' => 'datetime','html5'=>false, 'label'=>'Data de Ciência'])
            ->add('vistoCiencia', CheckboxType::class, ['label'=>'Ciente', 'required'=>false])
            ->add('nomeCliente', null, ['label'=>'Nome'])
            ->add('getRegistro', null, ['label'=>'CNPJ/CPF'])
            ->add('cpfCliente', null, ['label'=>'CPF'])
            ->add('cnpjCliente', null, ['label'=>'CNPJ'])

        ;
    

    public function configureOptions(OptionsResolver $resolver)
    
        $resolver->setDefaults([
            'data_class' => Multa::class,
            'usuario' => Usuario::class,
        ]);
    

这是我的控制器上的:

    /**
     * @Route("/novo", name="multa_novo", methods="GET","POST")
     */
    public function novo(PushNotification $push,
        Request $request): Response
       
        $multa = new Multa();
        $form = $this->createForm(MultaType::class, $multa);
        $form->remove('usuario');
        $form->remove('departamento');
        $form->remove('dtCiencia');
        $form->remove('dtRegistro');
        $form->remove('razaoSocial');
        $form->remove('getRegistro');

        if(in_array($this->getUser()->getAcesso(), [1,2,3,4,7,10]))
        
            $desligados = $this->getDoctrine()->getRepository(Usuario::class)->findByAtivo(0);
        
        else
        
            $desligados = [];
        
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) 
            $entityManager = $this->getDoctrine()->getManager();
            $multa->setUsuario($this->getUser());
            $entityManager->persist($multa);
            $entityManager->flush();
            $this->addFlash('success', "Multa registrada com sucesso!");
 
 - "HERE I HAVE OTHER THINGS I'M DOING AFTER THE SUBMIT..." -

            return $this->redirectToRoute('multa_index');
        

        return $this->render('multa/novo.html.twig', [
            'entity' => $multa,
            'form' => $form->createView(),
            'coordenador' => $coordenador[0], //passando o primeiro objeto usuario encontrado para o front
            'desligados' => $desligados
        ]);
    

我在前面做什么:

            % if desligados %
            <div class="col-lg-4 mb-3" data-intro="Nome do coordenador responsável pela ciência da multa." data-step="5">
              <label>Responsável  <i class=" ml-1 text-info icon-sm mdi mdi-information-outline" title="Caso o responsável pela multa ja tenha sido desligado." data-placement="top" data-toggle="tooltip"></i></label>
              <select id="responsavel" name="multa[responsavel]" class="form-control">
                  <option></option>
                % for responsavel in desligados %
                  <option value="responsavel.id"> responsavel.nomeCompleto </option>
                % endfor %
              </select>
            </div>
            % else %

...


 $(function () 
      $("#multaForm").submit(function(e)     
        e.preventDefault();
        e.stopPropagation();
        var form = $("#multaForm").serializeObject(); //Envia todo o formuário
        form['multa[responsavel]'] = $('#responsavel').val();

        $.post( % if __rota[1] == 'novo' % " path('multa_novo') " % elseif __rota[1] == 'editar' % " path('multa_editar', 'id': entity.id  ) " % else % " path('multa_aprovacao', 'id': entity.id  ) " % endif %, form, function( data ) 
        ).fail(function(error) 
          console.log(error);
        );
        $(this).unbind('submit').submit();
        );
  );

在我的数据库上提交的一个示例:

【问题讨论】:

将 EntityType 与控制器提供给表单的自定义 query_builder 选项一起使用。 该死!这么简单的事情,我不知道。非常感谢你! 有点跑题了,但是.unbind()已经被弃用很久了,已经被.off()取代了。 @LucasMarques 不客气。请随意写下您问题的答案并将其标记为解决方案,以帮助其他追随您的人;o) 【参考方案1】:

正如 Jakumi 建议的那样,我使用 EntityType::class 创建了一个自定义查询构建器,它返回了我想要的内容,因为我使用 formType 来呈现所有字段,我不需要在前端做任何事情来传递它给我的控制器。

【讨论】:

以上是关于通过 post 将外键的 id 传递给表单的主要内容,如果未能解决你的问题,请参考以下文章

Django如何将外键传递给ModelForm字段

Laravel - 如何将外键用于具有识别外键的表?

将外键放入表单

将外键传递给 Rails 中的部分渲染

Python:如何在我的 Django 模板中传递外键的值?

如何通过表单通过 POST 传递 TD id