To the menu


Codelistings

Seite 37/38

Installation unter Linux mit einem Paket Ihrer Wahl
user@domain:~$ cd /var/www
user@domain:/var/www$ wget [URL zum TYPO3-Kern]
user@domain:/var/www$ wget [URL zum dummy-Paket]
user@domain:/var/www$ tar xfz typo3_src-X.X.tar.gz
user@domain:/var/www$ tar xfz dummy-X.X.tar.gz
user@domain:/var/www$ mv dummy-X.X t3site
user@domain:/var/www$ chgrp -R www-data typo3_src-X.X/ t3site/
user@domain:/var/www$ chmod -R g+w,o-rwx typo3_src-X.X/ t3site/
user@domain:/var/www$ rm typo3_src-X.X.tar.gz
user@domain:/var/www$ rm dummy-X.X.tar.gz

Seite 39

Benutzer des Webservers herausfinden
<?php
passthru("whoami");
?>

Seite 46/47

Installation über Absetzen von Systemkommandos mittels PHP
<?php
//~ Geben Sie hier den Namen Ihres Projektes an.
$project = 't3site';
 
//~ Geben Sie hier den sf.net Mirrors an. Z.B.: mesh, switch, ovh etc.
$mirror = 'mesh';
 
//~ Geben Sie hier die gewünschte Version an
$version = '4.0';
 
//~ --- ENDE DER KONFIGURATION ---
 
//~ Benutzereingaben sichern
$project = escapeshellarg(escapeshellcmd($project));
$mirror = escapeshellcmd($mirror);
 
//~ Zu ladende Dateien definieren.
$files = array(	'dummy'	=> 'dummy-'.$version,
				'src' 	=> 'typo3_src-'.$version);
				
//~ Endungen der zu ladenden Dateien definieren
$ext = '.tar.gz';
 
//~ URL zu sf.net mit dem gewählten Mirror erzeugen
$uri = "http://$mirror.dl.sourceforge.net/sourceforge/typo3/";
 
//~ Fehler umleiten. Wichtig: String beginnt mit Leerzeichen
$stderr = ' 2>&1';
 
//~ Trenner zwischen den verschiedenen Ausgaben
$divider= str_pad('',100,'-')."\n";
 
//~ Ausgabe von der Kommandozeile kommt als Plain-Text.
header('Content-Type: text/plain');
 
foreach($files as $file) {
	//~ Download. Wiederaufnehmen (-c) und mehrfach versuchen (--tries=5)
	system('wget -c --tries=5 '.escapeshellarg($uri.$file.$ext).$stderr);
	echo $divider;
	
	//~ Datei schreibbar für alle machen (o+rw).
	//~ Andernfalls wäre sie per FTP nicht mehr löschbar.
	system('chmod o+rw ./'.$file.$ext.$stderr);
	echo $divider;
	
	//~ extrahiere (-x) Dateien aus den mit
	//~ gzip-gepackten (-z) Archiven (-f) und
	//~ liefere erweiterte Ausgabe (-v).
	system('tar -zxvf ./'.$file.$ext.$stderr);
	echo $divider;
	
	//~ Entpacktes Verzeichnis und Inhalt (-R)
	//~ lesbar und schreibbar für alle machen (o+rw).
	system('chmod o+rw -R ./'.$file.$stderr);
	echo $divider;
}
//~ dummy-$version in den gewünschten Namen ($project) umbenennen.
system("mv ./{$files['dummy']} $project");
?>

Seite 52-54

Ubuntu Komplett-Installationsanleitung
user@domain:~$ wget http://typo3.sunsite.dk/software/linux/graphicsmagick-X.X.X_i386-static-2.tar.gz
user@domain:~$ tar xfz graphicsmagick-X.X.X_i386-static-2.tar.gz
user@domain:~$ chmod 0755 graphicsmagick-X.X.X/bin/gm
user@domain:~$ sudo mv graphicsmagick-X.X.X/ /usr/bin/graphicsmagick
user@domain:~$ sudo mysqladmin -u root password geheim
user@domain:~$ cd /etc/php5/apache2
user@domain:/etc/php5/apache2$ sudo cp php.ini php.ini~
user@domain:/etc/php5/apache2$ sudo gedit php.ini
		[...Änderungen an der php.ini vornehmen]
user@domain:~$ sudo apache2ctl restart
user@domain:~$ sudo su
user@domain:~$ cd /var/www
		[...normale Installation...]

Seite 256

Seitenhintergrund abhängig vom Layout schwarz einfärben
[globalVar = TSFE:page|layout = 1]
	page.bodyTag = <body bgcolor="#000000">
[end]

Seite 257

Inhalt des Feldes newUntil verwenden und formatieren
temp.mindesthaltbarkeit = TEXT
temp.mindesthaltbarkeit {
	// nur, wenn das Feld einen Eintrag enthält
	fieldRequired = newUntil
	field = newUntil
	strftime = bis %d.%m.%Y zum Verzehr geeignet
}
Tag der Woche ausgeben (mit/ohne Lokalisierung)
// ohne Lokalisierung
temp.zeita = TEXT
temp.zeita.field = tstamp
temp.zeita.date = l

// mit Lokalisierung
temp.zeitb = TEXT
temp.zeitb.field = tstamp
temp.zeitb.strftime = Heute haben wir %A

Seite 289/290

Inhaltselement "Table" benutzerdefiniert formatieren
/* Tabelle mit rotem Rand versehen */
table.contenttable-0 {
	border: 1px Solid red;
}
 
/* Hintergrund der Tabellenzeilen alternierend dunkelrot und grau einfärben */
table.contenttable tr.tr-even {
	background: crimson;
}
table.contenttable tr.tr-odd {
	background: gray;
}
 
/* Erste Zeile und erste Spalte der Tabelle dunkelrot einfärben */
table.contenttable tr.tr-0,
table.contenttable tr td.td-0 {
	background: crimson;
}
 
/* Letzte Zeile und letzte Spalte der Tabelle dunkelrot einfärben */
table.contenttable tr.tr-last,
table.contenttable tr td.td-last {
	background: crimson;
}

Seite 296

Beispiel eines Kontaktformulars
Name:			| *name=input,40,40 	| [Name oder Firma]
E-Mail:			| *email=input,40
Adresse: 		| address=textarea,40,10
Kontaktaufnahme:	| *contact_by=radio 	| E-Mail=email, Rückruf=phon
Produkt: 		| *product=select,1 	| Bitte wählen=, A, B, C
Datei: 			| attachment=file
Datenspeicherung:	| save=check		| 1
			| formtype_mail=submit	| Abschicken
			| html_enabled=hidden	| 1
			| subject=hidden 	| Nachricht über Webseite 

Seite 316

Benutzerdef. Fkt.: Name des angemeldeten Benutzers ausgeben
<?php
function user_print_name() {
	$TSconfig = $GLOBALS["TSFE"]->fe_user->getUserTSconf();
	if (!empty($TSconfig["user."]["printName"])) {
		return $GLOBALS["TSFE"]->fe_user->user["name"];
	}
}
?>

Seite 317

Benutzerdefinierte Funktion (Seite 316) laden und ausführen
temp.userName = USER_INT
temp.userName {
	includeLibs = fileadmin/scripts/user_print_name.inc.php
	userFunc = user_print_name
}

Seite 338

Standardsprache auf Deutsch (Deutschland) festlegen
config {
	sys_language_uid = 0
	language = de
	locale_all = german
	htmlTag_langKey = de-DE
}

Seite 347

Konfiguration für Formatierung
//~ Definition der zur Auswahl stehenden Klassen
//~ Diese müssen auch in der Stylesheet-Datei existieren
RTE.classes {
	wichtig {
		//~ Name, der die Klasse im Auswahlfeld repräsentiert
		name = Wichtig
		
		//~ Anzeige der Klasse im Dropdown
		value = border: 1px Solid red;
	}
}
//~ Konfiguration des RTE
RTE.default {
	//~ Stylesheet-Datei, die die Klassendefinitionen enthält
	contentCSS = fileadmin/test.css
	
	//~ Klassen, die in der Datenbank gespeichert werden dürfen
	proc.allowedClasses = wichtig
	
	//~ Klassen, die bei Absätzen zur Verfügung stehen
	classesParagraph = wichtig
}
Inhalt von fileadmin/test.css
p.wichtig {
	border: 1px Solid red;
}

Seite 348

Konfiguration für Formatierung
//~ Definition der zur Auswahl stehenden Klassen
//~ Diese müssen auch in der Stylesheet-Datei existieren
RTE.classes {
	beispiel {
		//~ Name, der die Klasse im Auswahlfeld repräsentiert
		name = Beispiel
		
		//~ Anzeige der Klasse im Dropdown
		value = color: blue;
	}
}

//~ Konfiguration des RTE
RTE.default {
	//~ Stylesheet-Datei, die die Klassendefinitionen enthält
	contentCSS = fileadmin/test.css
	
	//~ Klassen, die in der Datenbank gespeichert werden dürfen
	proc.allowedClasses = beispiel
	
	//~ Klassen, die bei Absätzen zur Verfügung stehen
	classesCharacter = beispiel
}
Inhalt von fileadmin/test.css
span.beispiel {
	color: blue;
}

Seite 359/360

Benutzerdefinierte Elemente im RTE verwenden
RTE.default.userElements {
	10 = Verschiedenes
	10 {
		1 = TYPO3 Logo
		1.description = Das TYPO3 Logo wird eingefügt.
		1.content = <img src="###_URL###typo3/gfx/loginlogo_transp.gif">
		
		2 = Text hochstellen
		2.description = Markierter Text wird als Code ausgezeichnet.
		2.mode = wrap
		2.content = <code>|</code>
		
		3 = In Großbuchstaben umwandeln
		3.description = Markierter Text wird in GB umgewandelt.
		3.mode = processor
		3.submitToScript = fileadmin/toUpper.php
	}
}
Inhalt von fileadmin/toUpper.php
  1. <?php
  2. echo strtoupper($_POST['processContent']);
  3. ?>

Seite 367

Admin Panel konfigurieren
admPanel {
	enable.edit = 1
	module.edit.forceDisplayFieldIcons = 1
	module.edit.forceDisplayIcons = 1
	hide = 1
}

Seite 381

Schritt 4, Formular
Name:		|*name=input,40		|Geben Sie Ihren Namen ein!
E-Mail: 	|email=input,40
Nachricht:	|*message=textarea,30,5	|Geben Sie Ihre Nachricht ein!
		|formtype_mail=submit	|Abschicken
		|subject=hidden		|Nachricht von der Webseite XY 

Seite 383

Beispiel-CSS für das im Kapitel gezeigte Formular
fieldset.csc-mailform {
	border: 0;
}
 
fieldset.csc-mailform .csc-mailform-field label {
	display: block;
	font-weight: bold;
}
 
fieldset.csc-mailform #mailformname,
fieldset.csc-mailform #mailformmessage {
	color: red;
}

Seite 404

Inhalt von fileadmin/test.css
* {
	font-family: sans-serif;
}
* BODY {
	background-color: Silver;
}
* A {
	color: Red;
}
* A:hover {
	font-weight: bold;
}

Seite 405

CSS Editor Konfiguration
CSS_editor = Template Stile
CSS_editor.ch { /* Kindelemente */
	alle = Alle Elemente
	alle.selector = *
	alle.attribs = font-family,font-size,color
	alle.example = Dies ist Beispieltext
	alle.ch { /* Kindelemente */
		koerper = Seitenkörper
		koerper.selector = BODY
		koerper.attribs = background-color
		koerper.example = Hintergrundfarbe-Test
		
		links = Links
		links.selector = A
		links.attribs = LINKS
		links.example = Hallo <a href= "# ">Welt</a>
		links.exampleStop = 1
		links.ch { /* Kindelemente */
			ueber = Über dem Link
			ueber.selector = +:hover
			ueber.attribs = LINKS,font-weight
		}
	}
}

Seite 409

Marker-Beispiel
<html>
	<body>
		<h1>###SEITENTITEL###</h1>
		<!-- ###INHALT### begin -->
		Dieser Bereich wird komplett ersetzt.
		Anders als der Seitentitel, dürfen diese
		Marker daher in Kommentaren stehen.
		<!-- ###INHALT### end -->
	</body>
</html>

Seite 410

Inhalt von fileadmin/template.html (I)
<html>
	<head>
		<title>Template XYZ</title>
	</head>
	<body>
		<!-- ###MY_BODY### begin -->
		<h1>###MY_HEADLINE###</h1>
		<div class="content">
			<!-- ###MY_CONTENT### begin -->
			Inhalt Inhalt Inhalt
			Inhalt Inhalt Inhalt
			<!-- ###MY_CONTENT### end -->
		</div>
		<!-- ###MY_BODY### end -->
	</body>
</html>

Seite 411

Verarbeitung des Templates fileadmin/template.html (I)
temp.myTemplate = TEMPLATE
temp.myTemplate {
	template = FILE
	template.file = fileadmin/template.html
	workOnSubpart = MY_BODY
	
	marks {
		MY_HEADLINE = TEXT
		MY_HEADLINE.field = title
	}
	
	subparts {
		MY_CONTENT < styles.content.get
	}
}
page.10 < temp.myTemplate

Seite 414

Inhalt von fileadmin/template.html (II)
<html>
	<head>
		<title>Template</title>
		<meta name="author" content="Joscha Feth">
	</head>
	
	<body>
		<div class="headline">Titel</div>
		<div class="menu">Menü</div>
		<div class="content">Inhalt</div>
	</body>
</html>

Seite 414/415

Verarbeitung des Templates fileadmin/template.html (II)
plugin.tx_automaketemplate_pi1 {
	content = FILE
	content.file = fileadmin/template.html
	relPathPrefix = fileadmin/
	
	elements {
		BODY.all = 1
		BODY.all.subpartMarker = DOCUMENT_BODY

		HEAD.all = 1
		HEAD.all.subpartMarker = DOCUMENT_HEADER
		HEAD.rmTagSections = title

		DIV.all = 1
	}
}

Seite 417

Erweitertes Template-Parsing
# temporäres Template-Objekt für den body-Bereich erstellen
temp.myTemplate = TEMPLATE
temp.myTemplate {
	# Das Template-Objekt mit Template Code füllen
	template =< plugin.tx_automaketemplate_pi1
	
	# nur auf dem Bereich DOCUMENT_BODY arbeiten
	workOnSubpart = DOCUMENT_BODY
	
	subparts {
		# Den headline-Bereich durch ein TEXT-Objekt ersetzen
		headline = TEXT
		
		# Das TEXT-Objekt soll den Seitentitel beinhalten
		headline.field = title
		
		# Den menu-Bereich durch ein HMENU-Objekt ersetzen
		menu = HMENU
		menu.1 = TMENU
		menu.1.NO = 1
		
		# Inhaltselemente in den content-Bereich einfügen
		content < styles.content.get
	}
}

# temporäres Template-Objekt für den head-Bereich erstellen
temp.headTemplate = TEMPLATE
temp.headTemplate {
	# Das Template-Objekt mit Template Code füllen
	template =< plugin.tx_automaketemplate_pi1
	
	# nur auf dem Bereich DOCUMENT_HEADER arbeiten
	workOnSubpart = DOCUMENT_HEADER
}

# PAGE-Objekt erstellen
page = PAGE

# Temporäres Template-Objekt des body-Bereichs in <body>einfügen
page.10 < temp.myTemplate

# Temporäres Template-Objekt des head-Bereichs in <head> einfügen
page.headerData.10 < temp.headTemplate

Seite 422

Inhalt von fileadmin/templates/template.html
<html>
	<head>
		<title>TemplaVoila Template</title>
		<meta name="author" content="Joscha Feth">
	</head>
	
	<body>
		<div id="menu" class="menu">
			<div class="act"><a href="#">A</a></div>
			<div class="no"><a href="#">B</a></div>
			<div class="no"><a href="#">C</a></div>
		</div>
		<div id="content" class="content">Inhalt</div>
	</body>
</html>

Seite 436

Inhalt von fileadmin/templates/tld.domain/main.html
<html>
	<head>
		<title>Example</title>
		<link rel="stylesheet" type="text/css" href="styles/web.css">
		<script src="scripts/test.js" type="text/javascript"></script>
	</head>
	
	<body onload="test();">
		<div id="n" class="navigation">
			Navigation
		</div>
		<div class="cbody">
			<div id="h" class="header">Header</div>
			<div id="c" class="content">Inhalt</div>
			<div class="footer">
				Last change:
				<span id="d" class="yyyy_mm_dd">YYYY-MM-DD</span><a id="p" href="#">Print this page</a>
			</div>
		</div>
	</body>
</html>

Seite 437

Inhalt von fileadmin/templates/tld.domain/styles/web.css
div {
	border: 1px Dashed grey;
	margin: 5px;
}
 
div.navigation,
div.cbody {
	float: left;
}
Inhalt von fileadmin/templates/tld.domain/scripts/test.js
function test() {
	alert("Hallo Welt!");
}

Seite 458

TemplaVoilà-Objekt auf der Seite einbinden
page = PAGE
page.10 = USER
page.10.userFunc = tx_templavoila_pi1->main_page

Seite 459

Menü-Code für Feld field_navigation
temp.myNavigation = HMENU
temp.myNavigation.1 = TMENU
temp.myNavigation.1 {
	NO = 1
	NO.after = <br />
}

Seite 463

Local Processing für Feld field_header
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<T3DataStructure>
	<ROOT type="array">
		<el type="array">
			<field_header type="array">
				<tx_templavoila type="array">
					<TypoScript>
						10 = IMAGE
						10.file = GIFBUILDER
						10.file {
							XY = 200,20
							10 = TEXT
							10.text.current = 1
							10.text.ifEmpty = TEXT
							10.text.ifEmpty.data = page:subtitle // page:title
							10.text.case = upper
							10.niceText = 1
							10.offset = 0,14
							10.fontSize = 14
						}
					</TypoScript>
				</tx_templavoila>
			</field_header>
		</el>
	</ROOT>
</T3DataStructure>

Seite 470

Datum der letzten Änderung der Seite
temp.lastChange = TEXT
temp.lastChange {
	data = register : SYS_LASTCHANGED
	date = Y-m-d
}

Seite 472

Link zur Druckversion generieren
temp.printLink = TEXT
temp.printLink.typolink {
	parameter.data = page:uid
	returnLast = url
	additionalParams = &print=1
	additionalParams.htmlSpecialChars = 1
}

[globalVar = GP:print > 0]
	temp.printLink.typolink.additionalParams >
[global]

Seite 474

Inhalt von fileadmin/templates/tld.domain/print.html
<html>
	<head>
		<title>Example (Print)</title>
	</head>
	<body onload="print();">
		<div class="header">Header</div>
		<hr/>
		<div class="content">Inhalt</div>
		<hr/>
		<div class="footer">
			Last change: <span class="yyyy_mm_dd">YYYY-MM-DD</span>
			-
			<a href="#">Back to web version</a>
		</div>
	</body>
</html>

Seite 475

Local Processing für Feld field_header (Print-Version)
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<T3DataStructure>
	<ROOT type="array">
		<el type="array">
			<field_header type="array">
				<tx_templavoila type="array">
					<TypoScript>
						<![CDATA[
							10 = TEXT
							10 {
							current = 1
							ifEmpty = TEXT
							ifEmpty.data = page:subtitle // page:title
							case = upper
							wrap = <h1>|</h1>
							}
						]]>
					</TypoScript>
				</tx_templavoila>
			</field_header>
		</el>
	</ROOT>
</T3DataStructure>

Seite 478

Inhalt von fileadmin/templates/tld.domain/flexgrid.html
<html>
	<head>
		<title>Example (FlexGrid)</title>
	</head>
	
	<body>
		<table class="flexsquare">
			<tr class="upper">
				<td class="left">Oben links</td>
				<td class="right">
					<img width="200" height="200" src="">
				</td>
			</tr>
			
			<tr class="lower">
				<td class="left">
					<img width="200" height="200" src="">
				</td>
				<td class="right">Unten rechts</td>
			</tr>
		</table>
	</body>
</html>

Seite 483

Inhalt von fileadmin/templates/tld.domain/flexlist.html
<div class="flexlist">
	<h1 class="flexlist_header">Personenliste</h1>
	<ul class="flexlist_people">
		<li class="flexlist_person">
			<a class="flexlist_person_link" href="#">Ich</a>
		</li>
	</ul>
</div>

Seite 499

Standardsprache auf Deutsch (Deutschland) festlegen
config {
	# Sprache festlegen, wichtig für die korrekte Anzeige von Labels
	language = de
	
	# Locale festlegen – wichtig für Formatierung von Datum/Uhrzeit
	locale_all = german
	
	# Wichtig für korrekte lang-Attribute
	htmlTag_langKey = de-DE
}

Seite 507

GIFBUILDER-Beispiel
# GIFBUILDER-Objekt erstellen
gfx = GIFBUILDER
gfx {
	# Größe der Bilddatei festlegen
	XY = [10.w]+4,[10.h]+2
	
	# Offset festlegen
	offset = 0,[10.h]-4
	
	# Neues TEXT-Objekt erstellen
	10 = TEXT
	10 {
		# Untertitel oder falls nicht vorhanden Seitentitel anzeigen
		text.field = subtitle // title
		
		# Schriftartendatei festlegen
		fontFile = fileadmin/Bluehigh.ttf
		
		# Schriftgröße festlegen
		fontSize = 24
		
		# Schriftfarbe festlegen
		fontColor = gray
		
		# Antialiasing aktivieren, benötigt ImageMagick/GraphicsMagick
		niceText = 1
	}
}

# PAGE-Objekt erstellen
page = PAGE

# IMAGE-Objekt mit GIFBUILDER als Quelle erstellen
page.10 = IMAGE

# IMAGE-Objekt auf Seite einblenden
page.10.file < gfx

Seite 509

niceText-Beispiel
temp.niceTest = IMAGE
temp.niceTest {
	file = GIFBUILDER
	file {
		XY = [10.w]+10,[10.h]+10
		10 = TEXT
		10 {
			fontSize = 72
			fontFile = fileadmin/Bluehigh.ttf
			offset = 0,50
			text.data = page:title
			niceText = 1 # Hier an-/ausschalten für Vergleich
		}
	}
}

Seite 513

directory-Spezialmenü
temp.menu = HMENU
temp.menu.special = directory
# IDs der Seiten, deren Kindelemente angezeigt werden sollen
temp.menu.special.value = 11,22
temp.menu.1 = TMENU
temp.menu.1 {
	NO = 1
	NO.after = <br />
}
list-Spezialmenü
temp.menu = HMENU
temp.menu.special = list
# IDs der Seiten, die im Menü angezeigt werden sollen
temp.menu.special.value = 11,22,33
temp.menu.1 = TMENU
temp.menu.1 {
	NO = 1
	NO.after = <br />
}

Seite 514

updated-Spezialmenü
temp.menu = HMENU
temp.menu.special = updated
temp.menu.1 = TMENU
temp.menu.1 {
	NO = 1
	NO.after = <br />
}
rootline-Spezialmenü
temp.menu = HMENU
temp.menu.special = rootline
temp.menu.1 = TMENU
temp.menu.1 {
	NO = 1
	NO.after = <br />
}

Seite 515

browse-Spezialmenü
temp.menu = HMENU
temp.menu.special = browse
# Elemente, die im Menü zur Verfügung stehen sollen
temp.menu.special.items = prev|next

# Links nach Ihrer Funktion benennen
temp.menu.special {
	prev.fields.title = vorherige Seite
	next.fields.title = nächste Seite
}
keywords-Spezialmenü
temp.menu = HMENU
temp.menu.special = keywords
temp.menu.1 = TMENU
temp.menu.1 {
	NO = 1
	NO.after = <br />
}
language-Spezialmenü
temp.menu = HMENU
temp.menu.special = language
# IDs der Sprachen, deren lokalisierte Seiten verlinkt werden sollen
temp.menu.special.value = 0,1,2
temp.menu.1 = TMENU
temp.menu.1 {
	NO = 1
	NO.after = <br />
}

Seite 516

userdefined-Spezialmenü
temp.menu = HMENU
temp.menu.special = userdefined
temp.menu.special.file = fileadmin/my_menu.inc.php
temp.menu.1 = TMENU
temp.menu.1 {
	NO = 1
	NO.after = <br />
}
Inhalt von fileadmin/my_menu.inc.php
<?php
$menuItemsArray[] = array('title' => 'Alles', 'uid' => 1);
$menuItemsArray[] = array('title' => 'Lüge', 'uid' => 3);
?>
Inhalt von fileadmin/my_menu.inc.php (mit Unterpunkten)
<?php
$menuItemsArray[] = array(
	'title' => 'Alles',
	'uid' => 1);
	$menuItemsArray[] = array(
		'title' => 'nur',
		'uid' => 2,
		'_SUB_MENU' => array(
			array(
				'title' => 'Lüge',
				'uid' => 3)));
?>

Seite 517

userfunction-Spezialmenü
# Datei mit Klasse/Funktion laden
includeLibs.user_myMenu = fileadmin/user_myMenu.inc.php

temp.menu = HMENU
temp.menu.special = userfunction
temp.menu.special.userFunc = user_myMenu
temp.menu.1 = TMENU
temp.menu.1 {
	NO = 1
	NO.after = <br />
}
Inhalt von fileadmin/user_myMenu.inc.php
<?php
function user_myMenu($content,$conf) {
	return array(
		array(
			'title' => 'Alles',
			'uid' => 1),
		array(
			'title' => 'Lüge',
			'uid' => 2));
}
?>

Seite 520

<ul>-Menü
# HMENU-Objekt erstellen
temp.menu = HMENU
temp.menu {
	# TMENU-Objekt erstellen
	1 = TMENU
	1 {
		# Jedes TMENU mit <ul> umschließen
		wrap = <ul>|</ul>
		
		# Normalen Zustand definieren
		NO = 1
		NO {
			# jedes Element und Sub-Elemente mit <li> umschließen
			wrapItemAndSub = <li>|</li>
			# Das title-Attribut der Links einstellen
			ATagTitle.field = subtitle // title
		}
		
		# Aktiven Zustand definieren
		ACT = 1
		# Aktiven von normalem Zustand kopieren
		ACT < .NO
		# Aktive Elemente kennzeichnen
		ACT.ATagParams = style="color: red;"
	}
	# Konfiguration von erster Ebene für zweite Ebene kopieren
	2 < .1
	# Konfiguration von erster Ebene für dritte Ebene kopieren
	3 < .1
	# Hier für beliebig viele weitere Ebenen kopieren (z.B. 4 < .1)
}

Seite 521/522

expAll-Beispiel
temp.myNavigation = HMENU
temp.myNavigation {
	1 = TMENU
	1 {
		NO = 1
		NO.before = |->
		NO.after = <br />
		expAll = 1
	}
	2 < .1
	2.NO.before = | &nbsp; &nbsp;|->
}

Seite 522/523

GMENU-Beispiel
# HMENU-Objekt erzeugen
temp.menu = HMENU
# GMENU-Menüobjekt hinzufügen
temp.menu.1 = GMENU
temp.menu.1 {
	# Normalen Zustand definieren
	NO = 1
	NO {
		# Größe des GIF-Bildes einstellen
		XY = [10.w]+2,[10.h]+4
		
		# Versatz für Inhalt festlegen
		offset = 0,10
		
		# TEXT-Objekt innerhalb des GIFBUILDER-Objekts definieren
		10 = TEXT
		10 {
			# Textinhalt festlegen
			text.field = subtitle // title
			# Inhalte zentrieren
			align = center
		}
	}
	
	# Rollover Zustand definieren
	RO = 1
	# Einstellungen vom Normalzustand kopieren
	RO < .NO
	RO {
		# Hintergrund bei Mouseover rot einfärben
		backColor = red
	}
}

Seite 531

Benutzernamen in der Listenansicht fett auszeichnen
plugin.tx_newloginbox_pi3.listView.customProcessing {
	username = TEXT
	username.field = username
	username.wrap = <strong>|</strong>
}

Seite 535-539

Inhalt von fileadmin/form.html
<!-- ###TEMPLATE_FORM### begin -->
<form method="post" action="index.php" enctype="multipart/form-data">
	<input type="hidden" name="id" value="###PID###">
	<input type="hidden" name="submitted" value="1">
	###ERROR###
	<ul class="form">
		###error_name###
		<li>
			Name:<br />
			<input type="text" name="name" value="###value_name###">
		</li>
		###error_email###
		<li>
			E-Mail:<br />
			<input type="text" name="email" value="###value_email###">
		</li>
		<li>
			Kontakt:<br />
			<input type="radio" name="via" value="E-Mail" ###checked_via_E-Mail###>
			via E-Mail
			<input type="radio" name="via" value="Phon" ###checked_via_Phon###>
			via Telefon
		</li>
		
		<li>
			<input type="submit">
		</li>
	</ul>
</form>
<!-- ###TEMPLATE_FORM### end -->
 
<!-- ###TEMPLATE_ERROR### begin -->
	<!-- ###ERROR_START### begin -->
	Es gab folgende Fehler:
	<ul class="formerror">
		<!-- ###ERROR_START### end -->
			<!-- ###ERROR_email### begin -->
				<li class="error">Bitte geben Sie Ihre E-Mail-Adresse ein!</li>
			<!-- ###ERROR_email### end -->
			
			<!-- ###ERROR_name### begin -->
				<li class="error">Bitte geben Sie Ihren Namen ein!</li>
			<!-- ###ERROR_name### end -->
		<!-- ###ERROR_END### begin -->
	</ul>
	<!-- ###ERROR_END### end -->
<!-- ###TEMPLATE_ERROR### end -->
 
<!-- ###TEMPLATE_SUBMITTED_OK### begin -->
	Danke f&uuml;r deine Nachricht ###value_name###!
<!-- ###TEMPLATE_SUBMITTED_OK### end -->
 
<!-- ###TEMPLATE_EMAIL_USER### begin -->
Hallo ###name###,
Wir haben deine Nachricht bekommen!
Deine E-Mail-Adresse: ###email###. Wir kontaktieren dich per ###via###.
<!-- ###TEMPLATE_EMAIL_USER### end -->
 
<!-- ###TEMPLATE_EMAIL_RECEIVER### begin -->
###name### (###email###) kontaktieren via ###via###!
<!-- ###TEMPLATE_EMAIL_RECEIVER### end -->

Seite 541

Fakultative Eingabefelder dynamisch ermitteln
temp.req = name
[globalVar = GP:via=E-Mail]
	temp.req := addToList(email)
[end]
[globalVar = GP:via=Phon]
	temp.req := addToList(number)
[end]
plugin.tx_thmailformplus_pi1.default.email_requiredfields < temp.req

Seite 544

Stilinformationen für das Kontaktformular
ul.form {
	margin: 0;
	padding: 0;
	list-style: none;
}
 
ul.formerror li,
ul.form li.error {
	color: red;
}
 
ul.form li.error {
	font-size: 10px;
}

Seite 556

Wieder verwendbarer Menü-Code
temp.navi = HMENU
temp.navi {
	1 = TMENU
	1 {
		wrap = <ul>|</ul>
		
		NO = 1
		NO {
			wrapItemAndSub = <li class="no">|</li>
			ATagTitle.field = subtitle // title
			stdWrap.htmlSpecialChars = 1
		}
		
		ACT = 1
		ACT < .NO
		ACT.wrapItemAndSub = <li class="act">|</li>
		
		IFSUB = 1
		IFSUB < .NO
		IFSUB.doNotLinkIt = 1
		
		ACTIFSUB = 1
		ACTIFSUB < .ACT
		ACTIFSUB.doNotLinkIt = 1
	}
	2 < .1
}

Seite 560

Seiten-Navigation
lib.top_navi < temp.navi
lib.top_navi.entryLevel = 0
lib.top_navi.2 >

Seite 561

Produktsortiments-Navigation
lib.left_navi < temp.navi
lib.left_navi {
	special = directory
	special.value = 5 # ID der “Sortiment” Seite
	1.expAll = 1
	1.NO.doNotLinkIt = 1
}

Seite 562

Info-Navigation
lib.info_navi < temp.navi
lib.info_navi {
	special = directory
	special.value = 38 # ID der “Info” Seite
	2 >
}

Seite 568/569

GIF-Bild mit Überschrift
temp.headline = IMAGE
temp.headline {
	altText.data = page:subtitle // page:title
	file = GIFBUILDER
	file {
		XY = [10.w]+2,[10.h]+2
		transparentBackground = 1
		10 = TEXT
		10 {
			text.data = page:subtitle // page:title
			fontFile = {$font}
			fontSize = 20
			offset = 0,16
			niceText = 1
		}
	}
}

Seite 571

RTE für Einfügen des Ø-Zeichens konfigurieren
RTE.default.userElements {
	10 = Zeichen
	10 {
		1 = Durchschnitt-Zeichen
		1.description = Das Durchschnitt-Zeichen wird eingefuegt.
		1.content = Ø
		# … Hier weitere Zeichen einfügen
	}
}
RTE.default.showButtons = user

Seite 572

Sitemap zusammenfügen
lib.myObject = COBJ_ARRAY
lib.myObject {
	wrap = <ul>|</ul>
	1 < lib.top_navi
	1.1.wrap = |
	
	2 < lib.left_navi
	2 {
		excludeUidList = 7 # ID der „Suche“-Seite im Sortiment
		1.wrap = |
	}
	
	3 < lib.info_navi
	3.1.wrap = |
}

Seite 576

Standard-Menü definieren
temp.ul_menu = TMENU
temp.ul_menu {
	# Jedes TMENU mit <ul> umschließen
	wrap = <ul>|</ul>
	
	# Normalen Zustand definieren
	NO = 1
	NO {
		# jedes Element und Sub-Elemente mit <li> umschließen
		wrapItemAndSub = <li class="no">|</li>
		
		# Das title-Attribut der Links einstellen
		ATagTitle.field = subtitle // title
		
		stdWrap.htmlSpecialChars = 1
	}
	
	# Aktiven von normalem Zustand kopieren
	ACT < .NO
	# Aktive Elemente kennzeichnen
	ACT.wrapItemAndSub = <li class="act">|</li>
}

Seite 577

Menü im Kopfbereich
temp.head_menu = HMENU
temp.head_menu.special = list
# ids: Startseite, Kundenlogin/Kundenbereich, FAQ, AGBs, Anfrage
temp.head_menu.special.value = 2,3,17,22,16,20
temp.head_menu.1 < temp.ul_menu

Seite 580-583

Hauptnavigation
temp.menu_1 = HMENU
temp.menu_1.entryLevel = 1
temp.menu_1.1 = GMENU
temp.menu_1.1 {
	NO = 1
	NO {
		ATagTitle.field = subtitle // title
		XY = 170,20
		wrap = <div class="item">|</div>
		backColor = #F7F7F7
		5 = IMAGE
		5 {
			file = {$pfeil_r}
			offset = 7,0
			align = 0,c
		}
		10 = TEXT
		10 {
			text.field = title
			offset = 18,14
			fontFile = {$font}
			niceText = 1
		}
		20 = BOX
		20 {
			dimensions = 0,0,170,1
			color = white
		}
	}

	CUR < .NO
	CUR.backColor = #D0DCE4

	RO < .CUR
	RO.5.file = {$pfeil_u}

	ACTIFSUB < .RO
	ACTIFSUB {
		7 < .20
		7.dimensions = 0,19,170,1
	}

	USR < .CUR
	USR {
		20.color = #E4180D
		7 < .20
		7.dimensions = 0,19,170,1
		10.fontColor = #E4180D
		5 < .20
		5.dimensions = 7,7,5,5
	}
}

temp.menu_1.2 < temp.ul_menu
temp.menu_1.2 {
	SPC < .NO
	SPC.doNotShowLink = 1
	SPC.wrapItemAndSub = <li class="spc">|</li>
}
temp.menu_1.3 < temp.menu_1.2

Seite 584

Produktnavigation
temp.model_menu = HMENU
temp.model_menu {
	entryLevel = -2
	1 < temp.ul_menu
	1.ACT.doNotLinkIt = 1
}

Seite 585

Brotkrümelnavigation (Breadcrumbs navigation)
temp.yah = HMENU
temp.yah {
	special = rootline
	special.range = 1|
	1 = TMENU
	1 {
		NO = 1
		NO.allWrap = || &nbsp;&raquo;&nbsp; |*|
		NO.stdWrap.htmlSpecialChars = 1
		
		CUR < .NO
		CUR.doNotLinkIt = 1
	}
}

Seite 587

TypoScript-Setup
config {
	htmlTag_langKey = de-DE
	xhtml_cleaning = all
	spamProtectEmailAddresses = 3
	language = de
	locale_all = german
	
	simulateStaticDocuments = 1
	simulateStaticDocuments_pEnc = md5
	simulateStaticDocuments_pEnc_onlyP = tx_mininews_pi1[showUid],cHash
	simulateStaticDocuments_noTypeIfNoTitle = 1
}

Seite 589

Link zum Impressum
temp.impressum_link = TEXT
temp.impressum_link.typolink.parameter = sp_impressum
Link zu den Kundenmeinungen
temp.client_link = TEXT
temp.client_link.typolink {
	parameter = sp_kunden
	returnLast = url
}

Seite 590

Link zur Druckversion
temp.printLink = TEXT
temp.printLink.typolink {
	parameter.data = page:uid
	returnLast = url
	additionalParams = &print=1
	additionalParams.htmlSpecialChars = 1
}

Seite 592-594

Button-Template
temp.button = HMENU
temp.button.special = list
temp.button.1 = GMENU
temp.button.1 {
	NO = 1
	NO {
		ATagTitle.field = subtitle // title
		XY = [40.w]+16,18
		
		10 = IMAGE
		10.file = {$buttonPath}middle_no.gif
		10.offset = 8,0
		10.tile = 20
		
		20 = IMAGE
		20.file = {$buttonPath}left_no.gif
		
		30 = IMAGE
		30.file = {$buttonPath}right_no.gif
		30.align = r
		
		40 = TEXT
		40 {
			offset = 8,13
			fontColor = black
			text.field = subtitle // title
			fontFile = {$font}
		}
	}
	
	RO < .NO
	RO {
		10.file = {$buttonPath}middle_ro.gif
		20.file = {$buttonPath}left_ro.gif
		30.file = {$buttonPath}right_ro.gif
		40.fontColor = #AEAEAE
	}
}

Seite 595

Benutzerdefinierten Seitentitel erzeugen und verwenden
temp.myTitle = HMENU
temp.myTitle {
	special = rootline
	special.range = 2|
	wrap = <title>Schattenprofi.de - Qualität zu günstigen Preisen|</title>
	1 = TMENU
	1 {
		NO = 1
		NO.allWrap = &nbsp;::&nbsp; |
		NO.stdWrap.htmlSpecialChars = 1
		NO.doNotLinkIt = 1
	}
}

page.headerData.5 < temp.myTitle
config.noPageTitle = 1

Seite 597/598

Bild für Seitenüberschrift erzeugen
temp.site_title = IMAGE
temp.site_title {
	altText.data = page:subtitle // page:title
	file = GIFBUILDER
	file {
		XY = [10.w]+2,[10.h]+2
		transparentBackground = 1
		10 = TEXT
		10 {
			text.data = page:subtitle // page:title
			text.case = upper
			fontFile = {$font}
			offset = 0,10
			niceText = 1
		}
	}
}

Seite 604

HTML-Template für das Schattenprofi::3cols Template-Objekt
<table class="t-3cols">
	<tr class="t-3cols-cols">
		<td class="t-3cols-left">Linke Spalte</td>
		<td class="t-3cols-middle">Mittlere Spalte</td>
		<td class="t-3cols-right">Rechte Spalte</td>
	</tr>
	<tr class="t-3cols-buttons">
		<td class="t-3cols-left-button"><img src=""></td>
		<td class="t-3cols-middle-button"><img src=""></td>
		<td class="t-3cols-right-button"><img src=""></td>
	</tr>
</table>

Seite 605

HTML-Template für das Schattenprofi::3cols::Print TO
<div class="t-3cols">
	<div class="t-3cols-left">Linke Spalte</div>
	<hr />
	<div class="t-3cols-middle">Mittlere Spalte</div>
	<hr />
	<div class="t-3cols-right">Rechte Spalte</div>
</div>

Seite 611

HTML-Template für das Schattenprofi::Product::Print TO
<div class="product">
	<h1>
		&raquo;<span class="name">Name</span>
	</h1>
	<h2>Markisentyp</h2>
	<hr />
	<img src="" width="270" height="135" alt="Vorschau">
	<img src="" width="240" height="34" alt="Slogan"/>
	<img src="images/neu.gif" width="58" height="57" alt="Neu!"/>
	<hr />
</div>

Seite 612

Druckversion anpassen
[globalVar = GP:print > 0]
	lib.site_title = TEXT
	lib.site_title.data = page:subtitle // page:title
	lib.site_title.wrap = <h1>|</h1>
	temp.yah.1.NO.doNotLinkIt = 1
	tt_content.multimedia.20 >
	temp.printLink.typolink.additionalParams >
[else]
	lib.site_title < temp.site_title
[global]

Seite 624/625

Vorbereitung für mehrsprachige Seiten
config {
	# Sprachvariable festlegen
	linkVars = L
	# Kein Rückfall auf Standardsprache, falls Lokalisierung fehlt
	sys_language_mode = strict
	# Systemsprache UID 0 -> Englisch
	sys_language_uid = 0
	language = en
	locale_all = english # Systemabhängig
	htmlTag_langKey = en
}

Seite 626/627

Sprachweiche
[globalVar = GP:L = 1]
	# Sprache mit UID 1 -> Deutsch
	config.sys_language_uid = 1
	config.language = de
	config.locale_all = german
	config.htmlTag_langKey = de-DE
	config.sys_language_mode = content_fallback ; 0,3
[globalVar = GP:L = 2]
	# Sprache mit UID 2 -> Chinesisch
	config.sys_language_uid = 2
	config.language = zh
	config.locale_all = chinese-simplified
	config.htmlTag_langKey = zh-Hans
[globalVar = GP:L = 3]
	# Sprache mit UID 3 -> Französisch
	config.sys_language_uid = 3
	config.language = fr
	config.locale_all = french
	config.htmlTag_langKey = fr
	# […] hier können noch beliebig viele Bedingungen folgen
[global]
# Ende der Bedingungen

Seite 632/633

Spezialisiertes HMENU (language)
# Hierarchisches Menü erzeugen
lib.langMenu = HMENU
lib.langMenu {
	# Spezialfunktion anwenden -> Sprachen
	special = language
	# Auszuwählende Sprachen (IDs) angeben
	special.value = 0,1,3
	# TMENU-Objekt erzeugen
	1 = TMENU
	1 {
		# Das ganze Menü mit <ul> umschließen
		wrap = <ul>|</ul>
		
		# Normalen Menüzustand aktivieren
		NO = 1
		NO {
			# Elemente mit <li> umschließen und normal kennzeichnen
			linkWrap = <li class="no">|</li>
			
			# Titel durch lokal. Namen der Sprachen überschreiben
			stdWrap.override = English || Deutsch || Français
		}
		
		# Aktiven Menüzustand aktivieren
		ACT = 1
		# Einstellungen von normalem Menüzustand kopieren
		ACT < .NO
		# Elemente mit <li> umschließen, aber aktiv kennzeichnen
		ACT.linkWrap = <li class="act">|</li>
		
		# Benutzerdefinierten Menüzustand 1 aktivieren
		USERDEF1 = 1
		# Einstellungen von normalem Menüzustand kopieren
		USERDEF1 < .NO
		# Menüelemente sollen nicht verlinkt werden
		USERDEF1.doNotLinkIt = 1
	}
}
# PAGE-Objekt erstellen
page = PAGE

# Menü in PAGE-Objekt einfügen
page.10 < lib.langMenu

Seite 636

Sprachauswahl bei Two-Tree-Methode
temp.lng_menu = HMENU
temp.lng_menu {
	wrap = <ul>|</ul>
	1 = TMENU
	1.NO = 1
	1.NO.allWrap = <li>|</li>
}

# PAGE-Objekt erstellen
page = PAGE

# Sprachmenü in die Seite einfügen
page.10 < temp.lng_menu