Hola:
Seguimos a vueltas con Symfony. Tengo una duda relacionada con las direcciones. Quiero redireccionar después de enviar un formulario a la dirección referida. Como creo que me explico muy mal con:
$anterior = $this->container->get('request_stack')->getCurrentRequest()->headers->get('referer'); return $this->redirect($anterior);
Yo lo que quiero conseguir es esto:
Listado -> confirmación de borrado -> borrado -> listado
Lo que consigo es esto:
Listado -> confirmación de borrado
No se si me explicado correctamete, porque creo que me explico muy mal.
Saludos.
Respuestas
Para hacer lo que planteas, necesitas dos plantillas (listado.html.twig
y confirmacion.html.twig
) y dos acciones en el controlador (listadoAction()
, borradoAction()
).
A grandes rasgos, este sería el código que debes utilizar:
public DefaultController extends Controller { public function listadoAction(Request $request) { // ... } /** * @Route("/borrar/{id}/", name="borrar") */ public function borradoAction(Request $request) { if (false === $request->query->getBoolean('confirmacion')) { return $this->render('confirmacion.html.twig'); } else { $em = $this->getDoctrine()->...; $entidad = $em->...; $em->remove($entidad); return $this->redirect('listado.html.twig'); } } }
Y en la plantilla de confirmación es donde tienes que definir ese parámetro confirmacion
que indica si el elemento tiene que borrarse o no:
{% extends 'layout.html.twig' %} {# ... #} <a href="{{ path('borrar', { id: entidad.id, confirmacion: 'true' }) }}">Borrar</a>
Te comento algunas cosas más:
- En tu código original utilizas un parámetro
referer
, pero si siempre rediriges al listado, no hace falta utilizar un parámetro para saber a dónde quieres redirigir. - El código original utiliza la llamada al contenedor para obtener el servicio
request_stack
. A menos que obliguen a hacerlo así, no te recomiendo esa forma de trabajar. Mira el código que te he puesto de ejemplo para ver que es muy fácil acceder a la petición actual. En realidad Symfony es muy fácil, pero a veces nos complicamos nosotros mismos. - Me parece que mostrar una pantalla intermedia para confirmar el borrado es innecesario. Puede llegar a cansar al usuario final y complica nuestro trabajo. A menos que te obliguen a hacerlo así, yo utilizaría una ventana modal para confirmar el borrado. Aquí puedes ver un ejemplo de cómo hacerlo.
- Por último, para borrar un elemento no deberías utilizar el método GET y pasar parámetros en el query string, tal y como te he mostrado en el ejemplo anterior. Para hacerlo bien y evitar problemas, tienes que utilizar el método
DELETE
de HTTP, lo que te obliga a crear un formulario sólo para el botón de borrar. Como suena raro, aquí puedes ver un ejemplo de este formulario de borrado.
@javiereguiluz
11 marzo 2015, 8:52