Forms Symfony2:在表单中单击“取消”后如何更新和删除实体
我有一个带有取消按钮的表单实体。 我的目标是,当用户单击“取消”时,我忽略表单中正在进行的用户更改,但在控制器中更新同一实体的一些字段 这是我的问题。 单击“取消”时,我的控制器必须处理该请求,以便识别已单击的“取消”。因此,我的实体将使用表单中正在进行的(但未验证的)用户更改进行更新。我不知道如何在更新某些字段之前放弃这些更改。目前,无论我在做什么,我的实体都会随着正在进行的用户更改而更新,持久化数据将持久化用户更改和控制器更新Forms Symfony2:在表单中单击“取消”后如何更新和删除实体,forms,symfony,entity,persistence,unbind,Forms,Symfony,Entity,Persistence,Unbind,我有一个带有取消按钮的表单实体。 我的目标是,当用户单击“取消”时,我忽略表单中正在进行的用户更改,但在控制器中更新同一实体的一些字段 这是我的问题。 单击“取消”时,我的控制器必须处理该请求,以便识别已单击的“取消”。因此,我的实体将使用表单中正在进行的(但未验证的)用户更改进行更新。我不知道如何在更新某些字段之前放弃这些更改。目前,无论我在做什么,我的实体都会随着正在进行的用户更改而更新,持久化数据将持久化用户更改和控制器更新 public function updateAction
public function updateAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$change = $em->getRepository('psmdbBundle:changes')->find($id);
$notification = $this->container->get('notification');
if (!$change) {
throw $this->createNotFoundException('Unable to find changes entity.');
}
$deleteForm = $this->createDeleteForm($id);
$editForm = $this->createEditForm($change);
$editForm->handleRequest($request);
// Manage Cancel Button
if ($editForm->get('cancel')->isClicked()) {
//Cancel is clicked
if (!$change->getSaved()) {
// A change was just created
$em->remove($change);
$em->flush();
$notification->notify('cancel');
return $this->redirect($this->generateUrl('admin_changes'));
} else {
// A change was already existing
// TODO undo user changes as cancel has been clicked before resetting Futurerequest and Futurerequiredapproval
$change->setFuturerequest('');
$change->setFuturerequiredapproval('');
$em->persist($change);
$em->flush();
$notification->notify('cancel');
return $this->redirect($this-> generateUrl('admin_changes_show', array('id' => $id)));
}
// Rest of the controller...
我尝试过实例化另一个变量,如$changeBack,但它仍然检索正在进行的用户更改:
$changeBack = $em->getRepository('psmdbBundle:changes')->find($id);
那么,在控制器识别Cancel案例之后,是否有方法将实体从表单中“解除绑定”?或者从数据库中获取实体的实例
我设想的一个解决方案是通过JS处理Cancel按钮,但我想知道如何在Symfony中做到这一点
提前感谢您的帮助 您可以有多个
submit
按钮,然后在控制器中确定单击了哪个按钮。因此,如果您将取消
按钮设置为提交
按钮,您可以使用isClicked
方法识别单击了取消
按钮,并相应地执行操作,即重新填充/刷新$change
:
if ($editForm->get('cancel')->isClicked()) {
$em->detach($change); // detaching
$change = $em->getRepository('psmdbBundle:changes')->find($id); // repopulating
//...
}
或者,正如@Cerad所指出的,可以刷新实体。分离和重新填充并非真正必要:
if ($editForm->get('cancel')->isClicked()) {
$em->refresh($change); // refreshing
//...
}
文档中的更多信息-您可以有多个
提交
按钮,然后在控制器中确定单击了哪个按钮。因此,如果您将取消
按钮设置为提交
按钮,您可以使用isClicked
方法识别单击了取消
按钮,并相应地执行操作,即重新填充/刷新$change
:
if ($editForm->get('cancel')->isClicked()) {
$em->detach($change); // detaching
$change = $em->getRepository('psmdbBundle:changes')->find($id); // repopulating
//...
}
或者,正如@Cerad所指出的,可以刷新实体。分离和重新填充并非真正必要:
if ($editForm->get('cancel')->isClicked()) {
$em->refresh($change); // refreshing
//...
}
文档中的更多信息-您可以有多个
提交
按钮,然后在控制器中确定单击了哪个按钮。因此,如果您将取消
按钮设置为提交
按钮,您可以使用isClicked
方法识别单击了取消
按钮,并相应地执行操作,即重新填充/刷新$change
:
if ($editForm->get('cancel')->isClicked()) {
$em->detach($change); // detaching
$change = $em->getRepository('psmdbBundle:changes')->find($id); // repopulating
//...
}
或者,正如@Cerad所指出的,可以刷新实体。分离和重新填充并非真正必要:
if ($editForm->get('cancel')->isClicked()) {
$em->refresh($change); // refreshing
//...
}
文档中的更多信息-您可以有多个
提交
按钮,然后在控制器中确定单击了哪个按钮。因此,如果您将取消
按钮设置为提交
按钮,您可以使用isClicked
方法识别单击了取消
按钮,并相应地执行操作,即重新填充/刷新$change
:
if ($editForm->get('cancel')->isClicked()) {
$em->detach($change); // detaching
$change = $em->getRepository('psmdbBundle:changes')->find($id); // repopulating
//...
}
或者,正如@Cerad所指出的,可以刷新实体。分离和重新填充并非真正必要:
if ($editForm->get('cancel')->isClicked()) {
$em->refresh($change); // refreshing
//...
}
文档中的更多信息-谢谢您的回答。我尝试过这样做,但即使我从存储库中检索到$change,它似乎来自实体而不是数据库,因此从表单提交的数据……这是因为
doctor
缓存了您的实体。在检索新副本之前尝试分离它。无需分离或再次查找,$em->refresh($change)即可完成此操作。哦,太好了!缺少的是刷新方法。我花了一些时间查看表单端的API,看看是否可以在实体管理器端解除绑定,但还不够。。。答案在评论中,我该怎么办?发布我的答案并接受它,还是等待@Cerad发布,然后我接受他的答案?谢谢你的回答。我尝试过这样做,但即使我从存储库中检索到$change,它似乎来自实体而不是数据库,因此从表单提交的数据……这是因为doctor
缓存了您的实体。在检索新副本之前尝试分离它。无需分离或再次查找,$em->refresh($change)即可完成此操作。哦,太好了!缺少的是刷新方法。我花了一些时间查看表单端的API,看看是否可以在实体管理器端解除绑定,但还不够。。。答案在评论中,我该怎么办?发布我的答案并接受它,还是等待@Cerad发布,然后我接受他的答案?谢谢你的回答。我尝试过这样做,但即使我从存储库中检索到$change,它似乎来自实体而不是数据库,因此从表单提交的数据……这是因为doctor
缓存了您的实体。在检索新副本之前尝试分离它。无需分离或再次查找,$em->refresh($change)即可完成此操作。哦,太好了!缺少的是刷新方法。我花了一些时间查看表单端的API,看看是否可以在实体管理器端解除绑定,但还不够。。。答案在评论中,我该怎么办?发布我的答案并接受它,还是等待@Cerad发布,然后我接受他的答案?谢谢你的回答。我尝试过这样做,但即使我从存储库中检索到$change,它似乎来自实体而不是数据库,因此从表单提交的数据……这是因为doctor
缓存了您的实体。在检索新副本之前尝试分离它。无需分离或再次查找,$em->refresh($change)即可完成此操作。哦,太好了!缺少的是刷新方法。我花了一些时间查看表单端的API,看看是否可以在实体管理器端解除绑定,但还不够。。。答案就在这里