TYPO3 - Powermail: Unterschied zwischen den Versionen
| Zeile 5: | Zeile 5: | ||
== Snippets == | == Snippets == | ||
| + | === E-Mail Empfänger abhängig von Feldwerten (powermail > 2 === | ||
| + | http://typo3.3.n7.nabble.com/Powermail-2-Dynamischer-Empfanger-je-nach-Betreff-td269199.html | ||
| + | |||
| + | ich hatte das in einem Projekt so gelöst: | ||
| + | (läuft unter Typo3 6.1 und Powermail 2.0) | ||
| + | |||
| + | 1) Betreff-Auswahl mit Select-Feld so wie du | ||
| + | |||
| + | 2) Im Powermail-Plugin im Reiter "Empfänger" folgendes: | ||
| + | |||
| + | Name des Empfängers:{f:cObject(typoscriptObjectPath:'lib.receiver_name')} | ||
| + | |||
| + | E-Mail des Empfängers: | ||
| + | |||
| + | {f:cObject(typoscriptObjectPath:'lib.receiver_email')} | ||
| + | |||
| + | Betreff der Mail an den Empfänger: | ||
| + | |||
| + | {f:cObject(typoscriptObjectPath:'lib.subject')} | ||
| + | |||
| + | 3) | ||
| + | Im TypoScript: | ||
| + | <pre> | ||
| + | lib.receiver_email = CASE | ||
| + | lib.receiver_email { | ||
| + | # content id 59: field uid 11 | ||
| + | key.data = GP:tx_powermail_pi1|field|11 | ||
| + | key.intval = 1 | ||
| + | default = TEXT | ||
| + | default.value = [hidden email] | ||
| + | 1 = TEXT | ||
| + | 1.value = [hidden email] | ||
| + | 2 = TEXT | ||
| + | 2.value = [hidden email] | ||
| + | 3 = TEXT | ||
| + | 3.value = [hidden email] | ||
| + | } | ||
| + | lib.receiver_name = CASE | ||
| + | lib.receiver_name { | ||
| + | # content id 59: field uid 11 | ||
| + | key.data = GP:tx_powermail_pi1|field|11 | ||
| + | key.intval = 1 | ||
| + | default = TEXT | ||
| + | default.value = Firma XY | ||
| + | 1 = TEXT | ||
| + | 1.value = Firma XY Allgemein | ||
| + | 2 = TEXT | ||
| + | 2.value = Firma XY Abteilung A | ||
| + | 3 = TEXT | ||
| + | 3.value = Firma XY Abteilung B | ||
| + | } | ||
| + | lib.subject = TEXT | ||
| + | lib.subject { | ||
| + | # content id 59: field uid 11 | ||
| + | key.data = GP:tx_powermail_pi1|field|11 | ||
| + | key.intval = 1 | ||
| + | default = TEXT | ||
| + | default.value = Allgemeine Anfrage | ||
| + | 1 = TEXT | ||
| + | 1.value = Allgemeine Anfrage | ||
| + | 2 = TEXT | ||
| + | 2.value = Anfrage an Abteilung A | ||
| + | 3 = TEXT | ||
| + | 3.value = Anfrage an Abteilung B | ||
| + | } | ||
| + | </pre> | ||
| + | ==== Korrektur für Powermail > 2.1 ==== | ||
| + | ich habe jetzt - mit Hilfe des Powermail-Bug-Trackers - eine Lösung für | ||
| + | > 2.1 gefunden. Und zwar werden Felder nicht mehr nach deren ID, | ||
| + | sondern Feldnamen referenziert: | ||
| + | |||
| + | Im TypoScript der Seite: | ||
| + | <pre> | ||
| + | lib.receiver = CASE | ||
| + | lib.receiver { | ||
| + | # Übergebener Wert | ||
| + | key.field = 0 | ||
| + | |||
| + | default = TEXT | ||
| + | default.value = [hidden email] | ||
| + | # Mitgliederverwaltung | ||
| + | member = TEXT | ||
| + | member.value = [hidden email] | ||
| + | } | ||
| + | </pre> | ||
| + | In das Empfänger-Eingabefeld: | ||
| + | {f:cObject(typoscriptObjectPath:'lib.receiver',data:'{betreff}')} | ||
=== E-Mail Empfänger abhängig von Feldwerten === | === E-Mail Empfänger abhängig von Feldwerten === | ||
==== Quellen ==== | ==== Quellen ==== | ||
Version vom 22. November 2017, 17:57 Uhr
Powermail Extension
Letzte Version für TYPO3 4.5
Powermail Conditions
Snippets
E-Mail Empfänger abhängig von Feldwerten (powermail > 2
http://typo3.3.n7.nabble.com/Powermail-2-Dynamischer-Empfanger-je-nach-Betreff-td269199.html
ich hatte das in einem Projekt so gelöst: (läuft unter Typo3 6.1 und Powermail 2.0)
1) Betreff-Auswahl mit Select-Feld so wie du
2) Im Powermail-Plugin im Reiter "Empfänger" folgendes:
Name des Empfängers:{f:cObject(typoscriptObjectPath:'lib.receiver_name')}
E-Mail des Empfängers:
{f:cObject(typoscriptObjectPath:'lib.receiver_email')}
Betreff der Mail an den Empfänger:
{f:cObject(typoscriptObjectPath:'lib.subject')}
3) Im TypoScript:
lib.receiver_email = CASE
lib.receiver_email {
# content id 59: field uid 11
key.data = GP:tx_powermail_pi1|field|11
key.intval = 1
default = TEXT
default.value = [hidden email]
1 = TEXT
1.value = [hidden email]
2 = TEXT
2.value = [hidden email]
3 = TEXT
3.value = [hidden email]
}
lib.receiver_name = CASE
lib.receiver_name {
# content id 59: field uid 11
key.data = GP:tx_powermail_pi1|field|11
key.intval = 1
default = TEXT
default.value = Firma XY
1 = TEXT
1.value = Firma XY Allgemein
2 = TEXT
2.value = Firma XY Abteilung A
3 = TEXT
3.value = Firma XY Abteilung B
}
lib.subject = TEXT
lib.subject {
# content id 59: field uid 11
key.data = GP:tx_powermail_pi1|field|11
key.intval = 1
default = TEXT
default.value = Allgemeine Anfrage
1 = TEXT
1.value = Allgemeine Anfrage
2 = TEXT
2.value = Anfrage an Abteilung A
3 = TEXT
3.value = Anfrage an Abteilung B
}
Korrektur für Powermail > 2.1
ich habe jetzt - mit Hilfe des Powermail-Bug-Trackers - eine Lösung für
> 2.1 gefunden. Und zwar werden Felder nicht mehr nach deren ID,
sondern Feldnamen referenziert:
Im TypoScript der Seite:
lib.receiver = CASE
lib.receiver {
# Übergebener Wert
key.field = 0
default = TEXT
default.value = [hidden email]
# Mitgliederverwaltung
member = TEXT
member.value = [hidden email]
}
In das Empfänger-Eingabefeld:
{f:cObject(typoscriptObjectPath:'lib.receiver',data:'{betreff}')}
E-Mail Empfänger abhängig von Feldwerten
Quellen
http://typo3blogger.de/powermail-empfanger-im-frontend-wahlen/ (3/2012) Verschiedene Möglichkeiten:
- Direkt (schlecht)
- Über dynamisches TypoScript
- Angepasste Datenbankabfrage
Direkt
Im Empfänger Feld kann man direkt einen Feldmarker angeben z.B.: ###UID234###, dann wird direkt der Wert des Feldes benutzt. Schlecht, weil einfach zu manipulieren (potentielle Spamschleuder)
E-Mail über dynamisches TypoScript
TS
// Case Objekt das den Wert eines Powermail Feldes auswertet.
emailan = CASE
emailan {
### Unterschiedung anhand Feld mit der UID 34 (Form hat id 25)
key.data = TSFE:fe_user|sesData|powermail_25|uid34
### Standardwert
default = TEXT
default.value = info@indihar.de
### Wert bei Auswahl "empf2"
empf2 = TEXT
empf2.value = schlegel@geo-bit.de
}
// neuen dynamischen Powermailmarker (###POWERMAIL_TYPOSCRIPT_EMPFAENGER###)
// dieser kann im Formular im Empfängerfeld eingetragen werden.
plugin.tx_powermail_pi1.dynamicTyposcript {
empfaenger < emailan
}
Angepasste Datenbankabfrage
http://typo3blogger.de/powermail-empfanger-im-frontend-wahlen/
http://www.typo3.net/forum/list/list_post//76461/?howto=1&page=1
Die Extension Powermail bietet eine komfortable Möglichkeit Formulare zusammenzuklicken – übrigens auch für Redakteure. Selbstverständlich ist Skalierbarkeit und Flexibilität ein großes Thema. So ist es auch einfach möglich, den Empfänger im Frontend auszuwählen.
Im Netz gibt es schon ein paar Erklärungen zu diesem Thema, aber ich möchte es dennoch noch einmal aufgreifen, da ich oft auf Empfängerwahl angesprochen werde.
Mail-Adressen direkt in der Select Box Technisch wäre es natürlich kein Problem eine Selectbox mit E-Mail Adressen im Frontend anzeigen zu lassen und im Flexform im Empfängerfeld dieses Feld durch einen Marker wieder aufzugreifen (z.B. ###UID234###). Der Nachteil liegt aber auf der Hand: - Mail Adressen können im Frontend aus dem Quelltext ausgelesen werden - Mail Adressen können einfach manipuliert werden (im schlimmsten Fall stellt ihr so eine Spamschleuder ins Netz) Diese Methode ist also allenfalls im Intranet nutzbar.
Umweg über Datenbank-UID Eine andere Idee ist es, Datankbankeinträge (z.B. tt_address oder fe_user) mit E-Mail Adressen vorzunehmen und in einer (z.B.) Selectbox die UID des Datensatzes wieder aufzugreifen. Beispiel Eintrag im Flexform In diesem Beispiel hat man die Wahl zwischen UID 1 und 2. Verwendeter Marker ist ###UID42###. SQL Query Beispiel Damit Powermail den Umweg über die Datenbank geht, bietet sich der Einsatz des Feldes “Alternative SQL-Query” an.
Weitere Infos Natürlich kann man auch an ganze Usergroups schicken:
SELECT email FROM fe_users WHERE find_in_set(###UID43###,usergroup) > 0 AND hidden = 0 AND deleted = 0
Beispiel mit fester Usergroup UID44:
SELECT email FROM fe_users WHERE find_in_set(44,usergroup) > 0 AND hidden = 0 AND deleted = 0
Hier ein Beispiel mit Checkboxen (mehrere Empfänger auswählen):
SELECT email FROM fe_users WHERE uid IN(###UID43###)
Eine ganz andere Möglichkeit ist der Einsatz von Dynamictyposcript im Empfängerfeld – auch hier lassen sich einige Anforderungen flexibel umsetzen. Dynamictyposcript in Powermail
Formular in Datenbank speichern
plugin.tx_powermail_pi1{
dbEntry {
# Speicherung für Tabelle ermöglichen
tt_address._enable = TEXT
tt_address._enable.value = 1
# "tt_address.name" mit dem Wert des Powermail felds ausfüllen
tt_content uid 88, field uid18 (###uid18###)
tt_address.name = TEXT
tt_address.name.data = TSFE:fe_user|sesData|powermail_88|uid18
}
}
Ausführliches Beispiel
Constants
plugin.powermail.js.alwaysInclude = 1 plugin.powermail.js.includeJquery = 0 plugin.powermail.js.includeJqueryTools = 0 plugin.powermail.js.includeJqueryToolsTabs = 0 plugin.powermail.allow.email2sender = 0 plugin.powermail.PID.dblog = 0 plugin.powermail.markerALL.hideLabel = 1 plugin.powermail.format.datetime = %d.%m.%Y% %H:%M plugin.powermail.format.date = %d.%m.%Y plugin.powermail.debug.output =
Setup
// CSS Pfad ändern (oder gar nicht erst statisch einbinden ;-) ) page.includeCSS.powermail_frontend_basic = fileadmin/templates/onlineboerse/powermail.css
Datenbank Speicherung mit verschiedenen Optionen
Setup
// Powermail DB Storage
// Extra userfunc to convert date to unix timestamp
includeLibs.powermailTimestamp = fileadmin/templates/scripts/user_powermailTimestamp.php
plugin.tx_powermail_pi1.dbEntry{
tx_gbbulletin_bulletin {
_enable = TEXT
_enable.value = 1
hidden = TEXT
hidden.value = 1
pid = TEXT
pid.value = 102
tstamp = TEXT
tstamp.data = date:U
crdate = TEXT
crdate.data = date:U
title = TEXT
title.data = TSFE:fe_user|sesData|powermail_214|uid1
author = TEXT
author.data = TSFE:fe_user|sesData|powermail_214|uid2
place = TEXT
place.data = TSFE:fe_user|sesData|powermail_214|uid3
description = TEXT
description.data = TSFE:fe_user|sesData|powermail_214|uid4
contact = TEXT
contact.data = TSFE:fe_user|sesData|powermail_214|uid5
qualification = TEXT
qualification.data = TSFE:fe_user|sesData|powermail_214|uid6
date = USER
date.userFunc = user_powermailTimestamp->preflight
date.userFunc.field = uid7
date.userFunc.formuid = 214
period = TEXT
period.data = TSFE:fe_user|sesData|powermail_214|uid29
end_date = USER
end_date.userFunc = user_powermailTimestamp->preflight
end_date.userFunc.field = uid14
end_date.userFunc.formuid = 214
url = TEXT
url.data = TSFE:fe_user|sesData|powermail_214|uid8
text1 = TEXT
text1.data = TSFE:fe_user|sesData|powermail_214|uid9
cluster = TEXT
cluster.data = TSFE:fe_user|sesData|powermail_214|uid11
# add mm relation to uid 2 of tx_gbbulletin_cluster (via mm table)
_mm = COA
_mm.10 = COA
# 1 is always the mm table
_mm.10.1 = TEXT
_mm.10.1.value = tx_gbbulletin_cluster_mm
# 2 is always the other table
_mm.10.2 = TEXT
_mm.10.2.value = tx_gbbulletin_cluster
# 3 is always the uid of the other table to get a relation to this
# (in this case uid1 of tx_gbbulletin_cluster)
_mm.10.3 = TEXT
_mm.10.3.value = 1
tag = TEXT
tag.data = TSFE:fe_user|sesData|powermail_214|uid12
}
}
Userfunktion zum umwandeln von Datum in Timestamp
Diese Funktion wird im obigen Beispiel zu Datenbankspeicherung verwendet
<?php
class user_powermailTimestamp {
// Function preflight() will be used from typoscript
function preflight($content='', $conf=array()) {
$value = $GLOBALS['TSFE']->fe_user->sesData['powermail_'.$conf['userFunc.']['formuid']][$conf['userFunc.']['field']];
return $this->getDate($value);
}
// Main getDate() changes a date in any format to an unix timestamp
function getDate($string, $default = 'now', $timestamp = 1) {
$error = 0; // no error at the beginning
$string = str_replace(array('-', '_', ':', '+', ',', ' '), '.', $string); // change 23-12-2009 -> 23.12.2009 AND "05:00 23.01.2009" -> 05.00.23.01.2009
if (method_exists('t3lib_div', 'trimExplode')) $dateParts = t3lib_div::trimExplode('.', $string, 1); else $dateParts = explode('.', $string); // split at .
if (count($dateParts) === 3) { // only if there are three parts like "23.12.2009"
if (strlen($dateParts[0]) <= 2 && strlen($dateParts[1]) <= 2 && strlen($dateParts[2]) <= 2) { // xx.xx.xx
$string = strtotime($dateParts[2].'-'.$dateParts[1].'-'.$dateParts[0]); // change to timestamp
}
elseif (strlen($dateParts[0]) == 4 && strlen($dateParts[1]) <= 2 && strlen($dateParts[2]) <= 2) { // xxxx.xx.xx
$string = strtotime($dateParts[0].'-'.$dateParts[1].'-'.$dateParts[2]); // change to timestamp
}
elseif (strlen($dateParts[0]) <= 2 && strlen($dateParts[1]) <= 2 && strlen($dateParts[2]) == 4) { // xx.xx.xxxx
$string = strtotime($dateParts[2].'-'.$dateParts[1].'-'.$dateParts[0]); // change to timestamp
}
else { // error
$error = 1; // error
}
} elseif (count($dateParts) === 5) { // only if there are five parts like "05.00.23.01.2009"
$string = strtotime($dateParts[4].'-'.$dateParts[3].'-'.$dateParts[2].' '.$dateParts[0].':'.$dateParts[1].':00'); // change to timestamp
} else { // more than 3 parts - so error
$error = 1; // error
}
$string = date('Y-m-d', $string); // For default: change 1234567 -> 1.1.1979
if ($timestamp) $string = strtotime($string); // Change back 1.1.1979 -> 1234567
if ($error) $string = ($default == 'now' ? time() : $default); // show default value
return $string;
}
}
?>
Dropdownfeld mit Werten aus der Datenbank
Beispiel 1
Quelle: http://www.typo3.net/forum/thematik/zeige/thema/77259/?show=1 Zugriff: 2013-10
1. Neues Powermail Feld anlegen (typoscript) im Feld Typoscript Objekt z.B. lib.objectname angeben
2. Eine Selectabfrage in TS (Hole name, uid von tt_address der Seite 5):
TS
lib.objectname {
10 = TEXT
10.value = <label for="uid33">Select:</label>
20 = CONTENT
20.wrap = <select id="uid33" name="tx_powermail_pi1[uid33]" size="1">|</select>
20 {
table = tt_address
select {
pidInList = 5
orderBy = name
}
renderObj = COA
renderObj {
10 = COA
10 {
10 = TEXT
10 {
field = uid
wrap = <option value="|">
}
20 = TEXT
20 {
field = name
wrap = |</option>
}
}
}
}
}
Ergebnis:
Dynamische Selecterbox, mit dem HTML Code:
<label for="uid33">Select:</label> <select id="uid33" name="tx_powermail_pi1[uid33]" size="1"> <option value="23">Name1</option> <option value="24">Name2</option> </select>
Datenspeicherung in m:n Tabellen
Quelle: http://typo3-blog.net/tutorials/news/powermail-tt-news-mn-tabelle.html 2013-10
Powermail lässt sich nicht nur zum Versenden von Mails sondern auch zum Erstellen von Inhaltselementen nutzen. Dazu dient die TYPO3 Option dbEntry. Mit Hilfe dieser Option ist es sogar möglich MN-Tabellen zu befüllen, welches wenig bekannt ist. Anbei ein Beispiel, wie Eine tt_news Nachricht erzeugt und direkt in Kategorie Nr. 2 eingefügt werden kann:
plugin.tx_powermail_pi1.upload.folder = uploads/pics/
plugin.tx_powermail_pi1.dbEntry.tt_news {
# Neue Nachrichten müssen durch Admin genehmigt werden
_enable = TEXT
_enable.value = 0
pid = TEXT
pid.value = 2
tstamp = TEXT
tstamp.data = date:U
crdate = TEXT
crdate.data = date:U
_mn = COA
_mn.10 = COA
# 1 muss Namen der mn Tabelle enthalten
_mm.10.1 = TEXT
_mm.10.1.value = tt_news_cat_mm
# 2 ist der Name der Fremdtabelle, hier News Kategorie
_mm.10.2 = TEXT
_mm.10.2.value = tt_news_cat
# 3 die Fremd uid, hier uid der Newskategorie
_mm.10.3 = TEXT
_mm.10.3.value = 2
# 139 ist die uid des Contenelements, welches das Powermailformular darstellt
# 15 ist die uid des einzelnen Feldes.
title = TEXT
title.data = TSFE:fe_user|sesData|powermail_139|uid15
author_email = TEXT
author_email.data = TSFE:fe_user|sesData|powermail_139|uid21
author = TEXT
author.data = TSFE:fe_user|sesData|powermail_139|uid739
# short = TEXT
# short.data = TSFE:fe_user|sesData|powermail_139|uid742
bodytext = TEXT
bodytext.data = TSFE:fe_user|sesData|powermail_139|uid19
datetime = TEXT
datetime.data = TSFE:fe_user|sesData|powermail_139|uid17
keywords = TEXT
keywords.data = TSFE:fe_user|sesData|powermail_139|uid41
}
Felder vorausfüllen
Quelle: http://typo3blogger.de/powermail-trickkiste-teil-2-%E2%80%93-felder-vorbelegen/
Über GET Parameter
Dropdown
http://www.einpraegsam.net/kontakt.html?tx_powermail_pi1[uid24]=TYPO3%20Extension%20powermail
Input
index.php?id=1&tx_powermail_pi1[uid12]=Hallo
Checkbox
index.php?id=1&tx_powermail_pi1[uid13][0]=1
Über TypoScript
Vorfüllen mit TypoScript: Durch eine Vorbelegung mit TypoScript gibt es kaum noch Grenzen. Statische Werte, GET und POST Parameter und userFuncs können verwendet werden. Nachfolgend ein paar Beispiele.
plugin.tx_powermail_pi1 {
prefill {
# Fülle Feld 1 mit statischem Wert
uid1 = TEXT
uid1.value = blabla
# Fülle Feld 2 mit aktuellem timestamp
uid2 = TEXT
uid2.data = date:U
# Feld 3 mit Datum
uid3 = TEXT
uid3.data = date:U
uid3.strftime = Datum: %d.%m.%Y
# Feld 4 mit IP Adresse
uid4 = TEXT
uid4.data = getIndpEnv:REMOTE_ADDR
# Feld 5 und 6 mit Wert aus aktueller URL
# index.php?id=123&wert=Ort
uid5 = TEXT
uid5.data = GP:wert
uid5.htmlSpecialChars = 1
# index.php?id=123&tx_ttnews[tt_news]=95
uid5 = TEXT
uid5.data = GP:tx_ttnews|tt_news
uid5.wrap = Wir befinden uns auf der Newsdetailseite mit der UID|
uid5.intval = 1
}
}
Hinweis: 1. Im Beispiel 4 und 5 werden Benutzerdefinierte Werte (GET oder POST) verwendet. Hier ist ein Absichern gegen XSS unabdingbar. Mit intval oder htmlSpecialChars lassen sich Werte innerhalb von TypoScript leicht absichern. 2. Falls ein Wert eines Feldes in der Session liegt, hat dieser Vorrang. 3. Ein Selectfeld wird automatisch vorselektiert wenn der vorgegebene Wert auch zur Auswahl steht
User basierter Upload Ordner
ich möchte die in einem Upload-Formular übermittelten Dateien in ein bestimmtes Verzeichnis (fileadmin/user_upload/verzeichnis/) schieben. Das funktioniert auch mit folgender Konstanten:
plugin.powermail.upload.folder = /fileadmin/user_upload/vkb-uploads/
Die Dateien landen im richtigen Ordner. Allerdings wird in der Powermail-Ansicht im Backend, dieser Pfad nicht übernommen. Ich lasse mir also die eingegangenen Powermails anzeigen und hier ist ja dann die übertragene Datei entsprechend verlinkt, aber eben nicht mit dem von mir vorgegebenem Pfad sondern mit dem Standard-Ordner (uploads/tx_powermail/files/Dateiname.abc).
Lösung anscheinend selbst gefunden.
Ich habe alle möglichen Dateien durchsuchen lassen, in denen der Pfad 'uploads/tx_powermail/files/' gesetzt ist und die Datei pageTSconfig.txt gefunden.
Hieraus konnte ich schlussfolgern, dass der folgende Schnipsel im TSConfig des Sysordners in dem die Mails auflaufen hinterlegt sein muss um mein Problem zu beheben:
tx_powermail_mod1.config {
list {
uploadFolder = mein/pfad/zu/den/dateianhängen/
}
}