微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过邮寄将外键的ID传递到表单

如何解决通过邮寄将外键的ID传递到表单

我在数据库上为此实体(“ 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',['label'=>'Cliente'])
            ->add('valor',['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',['label'=>'Competência'])
            ->add('motivo',TextareaType::class,['required'=>true])
            ->add('dtCiencia','label'=>'Data de Ciência'])
            ->add('vistoCiencia',CheckBoxType::class,['label'=>'Ciente','required'=>false])
            ->add('nomeCliente',['label'=>'Nome'])
            ->add('getRegistro',['label'=>'CNPJ/CPF'])
            ->add('cpfCliente',['label'=>'CPF'])
            ->add('cnpjCliente',['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();
        });
  });

我的数据库中有一个提交的示例:

enter image description here

解决方法

按照Jakumi的建议,我使用EntityType :: class创建了一个自定义的querybuilder,它返回了我想要的内容,并且当我使用formType呈现所有我不需要在前端做任何事情来传递的字段时交给我的控制器。

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。