Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour a tous et bonne année !
Cela fait plusieurs jours que je suis sur un problème, je cherche a générer une page PDF tout simplement mais en respectant mon architecture MVC avec Extjs.
Pour générer un PDF j'ai créé un helpers comme dans ce tuto (http://wiip.fr/content/zend-framework-u … navigateur) qui est une aide d'action pour envoyer un PDF au navigateur. En suivant le tuto j'ai créé une action dans mon controlleur "pdfAction" qui à pour but de générer un pdf avec l'aide de l'helpers.
Mon controlleur client qui contient la fonction pdfAction
class ClientController extends Zend_Controller_Action { function indexAction() { } public function pdfAction() { $this->_helper->viewRenderer->setNoRender(true); $this->_helper->layout->disableLayout(); $id_client ='test'; // Création d'un PDF et d'une page A4 $pdf = new Zend_Pdf(); $pdfPage = $pdf->newPage(Zend_Pdf_Page::SIZE_A4); $pdf->pages[] = $pdfPage; $pdfPage->setFont(Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA), 20); // On dessine quelque chose dans le PDF $pdfPage->drawText($id_client, 100, 510); // On récupère le contenu du PDF $data = $pdf->render(); // Envoi du PDF au navigateur $this->_helper->sendPdf($data); } etc...
Mon Helpers
<?php class Zend_Controller_ActionHelpers_SendPdf extends Zend_Controller_Action_Helper_Abstract { public function direct($data, $contentDisposition = 'inline', $filename = null) { if (!isset($filename)) $filename = uniqid(); $this->getResponse()->setHeader('Content-Type', 'application/x-pdf'); switch ($contentDisposition) { case 'inline': $this->getResponse()->setHeader('Content-Disposition', 'inline'); break; case 'attachment': $this->getResponse()->setHeader('Content-Disposition', "attachment; filename=\"$filename.pdf\""); break; default: throw new Exception("Unknown Content-Disposition ($contentDisposition)"); } $this->getResponse()->setHeader('Content-Length', strlen($data)) ->setHeader('Cache-Control', 'private, max-age=0, must-revalidate') ->setHeader('Pragma', 'public') ->setBody($data); } }
Mon problème est que ma fonction ne génère pas de PDF lorsque celle-ci est appelé via une requete AJAX, par contre si je déplace mon code pdfAction dans le constructeur, un pdf à l'ouverture de la page est bien généré et affiché. Je pense que c'est un problème de réponse de ma requette AJAX, un problème de format de réponse.. je ne sais pas, je suis perdu...
J'utilise Extjs comme interface cliente, du javascript, sur l'évenement de mon bouton pour générer le pdf, je fais une requête en spécifiant dans l'url 'client/pdf' mon controlleur et l'action a exécuté, mais cela ne me génère pas le PDF, le code du pdf m'est retourné en réponse a ma requête AJAX...
var menu_exporterpdf= new Ext.Button({ xtype: 'tbbutton', iconCls:'export', text: 'Imprimer', menu: [{ iconCls:'print', text: 'exporter pdf', handler:function(){ rowsSelected = grid.getSelectionModel().getSelections(); if(grid.selModel.getCount() == 1) { id_client = rowsSelected[0].get('id_client'); Ext.Ajax.request({ waitMsg: 'Please wait...', url: 'client/pdf' });
Je suis perdu, je ne sais vraiment pas comment faire, je suis bloqué, avez vous des idées les amis ??
Hors ligne
J'ai réussi a résoudre mon problème, en fait une requête Ajax demande forcement en retour une réponse, dans mon cas c'était le problème car je ne voulais pas de réponse en ajax pour que le navigateur puisse générer mon pdf et me le proposer en téléchargement, ma solution est simple, j'appelle maintenant ma fonction Pdfaction dans mon javascript comme ceci : window.location = 'client/pdf?id='.concat(id_client); et cela fonctionne j'arrive a récupérer mon parametre, puis faire ma requete puis générer le PDF.
Je ne sais pas si cette solution est optimale mais elle fonctionne, si vous avez d'autres idées je suis preneur !
Hors ligne
Pages: 1