Skip to content

Generación de pdf's en symfony. Una acción y varias plantillas

by david on abril 27th, 2010

Symfony tiene soporte nativo para los diferentes formatos y tipos mime, es decir, el mismo modelo y controlador pueden generar diferentes plantillas basándose en el formato de la petición.
El formato por defecto en symfony es html, el resto de formatos pueden definirse en el factory sfWebRequest a través del fichero factories.yml.
Pues bien, si necesitamos generar pdf’s y queremos hacer uso de ésta característica de symfony hemos de agregar al factory sfWebRequest el mime asociado a los pdf’s.

1
2
3
4
5
6
7
8
9
10
11
12
request:
  class: sfWebRequest
    param:
      formats:
        txt:  text/plain
        js:   [application/javascript, application/x-javascript, text/javascript]
        css:  text/css
        json: [application/json, application/x-json]
        xml:  [text/xml, application/xml, application/x-xml]
        rdf:  application/rdf+xml
        atom: application/atom+xml
        pdf: application/pdf

Imaginemos que tenemos una acción verContrato cuyo contenido queremos generarlo en formato html y pdf. Para ello deberemos crear los siguientes templates:

  • verContratoSuccess.php (encargada de visualizar el html)
  • verContratoSuccess.pdf.php (encargada de genera el pdf)

y su correspondiente routing sería:

1
2
3
4
5
ver_contrato
  url: /ver-contrato.:sf_format
  param: { module: usuario, action: verContrato, sf_format: html }
  requirements:
    sf_format: (?:html|pdf)

Por último sólo quedaría implementar la función executeVerContrato en el actions.class.php correspondiente.

1
2
3
4
5
6
7
8
9
10
class usuarioActions extends sfActions
{
  ...
  public function executeVerContrato($request)
  {
    // Aqui realizamos los cálculos necesario y symfony
    // ya sabe que template ejecutar según la petición recibida
  }
  ...
}

Y de este modo, como ya he dicho, tenemos una única acción verContrato encargada de realizar los calculos, y dos templates que se utilizarán según necesitemos un tipo de formato u otro. Recordar que los partials pueden ser también diferentes según el formato:

  • _datos.php
  • _datos.pdf.php

Si necesitáis más información consultar este enlace al blog de symfony

From → Symfony, sfWebRequest

11 Comments
  1. Gracias lo implementare cuando tenga que hacer mis reportes de mi tesis

  2. David permalink

    Gracias a tí @conates por participar!

  3. Jnillo permalink

    Hola @david, he intentado obtener el pdf pero me sale corrupto. Seguro que se me esta olvidando un parametro necesario para construir correctamente el pdf y que aqui no has explicado. ¿Puede ser el caso? O simplemente como indicas aqui ya te funciona correctamente?

    Saludos y gracias, buen trabajo!

  4. David permalink

    Hola @Jnillo,
    ¿A que te refieres con que te sale corrupto?

    Necesitas rellenar la acción “verContrato” con tu código y luego definirte el template verContratoSuccess.pdf.php y verContratoSuccess.php.
    El código que genera tu pdf debe estar en el template verContratoSuccess.pdf.php y a esa plantilla le pasas los datos que necesitas como a cualquier otra.

    Con eso debe bastarte.

    Saludos!

  5. Jnillo permalink

    Si si hago todo esto que dices pero a la hora de obtener el pdf, me sale el adobe con que tengo un error

    “Adobe Reader no pudo abrir ’3[3].pdf’ debido a que no es un tipo de archivo admitido o esta dañado…”

    Pienso que se debe a una mala configuracion por mi parte de routing.yml y/o del url_for que uso para llamar a la accion para generar el pdf.

    Routing:
    ver_albaran:
    url: /ver_albaran/:sf_format/:id
    param: { module: pedido, action: albaran, sf_format: html}
    requirements:
    sf_format: (?:html|pdf)

    URL_FOR:
    url_for(‘@ver_albaran?sf_format=pdf&id=’.$pedido->getId())

    Creo que me he hecho la “pixa un lio”, como lo harias?

    Gracias por tu tiempo tio!

    • David permalink

      Prueba esto,
      routing:
      ver_albaran:
      url: /ver_albaran/albarna-:id.:sf_format (deja sf_format al final)
      param: { module: pedido, action: albaran, sf_format: html}
      requirements:
      sf_format: (?:html|pdf)

      El url_for lo veo bien. Mira a ver si lo que tienes en albaranSuccess.pdf.php es correcto.

  6. Jnillo permalink

    Nada el error de que no es un archivo admitido persiste.

    Lo raro es que, cuando lei el articulo me surgio la duda de que librerías como DomPdf entre otras, necesitan renderizar para obtener el pdf y en el caso que explicas simplemente con indicarle un formato ya obtienes un pdf.

    ¿Te sale el pdf y puedes abrirlo con adobe reader como tal?

    Perdona la duda pero me sorprende mucho que el paso a pdf sea tan simple. Saludos!

  7. Cristian permalink

    A mi también me sucede lo mismo que a Jnillo alguien lo pudo resolver?

    Como prueba cambie la extensión a xls y me genera el archivo sin problemas.

    ¿Alguna sugerencia?

  8. Lupita Rodriguez permalink

    Alguien a tenido solucion a su problema??? si alguien la ha tenido, por fa me puede indicar como lo solucionaron xq tengo el mismo problema.

Trackbacks & Pingbacks

  1. uberVU - social comments
  2. Tweets that mention Symfony e Internet » Blog Archive » Generación de pdf’s en symfony. Una acción y varias plantillas - Conociendo la web -- Topsy.com

Leave a Reply

Note: XHTML is allowed. Your email address will never be published.

Subscribe to this comment feed via RSS