Pour utiliser Tcpdf sous ZF2, j'ai créé un module basé sur le principe suivant :
- La méthode qui souhaitera créer un pdf lancera un événement contenant tous les paramètres et toutes les données permettant de créer le pdf.
- un écouteur (listener) sera chargé de surveillé la présence de ces événements et déclenchera la création
Voici le schéma d'organisation de mon module :
La configuration de Tcpdf est basée sur des constantes. Elle se fera dans le fichier config/autoload/tcpdf-config.global.php de l'application.
Voici ci-dessous un exemple d'utilisation de mon module dans un controller. Il s'agit de créer un listing à partir d'une sélection dans une table de tarifs. La sélection est définie dans l'action tarifListeAction() à partir d'un formulaire criteres_form et ses paramètres sont conservés en session.
/** * envoie un evenement contenant les paramètres de création d'un document pdf * (le listener DafapTcpdf\Listener\PdfListener lancera la création du pdf) * Il n'y a pas de vue associée à cette action puisque la response html est créée par \TCPDF */ public function tarifPdfAction() { $currentPage = $this->params('page', 1); $criteres_form = new CriteresForm('tarifs'); $criteres_obj = new ObjectDataCriteres($criteres_form->getElementNames()); $session = new SessionContainer(str_replace('pdf', 'liste', $this->getSessionNamespace())); if (isset($session->criteres)) { $criteres_obj->exchangeArray($session->criteres); } $tableTarifs = $this->getServiceLocator()->get('Sbm\Db\Table\Tarifs'); $data = array(); foreach ($tableTarifs->fetchAll($criteres_obj->getWhere(), 'nom') as $row) { $data[] = array( $row->nom, $row->montant, $row->rythme, $row->grille, $row->mode ); } $call_pdf = $this->getServiceLocator()->get('RenderPdfService'); $call_pdf->setData($data) ->setHead(array('Nom', 'Montant', 'Rytme', 'Grille', 'Mode')) ->setPdfConfig( array( 'title' => 'Liste des tarifs', 'header' => array( 'title' => 'Liste des tarifs', 'string' => 'éditée par School Bus Manager le ' . date('d/m/Y à H:i') ))) ->setTableConfig(array( 'tbody' => array( 'cell' => array( 'txt_precision' => array(0, 2, 0, 0, 0) )), 'column_widths' => array(64, 30, 30, 20, 36) )) ->renderPdf(); $this->flashMessenger()->addSuccessMessage("Création d'un pdf."); }
Cliquez sur cette image pour voir le résultat.
Ce module est disponible sur github/dafap.