Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous!
J'aimerai renvoyer un pdf créer avec FPDF, sauf que ZF2 me renvoie automatiquement la vue. En cherchant je dis que cela est dû à un déclencheur, alors je me suis mis dessus sauf que sur les différents tutos que je trouve, je ne voie nulle part où l'on indique où stocker les classe devant me servirent de gestionnaires d'événement, ni aucune nomenclature si il y'en a bien sûr. S'il vous plait j'aimerai bien savoir où stocker lms gestionnaires d'événement dans arborescence de mes modules et si possible avoir une explication simple sur comment cours-circuiter des événements.
Merci
Hors ligne
Bonjour,
je ne suis pas bien sur de comprendre l'histoire des événements.
Par contre pour ne pas afficher ton template de vue dans ton action, tu peu mettre ton ViewModel en terminal:
$view = new ViewModel(); ... bla bla bla ... $view->setTerminal(true);
Si ce n'est pas ca que tu recherchais, je te demanderai un peu plus de précision ^^
Hors ligne
Merci flobrflo pour ta réponse, sauf que si je ne me trompe pas, $view->setTerminal(true) me permet de ne pas afficher mon layout, mais le template est toujours affiché. Alors comment faire pour qu'il renvoie ni le layout, ni le template aussi afin de pouvoir envoyer un pdf à la place par exemple.
Merci!
Dernière modification par DDUC (10-09-2014 10:21:04)
Hors ligne
Salut, pour télécharger un fichier il faut changer le header de ta requête .
Hors ligne
Tu peu passer par la classe Response de ZF2, ça permet de gérer très convenablement la sortie de ton controller
(très pratique pour un retour du json notamment ^^)
Hors ligne
J'ai trouvé!
il suffit d'utiliser code qui suit pour faire cela.
return new \Zend\Http\PhpEnvironment\Response();
Cela permet de ne pas renvoyer ni le layout et ni la vue. Il renvoie un objet de réponse vide.
On le mettant juste après l’envoie de notre pdf, il agit comme si on faisait un exit() qui parait être barbare.
En tout cas merci pour vos réponse.
Cordialement.
Dernière modification par DDUC (14-10-2014 17:58:55)
Hors ligne
flobrflo a écrit:
Tu peu passer par la classe Response de ZF2, ça permet de gérer très convenablement la sortie de ton controller
(très pratique pour un retour du json notamment ^^)
Hou le vilain.
Pour ça il y a le JsonModel.
DDUC a écrit:
J'ai trouvé!
il suffit d'utiliser code qui suit pour faire cela.Code:
return new \Zend\Http\PhpEnvironment\Response();Cela permet de ne pas renvoyer ni le layout et ni la vue. Il renvoie un objet de réponse vide.
On le mettant juste après l’envoie de notre pdf, il agit comme si on faisait un exit() qui parait être barbare.
En tout cas merci pour vos réponse.
Cordialement.
Pour cet usage il y a le \Zend\Http\Response\Stream;
Hors ligne
Bouks! Un lien ou l'on explique de façon explicite avec des exemple si possible sur la classe \Zend\Http\Response
me serai d'une grande aide car j'en trouve pas.
Hors ligne
Là il n'y a rien de compliqué tu créés une instance de \Zend\Http\Response dans ton contrôleur et tu la retourne en remplissant ce dont tu as besoin .
Hors ligne
http://framework.zend.com/manual/2.0/en … e-examples
Il n'y a rien de mieux que la doc
bon je te conseil qu'en même de faire un setContent autrement, mais au moins tu a toutes les clefs en main ^^
Dernière modification par flobrflo (15-10-2014 15:08:10)
Hors ligne
ok! je vois c'est nettement mieux mais le problème est que dans la syntaxe le <<<EOS ne se ferme pas à la rencontre du EOS fermant. Du coup tout le reste de mon code est prix comme fessant parti de la chaîne de caractère. Alors bonjour le bug
voici ce que m'affiche le bug
Parse error: syntax error, unexpected '"', expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\Program Files\Zend\Apache2\htdocs\ebanking\module\Administration\src\Administration\Controller\TracesUsersController.php on line 293
Je précise que la fermeture de mon <<<EOS se trouve à la ligne 206
Hors ligne
peut tu nous montrer le bout de code?
apparemment tu à mis une double quote en trop.
Hors ligne
k! voici l'action qui me permet d'envoier un pdf ou un cvs selon le choix de l'utilisateur
public function printConsultationAction(){ set_time_limit(0); $session = new SessionContainer('user'); if($session->offsetExists('userId')) { $userId = $session->userId; //if($request->isXmlHttpRequest() && $request->isPost()){ $format = $this->params('format',null); $option = $this->params('option', null); $racine = $this->params('racine', null); $debut = $this->params('debut', null); $fin = $this->params('fin', null); if(!is_null($debut)) { $tab[0] = substr ( $debut , 0 , 4 ); $tab[1] = substr ( $debut , 4 , 2 ); $tab[2] = substr ( $debut , 6 , 2 ); $debut = $tab[2].'/'.$tab[1].'/'.$tab[0]; $debut = $debut.' 00:00:00'; } if(!is_null($fin)) { $tab[0] = substr ( $fin , 0 , 4 ); $tab[1] = substr ( $fin , 4 , 2 ); $tab[2] = substr ( $fin , 6 , 2 ); $fin = $tab[2].'/'.$tab[1].'/'.$tab[0]; $fin = $fin.' 23:59:59'; } // Mettre les filtres sur les champs ici try { $response = new Response(); $response->setStatusCode(Response::STATUS_CODE_200); $response->getHeaders()->addHeaders(array( 'HeaderField1' => 'header-field-value', 'HeaderField2' => 'header-field-value2', )); $response->setContent(<<<EOS <html> <body> Hello World </body> </html> EOS); $consultations = $this->getSessionsLogTable()->traceAdhesions( $option, $racine, $debut, $fin ); if ($format == "pdf") { $view = new ViewModel(array( 'consultations' => $consultations, 'option' => $option )); $view->setTemplate('Administration/traces-users/print-consultations'); $view->setTerminal(true); $render = $this->getServiceLocator()->get('ViewRenderer'); $html = $render->render($view); //echo $html; //exit(); $pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // set document information $pdf->SetCreator(PDF_CREATOR); $pdf->SetAuthor(PDF_AUTHOR); $pdf->SetTitle(PDF_HEADER_STRING); $pdf->SetSubject('Liste des consultations des clients'); $pdf->SetKeywords('PETI, Historique, centre, compte'); // set default header data //$soustitle = PDF_HEADER_STRING.'Relevé du compte bancaire '.$compte->numero."\nPETI Ebanking, le ".date('d/m/Y'); $soustitle = ""; $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE, $soustitle, array(119,41,83), array(119,41,83)); $pdf->setFooterData(array(119,41,83), array(119,41,83)); // set header and footer fonts $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); // set default monospaced font $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); // set margins $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); $pdf->SetHeaderMargin(PDF_MARGIN_HEADER); $pdf->SetFooterMargin(PDF_MARGIN_FOOTER); // set auto page breaks $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); // set image scale factor $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); // set some language-dependent strings (optional) if (@file_exists(dirname(__FILE__).'/lang/eng.php')) { require_once(dirname(__FILE__).'/lang/eng.php'); $pdf->setLanguageArray($l); } // --------------------------------------------------------- // set font $pdf->SetFont('helvetica', '', 9); // add a page $pdf->AddPage(); // create some HTML content //$html = '<h1>Example of HTML text flow</h1>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. <em>Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?</em> <em>Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</em><br /><br /><b>A</b> + <b>B</b> = <b>C</b> -> <i>C</i> - <i>B</i> = <i>A</i> -> <i>C</i> - <i>A</i> = <i>B</i> -> <b>A</b> + <b>B</b> = <b>C</b> -> <i>C</i> - <i>B</i> = <i>A</i> -> <i>C</i> - <i>A</i> = <i>B</i> -> <b>A</b> + <b>B</b> = <b>C</b> -> <i>C</i> - <i>B</i> = <i>A</i> -> <i>C</i> - <i>A</i> = <i>B</i> -> <b>A</b> + <b>B</b> = <b>C</b> -> <i>C</i> - <i>B</i> = <i>A</i> -> <i>C</i> - <i>A</i> = <i>B</i> -> <b>A</b> + <b>B</b> = <b>C</b> -> <i>C</i> - <i>B</i> = <i>A</i> -> <i>C</i> - <i>A</i> = <i>B</i> -> <b>A</b> + <b>B</b> = <b>C</b> -> <i>C</i> - <i>B</i> = <i>A</i> -> <i>C</i> - <i>A</i> = <i>B</i> -> <b>A</b> + <b>B</b> = <b>C</b> -> <i>C</i> - <i>B</i> = <i>A</i> -> <i>C</i> - <i>A</i> = <i>B</i> -> <b>A</b> + <b>B</b> = <b>C</b> -> <i>C</i> - <i>B</i> = <i>A</i> -> <i>C</i> - <i>A</i> = <i>B</i><br /><br /><b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u>'; // output the HTML content $pdf->writeHTML($html, true, 0, true, 0); // reset pointer to the last page $pdf->lastPage(); // --------------------------------------------------------- //Close and output PDF document $pdf->Output('download.pdf', 'I'); } else { header("Content-type: application/vnd.ms-excel"); header("Content-disposition: attachment; filename=consultations.csv"); $arr = array(); $i = 0; if($option == 1) { foreach ($consultations as $row) { $arr[$i][0] = $row["nom"]; $arr[$i][1] = $row["prenom"]; $arr[$i][2] = $row["racine"]; $arr[$i][3] = $row["nbconnexion"]; $dat = new \DateTime($row["date_connexion"]); $arr[$i][4] = $dat->format('Y-m-d H:i:s'); ++$i; } } elseif($option == 2) { foreach ($consultations as $row) { $arr[$i][0] = $row["nom"]; $arr[$i][1] = $row["prenom"]; $arr[$i][2] = $row["racine"]; $arr[$i][3] = $row["tel"]; $dat = new \DateTime($row["dateheure"]); $arr[$i][4] = $dat->format('Y-m-d H:i:s'); $arr[$i][3] = $row["categorie"]; ++$i; } } echo $this->array_to_csv($arr); //echo var_dump($arr); //exit(); return new \Zend\Http\PhpEnvironment\Response(); } return new \Zend\Http\PhpEnvironment\Response(); } catch (\Exception $ex) { $view = new ViewModel(array( 'err' => $ex )); $view->setTerminal(true); return $view; } //} } }
mais quand je réduit ce code à ce qui suit
public function printConsultationAction(){ set_time_limit(0); $session = new SessionContainer('user'); if($session->offsetExists('userId')) { $userId = $session->userId; //if($request->isXmlHttpRequest() && $request->isPost()){ $format = $this->params('format',null); $option = $this->params('option', null); $racine = $this->params('racine', null); $debut = $this->params('debut', null); $fin = $this->params('fin', null); if(!is_null($debut)) { $tab[0] = substr ( $debut , 0 , 4 ); $tab[1] = substr ( $debut , 4 , 2 ); $tab[2] = substr ( $debut , 6 , 2 ); $debut = $tab[2].'/'.$tab[1].'/'.$tab[0]; $debut = $debut.' 00:00:00'; } if(!is_null($fin)) { $tab[0] = substr ( $fin , 0 , 4 ); $tab[1] = substr ( $fin , 4 , 2 ); $tab[2] = substr ( $fin , 6 , 2 ); $fin = $tab[2].'/'.$tab[1].'/'.$tab[0]; $fin = $fin.' 23:59:59'; } // Mettre les filtres sur les champs ici try { $response = new Response(); $response->setStatusCode(Response::STATUS_CODE_200); $response->getHeaders()->addHeaders(array( 'HeaderField1' => 'header-field-value', 'HeaderField2' => 'header-field-value2', )); $response->setContent(<<<EOS <html> <body> Hello World </body> </html> EOS); } return new \Zend\Http\PhpEnvironment\Response(); } catch (\Exception $ex) { $view = new ViewModel(array( 'err' => $ex )); $view->setTerminal(true); return $view; } //} } }
voici l'erreur qui est afficher
Parse error: syntax error, unexpected end of file in C:\Program Files\Zend\Apache2\htdocs\ebanking\module\Administration\src\Administration\Controller\TracesUsersController.php on line 272
Certe la je ne renvoie pas de pdf, c'est juste que je faire un essaie avec du texte premièrement.
Dernière modification par DDUC (15-10-2014 12:27:32)
Hors ligne
euh, ça réglera certainement pas ton soucis, mais après avoir initialisé ton $objet response, tu retourne un nouvel objet vide avec :
[lang=php] return new \Zend\Http\PhpEnvironment\Response();
ce qui rend la config inutile.
fait le passer avec return $response;
Et le "unexpected end of file", regarde bien la syntaxe de toute ta classe, tu peut-être oublié un "}"
Dernière modification par flobrflo (15-10-2014 12:41:17)
Hors ligne
Franchement, du côté de cette piste rien à faire. J'ai vérifier et tout mes blocs sont bien fermés. Mais des que j'ouvre l'instruction <<<EOS, tout le code restant est pris pour du texte
Hors ligne
Autant pour moi! j'ai fait des recherche du côté de php à cette adresse Les chaînes de caractères. ET cette façon d'écrire du texte est appelée "Heredoc".
Mon erreur à été d'avoir indenté l'identifiant de fin et d'avoir mal terminer l'expression $response->setContent(<<<EOS...
Résultat, j'ai un beau hello world qui s'affiche.
Merci à vous!
Hors ligne
Tu peux aussi utiliser des services parce que là ton contrôleur c'est un peu sale ... Si jamais tu veux générer ce même pdf ailleurs dans une autre action tu fais comment ? Du copier/coller ? Dans ce cas dès que tu vas modifier à un endroit faudra le modifier partout ?
Ensuite je suis pas sur que tu sois obligé d'utiliser cette notation pour le setContent et là pour le coup dans ton exemple tu t'en fous du contenu puisque c'est le header qui importe.
Hors ligne
Merci Orkin c'est très bien pensé. Sauf que je me suis mis récemment sur les service donc par rapport à sa j'ai des questions donc je vais ouvrir une nouvelle discussion pour sa.
Hors ligne