Hallo habuky,
ich glaube was du suchst bzw. was deine Nerven schont, ist das hier: #88058. Ich habe dort beschrieben, wie man die Extension "freeCap Captcha (sr_freecap)" in Mailformplus einbaut.
Hallo habuky,
ich glaube was du suchst bzw. was deine Nerven schont, ist das hier: #88058. Ich habe dort beschrieben, wie man die Extension "freeCap Captcha (sr_freecap)" in Mailformplus einbaut.
Alternativ kannst du auch powermail nutzen und dort einfach eine captcha Extension nutzen - natürlich auch ohne Programmieren
Hallo zurück und heißen Dank für die schnellen Antworten!
Ich hab inzwischen den Weg von speedprogs ausprobiert und bin nach wenigem Stöhnen stolzer Umsetzter eines Captcha-Mailfomulars. 😃 Dankeschön für gute Anleitung!
Leider ist damit meine Problemstellung noch nicht zu Ende. #paralyzed#
Das Mailformular ist dafür gedacht, Fehler auf der gesamten Seite zu melden. Also muss das Formular die ID der vorherigen Seite oder noch besser den Inhalt des Referrers enthalten.
Meine ursprüngliche Lösung war:
1. Auf jeder Seite ist unten ein als Link getarntes Formular, dass die ID der aktuellen (!) Seite per GET übergibt.
10.marks {
FEHLER-MELDEN= TEXT
FEHLER-MELDEN.data = getIndpEnv:REQUEST_URI
FEHLER-MELDEN.wrap(
<form action="http://10.11.10.14/kontakt.html" method="get" >
<input type=hidden name=prob_url value="
|
">
<input type=submit value="Fehler melden">
</form>
)
FEHLER-MELDEN.typolink.parameter.data = page:uid
FEHLER-MELDEN.typolink.no_cache
FEHLER-MELDEN.typolink.returnLast = url
}
2. Die Seite mit dem Formular für die Fehlermeldung wrapt dann per TS das eigentliche Formular um die übergebene URL:
10.marks {
SEITENINHALT= TEXT
SEITENINHALT.wrap (
<h1> Meldung einer fehlerhaften Seite </h1>
<form action="mailform.html" method="get">
... unwichtige Felder gelöscht ...
<b>Der Fehler wurde gefunden auf der folgenden Seite:</b> <br>
<input type="text" size="30" maxlength="60" name=Fehlerhafte_Seite value="
|
" readonly> <br>
<input type=submit value="SENDEN" >
</b></p></form>
)
SEITENINHALT.data = GPvar : prob_url
} # Ende 10.marks
Da jetzt aber das Template für das Formular in einer separaten Datei vorliegt und von der Extension "Formmailplus" eingebunden wird, weiß ich nicht, wie ich die URL (besser) oder zumindest die ID (okay) der letzten Seite übertragen soll.
Mein nicht gelingen wollender Versuch fußt auf der Anleitung von FormmailPlus
http://typo3.org/documentation/document-library/extension-manuals/th_mailformplus/4.0.13/view/1/3/#id4173115 und sieht in TS so aus:
plugin.tx_thmailformplus_pi1.markers.LASTURL = TEXT
plugin.tx_thmailformplus_pi1.markers.LASTURL.warp (
<p> Letzte besuchte URL
|
.</p>
)
plugin.tx_thmailformplus_pi1.markers.LASTURL.data = GPvar : prob_url
Es weigert sich aber hartnäckig zu funktionieren.
Habt Ihr ne Idee, wie man das umsetzen könnte? (kann ruhig eleganter als meine Lösung sein😉 )
@Michaelh74: Wo wird das mit dem PHP-Einbinden denn mal richtig erklärt? Die Refs von Typo3.org verwirren mich gerade mehr, als dass sie mir helfen.
http://typo3.org/documentation/document-library/core-documentation/doc_core_tsbyex/0.0.16/view/8/1/
https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/ContentObjects/Index.html
Und recht hattest Du, oben komme ich erst einmal ohne PHP aus.
Grüße, Habuky
VORLÄUFIGES HOW TO: Fehler-Melden-Link: MAILFORMULAR mit CAPTCHA und ANGABE DER LETZTEN URL
nicht ganz elegant, aber funktionstüchtig:
Ein Mailformular, mit dem Fehler auf der gesamten Webseite gemeldet werden können. Übergeben wird die letzte URL. Schutz vor Bots durch Captcha
Benötigt: Extension "mailformplus" http://typo3.org/extensions/repository/?tx_terfe_pi1[view]=search&no_cache=1&tx_terfe_pi1[sword]=MailformPlus+
Extension "sr_freecap" http://typo3.org/extensions/repository/?tx_terfe_pi1[view]=search&no_cache=1&tx_terfe_pi1[sword]=sr_freecap
Eine gute Anleitung für die beiden Extensions gibts von speedprogs und liegt hier: #88058
Die Umsetzung des Fehler-Melden-Links
1.: Root-TypoScript
In der html-Vorlage für die ganze Seite wird an irgendeiner Stelle ein Marker für den Link "Fehler melden" gesetzt.
Dieser Marker wird im root-template der gesamte Seite angesprochen und die aktuelle URL in Form eines GET-Formulars übergeben. Das Formular hat als Ziel jene eine Seite, die die Fehlermeldung mittels Mailformular umsetzen soll.
seite = PAGE
seite {
typeNum = 0
stylesheet = fileadmin/shared/style/style.css
10 = TEMPLATE
10.template = FILE
10.template.file = fileadmin/shared/style/vorlage.html
###FEHLER-MELDEN###
10.marks {
FEHLER-MELDEN= TEXT
FEHLER-MELDEN.data = getIndpEnv:REQUEST_URI
FEHLER-MELDEN.wrap(
<form action="http://10.11.10.14/schadensmeldung.html" method="get" id="bloss_keinen_umbruch">
<input type=hidden name=prob_url value="
|
">
<input type=submit value="Fehler melden" class="LL_submit">
</form>
)
FEHLER-MELDEN.typolink.parameter.data = page:uid
FEHLER-MELDEN.typolink.no_cache
FEHLER-MELDEN.typolink.returnLast = url
}
2.: TypoScript für Kontaktformularseite
Die Seite, die das Plugin für die Fehlermeldung enthält, bekommt nun noch ein extension template verpasst. Neben den nötigen Angaben für sr_freecap wird die Variable übernommen und einem Marker zugeordnet. Warum das so geht steht in der Dokumentation der extension Mailformplus (http://typo3.org/documentation/document-library/extension-manuals/th_mailformplus/4.0.13/view/1/3/#id4173115)
plugin.tx_thmailformplus_pi1.freecapFieldname = captchafield
plugin.tx_thmailformplus_pi1.fieldConf.captchafield = required
plugin.tx_thmailformplus_pi1.markers.LASTURL = TEXT
plugin.tx_thmailformplus_pi1.markers.LASTURL.warp (
<p> Letzte besuchte URL
|
.</p>
)
plugin.tx_thmailformplus_pi1.markers.LASTURL.data = GPvar : prob_url
3.: html-Vorlage für Mailformplus
In das funktionierende Mailformular (ich hab die Vorlage der Extension selber genommen und modifiziert [example_form/singlepage_forms/mailformplus_demo.html]) baut man nun einen Marker ein, der die URL übernimmt. Der Marker sollte sichtbar im Formular übergeben werden und muss zweitens später per Mail übermittelt werden. All das wird in ein und der selben html-Vorlage definiert.
<!-- ###TEMPLATE_FORM### begin -->
###ERROR###
<form name="Formular" method="post" action="###REL_URL###" enctype="multipart/form-data">
<fieldset>
<legend>Schadensmeldung</legend>
<input type="hidden" name="id" value="###PID###" />
<input type="hidden" name="submitted" value="1" />
<input type="hidden" name="L" value="###value_L###" />
<input type="hidden" name="type" value="###value_type###" />
<!--###CAPTCHA_INSERT### -->
<div class="captcha"> <label for="captcha_response">###SR_FREECAP_NOTICE###</label> ###SR_FREECAP_CANT_READ### <input type="text" id="captcha_response" name="captchafield" title="###SR_FREECAP_NOTICE###" value="" /> ###SR_FREECAP_IMAGE### </div>
<!--###CAPTCHA_INSERT###-->
<div>
<b> <label for="fehlertyp" accesskey="ft">
Um welche Art von Fehler handelt es sich?
</label> </b> <br>
###error_fehlertyp###
<input tabindex="1" type="radio" name="fehlertyp" value="Design" id="fehlertyp_design" style="border-style:none;" ###checked_fehlertyp_design###><label for="fehlertyp_design">Design stimmt nicht </label><br>
<input tabindex="2" type="radio" name="fehlertyp" value="link" id="fehlertyp_link" style="border-style:none;" ###checked_fehlertyp_link###><label for="fehlertyp_link">Link defekt</label><br>
<input tabindex="3" type="radio" name="fehlertyp" value="inhalt" id="fehlertyp_inhalt" style="border-style:none;" ###checked_fehlertyp_inhalt###><label for="fehlertyp_inhalt">Inhalte sind nicht aktuell </label><br>
<input tabindex="4" type="radio" name="fehlertyp" value="inhalt" id="fehlertyp_anderes" style="border-style:none;" ###checked_fehlertyp_anderes###><label for="fehlertyp_anderes">sonstiger Fehler</label><br>
<br>
<b> <label for="errorSite" accesskey="es">
Der Fehler wurde gefunden auf der folgenden Seite (Ihre letzte besuchte Seite):
</label> </b> <br>
###error_errorSite###
<input type="text" name="errorSite" id="errorSite" value="###LASTURL###" tabindex="5" size='60' maxlength='60' readonly><br>
<br>
<b> <label for="beschreibung" accesskey="b">
Bitte machen Sie genauere Angaben zu dem Fehler.
</label> </b> <br>
###error_beschreibung###
<textarea cols="50" rows="5" name="beschreibung" id="beschreibung" cols='50' rows='10' tabindex="6">###value_beschreibung###</textarea><br>
<br>
<input type="submit" value="submit" tabindex="8"><br>
###ADDITIONAL_MULTIPAGE###
</fieldset>
</form>
<!-- ###TEMPLATE_FORM### end -->
<!-- ###TEMPLATE_EMAIL_RECEIVER_HTML### begin -->
SCHADENSMEDLUNG! <br><br>
SEITE: <a href="http://10.11.10.14/###LASTURL###"> ###LASTURL### </a> <br><br>
FEHLERTYP: ###value_fehlertyp###<br><br>
BESCHREIBUNG: ###value_beschreibung###<br><br>
<!-- ###TEMPLATE_EMAIL_RECEIVER_HTML### end -->
An alle die geholfen haben: DANKESCHÖN
An alle die bessere Lösungen haben: HER DAMIT (v.a. eine bessere Lösung für das Formular in Schritt 1!)
Hallo habuky,
es ist einfacher in diesem Fall mit der Umgebungsvariable "HTTP_REFERER" zu arbeiten, so bekommst du automatisch immer die URL von der zuletzt besuchten Seite. Wenn du also auf der Startseite auf einen Link zum Formular klickst, erhältst du auf der Formularseite die URL der Startseite, usw...
Eine Implementierung sähe dann so aus:
plugin.tx_thmailformplus_pi1 {
freecapFieldname = captchafield
fieldConf.captchafield = required
markers {
LASTURL = TEXT
LASTURL {
data = getenv : HTTP_REFERER
wrap = <p>Letzte besuchte URL: | .</p>
}
}
}
So sparst du dir das Formular auf jeder Seite, dem als Parameter die URL der aktuellen Seite mitgegeben wird. Denn nun kannst du dir einfach einen Link auf die Seite mit dem Formular anlegen:
seite = PAGE
seite {
typeNum = 0
stylesheet = fileadmin/shared/style/style.css
10 = TEMPLATE
10 {
template = FILE
template.file = fileadmin/shared/style/vorlage.html
marks {
FEHLER-MELDEN = TEXT
FEHLER-MELDEN {
value = Fehler melden
typolink {
parameter = <UID der Seite Schadensmeldung>
}
}
}
}
}
Hier musst du nun nur noch statt "<UID der Seite Schadensmeldung>" die Seiten-ID deiner Formularseite angeben. Diese findest du, wenn du im Backend im Seitenbaum mit der Maus über dem Symbol links neben deiner Seite stehen bleibst.
Mehr zu den Umgebungsvariablen findest du hier: http://typo3.org/documentation/document-library/core-documentation/doc_core_cgl/4.1.0/view/1/3/
Und mehr Informationen zu TypoLinks findest du hier: https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/Functions/Typolink.html
Gute Morgen speedprogs,
yeah, danke, das war dann ja wohl die elegantere Lösung. 🙂
Aber hast Du ne Ahnung, warum das mit
typolink.returnLast = url
eigentlich nicht funktioniert hat?
Laut Referenz sollte das die LETZTE Url ausgeben. Alle was ich im Netzt aber dazu finde, sind Meldungen, dass es eben nicht wie Beschriebe wirkt - wie bei mir. - ich frage nur aus Interesse - 😉
Ne andere Frage: wäre es eigentlich auch möglich, den Besitzer der Seite ausgeben zu lassen, so dass die Fehler gleich an die Besitzer der Seiten weitergeleitet werden?
Theoretisch müsste die Info über Besitzer und Gruppe ja irgendwo gespeichert sein - ich finde nur leider auch keine Referenz zu den Datenbanken (tt_content)
Grüße, habuky
Hallo habuky,
die TypoLink-Funktion erzeugt dir aus dem angegebenen Parameter eine gültige URL. Durch die Angabe von "returnLast = url" bekommst du an dieser Stelle jedoch lediglich die erzeugte URL und nicht den gesamten Link zurück geliefert. Das bedeutet nicht, dass du, wie bei dem HTTP_REFERER die URL ausgegeben bekommst, die du vor der aktuellen Seite besucht hast.
Um die E-Mail Adresse des Backend-Seitenbesitzers herauszufinden bedarf es etwas mehr Aufwand. Du musst hierfür auf eine sogenannte userFunc zurückgreifen, da du den Wert nicht direkt mit einem SELECT aus der Datenbank auslesen kannst.
Erstelle zuerst eine PHP-Datei mit dem Namen "user_pageUser.php" in dem Verzeichnis "fileadmin" deiner TYPO3-Installation. Füge folgende Zeilen Code in diese Datei ein:
<?php
class user_pageUser {
var $cObj;
function getEmail($content,$conf) {
global $TSFE;
// Get SQL ressource
$ressource = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
'be_users.email',
'pages INNER JOIN be_users ON (pages.perms_userid = be_users.uid)',
'pages.uid='.(int) $TSFE->id,
'',
'',
'1'
);
// Get result
$result = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($ressource);
// Check result and return email address
if (is_array($result)) {
$email = reset($result);
if (!empty($email)) {
return $email;
}
}
// Return default if no email address was found
if (isset($conf['ifEmpty']) && !empty($conf['ifEmpty'])) {
return $conf['ifEmpty'];
}
// Return en empty string
return '';
}
}
?>
In dieser Datei wird eine Anfrage auf deine Datenbank ausgeführt. Die Anfrage liefert dir die E-Mail Adresse des Backend-Benutzers, dem die aktuelle Seite gehört. Dazu Fragt das Script die Benutzer-ID ab, welche in der Tabelle mit allen Seiten deines Internetauftritts hinterlegt ist. Anschließend wird über die ID die zugehörige E-Mail Adresse aus einer anderen Tabelle, nämlich der Backend-Benutzer-Tabelle geholt. Zum Schluss wird die E-Mail Adresse aus dem, von der Anfrage zurück gelieferten, Ergebnis ausgelesen und als Resultat der Methode "getEmail" ausgeliefert. Ist keine E-Mail Adresse für den Benutzer hinterlegt, wird eine Standard-Adresse ausgeben und ist auch diese nicht definiert, wird ein leerer Wert zurück geliefert.
Anschließend speicherst du die Datei und gehst in das Backend. Dort erweiterst du deinen TypoScript folgendermaßen:
## Include the userFunc file
includeLibs.pageUser = fileadmin/user_pageUser.php
plugin.tx_thmailformplus_pi1 {
freecapFieldname = captchafield
fieldConf.captchafield = required
## Set recipients email address automatically via userFunc
default {
email_to >
email_to = USER
email_to {
userFunc = user_pageUser->getEmail
ifEmpty = email@domain.com
}
}
markers {
LASTURL = TEXT
LASTURL {
data = getenv : HTTP_REFERER
wrap = <p>Letzte besuchte URL: | .</p>
}
}
}
Hier wird nun zuerst die Oben erstellte PHP-Datei eingebunden. Anschließend wird die E-Mail Adresse des Administrators "email_to" mit einem USER-cObject überschrieben. An dieser Stelle wird dann die Methode "getEmail" in der PHP-Datei aufgerufen. Deren Rückgabewert (die E-Mail Adresse) wird dann als Wert für "email_to" eingetragen. Das "ifEmpty" stellt die Standard-E-Mail Adresse aus dem Code dar.
Da ich im Moment kein "mailformplus" installiert habe, musste ich diese Konfiguration aus dem Kopf schreiben, sollte aber dennoch funktionieren. Bitte um Feedback, falls nicht.
Weitere Informationen zur userFunc erhältst du hier: http://www.typo3wizard.com/de/snippets/allgemeine-probleme-und-loesungen/einfache-userfunc.html
Und für Datenbankabfragen mit TYPO3 schau dir bitte das hier an: http://typo3.org/fileadmin/typo3api-4.0.0/de/d07/classt3lib__DB.html
Hallo speedprogs,
wow, danke für dieses ausführliche Beispiel!
Ich finds auch echt super, dass Du immer gleich die Referenz mit verlinkst, dann kann man selber ein wenig knobeln.
Ich komme Montag erst wieder an das System, werde Dir dann aber Rückmelden, ob's mit der Mailformkonfiguration geklappt hat.
Zu Deinem Code muss ich sagen, dass das so langsam aber sicher die mir bekannten Wege verlässt, aber ich versuch mal es zu verstehen:
PHP ---------------------------
Die Zeilen 9 bis 16 ist die Definition der SQL-Query
9: Query richten an Datenbank'TYPO3_DB', darin
10: das Feld User's Email
11: aus Tabelle Backend-User jene Zeile bei der Page_user_ID=BE_user_ID wobei Page_User_ID aus Tabelle "pages" kommt.
12: UNKLAR
13: Ergebnisse der Abfrage werden nicht gruppiert
14: Ergebnisse der Abfrage werden nicht sortiert
15: maximal ein Ergebnis liefern
30: in der Array $conf, liegt in dem Feld ['ifEmpty'] die Emailadresse des Admins?
TS ---------------------------
11: Variable email_to wird eine vom USER definierte Funktion zugewiesen
13: die php-Funktion wird aufgerufen (müsste da nicht pageUSer statt user_pageUser stehen?) und als Klasse (getEmail) definiert
14: wenn der Wert leer ist, dann soll er email@domain.de sein.
(ist nur leer, wenn Zeile 35 im PhP-Skript ausgeführt wird.)
Mir ist nicht ganz klar, warum die PHP-Funktion als Klasse aufgerufen wird (TS:13).
Auch die Bedeutung des Arrays $conf ist mir noch nicht klar.
Wenn Du mir da Sprünge helfen könntest wäre super.
Oder: wo finde ich denn mal eine Liste der von Typo3 verwendeten Variablen und eine Beschreibung der Datenbanken. Ich meine, woher weißt Du, wie das Feld für die Emails lautet?
Aber noch mal zurück zur praktischen Seite der Problemstellung:
Die von Dir geschriebene Lösung würde mir die Email des Besitzers der aktuellen Seite ausgeben. So weit, so cool. Im Falle der Fehlermeldungseite wäre das immer der Admin. Jetzt die tricky Frage: kann ich mir auch den Benutzernamen und die Email des Besitzers der vorherigen Seite (auf der der Fehler gefunden wurde) ausgeben lassen?
Gestern abend habe ich noch Real_url installiert, was mir die URLs als domain/Ebene1/Ebene2/.../seitenname.html ausgibt.
Folglich liefert auch der Referer genau das und man sieht die Page-ID nicht mehr.
Ich sähe jetzt da nur wieder die Lösung, mir diese Infos(Besitzer und Email) mittels des gewrapten Formulars (meine Anfangslösung) zu schicken, was aber wegen RealUrl nicht mehr gehen wird, nehme ich an.
Schönes Wochenende, Habkuy
Hallo habuky,
du hast vollkommen Recht, ich habe übersehen, dass du mit dem Script, immer die E-Mail Adresses des Backend-Benutzers bekommen würdest, dem die Formular-Seite gehört. Aber durch ein paar kleine Änderungen funktioniert alles so, wie gewollt.
Aber zuerst eine kurze Erklärung der Code-Beispiele aus meinem letzten Post:
@ PHP:
(Zeile | Beschreibung)
-------------------------------
02: Beginn der Klasse "user_pageUser"
05: Beginn der Methode "getEmail". Diese wird später im TS aufgerufen
06: Holen der globalen Variable "$TSFE" in die lokale Methode
09: Ausführen des folgenden SQL-Statements über die TYPO3-Methode "exec_SELECTquery". [1]
10: Das Feld "email" von der Tabelle "be_users" ausgelesen werden (entspricht SELECT)
11: Das Feld soll von der Tabelle "pages" gelesen werden. Durch das "INNER JOIN" kombiniere ich die Anfrage mit der Tabelle "be_users" auf Grundlage der Bedingung, dass der Wert des Feldes "perms_userid" aus der Tabelle "pages" mit dem Wert des Feldes "uid" aus der Tabelle "be_users" übereinstimmt (entspricht FROM)
12: Hier wird festgelegt, dass die Abfrage nur aus dem Datensatz der Tabelle "pages" auslesen soll, wenn der Wert des Feldes "uid" mit der aktuellen Seiten-ID übereinstimmt (entspricht WHERE) [2]
13: Keine Gruppierung der Ergebnisse (entspricht GROUP BY)
14: Keine Sortierung der Ergebnisse (entspricht ORDER BY)
15: Limitierung auf ein Ergebnis (entspricht LIMIT)
19: Auslesen des Ergebnisses über die Methode "sql_fetch_assoc".
21: Wenn das Ergebnis vom Typ Array ist, in diese Bedingung laufen.
22: Den ersten Wert des Arrays auslesen (entspricht $result[0]).
23: Wenn die Variable "$email" nicht leer ist, in die nächste Bedingung laufen.
24: Als Ergebnis der Methode "getEmail" den Wert der Variable "$email" zurück liefern.
30: Wenn bisher kein Ergebnis der Methode zurück geliefert wurde und der Wert der, im TS definierten Variable "ifEmpty" nicht leer ist, in diese Bedingung laufen. (Der Parameter "$conf" wird automatisch übergeben, wenn die Methode "getEmail" von TYPO3 aufgerufen wird. Sie enthält die TypoScript-Konfiguration für die userFunc.)
31: Ausgeben des Wertes von "$conf['ifEmpty']".
35: Wenn bis hier hin kein Wert zurück geliefert wurde, wird ein leerer Wert als Ergebnis der Methode geliefert.
@ TS:
(Zeile | Beschreibung)
-------------------------------
02: Hier wird die PHP-Datei als Funktionsbibliothek zugewiesen.
10: Hier wird jede vorhergehende Konfiguration für die Variable "email_to" deaktiviert.
11: Anschließend wird der Variable zugewiesen, dass sie vom Typ "USER" sein soll.
13: Hier wird nun die Methode "getEmail" der Klasse "user_pageUser" aus der neu eingebundenen PHP-Datei aufgerufen. [3]
14: Die Variable "ifEmpty" wird von der PHP ausgelesen, wenn keine E-Mail Adresse aus der Datenbankabfrage geliefert wurde.
[1] Eine sehr gutes Wiki zu TYPO3-Datenbankabfragen: http://www.lisardo.biz/wiki/Datenbankabfragen/
[2] Mehr zum Thema "$TSFE": http://web13.netzwerteserver.de/1421+M5e34df5a01a.0.html?&no_cache=1&show=TSFE
[3] Mehr zur userFunc: http://www.typo3wizard.com/de/snippets/allgemeine-probleme-und-loesungen/einfache-userfunc.html[/list]
-------------------------------
So, und nun, wie Oben erwähnt, die Anpassungen am Code, damit die E-Mail Adresse des Backend-Benutzers angesprochen wird, die zur zuletzt besuchten Seite gehört.
<?php
class user_pageUser {
var $cObj;
function getEmail($content,$conf) {
global $TSFE;
// Return if no last page-id was found
if (!isset($conf['lastID']) || empty($conf['lastID'])) {
return '';
}
// Get SQL ressource
$ressource = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
'be_users.email',
'pages INNER JOIN be_users ON (pages.perms_userid = be_users.uid)',
'pages.uid='.(int) $conf['lastID'],
'',
'',
'1'
);
// Get result
$result = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($ressource);
// Check result and return email address
if (is_array($result)) {
$email = reset($result);
if (!empty($email)) {
return $email;
}
}
// Return default if no email address was found
if (isset($conf['ifEmpty']) && !empty($conf['ifEmpty'])) {
return $conf['ifEmpty'];
}
// Return en empty string
return '';
}
}
?>
Nun wird über "$conf['lastID']" auf den Wert der Variable "lastID" aus dem übergeben Konfigurationsarray (TypoScript-Konfiguration) ausgelesen und statt der aktuellen Seiten-ID (vorher: $TSFE->id) als Bedingung für Datenbankabfrage genutzt.
Als nächstes muss das TypoScript umgestellt werden:
## Include the userFunc file
includeLibs.pageUser = fileadmin/user_pageUser.php
plugin.tx_thmailformplus_pi1 {
freecapFieldname = captchafield
fieldConf.captchafield = required
## Set recipients email address automatically via userFunc
default {
email_to >
email_to = USER
email_to {
userFunc = user_pageUser->getEmail
lastID = GPvar:last_id
ifEmpty = email@domain.com
}
}
markers {
LASTURL = TEXT
LASTURL {
data = getenv : HTTP_REFERER
wrap = <p>Letzte besuchte URL: | .</p>
}
}
}
Hier wird nun eine weitere Variable "lastID" an die userFunc (den PHP-Code) übergeben.
Und zum Schluss noch eine kleine Anpassung in der Definition des Links, auf das Formular:
seite = PAGE
seite {
typeNum = 0
stylesheet = fileadmin/shared/style/style.css
10 = TEMPLATE
10 {
template = FILE
template.file = fileadmin/shared/style/vorlage.html
marks {
FEHLER-MELDEN = TEXT
FEHLER-MELDEN {
value = Fehler melden
typolink {
parameter = <UID der Seite Schadensmeldung>
additionalParams {
field = uid
wrap = &last_id=|
}
}
}
}
}
}
Hier wird nun an die URL des Links ein weiterer Parameter angehängt (unter Umständen musst du hier die Konfiguration von RealURL ein wenig erweitern).
Zur Erklärung:
-------------------------------
1. Übergabe der aktuellen Seiten-ID als neuer Parameter "last_id" des Links auf das Formular.
2. Auslesen des neuen Parameters aus der URL aus dem GET-POST-Array "GPvar".
3. Übergabe des ausgelesenen Parameters an die userFunc.
4. Setzen des übergebenen Parameters als Bedingung für das SQL-Statement. Somit wird von der PHP-Methode "getEmail" die E-Mail Adresse desjenigen Backend-Benutzers zurück geliefert, welche zu der übergebenen Seiten-ID gehört...
5. Anschließend wird die E-Mail Adresse als Administrator-E-Mail von mailformplus zugewiesen.
Hoffe das ist einigermaßen verständlich...
Hallo speedprogs,
ja, es ist verständlich. Herzlichen Dank für die Lehrstunde 😉 Die SQL-Befehle sind nur für mich noch sehr befremdlich, aber ich hab auch noch nie mit SQL gearbeitet. Aber das kommt auch noch...
Ich habe Deinen Skript mal umgesetzt. (danke für diesen!)
Leider funzt er nur teilweise. Bis jetzt werden keine Emails verschickt.
... Restart...
Boaa, ich hab eben ewig rumprobiert und Konfigurationen geändert weil immer die Emailadresse nicht ausgegeben wurde. Alle Test hab ich hier protokolliert um dann letztendlich dann beim Kopierens des Codes hier ins Forum zu merken, dass ich, auch wenn ich die Email erst einmal als Text auf der Webseite ausgeben will (zum Testen) dem Marker dennoch ein USER statt TEXT zuweisen muss. #paralyzed# Egal, dann also von neuem...
Also ich hab zunächst die Überschreibung der Empfängeradresse durch marks.{ } ersetzt um zu Testzwecken zu sehen, was Typo3 macht.
Und ich habe die leeren Strings durch unterschiedliche Texte ersetzt um zu sehen, an welcher Stelle der Skript eventuell hängt.
Ergebnisse:
0. Mailversand
Der Server versendet keine Emails mehr. Die ursprünglich eingetragene Empfängeradresse in Mailformplus erhält auch keine Mails.
1. TS für Link zum Formular
funktioniert einwandfrei. LastID Wird korrekt in URL übergeben.
2. TS welches das Formular modifiziert:
LastID wird korrekt empfangen und ausgegeben.
Es wirk aber keine Emailadresse angezeigt, sondern nur die Fehlermeldung, dass die ID "GPvar:last_id" (!) nicht in der Datenbank gefunden werden konnte.
(Sichtbare Meldung: keine Emailadresse gefunden.Übergebene ID:GPvar:last_id)
==> der TS kann also den Wert der GET-Variablen einem Marker zuweisen. Er kann aber nicht den Wert an das php-Skript übergeben.
==> die Übergabe des Wertes von ifEmpty funktioniert fehlerfrei.
Wenn man aber die GET-Variable "last_id" im php-skript manuell ausliest klappt es aber. (Zeile 7 in php)
Dann klappt auch wieder das Versenden der Mails.
haha! #giggle# und es funzt!
So und jetzt hab ich gleich noch die Funktion verändert:
1. Der Skript entreißt der DB nun auch den Namen des Besitzers.
2. Der Besitzer bekommt die Mail, ausgegeben wird aber nur sein Name.
3. Zudem bekommen die Redakteure ebenfalls eine Mail, um über den Vorfall informiert zu sein. Ich hab das mit default.email_sendtouser gelöst. Logischer weise muss dann irgendwo im template eben diese Adresse als versteckte Variabel übergeben werden. Besser wäre eigentlich wenn man die selbe Email direkt aus dem TS schicken könnte, dann würden die Adressen nicht im Quelltext auftauchen.
Was jetzt noch bliebe ist Schönheit:
1. direkt die GET Variable auslesen, ohne Umweg über PHP
2. Mir sagen, wo man die Feldnamen der DAtenbanken herbekommt. (Ich hab das Feld "realName" hier gefunden: https://svn.typo3.org/TYPO3v4/Core/tags/Root_AuthServices/typo3/sysext/lang/locallang_csh_be_users.php)
3. Mir erklären, wie man in TS mit MailsformPlus Mails an 2 Adressen schicken kann, ohne dass Sie im Formular als hidden Values auftreten. Oder kann man der in der UserFunc übergebenen Emailadresse in TS einfach eine weitere anhängen?
------------------------
Hier noch mal alle Code-Schnippsel, wie aktuell eingebunden:
ROOT-TS
10.marks {
FEHLER-MELDEN= TEXT
FEHLER-MELDEN {
value = Fehler melden!
typolink {
parameter = 515
additionalParams {
field = uid
wrap = &last_id=|
}
}
}
Hier der TS für das einbinden des Skripts
## Include the userFunc file
includeLibs.pageUser = fileadmin/shared/skripte/Error_Report/user_pageUser.inc
plugin.tx_thmailformplus_pi1 {
## Captcha Definitions
freecapFieldname = captchafield
fieldConf.captchafield = required
## definition of 2nd adress-field
default {
email_sendtouser = TEXT
email_sendtouser.value = readaktionsAdresse
}
## Set recipients email address automatically via userFunc
default {
email_to >
email_to = USER
email_to {
userFunc = user_pageUser->getEmail
lastID = GPvar:last_id
ifEmpty = admin@xyz.de
}
}
markers {
USERNAME = USER
USERNAME {
userFunc = user_pageUser->getName
#lastID = GPvar:last_id
ifEmpty = TS: Kein Namen des Besitzers in Datenbank gefunden
}
LASTID = TEXT
LASTID {
data = GPvar:last_id
}
LASTURL = TEXT
LASTURL {
data = getenv : HTTP_REFERER
}
ADRESSE-REDAKTION = TEXT
ADRESSE-REDAKTION.value = admin@xyz.de
}
}
und hier der Skript selber:
<?php
class user_pageUser {
var $cObj;
function getEmail($content,$conf) {
global $TSFE;
$conf['lastID'] = $_GET["last_id"];
// Return if no last page-id was found
if (!isset($conf['lastID']) || empty($conf['lastID'])) {
return 'Das Feld: lastID ist leer! Keine ID an PHP übergeben.';
}
// Get SQL ressource
$ressource = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
'be_users.email',
'pages INNER JOIN be_users ON (pages.perms_userid = be_users.uid)',
'pages.uid='.(int) $conf['lastID'],
'',
'',
'1'
);
// Get result
$result = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($ressource);
// Check result and return email address
if (is_array($result)) {
$email = reset($result);
if (!empty($email)) {
return $email;
}
}
// Return default if no email address was found
if (isset($conf['ifEmpty']) && !empty($conf['ifEmpty'])) {
//return $conf['ifEmpty'];
return 'keine Emailadresse gefunden.Übergebene ID:'.$conf['lastID'];
}
// Return an empty string
return 'Keine Besitzeradresse in Datenbank gefunden, noch in TS hinterlegt';
}
function getName($content,$conf) {
global $TSFE;
$conf['lastID'] = $_GET["last_id"];
// Return if no last page-id was found
if (!isset($conf['lastID']) || empty($conf['lastID'])) {
return 'Das Feld: lastID ist leer! Keine ID an PHP übergeben.';
}
// Get SQL ressource
$ressource = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
'be_users.realName',
'pages INNER JOIN be_users ON (pages.perms_userid = be_users.uid)',
'pages.uid='.(int) $conf['lastID'],
'',
'',
'1'
);
// Get result
$result = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($ressource);
// Check result and return userName
if (is_array($result)) {
$userName = reset($result);
if (!empty($userName)) {
return $userName;
}
}
// Return default if no email address was found
if (isset($conf['ifEmpty']) && !empty($conf['ifEmpty'])) {
//return $conf['ifEmpty'];
return 'kein Name gefunden gefunden. Übergebene ID:'.$conf['lastID'];
}
// Return an empty string
return 'Keine Namen in Datenbank gefunden, noch in TS hinterlegt';
}
}
?>
Danke speedprogs!
Grüße, Habuky
Hallo habuky,
schön, dass ich dich zum Ausprobieren motivieren konnte :-)
Deine Lösung, den Parameter direkt im PHP-Code auszulesen, ist eine gute Idee, allerdings nur, wenn du den Parameter nicht aus dem $_GET-Array ausliest, was eine potentielle Sicherheitslücke darstellt, sondern über den folgenden Aufruf:
$lastUID = t3lib_div::GPvar('last_id');
Durch die statische Methode GPvar der Klasse "t3lib_div" entfernt dir nämlich mit der PHP-Funktion "stripslashes" [1] automatisch alle Anführungszeichen aus $_GET- und $_POST-Parametern. Das beugt Cross-Site Scripting [2] vor.
Außerdem kann man deine beiden Methoden um jeweils die E-Mail Adresse und den Namen zu holen zu einer zusammenfassen, dadurch hast du keinen doppelten Code. Die Abfrage sieht dann so aus:
<?php
$ressource = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
'be_users.username, be_users.email, be_users.realName',
...
);
?>
Dadurch werden der Benutzername, die E-Mail Adresse und der "echte Name" des Backend Benutzers auf einen Schlag ausgelesen. Die Feldnamen aus der Tabelle habe ich übrigens über phpMyAdmin ausgelesen. [3]
Somit müssen wir den PHP-Code ein wenig umbauen:
<?php
class user_pageUser {
var $cObj;
function getEmailAndName($content,$conf) {
global $TSFE;
// Get last page id and overwrite it if empty
$lastId = t3lib_div::GPvar('last_id');
if (!isset($lastId) || empty($lastId)) {
return $conf['ifEmpty'];
}
// Split email and name and set defaults
$default = explode('|',$conf['ifEmpty']);
$email = $default[0];
$name = $default[1];
// Get SQL ressource
$ressource = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
'be_users.username, be_users.email, be_users.realName',
'pages INNER JOIN be_users ON (pages.perms_userid = be_users.uid)',
'pages.uid='.(int) $lastId,
'',
'',
'1'
);
// Get result
$result = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($ressource);
// Check result
if (is_array($result)) {
// Get email address and overwrite default
if (isset($result['email']) && !empty($result['email'])) {
$email = $result['email'];
}
// Get name and overwrite default
if (isset($result['realName']) && !empty($result['realName'])) {
$name = $result['realName'];
} else if (isset($result['username']) && !empty($result['username'])) {
$name = $result['username'];
}
}
// Combine all information to a single string
$content = $email.'|'.$name;
// Execute stdWrap and return the result
if ($conf['stdWrap.']) {
return $this->cObj->stdWrap($content, $conf['stdWrap.']);
}
// Else return the content without stdWrap
return $content;
}
}
?>
Dadurch liefert die userFunc ein Ergebnis wie folgendes zurück:
emai@domain.com|Firstname Lastname
Dieses Ergebnis gilt es jetzt im TypoScript in seine Bestandteile (E-Mail Adresse und Name) zu trennen. Dazu erzeugen wir zuerst ein temporäres COA mit dem wir anschließend weiterarbeiten:
includeLibs.pageUser = fileadmin/ts/user_pageUser.php
temp.userData = COA
temp.userData {
10 = USER
10 {
userFunc = user_pageUser->getEmailAndName
ifEmpty = email@domain.com|Name
stdWrap {
split {
token = |
cObjNum = 1 |*| 1 |*| 2
1.current = 1
}
}
}
20 < .10
20 {
stdWrap.split {
1 >
2.current = 1
}
}
}
Hierbei wird das Resultat der userFunc in am "token" also an der Pipe "|" zwischen E-Mail Adresse und Name getrennt. Jetzt kann man sich aus diesem COA bedienen:
plugin.tx_thmailformplus_pi1 {
## Captcha Definitions
freecapFieldname = captchafield
fieldConf.captchafield = required
default {
## definition of 2nd adress-field
email_sendtouser >
email_sendtouser = TEXT
email_sendtouser.value = readaktionsAdresse
email_to >
email_to = COA
email_to {
## Get recipients email address form temp.userData
10 < temp.userData.10
## Add another one
20 = TEXT
20 {
value = <WEITERE ADRESSE>
wrap = ,|
}
}
}
markers {
## Get username / real name from temp.userData
USERNAME < temp.userData.20
LASTID = TEXT
LASTID.data = GPvar:last_id
LASTURL = TEXT
LASTURL.data = getenv : HTTP_REFERER
ADRESSE-REDAKTION = TEXT
ADRESSE-REDAKTION.value = admin@xyz.de
}
}
Wie du siehst, kannst du, wenn du <WEITERE ADRESSE> durch eine eigene ersetzt, noch eine zusätzliche E-Mail Adresse angeben. Du kannst auch noch mehr angeben, solange diese durch ein Komma getrennt sind.
Hoffe das hilft...
[1] Funktion "stripslashes": http://de3.php.net/stripslashes
[2] Cross-Site Scripting: http://de.wikipedia.org/wiki/Cross-Site_Scripting
[3] phpMyAdmin Extension: http://typo3.org/extensions/repository/view/phpmyadmin/current/
Moin speedprogs,
Klar, rumprobieren macht ja auch am meisten Spaß 😉
Und wie ich sehe, hast du den Code schon aus bestehenden Projekten geholt, oder? Die Funktionsaufrufe haben nämlich teilweise falsche Namen. Schlingel 😉
Und leider klappt Dein Code diesmal nicht.
Ich habe ihn natürlich wieder ein wenig verändert, aber nur die Ausgaben. Daran sollte der Fehler also nicht liegen. Das aktuelle Resultat: es wird weder Email, noch Name noch die im PHP-Skript definierten Fehlermeldungen ausgegeben, noch der Inhalt von ifEmpty.
Ich bin mir aber auch nicht ganz sicher, wo das COA definiert werden soll. Ich habs nun zuerst innerhalb und danach auch ausserhalb Plugin-Definition ausprobiert. Auch die Anweisung zum Splitten um den token in Zeile 13 hab ich versucht zu ändern, da ja nur ein nicht 2 Namen übergeben werden. (cObjNum = 1 |*| 1 |*| 2 Statdessen cObjNum = 1 |*| 2).
Jedenfalls hab ich keine Lösung finden können mir nur irgendetwas ausgeben zu lassen.
Die wiedereinmal die aktuell eingebundenen Codeschnippsel:
<?php
class user_pageUser {
var $cObj;
function getEmailAndName($content,$conf) {
global $TSFE;
// Get last page id and overwrite it if empty
$lastId = t3lib_div::GPvar('last_id');
if (!isset($lastId) || empty($lastId)) {
return 'Keine ID der letzten Seite an PHP übergeben, Abfrage unmöglich.';
}
// Set defaults
$default = explode('|',$conf['ifEmpty']);
$email = 'keine Emailadresse gefunden. Übergebene ID:'.$lastID;
$name = 'kein Besitzernamen gefunden. Übergebene ID:'.$lastID;
// Get SQL ressource
$ressource = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
'be_users.username, be_users.email, be_users.realName',
'pages INNER JOIN be_users ON (pages.perms_userid = be_users.uid)',
'pages.uid='.(int) $lastId,
'',
'',
'1'
);
// Get result
$result = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($ressource);
// Check result and try to return name and email
if (is_array($result)) {
// Get email address and overwrite default
if (isset($result['email']) && !empty($result['email'])) {
$email = $result['email'];
}
// Get name and overwrite default
if (isset($result['realName']) && !empty($result['realName'])) {
$name = $result['realName'];
} else if (isset($result['username']) && !empty($result['username'])) {
$name = $result['username'];
}
}
// Combine all information to a single string
$content = $email.'|'.$name;
// Execute stdWrap and return the result
if ($conf['stdWrap.']) {
return $this->cObj->stdWrap($content, $conf['stdWrap.']);
}
// Else return the content without stdWrap
return $content;
}
}
?>
includeLibs.pageUser = fileadmin/shared/skripte/Error_Report/user_pageUser.inc
temp.userData = COA
temp.userData {
10 = USER
10 {
userFunc = user_pageUser->getEmailAndName
ifEmpty = typo3_fehler@imbei.uni-mainz.de | Standardwert(Fehler)
stdWrap {
split {
token = |
cObjNum = 1 |*| 1 |*| 2
1.current = 1
}
}
}
20 < .10
20 {
stdWrap.split {
1 >
2.current = 1
}
}
}
plugin.tx_thmailformplus_pi1 {
## Captcha Definitions
freecapFieldname = captchafield
fieldConf.captchafield = required
default {
## definition of 2nd adress-field
email_sendtouser >
email_sendtouser = TEXT
email_sendtouser.value = readaktionsAdresse
email_to >
email_to = COA
email_to {
## Get recipients email address form temp.userData
10 < temp.userData.10
## Add another one // SO würden weitere Adressen angehängt.
# 20 = TEXT
# 20 {
# value = <WEITERE ADRESSE>
# wrap = ,|
# }
}
# Betreffzeie der beiden Emails mit Seiten ID bestücken.
email_subject = TEXT
email_subject.data = GPvar:last_id
email_subject.wrap = SCHADENSMELDUNG! ID: |
email_subject_user < .email_subject
}
markers {
## Get username / real name from temp.userData
USERNAME < temp.userData.20
LASTID = TEXT
LASTID.data = GPvar:last_id
LASTURL = TEXT
LASTURL.data = getenv : HTTP_REFERER
ADRESSE-REDAKTION = TEXT
ADRESSE-REDAKTION.value = typo3_fehler@imbei.uni-mainz.de
}
}
Siehst Du den Fehler?
Und wie immer wirft Dein Code natürlich auch wieder ein paar zusätzliche Fragen auf: 😉
1.:
$lastUID = t3lib_div::GPvar('last_id');
Dieser PHP Befehl ruft die Datei t3lib_div auf, welche php-Funktionen enthält. Die Funktion (= Methode?) Liefert den GET- oder POST-Inhalt Names 'last_id' bereinigt zurück. Richtig?
2.:
$content = $email.'|'.$name;
Was hat es für einen Sinn, alle Infos in nur eine Variable zu packen? - Ich meine man macht sich ja nicht umsonst die Mühe erst alles in eine zu packen und dann später alles wieder aus einander zu klamüsern, wenn es dafür nicht einen triftigen Grund gäbe. Und einfacher wäre doch, 2 Variablen abzufragen, oder?
3.:
(return $this->cObj->stdWrap($content, $conf['stdWrap.']);
Was genau ist dieser 'stdWrap'? Ich bin jetzt schon häufiger darüber gestolpert, habe aber nicht verstehen können, was die Doku damit meinte.
Danke auch für das Erklären der 2. Emaildressanhängung. (schönes Deutsch nicht 😉).
...
Yeah! habe gerade die Extesion PhpMyAdmin installiert und ausprobiert! Die ist super. Da kann man bestimmt auch viel kaputt machen 😉
However, das kann ich bestimmt noch für mein nächstes Projekt nutzen.
Viele Grüße, Habuky
Hallo habuky,
nein, das ist nicht korrekt, ich habe die userFunc in eine Testumgebung eingebaut um deren Funktionalität zu prüfen, daher der veränderte Pfad zur PHP-Datei. Ansonsten habe ich die Namen der Methoden und Attribute nur an ihren Inhalt angepasst.
Also, hier nun mein letzter Post zu diesem Thema, da es dir nichts bringt, ohne die entsprechenden Grundlagen weiter an SQL-Statements, userFunc und TypoScript-Splits zu arbeiten. Schau dir statt dessen mal dieses Buch an: http://www.oreilly.de/catalog/typo3ckbkger/, das ist ein gutes Einsteigerbuch. Es ist zur Zeit vergriffen, aber du findest es sicher noch in diversen Buchläden oder bei Amazon und Co.
Nun zur aktuellen Problemstellung, es ist eine goldene Regel beim Programmieren, keinen Code doppelt oder gar dreifach zu erzeugen. Das ist auch der Grund, warum es Funktionen gibt, sonst könnte man auch alle Anweisungen einfach untereinander schreiben.
Daher habe ich eine Lösung gewählt, die genau das macht, eben doppelten Code vermeiden. Aber lass es uns nochmal anders versuchen. Die neue Lösung ist eine Mischung aus deinem und meinem Ansatz. So wird es dann hoffentlich endlich funktionieren. Legen wir los...
PHP-Datei:
---------------------
<?php
class user_pageUser {
var $cObj;
function getEmail($content,$conf) {
global $TSFE;
// Get last page id and overwrite it if empty
$lastId = t3lib_div::GPvar('last_id');
if (!isset($lastId) || empty($lastId)) {
return $conf['ifEmpty'];
}
// Set default email address
$content = $conf['ifEmpty'];
// Get SQL ressource
$ressource = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
'be_users.email',
'pages INNER JOIN be_users ON (pages.perms_userid = be_users.uid)',
'pages.uid='.(int) $lastId,
'',
'',
'1'
);
// Get result
$result = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($ressource);
// Check result and get email address
if (is_array($result) && isset($result['email']) && !empty($result['email'])) {
$content = $result['email'];
}
// Else return the content without stdWrap
return $content;
}
function getName($content,$conf) {
global $TSFE;
// Get last page id and overwrite it if empty
$lastId = t3lib_div::GPvar('last_id');
if (!isset($lastId) || empty($lastId)) {
return $conf['ifEmpty'];
}
// Set default name
$content = $conf['ifEmpty'];
// Get SQL ressource
$ressource = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
'be_users.username, be_users.realName',
'pages INNER JOIN be_users ON (pages.perms_userid = be_users.uid)',
'pages.uid='.(int) $lastId,
'',
'',
'1'
);
// Get result
$result = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($ressource);
// Check result and get username or better real name
if (is_array($result)) {
if (isset($result['realName']) && !empty($result['realName'])) {
$content = $result['realName'];
} else if (isset($result['username']) && !empty($result['username'])) {
$content = $result['username'];
}
}
// Else return the content without stdWrap
return $content;
}
}
?>
TypoScript:
---------------------
plugin.tx_thmailformplus_pi1 {
## Captcha Definitions
freecapFieldname = captchafield
fieldConf.captchafield = required
default {
## definition of 2nd adress-field
email_sendtouser >
email_sendtouser = TEXT
email_sendtouser.value = readaktionsAdresse
## Get email address
email_to >
email_to = USER
email_to {
userFunc = user_pageUser->getEmail
ifEmpty = email@domain.com
}
# Betreffzeie der beiden Emails mit Seiten ID bestücken.
email_subject = TEXT
email_subject {
data = GPvar:last_id
wrap = SCHADENSMELDUNG! ID: |
}
email_subject_user < .email_subject
}
markers {
## Get username / real name
USERNAME = USER
USERNAME {
userFunc = user_pageUser->getName
ifEmpty = Vorname Nachname
}
LASTID = TEXT
LASTID.data = GPvar:last_id
LASTURL = TEXT
LASTURL.data = getenv : HTTP_REFERER
ADRESSE-REDAKTION = TEXT
ADRESSE-REDAKTION.value = typo3_fehler@imbei.uni-mainz.de
}
}
Wieder gilt, dass ich den Code aus dem Kopf geschrieben habe, da ich momentan Projekt-bedingt nicht die Zeit habe, in meiner Testumgebung mailformplus zu installieren und einzurichten.
Zu deinen Fragen aus dem vorhergehenden Post:
1: Das ist richtig, eine Funktion ist innerhalb einer Klasse eine Methode, so kann man die beiden besser auseinander halten. Und ich lasse das jetzt mal so stehen, dass die Methode "t3lib_div::GPvar()" den Parameter bereinigt.
2: Da der Rückgabewert der userFunc meines Wissens nach nur ein String, also ein Text sein kann, musste ich auf eine Lösung zurückgreifen, die beide Werte zusammenfügt und sie im TypoScript wieder auseinander trennt.
3: Das "stdWrap" ist das Schweizer Taschenmesser des TypoScripts. Es stellt dir eine ganze Reihe Funktionen zur Manipulation deines TypoScipt-Objekts zur Verfügung. Siehe dazu: https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/Functions/Stdwrap.html
Beste Grüße und viel Erfolg weiterhin
Guten Morgen Speedprogs,
ich hoffe, dass Du mir mein „Schlingel“ nicht übel genommen hast. War als Spaß gemeint , nicht als Rüge! =)
Ich kann’s übrigens auch verstehen, wenn Du langsam keine Lust mehr hast, mich hier Schritt für Schritt durch die Problemstellungen zu führen – aber ich muss sagen – war super! Ich hab echt ne Menge mitnehmen und lernen können. Ich hab auch eigentlich noch nie so eine 1:1 Betreuung in einem Forum erlebt.
Dennoch ist das klein Ersatz dazu, die Grundlagen zu lernen, da hast du Recht. Ist aber nur leider so, dass ich das hier für meine Arbeit mache, aber eigentlich eine ganz andere Aufgabe habe, d.h. nicht wirklich die Zeit übrig hab, mich ewig einzulesen – zumindest, was die Funktionen betrifft, die schnell umgesetzt werden müssen.
Ist echt doof, weil ich eigentlich voll Lust hätte, mich in das System einzuarbeiten, aber mir schlicht weg die Zeit dafür fehlt. Deswegen habe ich auch noch nicht die letzte Deiner Versionen umsetzen können. Aber ich mach’s die Tage. Ich wollte mich nur einfach melden, bevor’s zu lange dauert! Wenn ich’s umgesetzt habe meld mich dann mal bei Dir, nur so zur Info für Dich.
Also: noch mal herzlichen Dank und bis irgendwann in den Weiten der Virtualität,
Habuky