Mittwoch, 25. Januar 2012

Form: Einfaches Nachrichtensystem für Mitglieder mit Spamschutz

Das Problem: Es gibt eine Community und Personen sollen sich untereinander erreichen können, trotzdem sollen Emailadressen nicht im System angezeigt werden. Außerdem wollte ich kein weiteres großes Plugin und die Nachricht sollte direkt an die Emailadresse des anderen Nutzers gehen und den anderen Nutzer nicht dazu zwingen sich erst einloggen zu müssen.

Die Lösung: Eine Erweiterung der Form-Extension um 2 Postprocessoren: Der eine schickt Emails im Namen des eingeloggten Users an einen anderen User und sendet gleichzeitig eine Bestätigungsnachricht an den Sender (ohne aber die Emailadresse des Originalempfängers preis zu geben). Der 2. Postprocessor verhindert, dass ein User mehr als 1 Nachricht alle 60 Sekunden verschickt und baut gleich noch eine Statistik auf.

Im Typoscript sieht das Formular so aus: 
 prefix = tx_form  
 confirmation = 0  
 postProcessor {  
     1 = minimumdelaychecker  
     1 {  
        delay=60  
        errorPageID = 226  
     }  
      2 = memberMail  
      2 {  
           recipientEmailField = EmpfaengerID  
           senderEmail = sender@domain
           senderName = Absendername 
           subject = Direktnachricht von Domain Mitglied:   
           replyToField = absenderemail  
         messages {  
                success = Deine Nachricht wurde erfolgreich an das Mitglied gesendet. Du erhälst von der Email eine Kopie  
           }  
      }  
 }  
 10 = FIELDSET  
 10 {  
      legend {  
           value = Private Nachricht an ein anderes Mitglied senden  
      }  
      20 = TEXTLINE  
      20 {  
           name = absenderemail  
           readonly = readonly  
           value = {TSFE:fe_user|user|email}  
           label.value = Deine Emailadresse  
      }  
      30 = TEXTLINE  
      30 {  
           name = name  
           readonly = readonly  
           value = {TSFE:fe_user|user|first_name} {TSFE:fe_user|user|last_name}  
           label.value = Dein Name  
      }  
 32 = TEXTLINE  
 32 {  
   name = Empfänger  
 readonly=readonly  
 value = {gp:receiverName}  
 label.value = Empfänger  
 }  
      40 = TEXTAREA  
      40 {  
           cols = 50  
           rows = 10  
           name = Nachricht  
           label.value = Nachricht  
      }  
 41 = HIDDEN  
 41 {  
   name = EmpfaengerID  
  value = {gp:receiverID}  
 }  
      50 = SUBMIT  
      50 {  
           name = Submit  
           value = Abschicken  
      }  
 }  

Das Formular selbst ist sehr einfach gehalten. Wie man Variablen im Formular auswertet, habe ich in diesem Blogbeitrag erklärt.

Der "Minimumdelaychecker" ist ein Postprocessor, der eine kleine Statistik erstellt, wer wie viele Nachrichten verschickt hat und wann die letzte Nachricht geschickt wurde. Dazu werden in der fe_users-Tabelle die 2 Felder user_system_number_of_messages und user_system_last_message_timestamp erwartet. Diese Felder können natürlich auch umbenannt werden, dann muss aber auch der Postprocessor angepasst werden. Diesen Postprocessor gibt es hier zum runterladen. Wenn jemand innerhalb der im Typoscript definierten Zeit (Variable "delay") 2 Nachrichten schickt, wird er auf die Seite mit der in der ebenfalls in Typoscript (errorPageID) definierten Seite umgeleitet.

Der 2. Postprocessor ersetzt den Standard Mail Postprocessor. Runterladen könnt ihr ihn hier. Dieser Postprocessor setzt zum einen als Absender nicht die Emailadresse, die vorher im Formular angezeigt wurde, sondern diejenige, die für den eingeloggten User hinterlegt ist. So wird verhindert, dass jemand  die Daten im Form vor dem senden editiert. Das geht in HTML auch dann, wenn der die Felder - wie im Beispiel - gesperrt sind.

Was noch fehlt? Der Aufruf der des Formulars. Hier habe ich es mir einfach gemacht:. Aus einer anderen Extension heraus rufe ich die Seite, die das Formular enthält auf und übergebe per URL die ID (und den Namen des Empfängers):
?receiverID=272&receiverName=Dein%20Name

Ich hoffe, die Beschreibung ist ausführlich genug. Wenn nicht, fragt ruhig :)

4 Kommentare:

  1. Hallo, vielen Dank für den aufschlußreichen Post!
    Mir stellt sich nur die Frage ob es eine Möglichkeit gibt eigene PostProcessor zu nutzen ohne die sysext anzufassen. So wie ich das derzeit sehe gibts aber keinen Weg eigene Klassen einer eigenen Extension einzubinden oder?

    Grüße
    Felix

    AntwortenLöschen
  2. Hi Felix,

    das sollte eigentlich schon ein Feature in 4.7 sein, evtl. geht es jetzt in 6.0, ich habe mir 6.0 aber noch nicht angeschaut, der Feature-Request sagt aber, dass es da drin ist: http://forge.typo3.org/issues/34711

    AntwortenLöschen
  3. Vielen Dank für diese Infos. Ich selber sitze an der Extension schon ein weilchen dran. Ich suche eine Möglichkeit per Dropdown den Empfänger auszuwählen. Leider ist das wohl nicht vorgesehn oder sehr umständlich. Hast du vieleicht eine Idee? Optimal wäre wenn man per TypoScript eine art Liste in den Konstanten / Setup pflegt welche dann dynamisch in das Dropdown übergeben wird.

    Grüße Michael

    AntwortenLöschen
  4. Hallo Michael,
    ich hab schon länger nicht mehr mit dem Thema gearbeitet. Für mich klingt es aber so, als wäre das mit einem Postprocessor relativ leicht umsetzbar. Evtl. so, dass der Postprocessor an die richtige Adresse eine zusätzliche Email schickt und die Form selbst an irgendeine deiner Dummy-mailadressen. So musst du nicht die Hauptfunktion umbiegen sondern nur eine Erweiterung schreiben.
    schöne Grüße! Jan

    AntwortenLöschen