Development

HowToPrintWithLatex: sfPDFView.class.php

You must first sign up to be able to contribute.

HowToPrintWithLatex: sfPDFView.class.php

File sfPDFView.class.php, 4.3 kB (added by skr68, 11 years ago)
Line 
1 <?php
2
3 /**
4  * Latex PDF View class for symfony
5  * @copyright 2006 Konrad Riedel riedel@ibr-oss.de
6  * based on work by Georg Gell
7  */
8
9 $e = error_reporting(0);
10 error_reporting($e);
11
12 class sfPDFView extends sfPHPView {
13     private static $mapLoaded = false;
14     protected static $helpers;
15     protected $file;
16
17     public function initialize($context, $moduleName, $viewName)
18     {
19         parent::initialize($context, $moduleName, $viewName);
20         if (sfConfig::get('sf_logging_active')) $this->getContext()->getLogger()->info('{sfPDFView} is used for rendering');
21         return true;
22     }
23
24     public function configure()
25     {
26         //$this->extension = '.tex';
27         //won't work with partials :(  - so only - .php
28         //if (sfConfig::get('sf_logging_active')) $this->getContext()->getLogger()->info('{sfPDFView} is using'.$this->extension);
29         parent::configure();
30     }
31
32     /**
33     * Render the presentation.
34     *
35     * When the controller render mode is sfView::RENDER_CLIENT, this method will
36     * render the presentation directly to the client and null will be returned.
37     *
38     * @return string A string representing the rendered presentation, if
39     *                the controller render mode is sfView::RENDER_VAR, otherwise null.
40     */
41     public function &render($templateVars = null)
42     {
43         $template         = $this->getDirectory().'/'.$this->getTemplate();
44         $actionStackEntry = $this->getContext()->getActionStack()->getLastEntry();
45         $actionInstance   = $actionStackEntry->getActionInstance();
46
47         $moduleName = $actionInstance->getModuleName();
48         $actionName = $actionInstance->getActionName();
49
50         $retval = null;
51         $context = $this->getContext();
52         
53         // execute pre-render check
54         //exception, if template missing
55         $this->preRenderCheck();
56
57         // get the render mode
58         $mode = $context->getController()->getRenderMode();
59         
60         // template variables
61         if ($templateVars === null)
62         {
63             $actionStackEntry = $context->getActionStack()->getLastEntry();
64             $actionInstance   = $actionStackEntry->getActionInstance();
65             $templateVars     = $actionInstance->getVarHolder()->getAll();
66         }
67
68         // assigns some variables to the template
69         $this->attribute_holder->add($this->getGlobalVars());
70         $this->attribute_holder->add(array('dir' => $this->getDirectory()));
71         $this->attribute_holder->add($retval !== null ? $vars : $templateVars);
72
73         $retval = null;
74         $retval = $this->renderFile($template);
75         if ($mode == sfView::RENDER_CLIENT)
76         {
77             if ($sf_logging_active = sfConfig::get('sf_logging_active'))
78             {
79                 $this->getContext()->getLogger()->info('{sfPDFView} render to client "'.$template.'"');
80             }
81             $tempDatei = tempnam("/tmp","tex");
82
83             $fp  = fopen ($tempDatei.'.tex',"w");
84             if (!$fp) {
85                 die ("Could not open ".$tempDatei);
86             }
87             fwrite($fp, $retval);
88             fclose($fp);
89
90             ob_start();
91             passthru("cd /tmp; pdflatex -interaction nonstopmode $tempDatei.tex 2>&1");
92
93             $err = '<pre>'.ob_get_contents().'</pre>';
94             ob_end_clean();
95
96             if (file_exists($tempDatei.'.log')) {
97                 $log = file_get_contents("$tempDatei.log");
98                 if (strpos($log, 'Fatal error')) {
99                     unlink($tempDatei.'.pdf');
100                 }
101             }
102
103             if (file_exists($tempDatei.'.pdf')) {
104                 $this->getContext()->getResponse()->setContentType('application/pdf');
105                 $this->getContext()->getResponse()->addHttpMeta('cache-control', 'no-cache');
106                 $this->getContext()->getResponse()->addHttpMeta('Expires', gmdate("D, d M Y H:i:s") . " GMT",time());
107                 //moved to action, so diffent filenames are possible
108                 //$this->getContext()->getResponse()->addHttpMeta('Content-Disposition', 'attachment; filename="document.pdf"');
109                 $retval = file_get_contents("$tempDatei.pdf");
110                 $context->getResponse()->setContent($retval);
111                 unlink($tempDatei);
112                 exec ("rm $tempDatei*");
113             } else {
114                 if ($sf_logging_active = sfConfig::get('sf_logging_active'))
115                 {
116                     $this->getContext()->getLogger()->info('{sfPDFView} mode '. $mode.' render "'.$template.'" error"'.$err.'"');
117                 }
118                 ob_start();
119                 readfile($tempDatei.'.tex');
120                 $msg = '<h2>Log</h2><pre>'.$log.'</pre>';
121                 $msg .= '<h2>Tex-source:</h2><pre>'.ob_get_contents().'</pre>';
122                 ob_end_clean();
123                 throw new sfRenderException($err.$msg);
124                 return parent::render();
125
126             }
127         }
128         return $retval;
129     }
130
131
132     public function getFile(){
133         return $this->file;
134     }
135
136 }
137
138 ?>
139