PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘excel’ tag

Nicht-HTML-Responses mit dem Zend Framework

with 5 comments

Wenn man dynamische Bilder oder RSS-Feeds oder einen AJAX/JSON-Service oder ein Excel-Export mithilfe des Zend Frameworks erstellen will, mußt man 2-3 wichtige Dinge beachten. Der Code soll dann in einem Rss-/Graph-/Ajax-/Export-Controller stehen.

Ein Problem bekommt man, wenn man ein Layout benutzt (Zend_Layout). Denn dann wird dieses Layout immer ausgegeben. Im hier betrachteten Fall wäre das aber sehr schädlich, denn dadurch würden wir unser Bild/RSS-Feed/AJAX/Excel-Response zerstören.

Unschön kann man das wie folgt lösen:

1
2
3
4
5
6
public function rssAction()
{
    // calculate rss data and echo it (with correct headers)
 
    exit;
}

Richtig und deutlich schöner ist das Abschalten des Layout in der Action, wie folgt:

1
2
3
4
5
6
7
8
9
10
public function rssAction()
{
    // disable layout
    $this->_helper->layout()->disableLayout();
     
    // disable view rendering
    $this->_helper->viewRenderer->setNoRender();
     
    // calculate rss data and echo it (with correct headers)
}

Wir schalten auch gleich noch den ViewRenderer mit aus, damit auch nicht versucht wird, ein Viewscript zu rendern (das es wahrscheinlich garnicht gibt).

Dieses RSS-Beispiel funktioniert natürlich genauso für die anderen Beispiele, wo kein klassischer HTML-Quelltext zurückgegeben werden soll, sondern eine Antwort in einem anderen Format gefordert ist.

Damit kann man dann seine dynmisch erstellten Bilder (z.B. mittels pChart, jpgraph oder direkt die GD-Funktionen/image* in php), RSS-Feeds (Zend_Feed), Ajax-Services (Zend_Json) usw. realisieren.

Hier noch schnell ein Beispiel eines Excel-Exports aus einer Datenbank, mit Hilfe der Spreadsheet-Klasse aus dem PEAR-Framework (vereinfacht auf das Wesentliche):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class ExportController extends Zend_Controller_Action
{  
    public function excel() {
        // disable layout
        $this->_helper->layout()->disableLayout();
         
        // disable view rendering
        $this->_helper->viewRenderer->setNoRender();
 
         
        // get some data from database here
         
                
        // create empty file
        //include 'Spreadsheet/Excel/Writer.php';
        $excel = new Spreadsheet_Excel_Writer();
        // add worksheet
        $sheet =& $excel->addWorksheet('Daily Export');
 
        $sheet->setColumn(0,0,20);
        $sheet->setColumn(1,1,15);
        $sheet->setColumn(2,2,18);
        $sheet->setColumn(3,3,23);
        $sheet->setColumn(4,4,35);
        $sheet->setColumn(5,5,15);
 
        $format_bold =& $excel->addFormat();
        $format_bold->setBold();
 
        $format_headline =& $excel->addFormat();
        $format_headline->setBold();
        $format_headline->setSize(20);
        $format_headline->setAlign('center');
 
        // headline
        $sheet->write(0, 0, 'Results: '.date('d.m.Y H:i'), $format_headline);
        $sheet->mergeCells(0,0,0,5);
 
        // add data to worksheet
        $rowCount=2;
 
        foreach ($data as $groupName=>$serverData) {
            $sheet->write($rowCount, 0, $groupName, $format_bold);
            $rowCount++;
 
            foreach ($serverData as $row) {
                $colcount = 0;
                foreach ($row as $key => $value) {
                    $sheet->write($rowCount, $colcount, $value);
                    $colcount++;
                }
                $rowCount++;
            }
            $rowCount++;
        }
        // send client headers
        $excel->send('daily_export_'.date("Ymd-His").'.xls');
    }      
}

Dies hier ist alter Code, mittlerweile nutzen wir PHPExcel.

Written by Michael Kliewe

Juli 2nd, 2009 at 2:52 pm

Posted in PHP

Tagged with , , , , , ,