Übersicht
TypoScript to go
Die aktuelle - zweite - Auflage beinhaltet zwei neue Kapitel, die sich vor allem an Administratoren richten. An vielen Stellen in diesen Kapiteln befinden sich TypoScript Codes, mit denen TYPO3 entsprechend konfiguriert und an die eigenen Bedürfnisse angepasst werden kann. Alle diese TypoSripte können hier kopiert und in der eigenen TYPO3-Installation verwendet werden.
Die genaue Anweisung für den Einsatz sind im jeweiligen Kapitel des Buches beschrieben und sollten am sinnvollsten nur von Administratoren eingesetzt werden.
Beispiel 15-1: Die Beschriftung von Eingabefeldern anpassen
TCEFORM.pages.title {
label = LLL:EXT:meine_extension/locallang_db.xml:pages.title
}
# Ohne locallang-Datei
TCEFORM.pages.title {
label.default = Websitetitle
label.de = Webseitentitel
}
Beispiel 15-2: Beschriftungen von Auswahloptionen anpassen
TCEFORM.pages.doktype.altLabels {
1 = LLL:EXT:meine_extension/locallang_db.xml:doktype.I.1
254 = LLL:EXT:meine_extension/locallang_db.xml:doktype.I.254
}
# Ohne locallang-Datei
TCEFORM.pages.doktype.altLabels {
1 = Normale Seite
254 = SystemOrdner (fuer Datensaetze)
}
Beispiel 15-3: Das Feld Alternativer Navigationstitel in den Seiteneigenschaften ausblenden
nav_title.disabled = 1
}
Beispiel 15-4: Auswahloptionen ausblenden und erweitern
removeItems = 199, 255
addItems.123 = LLL:EXT:meine_extension/locallang_db.xml:doktype.I.123
}
Beispiel 15-5: Standardinhalte setzen
TCAdefaults.pages {
author = Max Mustermann
layout = 2
hidden = 1
}
# Seiten/PageTSconfig ueberschreibt die Benutzer/USER-TSconfig unter
# Beruecksichtigung der Zugriffsberechtigungen.
TCAdefaults.pages {
layout = 1
hidden = 0
}
Beispiel 15-6: Feldtyp anpassen
Beispiel 15-7: Nur die Spalten Normal und Rechts anzeigen
mod.SHARED.colPos_list = 0,2
Beispiel 15-8: Inhaltsspalten auch in den Auswahllisten ausblenden
TCEFORM.tt_content.colPos.removeItems = 1,2
Beispiel 15-9: Weitere Inhaltsspalten für das Backend erzeugen
$TCA['tt_content']['columns']['colPos']['config']['items'][4] = Array(
0 => 'My Columns||Meine Spalte||||||||',
1 => 4
);
# Spalte ueber TypoScript ansprechen.
# Dazu definieren wir ein neues styles.content-Objekt, nehmen als
# Vorlage styles.content.get und passen es fuer unsere neue Spalte an.
styles.content.getMyColumn < styles.content.get
styles.content.getMyColumn.select.where = colPos=4
# Inhalt der neuen Spalte auf der Webseite ausgeben.
pages.10 < styles.content.getMyColumn
Beispiel 15-10: Spalten Normal und Rand umbenennen
# Code muss einzeilig sein, hier jedoch aus Platzgruenden durch \\ umbrochen.
$TCA['tt_content']['columns']['colPos']['config']['items'][1]\\
[0] = 'Middle||Mitte||||||||';
$TCA['tt_content']['columns']['colPos']['config']['items'][3]\\
[0] = 'Footer||Fusszeile||||||||';
Beispiel 15-11: Datensätze einschränken
# Seiten (pages) und Inhaltselemente (tt_content).
mod.web_list.allowedNewTables = pages, tt_content
Beispiel 15-12: Nur Datensätze von tt_news erlauben
mod.web_list.allowedNewTables = tt_news, tt_news_cat
Beispiel 15-13: Datensätze einschränken
# Nachrichten (tt_news) und Rubriken (tt_news_cat)
mod.web_list.deniedNewTables = tt_news, tt_news_cat
Beispiel 15-14: Nur Datensätze von tt_news erlauben
options.saveDocNew = 0
# Datensaetze freischalten, fuer die die Funktion verfuegbar sein soll
options.saveDocNew.tt_news = 1
options.saveDocNew.tt_news_cat = 1
Beispiel 15-15: Für alle Datensätze bis auf tt_news erlauben
options.saveDocNew = 1
# Datensaetze deaktivieren, fuer die die Funktion nicht verfuegbar sein soll
options.saveDocNew.tt_news = 0
options.saveDocNew.tt_news_cat = 0
Beispiel 15-16: Übersicht über die freigeschalteten Buttons der Grundeinstellung Typical
class, blockstylelabel, blockstyle, textstylelabel, textstyle, formatblock, bold, italic, subscript, superscript, orderedlist, unorderedlist, outdent, indent, textindicator, insertcharacter, link, table, findreplace, chMode, removeformat, undo, redo, about, toggleborders, tableproperties, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, columninsertbefore, columninsertafter, columndelete, columnsplit, cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge
)
Beispiel 15-17: hideButtons als Gegenstück zu showButtons
blockstylelabel, textstylelabel, subscript, superscript, outdent, indent, textindicator
)
Beispiel 15-18: Drei CSS-Definitionen für die Verwendung im RTE
font-family: monospace;
padding: 0.2em;
border: 1px #CCD dotted;
}
p.box {
padding-left: 0.5em;
border-left: 8px red solid;
}
.bluebox {
padding: 0.2em;
border: 1px #ccd solid;
background: #F0F0F4;
}
Beispiel 15-19: RTE-Konfiguration zur Einbindung der CSS-Definitionen
showTagFreeClasses = 1
classesCharacter = mono
classesParagraph = box, bluebox
proc {
allowedClasses < RTE.default.classesCharacter
classesParagraph < RTE.default.classesParagraph
}
}
Seite 502: Inhalte automatisiert einblenden und vererben 1
marks.RECHTS.stdWrap.ifEmpty.cObject = RECORDS
marks.RECHTS.stdWrap.ifEmpty.cObject {
tables = tt_content
source = 10,11,12,13
dontCheckPid = 1
}
Seite 502: Inhalte automatisiert einblenden und vererben 2
marks.RECHTS.stdWrap.ifEmpty.cObject = COA_INT
marks.RECHTS.stdWrap.ifEmpty.cObject {
10 = RECORDS
10 {
tables = tt_content
source = 10,11,12,13
dontCheckPid = 1
}
}
Seite 503: CONTENT Slide - Inhalte automatisch vererben
marks.RECHTS.slide = -1
Beispiel 16-1: Einen Marker füllen
FOOTER {
tables = tt_address
// Die ID des Datensatzes
source = 1
// Wenn der Datensatz z.B. in einem Ordner liegt,
// muss diese Option gewaehlt sein.
dontCheckPid = 1
conf.tt_address = COA
conf.tt_address {
10 = TEXT
10 {
field = company
typolink.parameter.field = email
wrap = <p>|</p>
}
}
}
Beispiel 16-2: Das Top-Level-Element tt_address definieren
tt_address {
wrap = <div class="vcard">|</div>
10 = TEXT
10 {
field = company
htmlSpecialChars = 1
wrap = <div class="org">|</div>
}
20 = TEXT
20 {
field = email
typolink {
parameter.field = email
ATagParams = class="email"
}
required = 1
}
30 = COA
30 {
stdWrap.wrap = <div class="adr">|</div>
stdWrap.required = 1
10 = TEXT
10 {
htmlSpecialChars = 1
field = address
wrap = <div class="street-address">|</div>
}
15 = TEXT
15 {
field = zip
noTrimWrap = |<span class="postal-code">|</span> |
}
20 = TEXT
20 {
field = city
htmlSpecialChars = 1
wrap = <span class="locality">|</span>
required = 1
}
}
40 = TEXT
40 {
field = phone
wrap = <div class="tel">|</div>
required = 1
}
}
Beispiel 16-3: Anpassen der Breiten- und Höhenangaben
equalH >
1.file {
width {
append = TEXT
append.value = c
}
height {
append = TEXT
append.value = c
field = imageheight
}
}
}
Beispiel 16-4: Verwenden von Umbrüchen als Trenner
enable.ifEmpty.typolink.parameter.listNum.splitChar = 10
typolink.parameter.listNum.splitChar = 10
}
Beispiel 16-5: Inhaltselement IMAGE erweitern
1 {
stdWrap.innerWrap (
|<a href="#" class="linkedImage" onclick="openLinkedImage(this); return false;">
<img src="fileadmin/template/img/icons/pfeil.gif" alt=""
title="Klicken, um den Link zu öffnen" /></a>
)
stdWrap.innerWrap {
if.isTrue.field = image_link
}
stdWrap.innerWrap2 (
|<a href="#" class="linkedImage" onclick="openClickEnlarge(this); return false;">
<img src="fileadmin/template/img/icons/lupe.gif" alt=""
title="Klicken, um Bild zu vergrößern" /></a>
)
stdWrap.innerWrap2 {
if.isTrue.field = image_zoom
if.isFalse.field = image_link
}
}
}
Beispiel 16-6: Bildzuschnitt nur für den entsprechenden Bildeffekt aktivieren
TCEFORM.tt_content.image_effects.addItems.30 = Zuschneiden
# Beispiel 16-5
temp.image < tt_content.image.20
tt_content.image.20 >
tt_content.image.20 = CASE
tt_content.image.20 {
key.field = image_effects
default < temp.image
30 < temp.image
30 {
equalH >
1.file {
width {
append = TEXT
append.value = c
}
height {
append = TEXT
append.value = c
field = imageheight
}
}
}
}
Druckfehler
An dieser Stelle wurde der erste innerWrap fälschlicherweise durch eine geschweifte Klammer } anstelle einer runden Klammer geschlossen.
Zusätzlich empfiehlt es sich in das onclick Event ein "return false" hinzuzufügen. Andernfalls springt der Browser bei dem Klick auf das Lupenicon auf den Seitenanfang. Vielen Dank an Ralf Becker für die Hinweise.
Beispiel 16-6: JavaScript-Funktion openClickEnlarge()
el.parentNode.getElementsByTagName('a')[0].onclick();
}
Beispiel 16-7: JavaScript-Funktion openLinkedImage()
url = el.parentNode.getElementsByTagName('a')[0].getAttribute('href');
target = el.parentNode.getElementsByTagName('a')[0].getAttribute('target');
switch (target) {
case '_top':
document.location.href = url;
break;
case '_blank':
window.open(url);
break;
}
}
Beispiel 16-8: CSS-Formatierung
display: block;
height: 16px;
margin: -20px 5px 10px 0;
text-align: right;
}
Beispiel 16-9: Freigabe des Admin-Panels für Redakteure im Tsconfig des BE-Benutzers oder der BE-Gruppe
enable.edit = 1
}
Beispiel 16-10: Das Frontend Editing als "Extrakt" des Admin-Panel
# Aktivieren der Optionspalette Eingabe
enable.edit = 1
# Bearbeitungsleiste einblenden
override.edit.displayIcons = 1
# Bearbeitungsstifte ausblenden
override.edit.displayFieldIcons = 0
# Ausblenden des Admin-Panel
hide = 1
}
Beispiel 16-11: Erweitertes Frontend Editing: Die Eingabe- und Vorschau-Palette
# Aktivieren der Optionspalette Eingabe
enable.edit = 1
# Aktivieren der Optionspalette Vorschau
enable.preview = 1
}
Beispiel 16-12: editPanel-Einstellungen fuer TYPO3-Inhaltselemente
stdWrap {
editPanel {
# Aktivieren folgender Funktionen
allow = new,move,edit,hide,delete
# Titel des Datensatzes, wird ueber %s eingefuegt, wenn vorhanden
label = Datensatz: <b>%s</b>
# Eine horizontale Linie nach jeder Leiste einziehen
line = 5
# Umrandung um ausgeblendete/zeitgesteuerte Elemente
previewBorder = 1
}
}
}
Beispiel 16-13: editPanel-Einstellungen fuer Seiten
page.9998 {
10 {
editPanel {
# Hier folgen Ihre Einstellungen.
}
}
}
Beispiel 16-14: Frontend Editing für News-Datensätze aktivieren
general_stdWrap.editPanel = 1
general_stdWrap.editPanel {
allow = new,edit,hide,delete
label = %s
line = 5
previewBorder = 1
}
}
Beispiel 16-15: Das veränderte Frontend Editing für die Schalter-Funktion
# Aktivieren der Optionspalette Eingabe
enable.edit = 1
# Bearbeitungsleiste einblenden
module.edit.forceDisplayIcons = 1
# Bearbeitungsstifte ausblenden
module.edit.forceDisplayFieldIcons = 0
# Ausblenden des Admin-Panel
hide = 1
}
Beispiel 16-16: Realisierung des Ein- und Ausschalters über Conditions
page.9999 = TEXT
page.9999.value = Vorschau-Modus
page.9999.typolink.parameter.data = TSFE:id
page.9999.typolink.additionalParams = &preview=1
[else]
page.9999 >
[end]
[globalVar = GP:preview > 0]
tt_content.stdWrap.editPanel >
plugin.tt_news.general_stdWrap.editPanel >
# Deaktivieren des Frontend Editing fuer Seiten, siehe Beispiel 5
page.9998 >
page.9999 = TEXT
page.9999.value = Bearbeiten-Modus
page.9999.typolink.parameter.data = TSFE:id
page.9999.typolink.additionalParams = &preview=0
[end]
Beispiel 16-17: Auslagern unnötigen Codes und Unterbinden von HTML-Kommentaren
config.inlineStyle2TempFile = 1
config.disablePrefixComment = 1
config.xhtml_cleaning = all
Beispiel 16-18: Unnötigen Quelltext aus Überschriften entfernen
stdheader {
# Umschliessende DIVs entfernen
stdWrap.dataWrap =
# CSS-Klasse der ersten Ueberschrift auf einer Seite entfernen
3.headerClass =
3.headerClass.noTrimWrap =
}
}
Beispiel 16-19: Ausgabe des RTE optimieren
parseFunc_RTE {
nonTypoTagStdWrap {
encapsLines {
# Umschreiben veralteter Tags in den xHTML-Standard
remapTag.B = STRONG
remapTag.I = EM
# <DIV>-Tags (z.B. per Copy-and-Paste) zu Absaetzen wandeln
RemapTag.DIV = P
# CSS-Klasse "bodytext"aus Absaetzen entfernen
addAttributes.P.class >
}
# xHTML-konformes "Remapping"
HTMLparser.tags {
b.remap = strong
i.remap = em
}
}
}
Beispiel 16-20: Setzen des <HR>-Tags für horizontale Linien
stdWrap {
innerWrap {
cObject {
# Linie davor
5 >
5 = TEXT
5.value = <hr id="c{field:uid}" />|
5.insertData = 1
# Linie danach
6 >
6 = TEXT
6.value = |<hr id="c{field:uid}" />
6.insertData = 1
}
}
}
}
Beispiel 16-21: Ergänzen des temporären Bildnamens um bis zu 100 Zeichen des Originalnamens der Datei
Beispiel 16-22: Einstellungen für die Metaangaben im Seitenkopf
robots = all
copyright = 2009
content-language = de
author = Max Mustermann
# Stichwoerter der Seiteneigenschaften verwenden
keywords.field = keywords
# Beschreibung der Seiteneigenschaften verwenden
description.field = description
# Textlaenge nach 160 Zeichen abschneiden, mehr bleibt meist unberuecksichtigt
description.stdWrap.crop = 160
}
Beispiel 16-23: Neuformatierung des Seitentitels
config.noPageTitle = 2
# Erstellen des neuen Titelformats
page.headerData.5 = COA
page.headerData.5 {
wrap = <title>|</title
10 = TEXT
10 {
field = subtitle
ifEmpty.field = title
}
20 = TEXT
20 {
data = leveltitle : 1
noTrimWrap = | - ||
# if.isFalse: Wenn die folgenden Bedingungen false zurueckgeben,
# wird der Inhalt von .20 gerendert.
if.isFalse.cObject = COA
if.isFalse.cObject {
# ... wenn Titel gleich dem von Level 1 ist.
1 = TEXT
1.value = 1
1.if {
value.cObject = TEXT
value.cObject {
field = subtitle
ifEmpty.field = title
}
equals.data = leveltitle : 1
}
# Spezielle Seiten/Systemordner auf Level 1 nicht einbeziehen.
# ... wenn aktuelle Seiten-ID gleich 9,13 und 56.
2 = TEXT
2.value = 2
2.if {
value.data = leveluid : 1
IsInList = 9,13,56
}
}
}
30 = TEXT
30.value = Marken-/Domainname oder Name der Website
30.noTrimWrap = | - ||
}
# Auf der Startseite (ID=1) nur den Domainnamen anzeigen
[globalVar= TSFE:id=1]
page.headerData.5.10 >
page.headerData.5.20 >
page.headerData.5.30.noTrimWrap >
[global]
Beispiel 16-24: Konfiguration der Fehlerbehandlung
pageNotFound_handling_statheader = HTTP/1.1 404 Not Found
Beispiel 16-25: Der Inhalt einer robots.txt
User-agent: *
Disallow: /fileadmin/_temp_/
Disallow: /beispiel.xml
# Spezielle Anweisung fuer den Robot "SearchRobot"
User-agent: SearchRobot/1.0
Disallow: /fileadmin/template/
Beispiel 16-26: Domainumleitungen mittels RewriteRules
RewriteCond %{HTTP_HOST} ^hauptdomain\.de$ [NC]
RewriteRule ^(.*)$ http://www.hauptdomain.de%{REQUEST_URI} [R=301,L]
# Umleitung der Nebendomain1 inklusive moeglicher Subdomains
RewriteCond %{HTTP_HOST} nebendomain1\.de$ [NC]
RewriteRule ^(.*)$ http://www.hauptdomain.de%{REQUEST_URI} [R=301,L]
# Umleitung der Nebendomain2 exklusive moeglicher Subdomains
RewriteCond %{HTTP_HOST} ^nebendomain2\.de$ [NC]
RewriteRule ^(.*)$ http://www.hauptdomain.de%{REQUEST_URI} [R=301,L]
# Explizierte Umleitung der Subdomain www.nebendomain2.de
RewriteCond %{HTTP_HOST} ^www.nebendomain2\.de$ [NC]
RewriteRule ^(.*)$ http://www.hauptdomain.de%{REQUEST_URI} [R=301,L]
Beispiel 16-27: Übertrag der Detailseite des News-Systems auf den Link Handler
tt_news.parameter = {$plugin.tt_news.singlePid}
}
Beispiel 16-28: Die .htaccess-Anweisungen für SimulateStaticDocuments
RewriteRule ^[^/]*\.html$ index.php
Beispiel 16-29: Möglichkeiten der SimulateStaticDocuments Methode
config.simulateStaticDocuments = 1
# Ignorieren des Seitentyps, wenn dieser nicht gesetzt ist.
# seite.0.html erscheint als seite.html, seite.1.html bleibt bestehen.
config.simulateStaticDocuments_noTypeIfNoTitle = 1
# Optional: Anstelle der Seiten-ID oder des -Alias immer die ersten 30 Zeichen
# des Titels verwenden, die vorherige Anweisung wird dadurch aufgehoben.
config.simulateStaticDocuments_addTitle = 30
# URL-Parameter verschluesseln, moegliche Werte: md5 oder base64.
config.simulateStaticDocuments_pEnc = md5
# Auflistung der zu verschluesselnden Parameter.
config.simulateStaticDocuments_pEnc_onlyP = MP, RDCT, cHash, L, print, type, no_cache, swords, tx_ttnews[backPid], tx_ttnews[tt_news], tx_ttnews[pS], tx_ttnews[pL], tx_ttnews[arc], tx_ttnews[cat], tx_ttnews[pointer], tx_ttnews[swords]
Beispiel 16-30: Der Inhalt der .htaccess-Datei für RealURL
RewriteRule ^typo3$ - [L]
RewriteRule ^typo3/.*$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* index.php
Beispiel 16-31: Aktivieren von RealURL per TypoScript
config.baseURL = http://www.example.com/
config.prefixLocalAnchors = all
config.tx_realurl_enable = 1
Seite 489: Adressdatensatz im Inhaltsbereich wiederverwenden
tt_address {
wrap = <div class="vcard">|</div>
10 = TEXT
10 {
field = company
htmlSpecialChars = 1
wrap = <div class="org">|</div>
}
20 = TEXT
20 {
field = email
typolink {
parameter.field = email
ATagParams = class="email"
}
required = 1
}
30 = COA
30 {
stdWrap.wrap = <div class="adr">|</div>
stdWrap.required = 1
10 = TEXT
10 {
htmlSpecialChars = 1
field = address
wrap = <div class="street-address">|</div>
}
15 = TEXT
15 {
field = zip
noTrimWrap = |<span class="postal-code">|</span> |
}
20 = TEXT
20 {
field = city
htmlSpecialChars = 1
wrap = <span class="locality">|</span>
required = 1
}
}
40 = TEXT
40 {
field = phone
wrap = <div class="tel">|</div>
required = 1
}
}
Seite 492: Bild-/Wortmarken 1
typo3 = TYPO3
Typo3 = TYPO3
}
Seite 492: Bild-/Wortmarken 2
Seite 493: Bild-/Wortmarken 3
Seite 493: Bild-/Wortmarken 4
Seite 494: Wortmarken mit HTML-Code 1
lib.stdheader.10.setCurrent.htmlSpecialChars = 1
Seite 494: Wortmarken mit HTML-Code 2
lib.stdheader.10.setCurrent.parseFunc.short < lib.parseFunc_RTE.short
lib.stdheader.10.setCurrent.htmlSpecialChars = 0