Archive for the ‘html’ 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.


