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,看看是否可以在实体管理器端解除绑定,但还不够。。。答案就在这里