per TS mit CONTENT
Wenn man viele Adressen (tt_address) hat, möchte man diese nicht immer alle auf einer Seite darstellen. Sicherlich könnte man mit Kategorien arbeiten, oder jeweils nur einzelene Einträge auswählen. Eine automatische Liste geordnete nach Anfangsbuchstabe (Nachnamen) ist einfacher. Dazu benötigt man keine extra Extension, das kann man auch mit tt_address lösen. Im diesem Artikel wird eine mögliche Lösung vorgestellt.
Mehrsprachige Seite ?
Wenn die Ausgabe mehrsprachig sein soll, macht es Sinn die Labels in eine Sprachdatei auszulagern, wie es in diesem Beispiel mit einer XML Datei gemacht wurde.
locallang.xml
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<T3locallang>
<meta type="array">
<type>module</type>
<description>Languages labels template</description>
</meta>
<data type="array">
<languageKey index="default" type="array">
<label index="tt_address.grender_f">Mrs.</label>
<label index="tt_address.grender_m">Mr.</label>
<label index="tt_address.phone">Phone</label>
<label index="tt_address.mobile">Mobile</label>
<label index="tt_address.fax">Fax</label>
<label index="tt_address.email">Email</label>
<label index="tt_address.www">Internet</label>
</languageKey>
<languageKey index="de" type="array">
<label index="tt_address.grender_f">Frau</label>
<label index="tt_address.grender_m">Herr</label>
<label index="tt_address.phone">Tel.</label>
<label index="tt_address.mobile">Mobile</label>
<label index="tt_address.fax">Fax</label>
<label index="tt_address.email">Email</label>
<label index="tt_address.www">Internet</label>
</languageKey>
</data>
</T3locallang>
locallang.xml
Veränderbare Konfiguration in Constanten auslagern
Wenn eine typoscript Code Schnipsel an mehreren Stellen in der Webseite ausgegeben werden kann, oder mehrere Webseiten in einem TYPO3 betrieben werden, sollte man veränderbare Konfigurationen in TYPO3 Constanten auslagern. Dies kann auch bei Sprachdateien hilfreich sein ;-)
constants.txt
FILE {
locallang = fileadmin/pfad-zur-datei/locallang.xml
}
# tt_address, ID des SysOrdners angeben
lib.tt_address.list.pidList = X?
constants.txt
Ausgabe des Codes in der Content Spalte
Damit typoscript Code in der Webseite aanstelle der Content Elemente ausgegeben wird, gibt es mehrere Varianten. Wenn mit MARKER gerabeitet wurde ( oder TemplaVoila sinnvoll verwendet wurde ) kann man mit einer Condition den Script Code einfach hinzufügen.
typoscript code einbinden
[globalVar = TSFE:id = ID-DER-SEITE]
# Der Marker in diesem Beispiel COL2.
# Bei .10 wird im Marker COL2 der TYPO3 Content ausgegeben.
page.10.marks.COL2.15 < lib.tt_address.list_by_lastname
[global]
Ein Beispiel mit Marker
Script Aufbau
Im ersten Teil (4-20) werden die Labels aus dem XML ins LOAD_REGISTER eingelesen.
Startbuchstabe A
Bei 75/142/ wird der Startbuchstabe A festgelegt.
Die A-Z Liste (Zeile 22 - 106)
Mit einem CONTENT Element werden alle Einträge ausgelesen und eine A-Z Liste erstellt. Der Buchstabe wird nur angezeigt, wenn ein Nachname mit diesem Anfangsbuchstaben vorhanden ist.
Alle Anzeigen Link (Zeile 109- 121)
Damit alle Einträge angezeigt werden können wurde ein zusätzlicher Link erstellt. Dieses Label wurde nicht in das XML ausgelagert und auf eine andere TYPO3 Art mehrsprachig umgesetzt.
SQL-Injection verhindern (Zeile 140 - 141)
Wenn URL Parameter in einem SQL Select verwendet werden, muss man SQL-Injections verhindern. Dies wird in diesem Beispiel mit crop = 1| gemacht, damit wird nur das erste Zeichen verwendet.
setup.txt
lib.tt_address.list_by_lastname = COA
lib.tt_address.list_by_lastname {
1 = LOAD_REGISTER
1 {
lll_grender_f = TEXT
lll_grender_f.data = LLL:{$FILE.locallang}:tt_address.grender_f
lll_grender_m = TEXT
lll_grender_m.data = LLL:{$FILE.locallang}:tt_address.grender_m
lll_phone = TEXT
lll_phone.data = LLL:{$FILE.locallang}:tt_address.phone
lll_mobile = TEXT
lll_mobile.data = LLL:{$FILE.locallang}:tt_address.mobile
lll_fax = TEXT
lll_fax.data = LLL:{$FILE.locallang}:tt_address.fax
lll_email = TEXT
lll_email.data = LLL:{$FILE.locallang}:tt_address.email
lll_www = TEXT
lll_www.data = LLL:{$FILE.locallang}:tt_address.www
}
# the lastname select list
10 = COA
10 {
1 = LOAD_REGISTER
1 {
firstLetter.value =
}
10 = CONTENT
10 {
# Tabellenname
table = tt_address
select{
# PID welche bei tt_address drin steht
pidInList= {$lib.tt_address.list.pidList}
# Sortierung
orderBy = last_name
# Feld einschränkung
selectFields = last_name
# Maximale Anzahl
#max = 10
# aktuelle Sprache berücksichtigen
languageField = sys_language_uid
}
renderObj = COA
renderObj {
5 = LOAD_REGISTER
5 {
fLetter = TEXT
fLetter {
field = last_name
crop = 1|
}
}
10 = TEXT
10 {
data = field:last_name
innerWrap = |
crop = 1|
typolink {
# PID der Ziel Seite
parameter.data = TSFE:id
useCacheHash = 1
additionalParams = &tx_ttaddress_pi1[last_name]={register:fLetter}
additionalParams.insertData = 1
ATagParams = class="cur"
ATagParams {
if {
value.data = GP:tx_ttaddress_pi1|last_name
value {
# Default Wert, wenn kein Param
override = A
override {
if.isFalse.data = GP:tx_ttaddress_pi1|all // GP:tx_ttaddress_pi1|last_name
}
}
equals.field = last_name
equals.crop = 1|
}
}
}
# nur wenn nicht bereits vorhanden
if {
value.data = register:firstLetter
equals.field = last_name
equals.crop = 1|
negate = 1
}
wrap = <li>|</li>
}
15 = LOAD_REGISTER
15 {
firstLetter.field = last_name
firstLetter.crop = 1|
}
}
wrap = <ul class="ttaddressLetterList clearfix">|</ul>
}
}
# show all
15 = TEXT
15 {
value = alle anzeigen
lang.en = view all
typolink {
# PID der Ziel Seite
parameter.data = TSFE:id
useCacheHash = 1
additionalParams = &tx_ttaddress_pi1[all]=1
additionalParams.insertData = 1
}
wrap = <div class="ttaddressShowAll">|</div>
}
# the adress list
20 = COA
20 {
10 = CONTENT
10 {
table = tt_address
select{
# PID welche tt_address enthält
pidInList= {$lib.tt_address.list.pidList}
# Sortierung
orderBy = zip
# Feld einschränkung - performance ?
#selectFields = first_name,last_name,title,email,phone,mobile,www,address,building,room,company,city,zip,region,country,image,fax
# einschränkung auf Nachname
andWhere {
data = GP:tx_ttaddress_pi1|last_name
# SQL-Injection verhindern
crop = 1|
wrap = tt_address.last_name LIKE('|%')
# default Wert
override = A
override {
if.isFalse.data = GP:tx_ttaddress_pi1|last_name
}
if.isFalse.data = GP:tx_ttaddress_pi1|all
}
# aktuelle Sprache berücksichtigen
languageField = sys_language_uid
}
renderObj = COA
renderObj {
5 = LOAD_REGISTER
5 {
gender.cObject = CASE
gender.cObject {
key = {field:gender}
key.insertData = 1
m = TEXT
m.value = {register:lll_grender_m}
m.insertData = 1
f = TEXT
f.value = {register:lll_grender_f}
f.insertData = 1
default = TEXT
default.value =
}
}
10 = COA
10 {
wrap = <td class="td-0">|</td>
10 = TEXT
10 {
value = {register:gender} {field:first_name} {field:last_name}
insertData = 1
noTrimWrap = |<span class="person">|</span><br />|
if.isTrue.field = last_name
}
20 = TEXT
20 {
field = company
required = 1
br = 1
wrap = <div class="company"><em>|</em></div>
}
}
20 = COA
20 {
wrap = <td class="td-last td-1">|</td>
10 = TEXT
10 {
field = address
required = 1
br = 1
wrap = <div class="streetAddress">|</div>
}
20 = TEXT
20 {
field = zip
required = 1
noTrimWrap = |<span class="postalCode">|</span> |
}
30 = TEXT
30 {
field = city
required = 1
noTrimWrap = |<span class="city">|</span> |
}
40 = TEXT
40 {
field = region
required = 1
noTrimWrap = |<span class="region">(|)</span><br />|
outerWrap = |<br />
outerWrap.if.isFalse.field = zip
}
50 = TEXT
50 {
field = phone
required = 1
dataWrap = <div class="phone"><span class="label">{register:lll_phone}. </span>|</div>
}
60 = TEXT
60 {
field = mobile
required = 1
dataWrap = <div class="mobile"><span class="label">{register:lll_mobile} </span>|</div>
}
70 = TEXT
70 {
field = fax
required = 1
dataWrap = <div class="fax"><span class="label">{register:lll_fax} </span>|</div>
}
80 = TEXT
80 {
field = email
typolink.parameter.field = email
required = 1
dataWrap = <div class="email"><span class="label">{register:lll_email}: </span>|</div>
}
90 = TEXT
90 {
field = www
typolink.parameter.field = www
typolink.extTarget = _blank
required = 1
dataWrap = <div class="inet">|</div>
}
}
wrap = <tr class="ttaddressAdrItem">|</tr>
}
wrap (
<table class="contenttable ttaddressAdrList">
<tbody>|</tbody>
</table>
)
}
}
wrap = <div class="ttaddressLastnameListBox">|</div>
}
lib.tt_address.list_by_lastname
Demo
Das TypoScript im Einsatz.
| Herr Vorname 2 BNachname 2 Organisation | Adresse 1 PLZ Stadt (Region/Bundesland)Adresse 2 Tel.. Telefon Mobile Mobil Fax Fax Email: email@domain.ch |