Generación de pdf's en symfony. Una acción y varias plantillas
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






Gracias lo implementare cuando tenga que hacer mis reportes de mi tesis
Gracias a tí @conates por participar!
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!
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!
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!
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.
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!
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?
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.