Foros del Web » Programando para Internet » PHP » Symfony »

[SOLUCIONADO] Problema al retornar Objeto Response en Sysmfony por medio de Ajax

Estas en el tema de Problema al retornar Objeto Response en Sysmfony por medio de Ajax en el foro de Symfony en Foros del Web. Hola a todos, pues mi problema es al momento de crear un PDF con "knp_snappy" y retornar la respuesta en el navegador para su visualización ...
  #1 (permalink)  
Antiguo 29/01/2015, 10:44
Avatar de DeivisAndres  
Fecha de Ingreso: febrero-2012
Ubicación: Colombia
Mensajes: 305
Antigüedad: 12 años, 2 meses
Puntos: 41
Exclamación Problema al retornar Objeto Response en Sysmfony por medio de Ajax

Hola a todos, pues mi problema es al momento de crear un PDF con "knp_snappy" y retornar la respuesta en el navegador para su visualización por medio del AJAX, pues lo que tengo es esto:

Este es mi JavaScript:

Código Javascript:
Ver original
  1. var options = {
  2.      type: "GET",    
  3.      headers: "....",
  4.      url: "ruta a ejecutar",
  5.      data: data,
  6.      contentType: 'application/json',
  7.      dataType: "json",
  8.      success: function(data, textStatus, jqXHR) {                                          
  9.           var winlogicalname = "detailPDF";
  10.           var winparams = 'width=850,height=1050';
  11.           //var htmlText = '<embed width="100%" height="100%" type="application/pdf" src="data:application/pdf,' + data + '"></embed>';                                        
  12.           var detailWindow = window.open(winlogicalname, winparams);
  13.       detailWindow.document.write(data);
  14.       //detailWindow.document.write(htmlText);
  15.       detailWindow.document.close();
  16.       },
  17.       error: function(xhr, status, error) {
  18.     alert("Estado del error " + status + " Error " + error);
  19.       }
  20. };
  21.  
  22. $.ajax(options);

Este es mi controlador de Symfony:

Código PHP:
Ver original
  1. $html = $this->renderView('ReportBundle:Price:price.html.twig', $data);
  2. $filename = "export.pdf";
  3. $basePath = $this->container->getParameter('kernel.root_dir');
  4. $basePath = str_replace("app", "web", $basePath);      
  5.  
  6. if (file_exists($basePath."/".$filename)) {
  7.     unlink($basePath."/".$filename);
  8. }
  9.  
  10. $this->get('knp_snappy.pdf')->generateFromHtml($html, $filename);
  11. $response = $this->get("talker")->response(array("success" => true));
  12. $response = new Response($response, 200);  
  13. $response->headers->set('Content-Description', 'PDF');
  14. $response->headers->set('Content-Type', mime_content_type($filename));
  15. $response->headers->set('Content-Disposition', 'inline; filename='.basename($filename));
  16. $response->headers->set('Content-Transfer-Encoding', 'binary');        
  17. $response->headers->set('Expires', '0');
  18. $response->headers->set('Cache-Control', 'must-revalidate');
  19. $response->headers->set('Pragma', 'public');           
  20. $response->headers->set('Content-Length:', filesize($basePath."/".$filename));
  21.            
  22. $response->sendHeaders();          
  23. $response->setContent(readfile($basePath."/".$filename));
  24.  
  25. return $response;

Pero el unico mensaje que me muestra es: "Estado del error parsererror Error SyntaxError: Unexpected end of input"

Si alguien me puede ayudar se lo agradeceria.
  #2 (permalink)  
Antiguo 29/01/2015, 12:36
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Problema al retornar Objeto Response en Sysmfony por medio de Ajax

Si vas a generar el pdf al vuelo y enviarlo de vuelta la cliente puedes hacer lo siguiente:
Código PHP:
Ver original
  1. $response = new Response (
  2.             $this->get('knp_snappy.pdf')->getOutputFromHtml($html,
  3.                 array('lowquality' => false,
  4.                     'print-media-type' => true,
  5.                     'encoding' => 'utf-8',
  6.                     'page-size' => 'Letter',
  7.                     'outline-depth' => 8,
  8.                     'orientation' => 'Portrait',
  9.                     'title'=> 'Áreas',
  10.                     'user-style-sheet'=> 'css/bootstrap.css',
  11.                     'header-right'=>'Pag. [page] de [toPage]',
  12.                     'header-font-size'=>7,
  13.                 )),
  14.             200,
  15.             array(
  16.                 'Content-Type'          => 'application/pdf',
  17.                 'Content-Disposition'   => 'attachment; filename="file.pdf"',
  18.             )
  19.         );
  20.  
  21. return $response
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 29/01/2015, 15:17
Avatar de DeivisAndres  
Fecha de Ingreso: febrero-2012
Ubicación: Colombia
Mensajes: 305
Antigüedad: 12 años, 2 meses
Puntos: 41
Respuesta: Problema al retornar Objeto Response en Sysmfony por medio de Ajax

@hhs con respecto a lo que me dices ya de esa forma lo he probado y me sale el error "Unexpected token %" cuando esta retornando en el AJAX
  #4 (permalink)  
Antiguo 29/01/2015, 15:32
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Problema al retornar Objeto Response en Sysmfony por medio de Ajax

Sin utilizar ajax presenta el mismo problema ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 29/01/2015, 16:26
Avatar de DeivisAndres  
Fecha de Ingreso: febrero-2012
Ubicación: Colombia
Mensajes: 305
Antigüedad: 12 años, 2 meses
Puntos: 41
Respuesta: Problema al retornar Objeto Response en Sysmfony por medio de Ajax

No, me funciona correctamente si no utilizo AJAX, solamente mando a ejecutar la ruta en otra pestaña y me visualiza el PDF sin problemas, entonces parece que me tocara realizarlo de esa manera sin el AJAX...
  #6 (permalink)  
Antiguo 29/01/2015, 16:54
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Problema al retornar Objeto Response en Sysmfony por medio de Ajax

No e probado esta idea, pero igual te puede servir: https://github.com/johnculviner/jquery.fileDownload
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 30/01/2015, 07:25
Avatar de DeivisAndres  
Fecha de Ingreso: febrero-2012
Ubicación: Colombia
Mensajes: 305
Antigüedad: 12 años, 2 meses
Puntos: 41
Respuesta: Problema al retornar Objeto Response en Sysmfony por medio de Ajax

Si ya la conozco, y la probé igualmente pero no se que pasa que los .css no me los toma como son y no me sale ningún style en el PDF... Pero ya me decidí y dejarlo sin el AJAX y mandar la ruta de ejecución así otra pestaña, de todas formas muchísimas gracias por la ayuda me sirvió de mucho gracias. Y el resultado final fue el siguiente:

Código PHP:
Ver original
  1. // Cree un objeto con el servicio, donde este tendra las funciones que necesito.
  2. $reportService = $this->get('report_service');
  3. // Creo el HTML.
  4. $html = $this->renderView('ReportBundle:Price:price.html.twig', $data);
  5. // Declaro el nombre del PDF.
  6. $filename = date("Ymd")."_".$oportunity->getClient()->getIdentity()->getNumber()."_".".pdf";
  7. // Declaro un Array() con las propiedades que se definiran en el PDF.
  8. $propertyPdf =  array('load-error-handling' => 'ignore', 'lowquality' => false, 'print-media-type' => true, 'encoding' => 'utf-8', 'outline-depth' => 8, 'images' => true, 'image-dpi' => 600, 'margin-bottom' => 10, 'margin-left' => 10, 'margin-right' => 10, 'margin-top' => 10, 'header-font-size' => 10, 'footer-font-size' => 10);
  9. // Llamo el servicio que cree, donde este me retornara un objeto de tipo PDF.
  10. $pdf = $reportService->getReportPdf($html, $propertyPdf);
  11. // Y creo el objeto de respuesta al navegador.
  12. $response = new Response();
  13. $response->setContent($pdf);
  14. $response->setStatusCode(200);
  15. // Seteo lo headers para que el navegador sepa el tipo de documento a interpretar.
  16. $response->headers->set('Content-Description', 'PDF Cotización');
  17. $response->headers->set('Content-Type', 'application/pdf');
  18. $response->headers->set('Content-Disposition', 'inline; filename='.$filename);
  19. // Y al final retorno este mismo al navegador.
  20. return $response;

Y este es la función que llamo desde mi servicio:

Código PHP:
Ver original
  1. /**
  2. * Recibe el HTML, el array() con las propiedades de este.
  3. */
  4. public function getReportPdf($html, array $property)
  5. {
  6.     $KnpSnappyPdf = $this->co->get('knp_snappy.pdf')->getOutputFromHtml($html, $property);
  7.     return $KnpSnappyPdf;
  8. }


Última edición por DeivisAndres; 30/01/2015 a las 08:36 Razón: SOLUCIÓN

Etiquetas: ajax, medio, objeto, response, retornar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:21.