TYPO3 - Powermail: Unterschied zwischen den Versionen
| Zeile 318: | Zeile 318: | ||
=== Datenspeicherung in m:n Tabellen === | === Datenspeicherung in m:n Tabellen === | ||
Quelle: http://typo3-blog.net/tutorials/news/powermail-tt-news-mn-tabelle.html 2013-10 | 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: | ||
<pre> | <pre> | ||
| − | |||
| − | |||
plugin.tx_powermail_pi1.upload.folder = uploads/pics/ | plugin.tx_powermail_pi1.upload.folder = uploads/pics/ | ||
plugin.tx_powermail_pi1.dbEntry.tt_news { | plugin.tx_powermail_pi1.dbEntry.tt_news { | ||
Version vom 18. Oktober 2013, 15:10 Uhr
Powermail Extension
Snippets
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
}