Archive for the ‘Zend_Layout’ tag
Nicht-HTML-Responses mit dem Zend Framework
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:
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:
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):
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.