我的控制器中有这个代码:
/**
* @Secure(roles="IS_AUTHENTICATED_FULLY")
* @Route("/rpni/registro/producto/1/guardar", name="productoGuardarPasoUno")
* @Method("POST")
*/
public function guardarPaso1Action(Request $request)
{
$em = $this->getDoctrine()->getManager();
$session = $request->getSession();
$response['success'] = false;
$status = 400;
if ($request->isXmlHttpRequest()) {
$productoSolicitudRequest = $request->request->get('productoSolicitud');
$entProductoSolicitud = $em->getRepository("AppBundle:ProductoSolicitud")->find($session->get('productoSolicitudId'));
$entProducto = $em->getRepository("AppBundle:Producto")->find($productoSolicitudRequest['producto']['nombre']);
$entCondicionProducto = $em->getRepository("AppBundle:CondicionProducto")->find($productoSolicitudRequest['condicion_producto']);
$entFinalidadProducto = $em->getRepository("AppBundle:FinalidadProducto")->find($productoSolicitudRequest['finalidad_producto']);
$entProcedenciaProducto = $em->getRepository("AppBundle:ProcedenciaProducto")->find($productoSolicitudRequest['procedencia_producto']);
$entSolicitudUsuario = $em->getRepository("AppBundle:SolicitudUsuario")->find($session->get('solicitudUsuarioId'));
if ($entProductoSolicitud)
{
$entProductoSolicitud->setProducto($entProducto);
$entProductoSolicitud->setCondicionProducto($entCondicionProducto);
$entProductoSolicitud->setFinalidadProducto($entFinalidadProducto);
$entProductoSolicitud->setProcedenciaProducto($entProcedenciaProducto);
$entProductoSolicitud->setSolicitudUsuario($entSolicitudUsuario);
try {
$em->flush();
} catch (\Exception $e) {
$response['error'] = $e->getMessage();
return new JsonResponse($response, $status);
}
} else {
$newEntProductoSolicitud = new Entity\ProductoSolicitud();
$formProductoSolicitud = $this->createForm(new Form\ProductoSolicitudForm(), $newEntProductoSolicitud);
if ($formProductoSolicitud->isValid())
{
try {
$em->persist($newEntProductoSolicitud);
$em->flush();
$session->set('productoSolicitudId', $newEntProductoSolicitud->getId());
$session->set('productoId', $entProducto->getId());
$response['success'] = true;
// Debug: remover cuando se termine el Bundle
$response['productoSolicitudId'] = $session->get('productoSolicitudId');
$response['productoId'] = $session->get('productoId');
$status = 200;
} catch (Exception $ex) {
$response['error'] = $ex->getMessage();
return new JsonResponse($response, $status);
}
} else {
$response['error'] = $this->get('translator')->trans('formularioNoValido');
$response['formError'] = $this->getFormErrors($formProductoSolicitud);
return new JsonResponse($response, $status);
}
}
return new JsonResponse($response, $status);
}
}
我尝试用于创建和更新目的。当我通过Ajax发送表单时,我从Symfony2获得了这个响应:
{
"success":false,
"error":"formularioNoValido",
"formError":{
"producto":{
"nombre":[
]
},
"lote":[
],
"procedencia_producto":[
],
"finalidad_producto":[
],
"condicion_producto":[
]
}
}
除此之外别无他法。奇怪的是,检查Firebug中的发布标签会给我输出结果:
Parameters application/x-www-form-urlencodedDo not sort
productoSolicitud[_token] wC_MAeVs7ZAGSpkvLYux6RKrLq46aivxXxiCZr6pNeU
productoSolicitud[condici... 1
productoSolicitud[finalid... 1
productoSolicitud[lote] 11
productoSolicitud[procede... 1
productoSolicitud[product... 4
Source
productoSolicitud%5Bproducto%5D%5Bnombre%5D=4&productoSolicitud%5Bprocedencia_producto%5D=1&productoSolicitud%5Bfinalidad_producto%5D=1&productoSolicitud%5Bcondicion_producto%5D=1&productoSolicitud%5Blote%5D=11&productoSolicitud%5B_token%5D=wC_MAeVs7ZAGSpkvLYux6RKrLq46aivxXxiCZr6pNeU
见下图:
那么,错误在哪里?为什么表格无效?任何线索?指教?
答案 0 :(得分:0)
如果我没有弄错,您的操作只会从此else
声明中返回该响应:
else {
$newEntProductoSolicitud = new Entity\ProductoSolicitud();
$formProductoSolicitud = $this->createForm(new Form\ProductoSolicitudForm(), $newEntProductoSolicitud);
if ($formProductoSolicitud->isValid())
{
try {
$em->persist($newEntProductoSolicitud);
$em->flush();
$session->set('productoSolicitudId', $newEntProductoSolicitud->getId());
$session->set('productoId', $entProducto->getId());
$response['success'] = true;
// Debug: remover cuando se termine el Bundle
$response['productoSolicitudId'] = $session->get('productoSolicitudId');
$response['productoId'] = $session->get('productoId');
$status = 200;
} catch (Exception $ex) {
$response['error'] = $ex->getMessage();
return new JsonResponse($response, $status);
}
} else {
$response['error'] = $this->get('translator')->trans('formularioNoValido');
$response['formError'] = $this->getFormErrors($formProductoSolicitud);
return new JsonResponse($response, $status);
}
}
我发现从ProductoSolicitud
的新实例创建表单的有效性后,我发现这很奇怪,这真的是你想要做的吗?如果您从请求中获得了一些数据,是否不能进行此有效性检查?
也许是这样的:
if ($entProductoSolicitud)
{
$entProductoSolicitud->setProducto($entProducto);
$entProductoSolicitud->setCondicionProducto($entCondicionProducto);
$entProductoSolicitud->setFinalidadProducto($entFinalidadProducto);
$entProductoSolicitud->setProcedenciaProducto($entProcedenciaProducto);
$entProductoSolicitud->setSolicitudUsuario($entSolicitudUsuario);
$formProductoSolicitud = $this->createForm(new Form\ProductoSolicitudForm(), $entProductoSolicitud);
if ($formProductoSolicitud->isValid()) {
try {
$em->flush();
} catch (\Exception $e) {
$response['error'] = $e->getMessage();
return new JsonResponse($response, $status);
}
}
}
但我可能只是误解了这个问题:S
答案 1 :(得分:0)
好吧,因为我发现问题出在哪里我会自己回答,所以别人不会犯同样的错误。在我的代码中,我从不告诉表单处理请求,因此存在问题所在。 else
中的代码转到此:
} else {
$newEntProductoSolicitud = new Entity\ProductoSolicitud();
$formProductoSolicitud = $this->createForm(new Form\ProductoSolicitudForm(), $newEntProductoSolicitud);
$formProductoSolicitud->handleRequest($request);
if ($formProductoSolicitud->isValid())
{
...
} catch (Exception $ex) {
$response['error'] = $ex->getMessage();
return new JsonResponse($response, $status);
}
} else {
....
}
}
return new JsonResponse($response, $status);
}
}
这就是全部,快乐的编码!!