Archive for September, 2010
Ausgabe in symfony, ODF-Templates, jetzt wirds dreckig
Jede größere Firma hat so was wie eine Corporate Identity und somit auch meistens Briefpapier. Also sollte aus der Applikation heraus ein Dokument mit Briefkopf generiert werden und das dann ausgedruckt werden. Mein erster Gedanke war einfach, wie bei der csv Datei den Header ändern mittels
$this->getResponse()->setHttpHeader('Content-Type', 'application/msword');
Also ein Word ein Dokument vorgaukeln und alles ist einfach und gut. Natürlich war gar nichts gut, das Layout wurde stets zerschossen und der Adresskopf war nie da wo er sein sollte. Außerdem hatten wir schon Word-Vorlagen. Die Word-Vorlagen habe ich dann mittels OpenOffice ins “.odt” Format gebracht.
Um diese Templates dann zu verarbeiten, benutze ich die kleine Bibliothek odtphp. Hier kann man mittels php in einem odt-Dokument Variablen var in {var} ändern.Also Bibliothek wieder einbinden.
require_once ("/library/odf.php");
Nun zur Action
public function executeInvoice(sfWebRequest $request){
$odf = new odf( "odfTemplates/document.odt");
Das hier ist der erste Knackpunkt, aber nur wenn man es nicht berücksichtigt. Irgendwo müssen ja die Templates liegen und sie liegen nicht beim Controller, sondern im ‘web’ Unterordner von Symfony, da dort die Verarbeitung der Anfrage stattfindet. Jetzt wird es dreckig und schmutzig.
Da ich nun vorsätzlich die MVC- Struktur verletzte, denn nach der Theorie gehört Logik in den Controller und Ausgabe in die View, dass man häufiger auch mal Logik in die View packt ist ja bekannt, aber dieses Mal muss der Controller zur Ausgabe hinhalten. Da hier die Marker verarbeitet werden.
$odf->setVars('variable', $variabeleValue );
Die Ausagbe als Downloadbare Datei erfolgt mit der Funktion.
$odf->exportAsAttachedFile('document.odt');
Nun kommen wir zu Problem, dass symfony nach jedem Aufruf einer Action in der View ein Rückgabewert erwartet, umgehen kann man es mit,
throw new sfStopException();
Die Verarbeitung wird gestoppt und man kriegt ein schönes odt-Dokument.
Ausgabe in symfony, Export in eine CSV Datei
Eine CSV Datei ist eigentlich nur eine Komma getrennte Wertetabelle,
Wert1, wert1a, wert1b
wert2, wert2a, wert2b
Was für den Projektmanager die Gantt Diagramme sind, ist für die Buchhaltung und Banken CSV Datei, die kann man nämlich in Excel öffnen.
Schlüsselwort war eben schon genannt es ist ‘DATEI’, also klicken auf einen linkt es kommt so ein ‘Datei Downloaden oder öffnen’ Fenster.
Als Vorbereitung brauchen wir hier eines neues Layout, also Hauptordner den ‘templates’ eine neue Layout-Datei erstellen, hier ‘csvLayout.php’ der Inhalt ist einfach gehalten
echo $sf_data->getRaw('sf_content')
.
Fertig. super!
Wir haben natürlich auch wieder eine Funktion,
public function executeCsv(sfWebRequest $request)
{
/**coole Abfrage. Daten holen**/
//unsere Layout Datei setzten
$this->setlayout('csvLayout');
//die Standard ausgabe des Header löschen
$this->getResponse()->clearHttpHeaders();
//dem Browser erzählen was da kommt
$this->getResponse()->setHttpHeader('Content-Type', 'application/vnd.ms-excel');
//und die Datei heisst
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment;filename=umsatzanzeige.csv');
}
In der View csvSuccess.php findet dann die Verabeitung der Daten statt.
foreach ($values as $v ):
echo $v->getId().',' .$v->getSome();
endforeach;
Done, Buchhaltung ist glücklich.
Ausgabe in symfony, Gantt Diagramm
In meinem derzeitigen Projekt muss ich symfony häufiger dazu nötigen keine HTML Seiten auszugeben, sondern Bilder, CSV oder Dokumente wie .doc oder das .odt Format auszugeben.
Die Abfragen in symfony laufen ja stets nach dem MVC Muster ab, also man ruft ein Funktion auf, meinetwegen ‘grafik/makeGrafik’, d.h. es gibt im Controller eine Klasse ‘grafikActions’ und in dieser eine Funktion ‘executeMakeGrafik’. Von dort aus wird aufs ‘Model’ zugegriffen, anschließend in der ‘View’ nach einer Datei die ‘makeGrafikSuccess.php’ heißt gesucht.
Natürlich kann man auch Plugins verwenden, aber ich hatte häufiger, dass Problem, dass vorgestellte Plugins nicht mit jeder symfony Version kompatibel sind bzw. einfach schlecht Dokumentiert sind/waren, außerdem sollte es eigentlich kein Problem darstellen eine bestehende PHP – Bibliothek einzubinden, geht ganz einfach mit ‘require_once(“…”);.
Ausgabe eines Gantt Diagramm
Erstmal ein Gantt Diagramm ist beliebt bei Projekt Manager um zeitliche Abläufe darzustellen. Hierzu gibt es eine tolle und umfangreiche PHP-Bibliothek JpGraph, die Teilbibliothek heißt Gantt.
Installation
Die Gantt Bibliothek in den gewünschten Controller kopieren und in der ‘Action’ über,
require_once ("/src/jpgraph.php");
require_once ("/src/jpgraph_gantt.php");
einbinden. Fertig.
Nun kann man in einer Action auf auf JpGraph zugreifen. Aber man generiert kein HTML sondern ein .jpeg, also heißt man muss die Standardantwort ändern,
public function executeDrawGantt( sfWebRequest $request ){
$this->getResponse()->setContent('image/jpeg');
$graph = new GanttGraph();
/*
*Hier wird nun die Grafik zusammen gabaut.
* Schaut euch dazu eines der Beispiele im Tutorial an,
*/
$graph->Stroke();
return sfView::NONE;
}
Was wir jetzt bekommen ist zwar ein Bild und es wird auch angezeigt,aber es ist nicht im Layout unser symfony Anwendung, dass reicht einem selbst aber jeder normale Benutzer schreit, zu recht.
Ich habe das Problem so gelöst.
Eine zweite Funktion, die in der gerenderte ‘view’ die oben beschrieben Funktion aufruft.
showGanttInLayoutSuccess.php
/* ... Hier werden die Formate definiert ... */
.graph{ border: 26px solid #FF0000}
#map{
background:url("") repeat scroll 0 0 transparent;
display:block;
height:1503px; //ja wirklich
margin:0 auto 2em;
position:relative;
width:4241px;//dito
/* ++++ */
Done!