die3sportarten

Triathlon and coding makes some fun

Ausgabe in symfony, ODF-Templates, jetzt wirds dreckig

without comments

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.

Written by Henrico

September 21st, 2010 at 11:49 am

Posted in Code