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äderbare 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äderbare 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äkung
				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äkung - performance ?
				#selectFields = first_name,last_name,title,email,phone,mobile,www,address,building,room,company,city,zip,region,country,image,fax
				# einschräkung 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.

Frau Vorname 1 ANachname 1
Organisation
Adresse 1
Adresse 2
PLZ Stadt (Region/Bundesland)
Tel.. Telefon
Mobile Mobil
Fax Fax