He instalado satisfactoriamente PsPdfBundle
usando Composer. He realizado el siguiente ejemplo que es muy sencillo:
Controlador
namespace Comercializacion\ComercializacionBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Ps\PdfBundle\Annotation\Pdf; class CatalogoController extends Controller { public function holaAction($nombre) { $format = $this->get('request')->get('_format'); return $this->render( sprintf('ComercializacionBundle:Inventario:hola.%s.twig', $format), array('nombre' => $nombre) ); } }
Enrutamiento
pdf_hola: pattern: /hola/{nombre}.{format} defaults: { _controller: ComercializacionBundle:Catalogo:hola, _format: html} requirements: _format: html|pdf
Plantillas Twig
{# hola.html.twig #} Hello <b>{{ nombre }}</b>! {# hola.pdf.twig #} <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE pdf SYSTEM "%resources%/dtd/doctype.dtd"> <pdf> <dynamic-page> Hello <b>{{ nombre }}</b>! </dynamic-page> </pdf>
Mi problema es que cuando se solicita el formato PDF, devuelve el formato HTML.
Respuestas
El problema que puede estar sucediendo es que en el pattern
del enrutamiento hay un pequeño error:
# ruta original pdf_hola: pattern: /hola/{nombre}.{format} # ... # ruta corregida pdf_hola: pattern: /hola/{nombre}.{_format} # ...
El sistema de enrutamiento de Symfony2 define algunas variables especiales, como por ejemplo la variable que controla el formato de la petición (HTML o PDF). Para distinguirlas de las variables normales, todas las variables especiales prefijan su nombre con un guión bajo, por lo que la variable del formato es _format
y no format
.
Por otra parte, como no he utilizado el bundle PsPdfBundle
, no se si se encarga de ajustar correctamente el formato de la respuesta o si hay que hacerlo a mano. Si no lo hace el bundle, tendrás que utilizar algo como lo siguiente:
use Symfony\Component\HttpFoundation\Response; class CatalogoController extends Controller { public function holaAction($nombre) { $format = $this->get('request')->get('_format'); $content = $this->render( sprintf('ComercializacionBundle:Inventario:hola.%s.twig', $format), array('nombre' => $nombre) ); $contentType = 'pdf' == $format ? 'application/pdf' : 'text/html'; $response = new Response($content, 200, array('content-type' => $contentType)); return $response; } }
@javiereguiluz