Zum Inhalt springen

Formhandler nach Absenden Werte auswerten/manipuleren bevor E-Mail versandt wird?

Erstellt am 5. Mai 2015 · 4 Antworten · letzte Antwort am 10. Mai 2015

Tags: Formhandler, E-Mail-Versand, TYPO3 6.x, Frage

typonewbe ·

Hallo Liebe TYPO3 Gemeinde,

ich hab mal wieder kleines Problem diesmal mit der Erweiterung Formhandler.

Folgendes Szenarion:
Ich habe mehrere Select-Boxen/checkboxen die in Abhängigkeit stehen.
Einmal die Sportarten und einmal die Entsprechenden Distanzen dazu.

Z.B. wähle ich Laufen geht eine Box auf aus der ich dann wählen kann "1 Runde", "2 Runden", etc.

Die Werte die ich bekomme sind nicht die Labels sondern die IDs der Datensätze aus den Tabellen.
Wenn ich jetzt in dem TEMPLATE einfach nur:

<!-- ###TEMPLATE_EMAIL_ADMIN_PLAIN### begin -->
Folgende Daten wurden eingegeben:

Vorname:     ###value_firstname###
Nachname:     ###value_name###
Straße:     ###value_streetAndNumber###
PLZ/Ort:     ###value_zip### ###value_city###
Sportarten:

###value_distance###
<!-- ###TEMPLATE_EMAIL_ADMIN_PLAIN### end -->

versende.
Bekomme ich eine Mail die unter Sporten folgendes abbildet:
Folgende Daten wurden eingegeben:
... Werte davor
Sportarten:
0,2,0,4

-----------
Wie Ihr seht werden die Werte zwar korrekt übergeben allerdings kann ein Mensch damit nicht viel Anfangen.

Ich habe mir nun eine userFunc geschrieben welche die GET/Post Werte holt und über die Datenbank die Labels ausgibt und gleich mal schön formatiert.

Jetzt dachte ich mir mittels "Finisher_Mail" könnte ich die Werte schon manipulieren da ich gesehen habe das ja auch email und subject dynamisch ausgelesen werden können also habe ich folgendes probiert.

plugin.Tx_Formhandler.settings.predef.contact {
  finishers {
    1.class = Finisher_Mail
    1.config {
      admin {
        to_email = TEXT
        to_email.value = meine@email.de
        subject = TEXT
        subject.value = Kontaktaufnahme von {GP:formhandler|firstname} {GP:formhandler|name}
        subject.insertData = 1
        sender_email = domain@email.de
        distance = USER
        distance {
            userFunc = user_form->getDisciplineForPlainMail
            userFunc {
                staticPid = 10
            }
        }
       
      }
      user {
        to_email = email
        
        subject = TEXT
        subject.value = Ihre Kontaktaufnahme mit uns
        
        sender_email = domain@email.de
      }
    }
    2 {
      class = Tx_Formhandler_Finisher_SubmittedOK
      config.returns = 1
    }
  }
}

Aber das klappt nicht. Auch habe ich den Code schon in diverse andere Klassen gepackt wie
saveInterceptors, initInterceptors aber die Wirkung bleibt die selbe es wird immer der reine Wert also 0,2,0,4 ausgegeben.

Ich kann mir nicht vorstellen das eine so mächtige Erweiterung es nicht schafft die Werte vor dem versenden zu manipulieren.

Hat jemand von euch ne Idee?

Danke schon mal im Voraus für die Mühe

Gruß typonewbe

jenses ·

Ich glaube, du bist da auf dem Holzweg.
Laut Doku wäre folgende Variante möglich:

...
saveInterceptors.2 {
  class = Tx_MyPackage_Interceptor
  config {
    param = value
  }
}
...

Die Angabe Tx_MyPackage_Interceptor interpretiere ich so,
daß du eine richtige Extension baust.
Den Aufbau der Klasse und die nötigen Funktionen kannst du dir in den mitgelieferten Interceptors abschauen.

typonewbe ·

Hallo Torsten,

danke für deine schnelle Antwort.

Ich lese mich da mal ein theoretisch hätte mein Ansatz aber funktionieren müssen ich habe folgendes probiert.

    saveInterceptors {
        1 {
            class = Tx_Formhandler_Interceptor_Filtreatment
            config.fieldConf {
                distance.removeChars = USER
                distance.removeChars.userFunc = user_form->getDisciplineForPlainMail
                distance.removeChars.userFunc.staticPid = 10    
            }
        }
    }

leider ohne Erfolg es wird wieder die Liste ausgegeben.
Laut Doku soll aber sowas möglich sein

plugin.Tx_Formhandler.settings.initInterceptors.1.config.fieldConf {
    name.removeChars = %,&,/
    email.removeChars = TEXT
    email.removeChars.value = ,|<|>
    email.separator = |
    company = USER
    company.userFunc = user_myClass->user_getRemoveWords
}

Bei removeChars steht verwende ein cObject für eigene Manipulationen das habe ich getan. Aber 0 Wirkung.

Ich probiere aber mal den Weg über einen eigenen Interceptor.

Danke und einen schönen Tag noch

Gruß typonewbe

jenses ·

Hallo Dettlef,
wer ist Torsten?

Ich finde in der Doku nirgendwo ein Anwendungsbeispiel für die Nutzung einer USER function,
dagegen die eigener Interceptors öfter mal.
Der Blick in den Quellcode hilft auch öfter mal, wenn man wissen will,
wie gewisse Zusammenhänge sind und warum manche Sachen nicht funktionieren, wie man sie sich zusammenreimt...

typonewbe ·

Hallo jenses,

entschuldige habe parallel noch einen anderen Post bearbeitet und dich aus versehen Torsten genannt man sollte nicht zwei Tabs mit Posts nebeneinander offen haben 🙂.

Nehmen wir den StdWrap Interceptor
http://www.typo3-formhandler.com/documentation/interceptors/interceptor-stdwrap/
Dort wird doch eine Userfunction ausgeführt auf den Marker "company". Und genau so hatte ich es probiert mit dem saveInterceptor und als das nicht ging hab ich es mit dem "Filtreatment" probiert ohne Erfolg. Aber dein Tipp war super danke.
Ich habe einen eigenen Finisher gebaut der die Werte manipulieren kann.
Für alle die das selbe wollen wie ich hier mein Beitrag dazu:

<?php
class Tx_Formhandler_Finisher_ManipulateValues extends Tx_Formhandler_AbstractFinisher {

    protected $cObj;
	/**
	 * The main method called by the controller
	 *
	 * @return array The probably modified GET/POST parameters
	 */
	public function process()
    {
        $this->cObj = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('tslib_cObj');

        $submitedValues = $this->gp;
        $fieldSettings = $this->settings['fieldConf.'];
        $content = '';
        foreach($submitedValues as $fieldname => $fieldvalue) {
            foreach($fieldSettings as $tsField => $tsValues) {
                if(strval($fieldname) === strval($tsField)) {
                    if(isset($fieldSettings[$tsField.'.'])) {
                        $content = ''.$this->cObj->cObjGetSingle($fieldSettings[$tsField], $fieldSettings[$tsField.'.']);
                        $this->gp[$tsField] = $content;
                    }
                }
            }
        }
		return $this->gp;
	}
}
?>

Der TS Code muss wie folgt aussehen:

plugin.Tx_Formhandler.settings.predef.contact {
finishers {
    1.class = Finisher_ManipulateValues
    1.config {
        fieldConf {
             salutation = CASE
             salutation {
               key.data = GP:contact|salutation
               0 = TEXT
               0.value = Herr
               1 = TEXT
               1.value = Frau
             }
             name = TEXT
             name.value = {GP:firstname} {GP:middlename} {GP:lastname}
             name.insertData = 1
        }
}
}
}

Der TS Code zeigt nur einige Beispiele die damit möglich sind und ist sicherlich noch ausbaufähig.
Für Feedback und Verbesserungsvorschläge bin ich offen.

Gruß typonewbe