Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Cómo usar PsPdfBundle en el controlador de mi propio bundle

17 de octubre de 2013

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

#1

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

20 octubre 2013, 22:12