Dienstag, 27. Dezember 2011

Form: Postprocessor um Kopie an Sender zu senden

Die Postprocessoren haben es mir gerade angetan. Liegt wohl daran, dass sie so schnell und schmutzig gehen ;)
In diesem Postprocessor geht es darum, wie man dem Absender auch eine Kopie zuschickt. In allen Fällen sollte man daran denken, dass so ein Formular auch als Mailschleuder genutzt werden könnte. Richtigen Schutz bietet da wohl nur ein Captcha, für eingeloggte User schreibe ich später meine Lösung dazu.
Dieser Postprocessor nimmt den Mail-Postprocessor und erweitert ihn sehr direkt. Dafür als erstes mal die Datei Mail.php kopieren und die Kopie in Mailtosendertoo.php umbenennen. Nun den Namen der Klasse in tx_form_System_Postprocessor_Mailtosendertoo ändern, bevor wir mit dem Anpassen der Funktion anfangen können.
In die Funktion process() kommt hinter den Aufruf
$this->send(); 
Noch eine neue Zeile, um die Funktion aufzurufen, in der die Kopie gesendet wird :
$this->sendCopyToSender();
Die neue Funktion sieht dann so aus:
 /**
 * Changes the To, Reply-To, Subject and sends message to the sender of this message
 * Function makes use of the same mailMessage object, thus should be used only after the original message is send* @return void
 */
protected function sendCopyToSender() {
 $this->mailMessage->setSubject("Die folgende Nachricht wurde eben in Deinem Namen via BiTS-Alumni.de verschickt");
 $this->mailMessage->setReplyTo($this->mailMessage->getSender());
 $this->mailMessage->setTo($this->typoScript['senderEmail']);
 }
 $this->send();
}
 Die Funktion tauscht entsprechend Subject, Empfänger, und ReplyTo der Email. Danach wird die Email gesendet.

Im Typoscript anstatt
 1 = Mail  
 1 {  
 …  
 }  
Jetzt:
 1 = Mailtosendertoo  
 1 {  
 …  
 }  
Der Rest bleibt gleich. Fertig!

Donnerstag, 22. Dezember 2011

Typoscript Variablen in der Form Extension auslesen

In Forum auf Typo3.net war es schon beschrieben, aber ich will hier noch mal kurz darauf eingehen, wie man die Stelle findet und warum die Lösung nicht immer zu nutzen ist.

Mit verschiedenen Extensions in Typo3 4.5 war es problemlos möglich Variablen mit Hilfe von Typoscript vorzubelegen:
{TSFE:fe_user|user|email}
Und ähnliche Werte konnte man öfter finden.
In der neuen Form ist das nicht mehr möglich. Laut diesem Issue (http://forge.typo3.org/issues/25931) im Forge liegt das an dem Securitykonzept der Extension. Die Idee der neuen Form ist offensichtlich, dass man auch Redakteuren erlaubt Forms zu erstellen. Diese wären dann in der Lage mittels Variablen eigenen Code einzuschleusen, vermute ich. Ich bin jetzt zu bequem diese Lücke gedanklich voll durchzudenken.

Für alle, bei denen es keine Redakteure gibt, hier die Quick & Dirty Lösung, mittels der man Variablen „erlauben“ kann. Alles was es braucht ist in sysext/form/Classes/ Domain/Factory/Typoscript.php in der Funktion reconstituteElement als erste Zeile folgendes:
 $arguments['value']= $this->getLocalConentObject()->insertData($arguments['value']);  

So kann dann mittels Typoscript zum Beispiel auf Werte des TSFE oder auch auf Werte, die per URL übergeben wurden, zugreifen.

 10 = Fieldset  
 10 {  
 10 = hidden  
 10.value = {TSFE:fe_user|user|email}  
 20 = hidden  
 20.value = {gp:receiverID}  
 }  


Die erste Zeile gibt die Emailadresse des eingeloggten Users zurück. Die zweite Zeile sucht in der URL nach dem Parameter receiverID und gibt deren Wert zurück. Also bspw. den Wert 23, wenn die URL so aussieht:  index.html?receiverID=23

Die Übergabe über die URL ist natürlich nicht frei von Risiken, weil jeder Nutzer hier natürlich die Werte ändern könnte. Deshalb sollte man sich genau überlegen, wann man mittels gp:… auf URL Übergaben vertraut.

Meine zugegebenermaßen sehr einfachen Tests ergaben, dass hier keine Risiken existieren. Weil jeglicher Code ja vorher bereits in HTML Sonderzeichen umgewandelt wird. Trotzdem sollte man diese Variante nur sparsam einsetzen. Wozu ich es  nutze, schreibe ich im nächsten Artikel.

Hintergrund
Wie aber findet man die Stelle in der Extension an der die Anpassung vorgenommen werden muss? In extBase Extensions kann man dazu eigentlich  in der ext_localconf.php anfangen und sich dann via Controller-Classes weiter hangeln. Für die Form Extension gilt das leider nicht ganz, weil der Einstieg etwas komplizierter ist, da die Form Extension das Standardform-Element und dessen Funktionen teilweise überschreibt.  Ein Blick in den Controller schadet aber auch nicht. Im Ordner form/Classes/Controller/ gibt es 2 Dateien: Form.php und Wizard.php. Form.php  klingt vielversprechend (wir wollen ja nicht den Backend Wizard bearbeiten).

In dieser Datei gibt es die Funktion cObjGetSingleExt, diese wird laut Kommentar 2 mal aufgerufen und trägt diesen Namen, weil der Typo3 Core das verlangt.
Am Ende ruft sie die Funktion execute() auf, die wiederrum die Funktion renderForm aufruft, wenn noch kein PostEvent stattgefunden hat (das wird in showForm() überprüft).
RenderForm ruft jetzt die Funktion buildModelFromTyposcript() des Objekts $this->typoscriptFactory auf. Klingt schon sehr nach dem, was wir wollen. Das Objekt $this->typoscriptFactory wird noch immer in Form.php erstellt und zwar mit der Zeile:

 t3lib_div::makeInstance('tx_form_Domain_Factory_Typoscript');  

Also suchen wir jetzt in Classes/Domain/Factory/Typoscript.php nach der Funktion “buildModelFromTyposcript“.
In dieser Funktion scheint die Methode createElement vielversprechend, zumal sie auch die Variable $typoscript enthält, in der die Werte, die wir im Formwizard eingegeben haben, enthalten sind. Das findet man heraus, indem man sich mittels der Extension debugster oder der php Funktion print_r() die Werte der Variable ausgeben lässt. In dem $typoscript Array sind wir daran interessiert, dass die Werte in 'value' umgeformt werden. An der Stelle ist die Extension etwas komplexer, weil reconstituteElement mehrfach rekursiv durchlaufen wird. Da die Funktion insertData() aber den Eingabewert unverändert zurück gibt, wenn es keine Variable {TSFE....} ist, kann einfach am Anfang der Funktion die besagte Zeile:
$arguments['value']= $this->getLocalConentObject()->insertData($arguments['value']);
Stehen.

Eine gute Beschreibung für extBase und Fluid habe ich jetzt auch noch bei Mittwald gefunden: http://www.mittwald.de/fileadmin/pdf/extbase_fluid.pdf
Ist zwar etwas älter, aber immer noch aktuell.

Mittwoch, 7. Dezember 2011

Freakonomics über Fundraising

Ein kurzer Abriss darüber, was Spender motiviert und wie man die Spendenbereitschaft erhöht gibt es aktuell bei Freakonomics, einem populärem Wissenschaftsblog & -podcast. Wie es sich für Alumniarbeit in Deutschland gehört ist das ein toller erster Beitrag zu dem Thema in diesem Blog. Das Transscript und den Podcast gibt es hier zum Download.

Mein Highlight daran ist, dass sich die Spendenbereitschaft dadurch erhöht, dass man ein Feld anbietet für permanentes Opt-Out. Das Feld selbst wird aber kaum angekreuzt. Ob das in Deutschland auch so wäre?

Typo3 4.6 und die neue Form Extension - ein erster eigener Postprocessor

Diese Zusammenfassung ist nicht verfügbar. Klicke hier, um den Post aufzurufen.