我想要的东西: 我想要一个回复表单,以便当我在论坛中单击某个帖子时,它将在所选帖子之后添加该表单。而且,当我提交表单时,所选的帖子或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必须为整数类型,给定为空
我找不到错误,因为对我来说,我用令人满意的警报检查了表格中的值,因此该表格已准备好传递给控制器,我将其放入控制器中并进行了更改变成一个对象。但是我的方法或语法显然有问题。 谢谢您花费时间帮助我!
答案 0 :(得分:0)
我得到了答案。我意识到,我什至在处理表单之前就试图从表单中提取数据。所以这只是一个空表格,这就是为什么我总是得到NULL的原因。因此,我必须在$contributionid=$formarg->get('Parent')->getData()
之后执行handlerequest()
。
唯一的事情是Symfony不允许我这样做,因为父字段中的属性不是Contribution对象的实例。为避免这种情况,我必须在构造表单时添加选项mapped => false
,以告诉symfony该属性不必与该对象映射。然后将ID传递给控制器,而不是映射到对象,并且我可以在Contribution实例中更改ID,以保留新的Contribution(或发布)
所以现在就可以使用了!感谢大家的时间和帮助。它帮助我弄清楚了!
答案 1 :(得分:-1)
如果我答对了,您正在寻找的是 CollectionType字段。
3.4: https://symfony.com/doc/3.4/reference/forms/types/collection.html
当前: https://symfony.com/doc/current/reference/forms/types/collection.html