Minimales Setup für Standard-Mailformular sollte mitbringen:
- Reply-To an Websitebesucher
- fester From-Name…
- …und From-Email (sonst ggf. falsch automatisiert ermittelt)
Konfiguration könnte somit etwa aussehen wie folgt:
Name | *replyto_name=input
E-Mail | *replyto_email=input
Nachricht | *Nachricht=textarea
| from_name=hidden | example.com
| from_email=hidden | info@example.com
| formtype_mail=submit | Absenden
| html_enabled=hidden
| subject=hidden | example.com Mailformular
Heute benötigte ich innerhalb eines generischen Markers von tt_news Zugriff auf das Content-Element, in dem die Meldung angezeigt wird (also die Plugin-Einbindung). Warum man sowas braucht? Naja, Projekte entwickeln sich manchmal kreativ… 😉
Generische Marker werden im Zuge des Renderings der einzelnen Newsmeldungen ausgewertet, d.h. der Zugriff über field etc. ist jeweils auf den tt_news-Datensatz, nicht auf das Inhaltselement. Der Datensatz selbst hat auch keine Verknüpfung zum Inhaltselement. 🙁
Die Kollegen der marit.ag haben vor Längerem den Artikel „Datenbankfelder dynamisch per stdWrap.data auslesen“ verfasst. Damit ließe sich (via „getText“) auf beliebige Datensätze dynamisch zugreifen wie folgt:
genericmarkers {
ceheader >
ceheader = TEXT
ceheader {
// @see http://blog.marit.ag/2009/12/15/datenbankfelder-stdwrap-data/
dataWrap = DB:tt_content:{field:pid}:header
wrap3 = {|}
insertData=1
}
} |
genericmarkers {
ceheader >
ceheader = TEXT
ceheader {
// @see http://blog.marit.ag/2009/12/15/datenbankfelder-stdwrap-data/
dataWrap = DB:tt_content:{field:pid}:header
wrap3 = {|}
insertData=1
}
}
Es bleibt aber die Problematik, dass wir die uid des tt_content-Datensatzes dennoch nicht kennen. Hilfe bringt aber der Inhalt von TSFE: dort gibt es einen Wert currentRecord:
This is set to the [table]:[uid] of the record delivered in the $data-array
Somit lässt sich der Ansatz erweitern, indem im dataWrap der Teilstring „[table]:[uid]“ dynamisch ersetzt wird:
genericmarkers {
ceheader >
ceheader = TEXT
ceheader {
// @see http://blog.marit.ag/2009/12/15/datenbankfelder-stdwrap-data/
//dataWrap = DB:tt_content:{cObj:TSFE:parentRecordNumber}:header
// {TSFE:currentRecord} liefert etwas in der Art "tt_content:1234"
dataWrap = DB:{TSFE:currentRecord}:header
wrap3 = {|}
insertData=1
}
} |
genericmarkers {
ceheader >
ceheader = TEXT
ceheader {
// @see http://blog.marit.ag/2009/12/15/datenbankfelder-stdwrap-data/
//dataWrap = DB:tt_content:{cObj:TSFE:parentRecordNumber}:header
// {TSFE:currentRecord} liefert etwas in der Art "tt_content:1234"
dataWrap = DB:{TSFE:currentRecord}:header
wrap3 = {|}
insertData=1
}
}
Quellen
Um Bilder nicht nur eine feste Breite in Abhängigkeit von der colPos zuzuweisen, sondern auch noch zu croppen, bentötigt man folgendes Snippet:
temp.tt_content.image < tt_content.image
tt_content.image = CASE
tt_content.image {
key.field=colPos
0 < temp.tt_content.image
1 < temp.tt_content.image
2 < temp.tt_content.image
1.20.1.file.width >
1.20.1.file.height >
1.20.1.file {
width = 698c
height = 400c
}
2.20.1.file.width >
2.20.1.file.height >
2.20.1.file {
width = 200c
height= 150c
}
}
Um Links in HTML-Elementen zu parsen benötigt man folgende Zeilen im setup:
# Syntax:
# ausgelassene Parameter können hinten weggelassen oder durch "-" freigehalten werden
# <link PID/URL/Mail TARGET/WIDTHxHEIGHT CLASS "TITLE">LINKTEXT</link>
#
# Beispiele:
# <link 2>Zur Seite</link>
# <link 7 - a-link "zur Information">hier</link>
# <link http://www.google.de 300x400 myPopup-class "in neuem Fenster">Google</link>
# <link info@abc.de - myMail "E-Mail senden">Kontakt</link>
#
tt_content.html.parseFunc.tags.link < lib.parseFunc.tags.link
Das target kann dann noch über das setup folgendermaßen ändern:
tt_content.html.parseFunc.tags.link.typolink {
extTarget >
extTarget = _self
target >
target = _self
}
Auf welche Weise die Sprachbehandlung und Fallbacks erfolgen sollen bzw. ob die Regelung auch für Bilder greifen soll, ist von Projekt zu Projekt verschieden.
Eine öfters anzutreffende Variante ist: Falls kein Bild in der Übersetzung der Seite vorhanden ist (pages_overlay), nimm das aus der Default-Sprache, falls dort auch keines ist, dann schau in der Rootline nach oben bis eines gefunden wird.
// 1. Idealerweise das Bild aus dem media-Feld der Sprache nehmen (override)
// 2. Falls leer, dann das aus der Default-Sprache (override.ifEmpty)
// 3. Falls da auch nix drin steht, dann levelmedia bis Root hochgucken
temp.dynamicImage = IMG_RESOURCE
temp.dynamicImage {
file.import = uploads/media/
file.import.data = levelmedia: -1,slide
file.import.override.listNum = 0
file.import.override.field = media
file.import.override.ifEmpty.cObject = TEXT
file.import.override.ifEmpty.cObject {
data.dataWrap = DB:pages:{field:uid}:media
insertData = 1
if.isTrue.data = TSFE:sys_language_uid
}
} |
// 1. Idealerweise das Bild aus dem media-Feld der Sprache nehmen (override)
// 2. Falls leer, dann das aus der Default-Sprache (override.ifEmpty)
// 3. Falls da auch nix drin steht, dann levelmedia bis Root hochgucken
temp.dynamicImage = IMG_RESOURCE
temp.dynamicImage {
file.import = uploads/media/
file.import.data = levelmedia: -1,slide
file.import.override.listNum = 0
file.import.override.field = media
file.import.override.ifEmpty.cObject = TEXT
file.import.override.ifEmpty.cObject {
data.dataWrap = DB:pages:{field:uid}:media
insertData = 1
if.isTrue.data = TSFE:sys_language_uid
}
}