视图中的隐藏值未传递到Symfony 3.4中的Controller

时间:2018-10-23 09:48:42

标签: jquery forms symfony

我想要的东西: 我想要一个回复表单,以便当我在论坛中单击某个帖子时,它将在所选帖子之后添加该表单。而且,当我提交表单时,所选的帖子或ID应该在表单输入中,以便能够将新评论作为我的控制器中的Doctrine / Symfony中具有有效属性的对象持久化。

我做什么: 我可以使用Jquery在所选元素之后添加表单。 我以与Entity属性相同的名称添加了一个隐藏的输入形式(否则Symfony说没有为实体定义这样的属性)。 Formbuilder:

// other lines of codes
        $formbuilder
            ->add('Parent', HiddenType::class, array('data' => null));
// ….

我在视图中为每个帖子添加了一个ID。(与数据库中的ID相同/ topicarg是包含该帖子信息的对象)

  <button class="btn-info comment" id="{{"#{topicarg.id}"}}"> Answer this post </button> </br>

然后当用户单击时,我使用Jquery更改了表单的隐藏值:

// ---------------------------------------CREATE ARGUMENTATION FORM AND PUT IT AFTER THE MAIN ARGUMENTATION
  $(".comment").click(function(){
    // Get the ID of the targeted comment in the same element
    var argtargetid =parseInt($(this).attr("id"), 10);

    // CHANGE THE HIDDEN VALUE IN THE FORM WITH THE ID OF THE TARGETED ELEMENT
    $("#formarg_Parent").val(argtargetid);

    // MOVE AND DISPLAY THE FORM
    var argblock = $(this).parent().parent().parent();
    $("#formarg").appendTo(argblock);
    $("#formarg").toggle(toggleTime);
  });

在这里,我检查了$("#formarg_Parent").val(argtargetid);,并显示了警告,该警告显示了预期的数字。 最后,在我的控制器中,我尝试在处理请求之前使用与该ID对应的对象更改目标帖子的ID。

        $contributionid=$formarg->get('Parent')->getData();
        $topicargtarget=$this->getContribution($contributionid);
        $formarg->get('Parent')->setData($topicargtarget);
        $formarg→handleRequest($request);

但是Symfony返回以下内容:

  

类型错误:传递给getContribution()的参数1必须为整数类型,给定为空

我找不到错误,因为对我来说,我用令人满意的警报检查了表格中的值,因此该表格已准备好传递给控制器​​,我将其放入控制器中并进行了更改变成一个对象。但是我的方法或语法显然有问题。 谢谢您花费时间帮助我!

2 个答案:

答案 0 :(得分:0)

我得到了答案。我意识到,我什至在处理表单之前就试图从表单中提取数据。所以这只是一个空表格,这就是为什么我总是得到NULL的原因。因此,我必须在$contributionid=$formarg->get('Parent')->getData()之后执行handlerequest()。 唯一的事情是Symfony不允许我这样做,因为父字段中的属性不是Contribution对象的实例。为避免这种情况,我必须在构造表单时添加选项mapped => false,以告诉symfony该属性不必与该对象映射。然后将ID传递给控制器​​,而不是映射到对象,并且我可以在Contribution实例中更改ID,以保留新的Contribution(或发布) 所以现在就可以使用了!感谢大家的时间和帮助。它帮助我弄清楚了!

答案 1 :(得分:-1)