使用一个表单编辑同一页面上的不同项目-Symfony2

使用一个表单编辑同一页面上的不同项目-Symfony2,symfony,Symfony,我使用的是Symfony2,我有一个项目列表,旁边有一个按钮可以编辑项目。像这样的 项目1 |编辑 项目2 |编辑 项目3 |编辑 在同一个页面上是编辑表单,但是它是隐藏的,当你点击一个按钮编辑一个项目时,它会在js中显示出来。问题是您仍然在同一页上,对于每个项目,表单都应该填充不同的对象。你知道如何做到这一点吗,因为当url不变时,我不知道如何调用不同的控制器。提前非常感谢!:) JS: 许多解决方案: 只有一个控制器,并向他发送一个隐藏的输入,其中包含要编辑的元素的Id 单击编辑链接时使用

我使用的是Symfony2,我有一个项目列表,旁边有一个按钮可以编辑项目。像这样的

项目1 |编辑

项目2 |编辑

项目3 |编辑

在同一个页面上是编辑表单,但是它是隐藏的,当你点击一个按钮编辑一个项目时,它会在js中显示出来。问题是您仍然在同一页上,对于每个项目,表单都应该填充不同的对象。你知道如何做到这一点吗,因为当url不变时,我不知道如何调用不同的控制器。提前非常感谢!:)

JS:

许多解决方案:

  • 只有一个控制器,并向他发送一个隐藏的输入,其中包含要编辑的元素的Id
  • 单击编辑链接时使用javascript设置相应的操作属性
如果使用第一种方法,我们要做的是使用ajax或表单检索当前项,假设编辑的链接如下所示:

<a href="{{ path("url", {id: myid}) }}" data-id="{{ myid }}">Edit</a>
然后在控制器中(显示当前视图的控制器):


以下是我过去使用过的一种方法:

  • 创建表示“项”的实体
  • 创建允许您编辑“项目”的表单类型:
  • 在表单中,使用上面的新类型定义集合类型:
  • 为您的类型定义自定义主题:
    • 此自定义主题将用于生成包装html,以便您的JS可以适当地打开/关闭
    • 如果在上面的新表单类型(例如ItemType_小部件)之后调用新块,它将被表单_小部件(form)自动拾取并使用。注意,你需要在细枝模板中包含你的主题&你的主题应该扩展Symfony的
    • 您可以在该主题中指定CSS类,以便隐藏子表单
然后,当调用视图时,可以渲染表单,它将自动附加子表单。然后,JS只需打开/关闭相应的表单

在处理表单时,您需要将它们全部包含在内,因此最好使用某种方法来识别刚刚编辑的元素


您在标签方面也会遇到问题-这只是摆弄主题的一种情况。

您能否为第一种解决方案提供更多信息。我的编辑链接是这样的:
,我将ID提供给控制器,但我不希望整个页面发生更改,只希望在单击时显示表单中的信息。非常感谢!我一直在尝试这个方法,但问题是如果我单击Item1的edit按钮,它将在表单的下一次打开时填充到表单中,而不是当前表单中。例如,现在表单中填充了有关Item1的信息,我单击以编辑Item2-当表单打开时,它将再次填充Item1,但下次我单击任何要编辑的链接时,表单将显示有关Item2的信息(先前单击的链接)有什么想法吗?:(看看jQuery.get及其“success”选项(在该选项中,您将数据附加到页面中)。您也可以使用Developer控制台进行调试,并在网络面板中查找发送到服务器的内容。我想我发现了更多信息-从数据库加载新项目的信息时,表单会花费很长时间,在此期间表单仍填充有旧内容。当新内容准备就绪时,表单会隐藏。W当你说“变得可见”你是说从服务器加载html或者用相应的数据填充隐藏的表单吗?我的意思是,它是用css隐藏的,当你点击按钮时,一个js脚本会让它显示一个动画,你可以看到它,但是一切都在前端,页面保持不变,表单在点击页面之前就在那里链接,它是不可见的。一个表单用于所有项目,或者一个表单用于每个项目?你能添加你的javascript代码吗?是的,我更新了问题
<a href="{{ path("url", {id: myid}) }}" data-id="{{ myid }}">Edit</a>
$('.editItem').click(function(e) {

   // We avoid the default behaviour (ie following the link)
   e.preventDefault();

   // We load the form with ajax
   $('.show').load('', {id: $(this).attr('data-id')});
});
 if($request->isXmlHttpRequest()) {
     $myid = $request->query->get('id'); // Could be $request->request


     $entity = $em->getRepository('...')->getOneById($myid);

     return $this->render('form.html.twig', array('entity' => $entity));

 }