d
2 4. ge flackt aOb3 AuDe .1YP e 2. Pu5Tsch e e PlHz ut ab g el e sg fla tu D Au . Au 3 Ak er Tipps & Rezepte von TYPO3-Experten
Lizensiert für Markus Mueller
TYPO3 Kochbuch
Christian Trabold, Jo Hasenau & Peter Niederlag
O’Reilly
Lizensiert für Markus Mueller
2. AUFLAGE
TYPO3 Kochbuch
Lizensiert für Markus Mueller
Christian Trabold, Jo Hasenau & Peter Niederlag
Beijing · Cambridge · Farnham · Köln · Sebastopol · Taipei · Tokyo
Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen. Alle Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt und sind möglicherweise eingetragene Warenzeichen. Der Verlag richtet sich im Wesentlichen nach den Schreibweisen der Hersteller. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen. Kommentare und Fragen können Sie gerne an uns richten: O’Reilly Verlag Balthasarstr. 81 50670 Köln Tel.: 0221/9731600 Fax: 0221/9731608 E-Mail:
[email protected] Copyright: © 2009 by O’Reilly Verlag GmbH & Co. KG 1. Auflage 2006 2. Auflage 2009 Lizensiert für Markus Mueller
Die Darstellung einer Ameive im Zusammenhang mit dem Thema TYPO3 ist ein Warenzeichen von O’Reilly Media, Inc.
Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.ddb.de abrufbar.
Lektorat: Alexandra Follenius, Köln Korrektorat: Sibylle Feldmann, Düsseldorf Satz: G&U e.Publishing Services GmbH, Flensburg Umschlaggestaltung: Marcia Friedman, Boston & Michael Oreal, Köln Produktion: Andrea Miß, Köln Belichtung, Druck und buchbinderische Verarbeitung: Druckerei Kösel, Krugzell; www.koeselbuch.de
ISBN 978-3-89721-851-2 Dieses Buch ist auf 100% chlorfrei gebleichtem Papier gedruckt.
First
Inhalt
Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XI 1
Installation und Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Lizensiert für Markus Mueller
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10
2
Vorüberlegungen zu einem TYPO3-Projekt . . . . . . . . . . . . . . . . . . . . . . . . . Das richtige TYPO3-Paket auswählen und installieren . . . . . . . . . . . . . . . . Eine Entwicklerversion von TYPO3 verwenden . . . . . . . . . . . . . . . . . . . . . . Die Ordnerstruktur verstehen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Systemparameter ermitteln und verstehen . . . . . . . . . . . . . . . . . . . . . . . . . Systemparameter anpassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Größere Dateiuploads ermöglichen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mehrere Websites mit TYPO3 verwalten . . . . . . . . . . . . . . . . . . . . . . . . . . UTF-8 als Standardzeichensatz verwenden . . . . . . . . . . . . . . . . . . . . . . . . Der richtige Umgang mit Fehlermeldungen . . . . . . . . . . . . . . . . . . . . . . . .
2 5 8 10 17 22 24 27 29 32
Wartung und Systempflege . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10
TYPO3 auf eine neue Version aktualisieren . . . . . . . . . . . . . . . . . . . . . . . . Die aktuell verwendete TYPO3-Version ermitteln . . . . . . . . . . . . . . . . . . . Den Kompatibilitätsmodus nutzen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Website temporär für Wartungsarbeiten sperren . . . . . . . . . . . . . . . . Die Datenbank prüfen und warten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Im Dateisystem aufräumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Referenzindex aktuell halten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Referenzindex nutzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Backup der TYPO3-Installation erstellen . . . . . . . . . . . . . . . . . . . . . . . Den Zeichensatz einer bestehenden TYPO3-Installation prüfen und auf UTF-8 umstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42 45 47 49 52 58 59 61 63 66
Max. Linie
Max. Linie | III This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Links 2.11 Systemprozesse mit dem Syslog protokollieren . . . . . . . . . . . . . . . . . . . . . 75 2.12 Inhalte im Backend schnell finden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 2.13 Verloren geglaubte Dateien wiederfinden. . . . . . . . . . . . . . . . . . . . . . . . . . 80
3
Der richtige Zugang zum Backend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12
Lizensiert für Markus Mueller
4
IV |
Seiten schnell erzeugen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Inhaltseingabe beschleunigen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Standardwerte für Felder vorgeben. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Werte anderer Datensätze übernehmen . . . . . . . . . . . . . . . . . . . . . . . . . . Seiten und Inhalte standardmäßig verstecken . . . . . . . . . . . . . . . . . . . . . Datensätze nur in bestimmten Seiten erlauben. . . . . . . . . . . . . . . . . . . . . Inhaltseingabe über das Frontend ermöglichen . . . . . . . . . . . . . . . . . . . . Den interaktiven Texteditor RTE konfigurieren . . . . . . . . . . . . . . . . . . . . Mehrsprachige Inhalte mit TYPO3 einpflegen . . . . . . . . . . . . . . . . . . . . . Sich in einem Workspace zurechtfinden. . . . . . . . . . . . . . . . . . . . . . . . . . Die Veröffentlichung von Inhalten über einen Workflow kontrollieren. .
118 120 122 123 125 127 131 137 150 154 157
Inhalte verwalten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9
Max. Linie
82 84 86 88 93 95 96 99 105 109 112 113
Inhalte eingeben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11
5
Yeah, that’s a classic – Den Browser richtig einstellen . . . . . . . . . . . . . . . . Am Backend anmelden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein verlorenes Passwort für das Backend wiederherstellen. . . . . . . . . . . . . Das Backend absichern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Beschriftung im Anmeldeformular ändern . . . . . . . . . . . . . . . . . . . . . . Eigene Bilder im Anmeldeformular anzeigen . . . . . . . . . . . . . . . . . . . . . . . Das Layout der Anmeldemaske ändern . . . . . . . . . . . . . . . . . . . . . . . . . . . Aktuelle Meldungen unter dem Anmeldeformular anzeigen . . . . . . . . . . . Tipp des Tages auf der Anmeldeseite anzeigen. . . . . . . . . . . . . . . . . . . . . Backend-Benutzer auf das Frontend umleiten . . . . . . . . . . . . . . . . . . . . . Einen bestimmten Backend-Benutzer simulieren . . . . . . . . . . . . . . . . . . . Benutzereinstellungen vorgeben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Inhalt
Datensätze effektiv verwalten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wiederkehrende Arbeiten beschleunigen . . . . . . . . . . . . . . . . . . . . . . . . . Datensätze verschieben oder kopieren . . . . . . . . . . . . . . . . . . . . . . . . . . . Seiteninhalt auf mehrere Seiten verteilen . . . . . . . . . . . . . . . . . . . . . . . . . Die Zwischenablage erweitern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mehrere Datensätze gleichzeitig bearbeiten . . . . . . . . . . . . . . . . . . . . . . . Einen oder mehrere Datensätze löschen . . . . . . . . . . . . . . . . . . . . . . . . . . Dateien oder Ordner verschieben oder löschen . . . . . . . . . . . . . . . . . . . . Gelöschte Inhalte wiederherstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
164 166 168 171 172 173 175 178 180
Max. Linie
Rechts 5.10 5.11 5.12 5.13 5.14
6
Lizensiert für Markus Mueller
Max. Linie
Die Seitenaufteilung im Backend beeinflussen . . . . . . . . . . . . . . . . . . . . . Anzahl der Inhaltsspalten erhöhen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anzahl der Inhaltsspalten verringern . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inhaltsspalten umbenennen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Auswahllisten optimieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eingabefelder und Bearbeitungsmöglichkeiten reduzieren. . . . . . . . . . . . Eingabefelder anpassen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Auswertung von Eingabefeldern anpassen. . . . . . . . . . . . . . . . . . . . . Die Anordnung von Eingabefeldern ändern . . . . . . . . . . . . . . . . . . . . . . . Eingabeformulare mehrspaltig darstellen . . . . . . . . . . . . . . . . . . . . . . . . .
201 202 203 204 206 209 211 213 220 225
Die Übersicht im Backend erhöhen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8
8
184 187 188 190 193
Das Backend anpassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10
7
Inhalte lokal sichern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inhalte zwischen unterschiedlichen TYPO3-Instanzen austauschen . . . . Eine Suche auf der Website integrieren . . . . . . . . . . . . . . . . . . . . . . . . . . Inhalte mit der Indexsuche von TYPO3 suchen und finden. . . . . . . . . . . Mit IRRE verknüpfte Datensätze bearbeiten . . . . . . . . . . . . . . . . . . . . . .
Oft verwendete Datensätze schnell erreichen . . . . . . . . . . . . . . . . . . . . . . Zuletzt bearbeitete Datensätze anzeigen. . . . . . . . . . . . . . . . . . . . . . . . . . Seiten-IDs ermitteln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Längere Seitentitel im Seitenbaum ermöglichen . . . . . . . . . . . . . . . . . . . . Tabelleninhalte nur bei Bedarf anzeigen. . . . . . . . . . . . . . . . . . . . . . . . . . Anzahl der Datensätze im Listenmodus erhöhen . . . . . . . . . . . . . . . . . . . Eigene Datensätze im Seitenmodul anzeigen . . . . . . . . . . . . . . . . . . . . . . Eigene Seiten-Icons anzeigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
230 233 235 237 238 240 241 243
TypoScript verstehen und verwalten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 8.10 8.11
TypoScript anstatt eigener PHP-Funktionen nutzen . . . . . . . . . . . . . . . . TypoScript-Templates sinnvoll aufteilen . . . . . . . . . . . . . . . . . . . . . . . . . Den TypoScript-Object-Browser und den Template-Analyzer nutzen. . . Den TypoScript-Debugger nutzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . TypoScript aus externen Dateien einbinden. . . . . . . . . . . . . . . . . . . . . . . Den TypoScript-Editor nutzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . TypoScript-Konstanten zentral verwalten . . . . . . . . . . . . . . . . . . . . . . . . Extension-Templates und Conditions nutzen . . . . . . . . . . . . . . . . . . . . . Template-Ressourcen effektiv einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . Mit Wraps Inhalte für die Ausgabe verpacken . . . . . . . . . . . . . . . . . . . . . TypoScript-Werte beim Parsen dynamisch ändern – der Operator := . . .
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
251 254 259 264 268 271 272 278 282 284 286
Inhalt | V
Max. Linie
Links 9
Die Seitenausgabe steuern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9
Das Seiten-Grundgerüst aufbauen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CSS-Styles in den Seitenkopf einbinden . . . . . . . . . . . . . . . . . . . . . . . . . . CSS-Stylesheets dynamisch aus Vorlagen erzeugen . . . . . . . . . . . . . . . . . Die Ausgabe mehrsprachiger Websites steuern . . . . . . . . . . . . . . . . . . . . Das Frontend-Editing optimieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . URL-Parameter an Menüs und Links übergeben . . . . . . . . . . . . . . . . . . . Links wie statische HTML-Dateien darstellen . . . . . . . . . . . . . . . . . . . . . Webseiten nur bestimmten Besuchern zeigen . . . . . . . . . . . . . . . . . . . . . Benutzerfreundliche Fehlerseiten integrieren und sinnvoll gestalten . . . .
294 304 307 311 317 322 324 327 331
10 Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen . . . . . . . . . . . . . . . . . 335
Lizensiert für Markus Mueller
10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9
Daten auslesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die getText-Funktionen data, dataWrap und insertData verwenden . . . Bedingungen abfragen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Daten verarbeiten und formatieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HTML und Text parsen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inhalte verpacken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Links mit typolink erzeugen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spezielle stdWrap-Funktionen verwenden . . . . . . . . . . . . . . . . . . . . . . . . Die Hierarchie von Wraps und anderen Funktionen kennenlernen. . . . .
337 348 364 372 383 389 395 401 406
11 Funktionale TypoScript-Elemente verwenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 11.1 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 11.10 11.11 11.12
Mit COA Inhalte zusammenfassen und mit stdWrap versehen . . . . . . . . Das Caching von Inhalten deaktivieren . . . . . . . . . . . . . . . . . . . . . . . . . . Inhalt nur bei Bedarf zweispaltig anzeigen . . . . . . . . . . . . . . . . . . . . . . . . Mit LOAD_REGISTER und RESTORE_REGISTER Elemente zwischenspeichern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Links im Fließtext als Fußnoten ausgeben . . . . . . . . . . . . . . . . . . . . . . . . Hierarchische Abschnittsübersichten . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vorhandene TypoScript-Register finden und nutzen . . . . . . . . . . . . . . . . Mit dem GIFBUILDER einfache Grafiken erstellen . . . . . . . . . . . . . . . . . Zugängliche grafische Header anlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . Mehrschichtige Grafiken für Überschriften oder Menüs erstellen . . . . . . Grafiken mit mehrzeiligem Text erzeugen . . . . . . . . . . . . . . . . . . . . . . . . Eigene PHP-Funktionen als TypoScript-Element einbinden . . . . . . . . . .
412 414 417 420 424 430 436 441 446 452 457 461
12 Navigationselemente erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467 12.1 Startpunkt für Menüs festlegen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 12.2 Geschützte Seiten im Menü anzeigen und auf Login-Seite umleiten . . . . 475 12.3 Zustände von Menüeinträgen erkennen und individuell formatieren . . . 477
Max. Linie VI |
Inhalt
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts 12.4 12.5 12.6 12.7 12.8 12.9 12.10 12.11 12.12 12.13 12.14 12.15 12.16 12.17 12.18
Menüeinträge in Abhängigkeit von ihrer Position konfigurieren . . . . . . . Spezielle Menütypen: Brotkrumen- oder Rootline-Navigation . . . . . . . . Spezielle Menütypen: Liste zuletzt aktualisierter Seiten . . . . . . . . . . . . . . Spezielle Menütypen: Liste themenverwandter Seiten . . . . . . . . . . . . . . . Spezielle Menütypen: Sprachauswahl. . . . . . . . . . . . . . . . . . . . . . . . . . . . Spezielle Menütypen: Blätternavigation . . . . . . . . . . . . . . . . . . . . . . . . . . Erweiterte Menüeigenschaften individuell anpassen . . . . . . . . . . . . . . . . Ein einfaches Textmenü auf Basis einer ungeordneten Liste erstellen . . . Ein Textmenü mit komfortablen Erweiterungen erzeugen. . . . . . . . . . . . Ein Teaser-Menü mit Bildern und Kurzbeschreibung erzeugen . . . . . . . . Menü und Titel mit hierarchischer Nummerierung erzeugen . . . . . . . . . Ein einfaches Grafikmenü auf Basis einer ungeordneten Liste erstellen. . Ein Grafikmenü mit Effekten und Erweiterungen erzeugen . . . . . . . . . . . Ein Jumpmenü als textbasiertes Menü konstruieren . . . . . . . . . . . . . . . . TypoScript-Menüs als Standard-Setup für das Inhaltselement Menü/Sitemap hinterlegen . . . . . . . . . . . . . . . . . . . . . . . . .
482 486 488 492 497 500 507 512 515 518 524 529 531 536 540
13 Statische und dynamische Inhalte ausgeben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545 Lizensiert für Markus Mueller
13.1 13.2 13.3 13.4 13.5 13.6 13.7 13.8 13.9 13.10 13.11 13.12
Textbausteine in der Seite fest verankern . . . . . . . . . . . . . . . . . . . . . . . . . Bild auf jeder Seite anzeigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Klick-Vergrößern mithilfe eines separaten Lupen-Icons realisieren . . . . . Vergrößerte Bilder mit Copyright-Vermerk versehen . . . . . . . . . . . . . . . . Inhalt einer Seite und ihrer Unterseiten zusammenfassen . . . . . . . . . . . . Inhaltselemente mit optionSplit verpacken . . . . . . . . . . . . . . . . . . . . . . . Inhaltselemente in der Seite fest verankern. . . . . . . . . . . . . . . . . . . . . . . . Verankerte Elemente unabhängig vom sonstigen Inhalt rendern . . . . . . . Wiederkehrende Inhalte zeitabhängig anzeigen . . . . . . . . . . . . . . . . . . . . Statische Formulare individuell erstellen . . . . . . . . . . . . . . . . . . . . . . . . . Formulare mit Fieldset zusammenfassen . . . . . . . . . . . . . . . . . . . . . . . . . Eine HTML-Vorlage verwenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
547 548 551 554 558 562 566 567 571 574 584 589
14 TypoScript ausreizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Max. Linie
14.1 14.2 14.3 14.4 14.5 14.6 14.7 14.8 14.9
TypoScript-Elemente intelligent als Hilfsmittel nutzen . . . . . . . . . . . . . . Die Ausgabe in Abhängigkeit von Bedingungen dynamisch anpassen . . . Ein alphabetisches Inhaltsverzeichnis anlegen . . . . . . . . . . . . . . . . . . . . . Eine mehrseitige Navigation mit Seitenbrowser erstellen. . . . . . . . . . . . . Den Backend-Seitenbaum als Frontend-Navigation simulieren . . . . . . . . Kopfgrafiken mit halbtransparenten Textboxen erstellen . . . . . . . . . . . . Pseudotransparenzen für Überschriften oder Menüs erstellen . . . . . . . . . Inhalte von Extensions unabhängig von Plugins ausgeben . . . . . . . . . . . Ein auf Seiten basierendes Newssystem erzeugen. . . . . . . . . . . . . . . . . . .
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Inhalt |
598 608 612 620 628 635 639 647 651
VII
Max. Linie
Links 15 Vorhandene Extensions nutzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663 15.1 15.2 15.3 15.4 15.5 15.6 15.7 15.8 15.9 15.10
Installierte Extensions ermitteln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Extension installieren und konfigurieren . . . . . . . . . . . . . . . . . . . . . Eine Extension aktualisieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nach Extensions recherchieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extensions importieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extensions exportieren oder sichern. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extensions deinstallieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Zugriff auf ein Repository konfigurieren . . . . . . . . . . . . . . . . . . . . . . Extensions über das TER veröffentlichen . . . . . . . . . . . . . . . . . . . . . . . . . Sprachpakete verwalten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
666 670 672 675 677 680 681 682 684 685
16 Extensions kickstarten und ausarbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Lizensiert für Markus Mueller
16.1 16.2 16.3 16.4 16.5 16.6 16.7 16.8 16.9 16.10 16.11
Einen passenden Extension-Key wählen. . . . . . . . . . . . . . . . . . . . . . . . . . Ein Extension-Grundgerüst anlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zusätzliche Datenbanktabellen und Felder hinzufügen . . . . . . . . . . . . . . Eigene Inhaltselemente einbinden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Neue Überschriftentypen integrieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eigene Tags in Seiteninhalten umsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . Backend-Module erstellen und erweitern . . . . . . . . . . . . . . . . . . . . . . . . . Unterverzeichnisse umbenennen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Abhängigkeiten und Voraussetzungen für Extensions definieren. . . . . . . Das Extension-Icon anpassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Änderungen am Code protokollieren . . . . . . . . . . . . . . . . . . . . . . . . . . . .
692 693 700 708 715 716 719 726 727 730 731
17 Einstieg in die TYPO3-API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733 17.1 17.2 17.3 17.4 17.5 17.6 17.7 17.8 17.9 17.10 17.11 17.12 17.13 17.14
Max. Linie VIII
Sich im Quellcode zurechtfinden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extensions sicher und standardkonform entwickeln . . . . . . . . . . . . . . . . Dateien aus dem Dateisystem einbinden . . . . . . . . . . . . . . . . . . . . . . . . . Fehler im Programmcode analysieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Datenbank-API nutzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mehrere Datenbanken über die Datenbank-API abfragen . . . . . . . . . . . . Mehrsprachigkeit in eigenen Extensions unterstützen . . . . . . . . . . . . . . . Datensätze in Workspaces versionierbar machen. . . . . . . . . . . . . . . . . . . IRRE für eigene Extensions nutzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellen mit IRRE über mehrere Ebenen verschachteln . . . . . . . . . . . . . Kernfunktionen und Prozesse individuell anpassen . . . . . . . . . . . . . . . . . TYPO3-Klassen mit XClass erweitern. . . . . . . . . . . . . . . . . . . . . . . . . . . . Prozesse mit Hooks beeinflussen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extension-Parameter zentral verwalten. . . . . . . . . . . . . . . . . . . . . . . . . . .
| Inhalt
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
735 737 740 742 744 748 754 758 759 768 772 774 779 785
Max. Linie
Rechts 18 Frontend-Plugins weiter entwickeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791 18.1 18.2 18.3 18.4 18.5 18.6 18.7
TypoScript in eigenen Frontend-Plugins verwenden . . . . . . . . . . . . . . . . Werte aus Flexform-Feldern auswerten . . . . . . . . . . . . . . . . . . . . . . . . . . Hyperlinks erzeugen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eigene Datensätze mit individuellen Linkfunktionen verlinken . . . . . . . . Benutzerdaten in Sessions speichern . . . . . . . . . . . . . . . . . . . . . . . . . . . . CSS- und JavaScript-Dateien einbinden . . . . . . . . . . . . . . . . . . . . . . . . . . Schnelle Ajax-Schnittstellen per eID-Tag ermöglichen. . . . . . . . . . . . . . .
792 798 799 803 806 808 810
19 Backend-Erweiterungen verfeinern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815 19.1 TSconfig-Optionen in eigenen Backend-Modulen nutzen und auswerten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.2 Flexform-Felder einbinden und konfigurieren . . . . . . . . . . . . . . . . . . . . . 19.3 Backend-Module individuell gruppieren . . . . . . . . . . . . . . . . . . . . . . . . . 19.4 Unterschiedliche Icons je nach Zustand des Datensatzes anzeigen . . . . . 19.5 Vorschautexte von Plugins anpassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.6 Backend-Formulare mit einer kontextsensitiven Hilfe ausstatten . . . . . . 19.7 Bearbeitungsfelder mit Ajax-Funktionalität versehen. . . . . . . . . . . . . . . .
816 818 824 826 829 832 837
Lizensiert für Markus Mueller
20 TYPO3 erleben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 847 20.1 20.2 20.3 20.4 20.5 20.6 20.7 20.8
Skårhøj richtig aussprechen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das TYPO3-Projekt unterstützen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handbücher schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übersetzungen anfertigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bugs melden oder neue Features vorschlagen . . . . . . . . . . . . . . . . . . . . . Die TYPO3-Newsgroups nutzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den aktuellen Projektfortschritt verfolgen . . . . . . . . . . . . . . . . . . . . . . . . Weiterführende Quellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
848 850 852 854 857 860 862 863
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Max. Linie
Max. Linie This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Inhalt
| IX
Lizensiert für Markus Mueller
First
Einleitung
TYPO3 konnte seine Position unter den Enterprise-Content-Management-Systemen in den letzten Jahren behaupten und weiter ausbauen. Zunächst durch das starke Engagement und die Überzeugung des Dänen Kasper Skårhøj angetrieben, wird TYPO3 heute durch die breite Unterstützung einer aktiven Community getragen und ist im deutschsprachigen Raum zweifelsohne zu einer festen Größe unter den Open Source-CM-Systemen geworden. Lizensiert für Markus Mueller
TYPO3 ist aufgrund der verwendeten GPL-Lizenz lizenzkostenfrei erhältlich und wird konsequent von einer weltumspannenden und sehr engagierten Community begleitet und vorangetrieben, sodass stets zahlreiche aktuelle Entwicklungen im Bereich der Internettechnologie in das Projekt einfließen. Mit der Vision Inspiring People to share ist dadurch im Laufe der Jahre ein flexibles und vielschichtiges System entstanden, das mit seinem großen Funktionsumfang unzählige Möglichkeiten zur Umsetzung erfolgreicher Webprojekte bietet. Diese Flexibilität bringt jedoch ohne Frage auch ein hohes Maß an Komplexität mit sich. Geht es darum, bestimmte Anforderungen umzusetzen und Redakteuren ein auf ihre Bedürfnisse optimiertes System zur Verfügung zu stellen, dann sind Sie als TYPO3-Entwickler oder Administrator gefordert, das System entsprechend einzurichten und anzupassen. TYPO3 gibt Ihnen alle dazu erforderlichen Mittel an die Hand.
Max. Linie
In diesem Buch finden Sie eine umfangreiche Sammlung von Lösungen zu verschiedenen Anforderungen, die wir in den letzten Jahren in einer Vielzahl von Projekten entwickelt und eingesetzt haben. Wir haben uns bemüht, die Konzepte und Hintergründe jeweils so zu beleuchten, dass die Zusammenhänge zwischen den verschiedenen Thematiken deutlich werden. Zahlreiche Querverweise sorgen dabei dafür, dass die häufigsten Fragen und Problemstellungen beim Arbeiten mit TYPO3 schnell beantwortet werden können. Gleichzeitig ermöglichen diese ineinander verzahnten Inhalte einen tieferen Einblick in die Hintergründe von TYPO3. Bei den Rezepten, die sich intensiv mit Programmierung beschäftigen, haben wir sehr viel Wert darauf gelegt, die Beispiele und Herangehensweisen so generisch wie möglich zu
| XI This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
gestalten. Da die Anforderungen hier individuell sehr unterschiedlich sind, sollen vorrangig die allgemeine Funktionsweise sowie der Aufbau von TYPO3 im Gesamten beleuchtet werden. Auf diesem Fundament können Sie dann weiter aufbauen und Ihrer Kreativität freien Lauf lassen.
Links
Wir würden uns freuen, Ihnen mit diesem Buch einen nützlichen Ratgeber für Ihre Arbeit mit TYPO3 an die Hand zu geben, und hoffen, dass wir Ihnen mit diesem Kochbuch darüber hinaus auch etwas von der Faszination von TYPO3 vermitteln können. Über Feedback, Kritik sowie über Anregungen für weitere Rezepte freuen wir uns, Sie können uns unter der Adresse
[email protected] erreichen.
An wen sich dieses Buch richtet Mit dem TYPO3 Kochbuch sprechen wir Entwickler und Dienstleister an, die professionelle Projekte mit TYPO3 realisieren möchten und dafür praktische Lösungen suchen. Sie sollten dabei idealerweise schon die ersten Schritte mit TYPO3 unternommen haben und mit dem grundsätzlichen Umgang mit der TYPO3-Benutzeroberfläche vertraut sein. Sollten Sie noch keinerlei Erfahrung mit TYPO3 haben, empfehlen wir Ihnen für den Einstieg das Buch Praxiswissen TYPO3 von Robert Meyer, das ebenfalls im O’Reilly Verlag erschienen ist. Lizensiert für Markus Mueller
TYPO3 ist eine Datenbankanwendung, daher sollten für Sie Begriffe wie Tabelle und Feld nicht nur mit Fußball verbunden sein. Der Schwerpunkt der meisten Rezepte liegt auf der entsprechenden Nutzung des TYPO3-spezifischen Sprachkonstrukts TypoScript oder der Nutzung der TYPO3-Benutzeroberfläche. Da die Rezepte jeweils in sich geschlossene Lösungen beschreiben, sollten sie mit allgemeinen Kenntnissen der einschlägigen Webtechnologien nachvollziehbar sein. Ein Teil der Rezepte, insbesondere diejenigen zur Extension-Entwicklung, setzen Kenntnisse in der PHP-Programmierung voraus. Da die Rezepte bewusst ausführlich gehalten sind und deutlich erläutert werden, sind sie aber auch ohne tieferes Fachwissen nachvollziehbar. Lesen Sie das TYPO3 Kochbuch ... • wenn Sie Ihr TYPO3-Wissen vertiefen möchten. • wenn Sie gern anhand von erläuterten Praxisbeispielen lernen. • wenn Sie Inspirationen zur Lösung Ihrer individuellen Problemstellungen suchen. • wenn Sie TYPO3 im Zusammenhang erfahren möchten. • wenn Sie es satt haben, Hunderte von Seiten der umfangreichen TYPO3-Dokumentation lesen zu müssen, um einen einfachen Zusammenhang zu verstehen. • wenn Sie schnelle Antworten auf dringende Fragen zu TYPO3 benötigen, dabei auch gern ein bisschen mehr als nötig lernen möchten und Querverweise schätzen.
Max. Linie
Max. Linie XII |
Einleitung
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Wir haben in diesem Buch bewusst auf die Behandlung von Extensions außerhalb des Standardpakets von TYPO3 4.2 verzichtet, weil wir Ihnen möglichst umfassend die Kernfunktionen des Systems erläutern wollen. Selbst die Behandlung nur der beliebtesten Extensions hätte zum einen den Rahmen dieses Buchs gesprengt, weil sie ausreichend Material für ein eigenes Buch zu diesem Thema geliefert hätten. Zum anderen werden Sie nach der Lektüre dieses Kochbuchs feststellen, dass sich viele Dinge ganz ohne separate Extensions sehr einfach und komfortabel mit den Bordmitteln des TYPO3-Kerns lösen lassen. Wenn Sie detaillierte Informationen über TemplaVoilà, News, Direct Mail, Shops, Foren oder andere Extensions suchen, sollten Sie sich auf typo3.org umsehen. Sie finden in diesem Buch ausschließlich Rezepte, die sich in der Praxis bewährt haben und Ihnen eine wirkliche Hilfe beim Erstellen eigener TYPO3-Projekte bieten. Abschließend sei darauf hingewiesen, dass dieses Kochbuch kein »Definitive Guide« sein kann und will. Wir erheben daher keinen Anspruch auf Vollständigkeit. Das eine oder andere TypoScript-Element wird beispielsweise nicht erwähnt werden, wobei dies meistens daran liegt, dass diese Elemente selten verwendet werden oder laut Referenz nicht mehr verwendet werden sollten.
Die verwendete TYPO3-Umgebung Lizensiert für Markus Mueller
TYPO3 ist ein sehr umfangreiches Projekt, das sich ständig weiterentwickelt. Die Grundlage für dieses Buchs ist TYPO3 in der Version 4.2. Fast alle Rezepte sind aber auch in älteren Versionen anwendbar, gegebenenfalls wird in den Rezepten explizit auf TYPO3versionsspezifische Besonderheiten hingewiesen. Beachten Sie, dass die TYPO3-Version 4.2 PHP 5.2 voraussetzt. Für TYPO3 sind neben dem Installationspaket zusätzlich Tausende weiterer Extensions verfügbar, mit denen TYPO3 auf verschiedenste Weisen beeinflusst oder erweitert werden kann. Wir behandeln in diesem Rahmen ausschließlich Extensions, die als System-Extensions bereits Bestandteil des TYPO3-Kerns sind. An geeigneten Stellen wird auf zusätzliche, optionale Extensions aus dem Extension-Repository hingewiesen. Da es sich bei TYPO3 um ein webbasiertes System handelt, werden entsprechende Systemumgebungen bestehend aus Betriebssystem, Webserver, Datenbankserver und PHP vorausgesetzt. Als Client dient dabei ein beliebiger Webbrowser.
Aufbau dieses Buchs Das TYPO3 Kochbuch ist eine Sammlung von Lösungen für gängige und manchmal auch nicht ganz alltägliche Aufgaben bei der Arbeit mit TYPO3. Sie werden erfahren, wie man mit TYPO3 umgeht und selbst knifflige Probleme zügig lösen kann.
Max. Linie
Max. Linie Aufbau dieses Buchs | XIII This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Sie müssen das Buch nicht von vorne bis hinten durcharbeiten, jedes Rezept ist in sich abgeschlossen und behandelt die Lösung eines spezifischen Problems. Oftmals gibt es dabei vielfältige Optionen oder Alternativen zur Lösung eines Problems. Unter der Überschrift Lösung wird zunächst der direkte und einfachste Weg beschrieben, danach gehen wir in der Diskussion auf weitere Möglichkeiten und Alternativen sowie deren Vor- und Nachteile ein.
Links
Wenn für das jeweilige Rezept Vorwissen nötig ist, wird dies entsprechend über Querverweise innerhalb des Texts verdeutlicht. Über diese Querverweise können Sie dann je nach Wissensstand bestimmte Themenbereiche vertiefen und ausbauen. Im Abschnitt Siehe auch enthalten die Rezepte außerdem Verweise auf weitere für die angesprochene Problemstellung relevante Rezepte sowie auf andere Online- und Offline-Ressourcen. Die einzelnen Kapitel dieses Buchs können in sechs große inhaltliche Abschnitte eingeteilt werden. Dabei steigt der Schwierigkeitsgrad innerhalb der Kapitel von leicht bis schwer, sodass die ersten Rezepte meist leichter sind als die Rezepte am Ende eines Kapitels. Suchen Sie einen allgemeinen Einstieg in die Thematik eines Kapitels, sollten Sie zunächst die jeweilige Einführung lesen. Hier ein Überblick über die einzelnen Abschnitte und Kapitel: Lizensiert für Markus Mueller
Der erste Abschnitt besteht aus zwei Kapiteln und widmet sich Aspekten rund um die Installation und Wartung einer TYPO3-Umgebung: • Kapitel 1, Installation und Konfiguration, behandelt wichtige Arbeitsschritte bei der Installation von TYPO3 und bietet zusätzlich einige Informationen zum technischen Hintergrund Ihrer TYPO3-Installation. • Kapitel 2, Wartung und Systempflege, setzt den Fokus auf administrative Arbeitsschritte, die im laufenden Betrieb einer TYPO3-Installation anfallen. Im zweiten Abschnitt wird der grundlegende Umgang mit dem TYPO3-Backend behandelt: • Kapitel 3, Der richtige Zugang zum Backend, erläutert nützliche Handgriffe rund ums TYPO3-Backend und die Benutzerverwaltung. • Kapitel 4, Inhalte eingeben, zeigt Ihnen, wie Sie Ihre Website zügig mit Inhalten füllen, und geht auf die Verwendungsmöglichkeiten von Workspaces ein. • Kapitel 5, Inhalte verwalten, erklärt, wie Sie die Inhalte in Ihrer Website effektiv handhaben, verwalten und für Ihre Besucher durchsuchbar machen können. Der dritte Abschnitt zeigt Ihnen, wie Sie das TYPO3-Backend an Ihre eigenen Bedürfnisse anpassen können:
Max. Linie
• Kapitel 6, Das Backend anpassen, beleuchtet die wesentlichen Punkte, mit denen Sie mit wenigen Handgriffen das TYPO3-Backend für Ihre eigenen Bedürfnisse optimieren können. • Kapitel 7, Die Übersicht im Backend erhöhen, behandelt Arbeitsschritte, die Ihnen die tägliche Arbeit im TYPO3-Backend erheblich erleichtern können.
XIV |
Einleitung
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Im vierten Abschnitt werden die Möglichkeiten diskutiert, Inhalte mit TYPO3 auszugeben: • Kapitel 8, TypoScript verstehen und verwalten, bringt Ihnen die Konfigurationssprache von TYPO3 näher. Hier erhalten Sie die nötigen Grundlagen, um die weiteren Kapitel verstehen zu können. • Kapitel 9, Die Seitenausgabe steuern, behandelt zahlreiche Möglichkeiten, anhand derer Sie Seiteninhalte in unterschiedlichen Ausgabeformaten präsentieren können. • Kapitel 10, Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen, beschäftigt sich mit dem umfangreichen Funktionsangebot, das Ihnen TYPO3 im Rahmen von stdWrap zur Verfügung stellt. Es dient auch als Nachschlagewerk, um die Funktionsweise der in den weiteren Kapiteln genutzten stdWrap-Funktionen nachlesen zu können. Die Beispiele sind daher etwas knapper gehalten als die der sonstigen Rezepte zum Thema TypoScript. • Kapitel 11, Funktionale TypoScript-Elemente verwenden, beschreibt TypoScript-Elemente, die verschiedene Hilfsfunktionen übernehmen, wenn es darum geht, TypoScript zu strukturieren, die Zwischenablage zu verwenden, Grafiken zu erzeugen oder eigene PHP-Funktionen einzubinden.
Lizensiert für Markus Mueller
• Kapitel 12, Navigationselemente erstellen, erläutert die komfortablen Möglichkeiten, mithilfe von TypoScript Menüstrukturen zu erstellen. Dabei kommen sowohl textbasierte als auch grafikbasierte Versionen zum Einsatz. In den ersten Rezepten des Kapitels werden zunächst die Grundlagen der Menüelemente erläutert. Danach folgen konkrete, umfangreichere Anwendungsbeispiele. • Kapitel 13, Statische und dynamische Inhalte ausgeben, beschäftigt sich mit den inhaltsbezogenen TypoScript-Elementen, mit deren Hilfe Sie Texte, Bilder und Formulare ausgeben sowie HTML-Vorlagen zuweisen können. • Kapitel 14, TypoScript ausreizen, zeigt Ihnen, wie Sie mithilfe des in den vorigen Kapiteln erworbenen Wissens auch äußerst komplexe Problemstellungen ausschließlich durch den Einsatz von TypoScript lösen können. Der fünfte Abschnitt zeigt Ihnen, wie Sie TYPO3 nach eigenen Wünschen erweitern können: • Kapitel 15, Vorhandene Extensions nutzen, beleuchtet, wie Sie in eigenen Projekten auf vorhandene Extensions zurückgreifen können, und unterstützt Sie bei der Recherche nach der richtigen Extension. • Kapitel 16, Extensions kickstarten und ausarbeiten, gibt Ihnen die grundlegenden Kenntnisse für den Kickstarter an die Hand, mit denen Sie dann leicht eigene Extensions erstellen und Basiseinstellungen von TYPO3 anpassen können.
Max. Linie
• Kapitel 17, Einstieg in die TYPO3-API, zeigt Ihnen tiefer gehende Möglichkeiten und Techniken bei der Extension-Entwicklung und führt Sie an die Nutzung der TYPO3API heran.
Aufbau dieses Buchs This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| XV
Max. Linie
• Kapitel 18, Frontend-Plugins weiter entwickeln, behandelt spezielle Entwicklungstechniken, mit denen Sie Ihre Frontend-Plugins ausbauen können.
Links
• Kapitel 19, Backend-Erweiterungen verfeinern, geht auf weiterführende Methoden ein, die sich bei der Entwicklung von Backend-Modulen bewährt haben. Im sechsten Abschnitt erhalten Sie zu guter Letzt tiefere Einblicke in die TYPO3-Community: • Kapitel 20, TYPO3 erleben, stellt Ihnen wichtige Quellen und Anlaufstellen vor, die Ihnen den Umgang mit TYPO3 erleichtern können.
Neues in der zweiten Auflage Seit der ersten Auflage, die auf der TYPO3-Version 4.0 basierte, haben sich in TYPO3 einige Neuerungen ergeben, die wir natürlich in dieser Neuauflage berücksichtigen. Ohne auf die kleinen Detailveränderungen einzugehen, sind vor allem die folgenden Neuerungen aus den TYPO3-Versionen 4.1 und 4.2 erwähnenswert: Neues Backend Mit Version 4.2 hat ein komplett überarbeitetes Backend in TYPO3 Einzug gehalten. Lizensiert für Markus Mueller
Workspaces Das Workspaces-Feature ist mittlerweile von einem rein experimentellen Status zu einem produktiv einsetzbaren Feature herangewachsen. Im deutschen Backend wird der Begriff Workspace mit Arbeitsumgebung übersetzt. Der Einfachheit halber verwenden wir oft den englischen Begriff Workspace. IRRE Mit IRRE, dem Inline Relational Record Editing, steht eine mächtige neue Funktion bereit, um verknüpfte Datensätze auf sehr einfache Weise zu bearbeiten. Ajax Der Hype geht auch an TYPO3 nicht spurlos vorbei, und so hat Ajax, vom Benutzer meist unbemerkt, im TYPO3-Backend ebenfalls Einzug gehalten. Mit Version 4.2 steht dabei im Backend auch eine nützliche Ajax-API bereit, die für Backend-Erweiterungen genutzt werden kann; ebenso gibt es mit eIb für das Frontend ein neues für Ajax geeignetes Feature. In der vorliegenden Auflage haben wir diese Neuerungen berücksichtigt und mit ins Buch aufgenommen. Alle bestehenden Rezepte wurden vollständig überarbeitet und auf die TYPO3-Version 4.2 angepasst. Zudem haben wir den Bereich Installation und Wartung ausgebaut und in zwei Kapitel aufgeteilt.
Max. Linie
Die Kernfunktionen IRRE und Workspaces haben wir mit mehreren Rezepten nahtlos integriert. Hierdurch werden zahlreiche Arbeitsschritte im Backend möglich bzw. vereinfacht, die vorher gar nicht oder nur über Extensions möglich waren. Ebenso erfahren Sie,
XVI
|
Einleitung
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
wie Sie Ihre Website für Ihre Besucher mit interaktiven Suchen und geschützten Bereichen attraktiver gestalten können. In Kapitel 13 erhalten Sie noch mehr spannende und inspirierende TypoScript-Beispiele, die Sie in Ihren eigenen Projekten weiter ausbauen können. Den Bereich Extension-Entwicklung haben wir aufgrund des Feedbacks der Leser erheblich ausgebaut. Dieser Bereich umfasst nun vier statt vormals zwei Kapitel. Im ersten Teil finden Sie Rezepte, die grundlegende Techniken für die Extension-Entwicklung beschreiben. In den darauf folgenden Kapiteln gehen wir dann detailliert auf die Ausbaumöglichkeiten Ihrer Frontend- und Backend-Erweiterungen ein. Dabei finden Sie zum Beispiel Anregungen dazu, wie Sie Ajax-Funktionalitäten in TYPO3 integrieren oder über Hooks eigene Funktionalitäten in den TYPO3-Kern implementieren können, ohne auch nur eine Zeile im TYPO3-Kern zu ändern. Wir möchten uns bei allen Lesern bedanken, die uns mit dem durchweg positiven Feedback ermuntert haben, diese zweite Auflage in Angriff zu nehmen. Wir hoffen, dass wir mit dieser Überarbeitung einige Ihrer Vorschläge umsetzen können, und freuen uns weiterhin über Ihre Kommentare und Anregungen.
Die CD-ROM und die Codebeispiele Lizensiert für Markus Mueller
Auf der beiliegenden CD-ROM finden Sie die Codebeispiele aus dem TYPO3 Kochbuch. Anhand dieses Quellcodes können Sie die in den Rezepten beschriebenen Vorgänge direkt nachvollziehen, eine kurze Erklärung zum jeweiligen Code erleichtert Ihnen dabei den Einstieg. Die Beispiele sind lauffähig ab TYPO3-Version 4.2 und können meist bequem als Extension oder eigener Seitenbaum in jede bestehende TYPO3-Installation integriert werden. Im Ordner doc finden Sie die wichtigsten Dokumente für TYPO3-Entwickler im OpenOffice- und PDF-Format (Stand: 15. September 2008). Der Ordner html enthält die Beispiele aus den Rezepten des TYPO3 Kochbuchs als statische HTML-Seiten. Wir haben dabei sehr viel Wert darauf gelegt, dass die Beispiele einfach und intuitiv nachvollziehbar bleiben. Sie lassen sich schnell über die Übersichtsseite index.html erreichen und durch einen Klick auf den Rezepttitel öffnen. Klicken Sie nach dem Einlegen der CD auf die Datei index.html und erkunden Sie die Beispiele über Ihren Webbrowser. Auf diese Weise können Sie sich schnell einen guten Überblick verschaffen. Im Ordner typo3packages finden Sie aktuelle TYPO3-Pakete (Stand: 15. September 2008). Eine Möglichkeit zum Download der Codebeispiele des TYPO3 Kochbuchs finden Sie außerdem auf der Website des O’Reilly Verlags unter folgender Adresse: http://www.oreilly.de/catalog/typo3ckbk2ger/
Max. Linie
Max. Linie Die CD-ROM und die Codebeispiele | XVII This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Verwendung der Codebeispiele
Links
Sinn und Zweck dieses Buchs ist es, Ihnen bei Ihrer Arbeit zu helfen. Sie dürfen generell den Code aus diesem Buch in Ihren Programmen und Dokumentationen verwenden, ohne uns um Erlaubnis zu fragen, es sei denn, Sie verwenden einen bedeutenden Teil des Codes. Beispielsweise brauchen Sie keine Erlaubnis, wenn Sie ein Programm schreiben, das mehrere Codestücke aus diesem Buch verwendet, doch wenn Sie eine CD-ROM mit Codebeispielen aus O’Reilly-Büchern verteilen oder verkaufen, müssen Sie eine Genehmigung einholen. Sie können nach Belieben dieses Buch und Beispielcode daraus zitieren, um Fragen zu beantworten, aber wenn Sie einen großen Teil des Beispielcodes in Ihre Produktdokumentation übernehmen, bedarf dies einer Genehmigung. Auch wenn wir es nicht verlangen, so freuen wir uns doch über eine Quellenangabe, wenn wir zitiert werden. Zu einer Quellenangabe gehören normalerweise Titel, Autor, Verlag sowie ISBN des Werks, zum Beispiel: »TYPO3 Kochbuch, 2. Auflage, von Christian Trabold, Jo Hasenau & Peter Niederlag. Copyright 2009 O’Reilly Verlag, ISBN 3-89721851-2.« Wenn Sie den Eindruck haben, Ihre Verwendung unseres Codes übersteige die Grenzen des Erlaubten, sprechen Sie uns bitte an unter
[email protected]. Lizensiert für Markus Mueller
Typografische Konventionen In diesem Buch gelten folgende typografische Konventionen: Kursiv Wird für Datei- und Verzeichnisnamen, E-Mail-Adressen und URLs, aber auch bei der Definition neuer Fachbegriffe und für Hervorhebungen verwendet. Nichtproportionalschrift
Wird für Codebeispiele sowie für Variablen, Funktionen, Befehlsoptionen, Parameter, Klassennamen und HTML-Tags verwendet, wenn sie im Text auftauchen. Nichtproportionalschrift fett
Wird in den Codebeispielen für Benutzereingaben sowie zur Hervorhebung einzelner Zeilen oder Abschnitte im Code verwendet. Dieses Symbol kennzeichnet einen Tipp, Vorschlag oder allgemeinen Hinweis mit nützlichen Zusatzinformationen zum Thema.
An diesem Symbol erkennen Sie eine Warnung, die zur Vorsicht rät.
Max. Linie
Max. Linie XVIII
|
Einleitung
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Danksagung Der größte Dank geht an alle, die mit ihrer Zeit, Energie und ihrem Engagement zur Weiterentwicklung von TYPO3 beitragen. Vor allem möchten wir dem Kernentwicklerteam für seinen unermüdlichen Einsatz danken, ohne den es TYPO3 nicht gäbe. Besonderer Dank geht an Kasper Skårhøj, Sebastian Kurfürst, Michael Stucki, Karsten Dambekalns, Robert Lemke, Rene Fritz, Martin Kutschker, Dmitry Dulepov, Ingmar Schlecht, Stanislas Rolland, Andreas Otto, Thorsten Kahler, Bernhard Kraft, Christian Jul Jensen, Rupert Germann, Wolfgang Klinger, Franz Holzinger und alle anderen hilfsbereiten Menschen aus Newsgroup und Bugtracker für ihre Geduld und Aufmerksamkeit. Ihr habt uns stets inspiriert und dazu angespornt, unser Bestes zu geben. Ganz herzlich danken wir auch den Lesern, die das Manuskript der 1. Auflage vorab begutachtet haben: Sacha Vorbeck für seine Hilfe bei der Vorbereitung, Recherche und Konzeption der ersten Auflage dieses Buchs, David Zschille für seine kritischen Anmerkungen und seine unbändige Lust, uns Löcher in den Bauch zu fragen, sowie Julian Kleinhans und Sven Hartmann für ihre hilfreichen Kommentare. Zudem danken wir Birgitte Laisen für die Hilfe bei der Aussprache von »Skårhøj«, die als Grundlage für das Rezept 20.1 diente. Tak!
Lizensiert für Markus Mueller
Ein ganz besonderes Dankeschön geht an unsere Lektorin Alexandra Follenius und ihr Team für ihre unermessliche Geduld und Unterstützung während der gesamten Entstehungszeit des TYPO3 Kochbuchs.
Jo Mein persönlicher Dank geht zunächst mal an Christian Trabold für das Vertrauen, mich als Autor für dieses Buch mit ins Team zu holen. Ebenso möchte ich Peter Niederlag danken, der bei der 1. Auflage erst später zum Team dazugestoßen ist und trotz der kurzen Zeit in hohem Maße zur Qualität der Inhalte beigetragen hat.
Christian Besonderen Dank sende ich an Friederike, Ursel, Albrecht und Gaby – ohne eure Unterstützung hätte ich das Buch in dieser Form nicht schreiben können. Dank auch an Daniel und David für die aufmunternden Gespräche und Tracks zwischendurch. Einen ganz herzlichen Dank auch an meine Kollegen, besonders an Chris, Olivier und Götz, für das flexible Projektmanagement. Ebenso danke ich meinen Freunden für die Geduld und das Verständnis, mich beim Schreiben ungestört zu lassen. Danke für euer Vertrauen!
Max. Linie
Max. Linie This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Danksagung
| XIX
Links
Peter Mein persönlicher Dank gilt Annelena, Julian und Fabio. Ihr habt wieder mal mit viel Geduld mein Arbeitspensum ertragen, und eure zwischenzeitlichen Aufmunterungen haben mir die Kraft gegeben durchzuhalten. Vielen Dank auch an Christian und Jo für die unendlichen, spannenden und streitbaren Diskussionen und die fruchtbare Zusammenarbeit.
Lizensiert für Markus Mueller
Max. Linie
Max. Linie XX
|
Einleitung
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
First
Kapitel 1
KAPITEL 1
Installation und Konfiguration
1.0
Einführung
Lizensiert für Markus Mueller
Einer der großen Vorteile von TYPO3 liegt darin, dass auf Anwender- wie Entwicklerseite keinerlei Softwareinstallation notwendig ist, denn TYPO3 ist ein serverbasiertes Content Management-System. Die Nutzer benötigen zur Arbeit mit TYPO3 lediglich einen gewöhnlichen Webbrowser. Die eigentliche TYPO3-Anwendung ist in der Skriptsprache PHP implementiert und wird zentral von einem Server im Internet oder Intranet bereitgestellt. Für die Einrichtung einer TYPO3-Serverumgebung und einen produktiv nutzbaren, sicheren und verlässlichen Betrieb der dazu notwendigen Komponenten sind entsprechende Kompetenzen und Erfahrungen im Betrieb von Servern empfehlenswert, zumindest wenn das System an das Internet angekoppelt wird. Hier müssen Sie abwägen, ob der Betrieb einer eigenen Plattform wirtschaftlich und sicherheitstechnisch sinnvoll ist oder ob auf die entsprechenden Leistungen eines im TYPO3-Hosting erfahrenen Anbieters zurückgegriffen werden sollte. Die Anforderungen für eine TYPO3-Serverumgebung können von entsprechenden Discount-Hosting-Angeboten allerdings oftmals nicht erfüllt werden. Das Rezept 1.1 gibt Ihnen hierzu entsprechende Hinweise, die Sie zu Beginn eines TYPO3Projekts berücksichtigen sollten. TYPO3 wird derzeit stark weiterentwickelt, und es erscheinen regelmäßig neue Versionen, die neue Features implementieren oder auftretende Probleme beseitigen. Zu jedem TYPO3-Release gibt es mehrere Pakete, die verschiedenen Zwecken dienen. In Rezept 1.2 erfahren Sie mehr über die Bedeutung dieser TYPO3-Installationspakete und wie Sie deren Installation vornehmen. Wenn Sie vorab neue Features oder Bugfixes in einer neuen TYPO3-Version testen möchten, hilft Ihnen Rezept 1.3. Dort wird detailliert auf die Verwendung von Entwicklerversionen eingegangen. Die Bedeutung der einzelnen Ordner und Dateien einer TYPO3-Installation wird in Rezept 1.4 dargestellt.
Max. Linie
Max. Linie | 1 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Entsprechend dem Framework-Charakter von TYPO3 gibt es sehr viele Parameter, die das Verhalten des Systems beeinflussen. In Rezept 1.5 erfahren Sie, wie Sie die in Ihrer Installation gesetzten Parameter prüfen können und welchem Zweck sie dienen. Das Rezept 1.6 erklärt, wie Sie die wichtigsten Grundeinstellungen, und damit einen Teil dieser Parameter, über das Install-Tool anpassen können. Ein häufig vorkommender Anwendungfall ist, die maximale Größe für Dateien zu erhöhen. Die dazu nötigen Schritte werden in Rezept 1.7 näher beschrieben. Wenn Sie planen, mehrere Websites in einer TYPO3-Instanz zu betreiben, finden Sie in Rezept 1.8 die notwendigen Tipps, um diese Aufgabe zu erfüllen. Außerdem sollten Sie vor der Installation Ihrer Website klären, in welchem Zeichensatz die Inhalte in der Datenbank gespeichert werden. Wir empfehlen als Standardzeichensatz UTF-8 und erläutern in Rezept 1.9 die nötigen Schritte, um TYPO3 und die Datenbank entsprechend einzurichten.
Links
Sollten Sie Probleme mit Ihrer Installation haben oder beim Aufruf Ihrer Website Fehlermeldungen erhalten, können Sie in Rezept 1.10 erfahren, wie Sie Ihre Grundeinstellungen überprüfen und mit auftretenden Fehlermeldungen umgehen sollten.
1.1
Vorüberlegungen zu einem TYPO3-Projekt
Lizensiert für Markus Mueller
Problem Sie möchten TYPO3 als CMS in Ihrem Projekt einsetzen und benötigen Tipps zur geplanten Einführung.
Lösung Zeitplanung Planen Sie ausreichend Zeit für das Projekt ein. Unterschätzen Sie die Komplexität eines solchen Projekts nicht. Eine effiziente Projektumsetzung mit TYPO3 erfordert einiges an Erfahrung, für Neulinge entsteht ein hoher Einarbeitungsaufwand.
Vorgehen In jedem Fall sollten Sie vor der Umsetzung mit TYPO3 ein Konzept mit einem Layout erstellen, das Sie zunächst losgelöst von TYPO3 anhand einiger statischer (X)HTMLund CSS-Dateien implementieren sollten. Bedenken Sie, dass die Inhalte einer Website zu den Ressourcen einer Organisation zählen. Um diese Ressourcen langfristig zu erhalten, ist eine entsprechende Trennung in Struktur- und Layoutinformationen, wie Sie mit XHTML und CSS erreicht werden, sinnvoll. Außerdem schaffen Sie damit die Grundlagen, um barrierearme Websites und verschiedene Ausgabeformate zu erzeugen. Neben
Max. Linie
Max. Linie 2 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
der statischen Umsetzung ist auch ein Konzept- oder Pflichtenheft nützlich, in dem Sie die Anforderungen, Zielgruppen und Funktionalitäten, die die Website betreffen, dokumentieren.
Know-how und Beratung Aus wirtschaftlichen Gründen sollten Sie in Erwägung ziehen, professionelle Dienstleistungen im Rahmen von Beratung, Schulung oder Support von TYPO3-Spezialisten in Anspruch zu nehmen. In der Praxis hat sich gezeigt, dass sich solche Investitionen im Projektverlauf rentieren. Dabei sollten Sie auch auf Referenzen achten. Eine Auflistung von TYPO3-Dienstleistern finden Sie unter: http://typo3.com/Consultancies.1248.0.html
Open Source
Lizensiert für Markus Mueller
Die Verwendung von TYPO3 als Open Source-Produkt ist lizenzkostenfrei. Die Entwicklung von TYPO3 wird dabei nicht direkt von einem Unternehmen getragen, sondern von einer weltweiten Gemeinschaft aus Entwicklern. Die TYPO3 Association übernimmt als gemeinnützige Organisation entsprechende Aufgaben zur Koordination der Entwicklung und Außendarstellung. Über die TYPO3 Association ist es möglich, das Projekt finanziell zu unterstützen. Die Website der TYPO3 Association ist unter http://association.typo3.org/ zu erreichen.
Diskussion TYPO3 als komplexes Softwareprodukt TYPO3 ist ein leistungsfähiges CMS-Framework. Die Bezeichnung Framework macht deutlich, dass es sich bei TYPO3 eigentlich um einen Baukasten handelt, mit dem Sie das CMS nach Ihren Bedürfnissen gestalten können. Ein Vorteil für Sie als Anwender gegenüber anderen Frameworks ist dabei, dass der Baukasten TYPO3 bereits mit einer sinnvollen, einsatzbereiten Grundkonstruktion ausgeliefert wird. Anders ausgedrückt, verfügt das CMS TYPO3 bereits im Standardinstallationspaket über eine endbenutzertaugliche Konfiguration und Oberfläche. Für den Projekterfolg ist es jedoch wichtig, dass TYPO3 an die für die jeweiligen Anwender maßgeblichen Anforderungen angepasst wird. Eine solche Anpassung erfordert umfangreiche Kenntnisse und Erfahrungen, die wir mit diesem Buch vermitteln möchten. In der Praxis sollten Sie sich bei Projektbeginn überlegen, ob Sie das notwendige Knowhow organisationsintern aufbauen wollen oder stattdessen lieber auf externe Dienstleister mit entsprechenden Referenzen zurückgreifen.
Max. Linie
Max. Linie 1.1 Vorüberlegungen zu einem TYPO3-Projekt | 3 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Überlegungen zum laufenden Betrieb
Links
TYPO3 besteht aus einer Sammlung von PHP-Skriptdateien. Zum Betrieb von TYPO3 werden die folgenden Komponenten benötigt: Ein Webserver mit einer Schnittstelle für die Skriptsprache PHP Dies ist die Komponente, auf die die Benutzer und Anwender mit ihrem Browser zugreifen, wenn sie mit dem CMS TYPO3 arbeiten. In den meisten Fällen wird diese Komponente vom Open Source-Webserver Apache (http://httpd.apache.org) bereitgestellt, es sind aber auch andere Produkte verwendbar. PHP-Skriptinterpreter Die TYPO3-Anwendungslogik wird von dem PHP-Skriptinterpreter (http://www. php.net) ausgeführt, der – für den Benutzer nicht direkt zugreifbar – in Zusammenarbeit mit dem Webserver seine Dienste tut. Ab TYPO3 4.2.x ist mindestens PHPVersion 5.1 erforderlich. Datenbankdienst Die eigentliche Datenhaltung von TYPO3 erfolgt in einem relationalen DatenbankManagement-System (RDBMS). In den meisten Fällen wird hier auf das weit verbreitete RDBMS MySQL (http://www.mysql.com) zurückgegriffen. Lizensiert für Markus Mueller
Für einen produktiv nutzbaren, sicheren und verlässlichen Betrieb dieser Komponenten sind entsprechende Kompetenzen im Betrieb von Internet-Services unabdingbar, zumindest wenn das System an das Internet angekoppelt wird. Auch hier sollten Sie abwägen, ob der Betrieb einer eigenen Plattform wirtschaftlich sinnvoll ist oder ob auf die Leistungen eines auf entsprechendes Hosting spezialisierten Anbieters zurückgegriffen werden soll.
Migration Sollten Sie bereits eine umfangreiche Website betreiben, müssen Sie überlegen, wie Sie die bereits vorhandenen Inhalte in das TYPO3-System übernehmen. Hierbei stehen derzeit noch keine wirklich nutzbaren freien Werkzeuge zur Verfügung. Viele TYPO3-Agenturen verfügen aber über entsprechene Verfahren und zum Teil auch über entsprechende interne Tools. Sollte für Sie die Übernahme eines größeren Datenbestands Thema sein, könnten Sie sich möglicherweise an einer solchen Entwicklung für das TYPO3-Projekt beteiligen, siehe dazu auch Rezept 20.2.
Siehe auch Eine Liste mit Links zu Informationen über TYPO3 finden Sie in Rezept 20.8.
Max. Linie
Max. Linie 4 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
1.2
Das richtige TYPO3-Paket auswählen und installieren
Problem Sie möchten TYPO3 installieren und benötigen eine Hilfestellung bei der Auswahl des richtigen Pakets.
Lösung Einen Überblick über die aktuell verfügbaren und stabilen TYPO3-Pakete finden Sie auf der offiziellen Webseite unter: http://typo3.org/download/packages/ Und hier erhalten Sie eine Liste mit den verschiedenen Installationspaketen: Dummy package Die dummy-*-Pakete enthalten ein leeres Gerüst und ergeben erst zusammen mit einem TYPO3 Source-Paket eine lauffähige TYPO3-Installation. Lizensiert für Markus Mueller
TYPO3 Source Die typo3_src-*-Pakete enthalten alle notwendigen Quellcodedateien für TYPO3. Die typo3_src+dummy-*-Pakete enthalten zusätzlich bereits das Dummy-Paket. Diese Aufteilung in TYPO3 Source- und Dummy-Paket kommt vor allem auf Unix-artigen Betriebssystemen zum Tragen. Dort ist es möglich, über sogenannte Symlinks (symbolische Links) einen TYPO3-Quellcode für mehrere TYPO3-Installationen zu nutzen. Unter Windows ist dieses Vorgehen ohne besondere Betriebssystemerweiterungen nicht möglich. Jedes dieser Pakete steht in den beiden Archivformaten ZIP (.zip) und TAR (.tgz) zur Verfügung. Prinzipiell gilt dabei: • Wählen Sie für Windows-Server das ZIP-Archiv, weil dieses für einen Einsatz ohne Symlinks gedacht ist. • Wählen Sie für Linux- und Mac-Systeme das TAR-Archiv, weil dieses für die Verwendung von Symlinks vorbereitet ist. Alle diese Pakete setzen voraus, dass die benötigten Komponenten Webserver, PHPSkriptinterpreter und Datenbank bereits funktionsfähig auf Ihrem System vorhanden sind.
Max. Linie
Max. Linie 1.2 Das richtige TYPO3-Paket auswählen und installieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 5
Links
Windows Zur Installation auf einem Windows-System wählen Sie folgendes Paket: typo3_src+dummy-*.zip
Das Paket entpacken Sie in das Hauptverzeichnis Ihres Webservers, das typischerweise mit htdocs/ bezeichnet ist.
Linux/Mac OS X Zur Installation auf einem Unix-System laden Sie am besten die folgenden Pakete getrennt herunter: typo3_src*.tgz dummy-*.tgz
Die beiden Pakete entpacken Sie jeweils in das Hauptverzeichnis Ihres Webservers. In diesem Fall brauchen Sie keine weiteren Anpassungen am Symlink des dummy-Pakets vorzunehmen.
Install-Tool aufrufen Lizensiert für Markus Mueller
Sind alle Dateien ausgepackt und befinden sich an der passenden Stelle, sollten Sie in Ihrem Browser die URL http://www.ihre-website.tld/typo3/install/ aufrufen. Bei einer Neuinstallation begrüßt Sie das Install-Tool mit dem 1-2-3-Modus, in den Sie die wichtigsten Parameter eingeben, um Ihre Installation abzuschließen. Wenn TYPO3 nicht auf dem lokalen Rechner installiert, ist müssen Sie zunächst noch im Verzeichnis typo3conf eine leere Datei mit der Bezeichnung ENABLE_INSTALL_TOOL anlegen. Dies ist eine zusätzliche Sicherheitsmaßnahme, um unberechtigte Zugriffe zu verhindern. Nach einer erfolgten Installation wird empfohlen, die Datei wieder zu löschen.
• Geben Sie den Benutzernamen, das Passwort und den Rechnernamen zur Verbindung mit der Datenbank ein. • Wählen Sie, so gewünscht, eine vorhandene Datenbank für Ihre TYPO3-Installation aus. Beachten Sie dabei, dass möglicherweise vorhandene Inhalte in dieser Datenbank dadurch verloren gehen! Alternativ können Sie eine Bezeichnung für eine neu zu erstellende Datenbank angeben. • Importieren Sie die notwendigen Datenbankdaten. Im 1-2-3-Modus wird dabei automatisch der Benutzer admin mit dem Passwort password angelegt. • Nach diesen ersten Schritten wechseln Sie in die Normalansicht des Install-Tools. Sie sollten nun unbedingt das Passwort Ihres Install-Tools ändern und unter Basic Configuration sowie All Configuration die Systemparameter prüfen und anpassen.
Max. Linie
• Nach dem ersten Login ins Backend mit dem Benutzer admin und dem Passwort password sollten Sie auf alle Fälle das Passwort ändern.
6 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts In Rezept 1.6 erhalten Sie Hilfestellung, um die Installation über den 1-2-3Modus hinaus anzupassen.
Weitere Hilfe zur Installation erhalten Sie im TYPO3-Wiki unter der folgenden URL: http://wiki.typo3.org/index.php/Category:Topic/installation
Diskussion Installer-Pakete Neben den reinen Source-Paketen gibt es einige Ready-to-go-Installationspakete. Diese stellen eine komplett lauffähige Umgebung bereit und beinhalten auch die benötigten Komponenten Apache, MySQL und PHP. Diese Pakete sollen einen einfachen Einstieg auch für diejenigen mit gar keiner bis wenig Erfahrung im Betrieb von Webservern ermöglichen. Grundsätzlich sind sie nicht für den Produktivbetrieb gedacht, vereinfachen die Nutzung von TYPO3 aber auf wenige Mausklicks. Eine Übersicht über diese Pakete finden Sie unter: Lizensiert für Markus Mueller
http://typo3.org/download/installers/
Beispielprojekte Neben den Basis-Installationspaketen gibt es spezielle TYPO3-Pakete, mit denen Sie Beispielprojekte in Ihre TYPO3-Installation einspielen können. Diese sind vor allem zur Analyse und als Anschauungsbeispiele hilfreich: QuickStart package Die Website eines fiktiven Fußballvereins. Ein Paket, das zum Ausprobieren und Stöbern einlädt. Besondere Merkmale: Ein Admin-Benutzer und ein Redakteur sind schon vorhanden. Mehrere Extensions sind dabei, sodass umgehend gearbeitet werden kann. Nicht für den Produktivbetrieb gedacht. Testsite package Dieses Paket enthält mehrere Websites, in denen exemplarisch unterschiedliche Szenarien und Beispiele vorinstalliert sind. Besondere Merkmale: Enthält zahlreiche Beispiele zur Lösung unterschiedlicher Problemstellungen mit TypoScript und PHPErweiterungen, Muster für alle Arten von Menüs und die dynamische Grafikerzeugung. Ebenfalls nicht für den Produktivbetrieb gedacht.
Max. Linie
Diese beiden Pakete enthalten möglicherweise noch TYPO3-Sourcen in Version 3.8.1 Nach der Installation kann aber problemlos wie in Rezept 2.1 beschrieben ein Update der Sourcen auf eine aktuelle TYPO3-Version vorgenommen werden.
1.2 Das richtige TYPO3-Paket auswählen und installieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 7
Siehe auch
Links
In Rezept 1.6 erfahren Sie, wie Sie Ihre Installation über den 1-2-3-Modus hinaus anpassen. Sollten Sie bei der Installation Fehlermeldungen erhalten, lernen Sie in Rezept 1.10 die Gründe für die am häufigsten auftretenden Meldungen kennen. In Rezept 2.1 erfahren Sie, wie Sie Ihre TYPO3-Installation aktualisieren. Bleiben Sie auf dem aktuellsten Stand, indem Sie sich den RSS-Feed auf der Website http://news.typo3.org/xml-feeds/ abonnieren.
1.3
Eine Entwicklerversion von TYPO3 verwenden
Problem Sie möchten die aktuellste TYPO3-Version testen, bevor sie öffentlich zum Download angeboten wird, etwa um ein neues Feature frühzeitig zu evaluieren oder Bugfixes zu testen. Wenn Sie selbst Bugfixes erstellen möchten, sollten Sie dafür auch die aktuellste Entwicklerversion nutzen, um sicherzustellen, dass Ihre Änderungen auch mit den anderen Änderungen am Code zusammenspielen. Die Entwicklerversionen sind zwar in aller Regel stabil, von einem produktiven Einsatz ist jedoch abzusehen. Lizensiert für Markus Mueller
Lösung Holen Sie sich die aktuellsten Quelldateien aus dem TYPO3-Subversion-Repository von dieser Adresse: https://svn.typo3.org/ Um die Dateien herunterladen zu können, müssen Sie die Adresse noch entsprechend erweitern: Die veröffentlichten stabilen Releases von TYPO3 4.x finden Sie unter: https://svn.typo3.org/TYPO3v4/Core/tags/ Die Entwicklungszweige für die stabilen Releases von TYPO3 4.x befinden sich in: https://svn.typo3.org/TYPO3v4/Core/branches/ Den jeweils aktuellsten Entwicklungsstand für das nächste Release von TYPO3 4.x erhalten Sie hier: https://svn.typo3.org/TYPO3v4/Core/trunk/ Legen Sie mit Ihrem Subversion-Client eine lokale Arbeitskopie des gewünschten SourceZweigs an.
Max. Linie
Mit dem folgenden svn-Kommando laden Sie den aktuellen Stand des Release-Zweigs 4.2 in das lokale Verzeichnis TYPO3_4-2: svn co https://svn.typo3.org/TYPO3v4/Core/branches/TYPO3_4-2
8 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Diskussion TYPO3 ist ein Open Source-Projekt mit einer weltweiten Entwicklergemeinde. Mehrere Entwickler arbeiten von verschiedenen Orten aus gleichzeitig am Programmcode. Diese verteilte Entwicklung ist nur mithilfe von Source-Code-Management (kurz SCM) zu bewältigen. TYPO3 setzt als SCM-Werkzeug das freie Subversion (SVN) ein. Subversion versioniert den Programmcode und protokolliert detailliert alle Änderungen am Code. Änderungen können dadurch zum Beispiel sichtbar und notfalls auch rückgängig gemacht werden. Über den Subversion-Server https://svn.typo3.org/ besteht jederzeit lesender Zugriff auf die aktuellen Ressourcen des TYPO3-Projekts. Wenn Sie die Adresse in Ihren Webbrowser eingeben, können Sie sich durch die Verzeichnisstruktur der einzelnen Projekte klicken. Um sich die Quelldaten auf den lokalen Rechner zu laden, benötigen Sie jedoch entweder einen sogenannten Subversion-Client, also ein Programm, das mit dem SVN-Protokoll umgehen kann, oder Sie greifen über die WebDav-Schnittstelle Ihres Betriebssystems direkt auf den Webserver zu und laden sich die gewünschten Verzeichnisse herunter.
Lizensiert für Markus Mueller
Der Subversion-Client ist in vielen aktuellen Entwicklungsumgebungen für PHP bereits enthalten. Eine ausführliche Liste an Subversion-Clients finden Sie unter http://subversion.tigris.org/. In Mac OS X und Windows kann das SVN-Repository auch als Netzwerklaufwerk eingebunden werden. Unter Max OS X richten Sie die Netzwerkressource mit diesen Schritten ein: • Öffnen Sie im Finder mit Apfel + K das Fenster Mit Server verbinden. • Geben Sie dort in das Feld Serveradresse die gewünschte URL ein. • Bestätigen Sie Ihre Eingabe mit dem Button Verbinden. • Danach steht Ihnen unter Freigaben ein neues Laufwerk zur Verfügung. Um die Netzwerkressource unter Windows einzurichten, gehen Sie wie folgt vor: • Öffnen Sie die Windows-Netzwerkumgebung und wählen Sie den Punkt Netzwerkumgebung hinzufügen. Klicken Sie dann zweimal auf den Button Weiter. • Geben Sie die gewünschte URL in das Eingabefeld ein. Bestätigen Sie Ihre Eingabe wieder durch einen Klick auf Weiter. • Ändern Sie die Bezeichnung der Ressource nach Wunsch. Bestätigen Sie das Anlegen mit einem Klick auf Fertigstellen. Auf diese Weise haben Sie jederzeit bequemen Zugriff auf den aktuellsten Quelltext und können wie gewohnt Dateien lesen und auf die Festplatte kopieren.
Max. Linie
Eine lokale Versionskontrolle ist jedoch im Gegensatz zum Checkout mit dem SVN-Client bei dieser Methode nicht möglich, da die Daten nur vom Server geladen werden und lokal keine automatische Versionierung angelegt wird.
1.3 Eine Entwicklerversion von TYPO3 verwenden | 9 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Siehe auch
Links
Weitere Informationen zu Subversion finden Sie unter der Webadresse http://subversion. tigris.org. Viele TYPO3-Extensions werden auch mit Subversion verwaltet und können unter https://svn.typo3.org/TYPO3v4/Extensions/ abgerufen werden. Als weiterführende Literatur zum Thema Subversion empfehlen wir das Buch Versionskontrolle mit Subversion von Ben Collins-Sussman, Brian W. Fitzpatrick & C. Michael Pilato, O’Reilly Verlag.
1.4
Die Ordnerstruktur verstehen
Problem Sie möchten sich in Ihrer TYPO3-Installation zurechtfinden und Dateien oder Ordner richtig zuordnen.
Lösung Lizensiert für Markus Mueller
Die Ordnerstruktur einer TYPO3-Installation ist in zwei Teile aufgeteilt: Zum einen gibt es Dateien und Ordner, die den TYPO3-Kern über das sogenannte Source-Paket bilden. Zum anderen enthält die TYPO3-Installation bestimmte Ordner, die projektspezifische Daten speichern. Diese Ordner werden auch als Dummy-Paket bezeichnet und zusammengefasst. Der TYPO3-Kern besteht aus den Ordnern misc, t3lib und typo3 sowie deren Unterordnern und der Datei index.php. Die Textdateien enthalten spezielle Informationen zur Verwendung von TYPO3. • Im Ordner misc liegen diverse Dateien, die für den Betrieb von TYPO3 nicht notwendig sind. Wenn Sie keine dieser Dateien benötigen, können Sie diesen Ordner auch ruhigen Gewissens entfernen. • Im Ordner t3lib finden Sie sämtliche Programmbibliotheken und Vorgaben, die essenziell für die Kernfunktionen von TYPO3 sind. • Im Ordner typo3 liegen die Dateien, über die das TYPO3-Backend sowie wichtige System-Extensions bereitgestellt werden, die notwendig sind, damit Sie über das Backend komfortabel Inhalte eingeben und wieder über die TypoScript-Engine ausgeben können. Besonderes Augenmerk gilt dabei der System-Extension cms im Ordner typo3/sysext/.
Max. Linie
• Die Dateien README.txt und INSTALL.txt geben Antworten auf allgemeine Fragen zu TYPO3 und der Installation. In den beiden Dateien LICENSE.txt und GPL.txt werden lizenztechnische Belange beschrieben. Wenn Sie unsicher sind, ob Sie TYPO3 in Ihrem gewünschten Umfeld einsetzen dürfen, sollten Sie diese Dateien lesen.
10 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Die Dateien des TYPO3-Kerns sollten Sie unberührt lassen und mit einem Schreibschutz versehen, um sie vor versehentlichen Änderungen zu schützen. Wenn Sie allerdings globale Extensions installieren möchten, sollte der Webserver für den Ordner typo3/ext/ Schreibrechte besitzen. Den TYPO3-Kern können Sie über Extensions sehr flexibel erweitern und anpassen (in Kapitel 15 und folgenden erfahren Sie mehr über diese Erweiterungsmöglichkeiten). Änderungen an diesen Dateien sind nur in sehr speziellen Fällen nötig und sollten ausschließlich von sehr erfahrenen Anwendern durchgeführt werden. Bei einem Update werden nur diese Ordner und Dateien aktualisiert. Projektspezifische Dateien werden hingegen in den Ordnern fileadmin, typo3conf, typo3temp und uploads gespeichert. Hier werden TYPO3-Erweiterungen (Extensions), CacheDateien sowie sämtliche Konfigurations- und Grafikdateien abgelegt. Diese Ordner müssen vom Webserver beschrieben werden können. Die Datei _.htaccess können sie als Vorlage für eine individuelle .htaccess-Datei verwenden oder löschen, wenn Sie nicht benötigt wird. Die Datei clear.gif dient als Platzhaltergrafik für Positionierungen und ist vor allem noch aus historischen Gründen vorhanden, da sie beispielsweise im Backend oft zur Positionierung von Formularelementen genutzt wird. Bei einem Update auf eine neue TYPO3-Version bleiben diese Ordner und die genannten Dateien unberührt.
Lizensiert für Markus Mueller
Diskussion TYPO3 ist sehr modular aufgebaut. So besteht der TYPO3-Kern aus weit über 500 PHPDateien und -Klassen, die beispielsweise die Basisfunktionalitäten zur Benutzerverwaltung, für Datenbankoperationen, das Dateihandling oder die Formularerzeugung bereitstellen. Diese Dateien sind je nach Anwendungsbereich in mehrere Unterordner gegliedert. Im Folgenden finden Sie Informationen zu den Aufgaben und Funktionen der einzelnen Ordner und Dateien, die Sie dabei unterstützen sollen, sich in der Struktur von TYPO3 besser zurechtzufinden. Diese Informationen dienen auch als Grundlage für eine Reihe von Rezepten in diesem Kochbuch – hier können Sie nach Bedarf die Details nachlesen. Diese Struktur finden Sie standardmäßig wieder, wenn Sie das Wurzelverzeichnis Ihrer TYPO3Installation öffnen: fileadmin misc/ t3lib typo3/ typo3conf typo3temp uploads
Max. Linie
Alle hervorgehobenen Ordner oder Dateien befinden sich im Source-Paket, das Sie mit einem Schreibschutz versehen sollten. Die restlichen Ordner müssen inklusive aller Unterordner für den Webserver beschreibbar sein.
1.4 Die Ordnerstruktur verstehen | 11 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
fileadmin/ In diesem Ordner können Sie beliebige Dateien ablegen und verwalten. Sämtliche Unterordner können Sie mit dem Modul Dateiliste über das Backend verwalten. Der Webserver muss diesen Ordner samt Unterordner beschreiben können, wenn Sie dieses Modul einsetzen möchten.
Links
misc/ In diesem Ordner finden Sie diverse Vorlagen für Sprach-, SQL- und .htaccessDateien. Außerdem gibt Ihnen die Datei superadmin.php nützliche Funktionen an die Hand, mit denen Sie mehrere TYPO3-Installationen komfortabel verwalten können. Dieser Ordner sollte daher nicht öffentlich zugänglich sein und in Produktivumgebungen gelöscht werden. Weitere Informationen zur Datei superadmin.php finden Sie im Quellcode der Datei.
Lizensiert für Markus Mueller
t3lib/ In diesem Ordner befinden sich sämtliche TYPO3-Codebibliotheken, die für den Betrieb von TYPO3 essenziell sind. Diese Funktionen bilden das TYPO3-Framework, auf das Sie beispielsweise auch in eigenen Projekten zugreifen können. Da es sich um eine Bibliothek handelt, werden diese PHP-Dateien nie direkt vom Browser aufgerufen. In der Datei config_default.php werden sämtliche Voreinstellungen für die Systemparameter festgelegt. Diese Standardwerte können Sie bequem über das Install-Tool anpassen. Sämtliche Werte, die Sie hierüber festlegen, werden in die Datei localconf.php geschrieben und überschreiben damit automatisch diese Standardwerte. Im Unterordner stddb finden Sie die grundlegende Tabellenkonfiguration, die für den Betrieb von TYPO3 notwendig ist. Diese Minimalkonfiguration wird anschließend über Extensions ausgebaut. Ändern Sie niemals Werte direkt in der Datei config_default.php. Um die Werte anzupassen, sollten Sie das Install-Tool oder eigene Extensions verwenden. Die Werte überschreiben Sie dann entweder über die Datei localconf.php im Ordner typo3conf oder über ext_localconf.php-Dateien in den Extension-Ordnern. t3lib/interfaces/ In diesem Ordner liegen Interface-Definitionen, die von TYPO3 genutzt werden, um Schnittstellen in der TYPO3-API fest zulegen.
Max. Linie
t3lib/stddb/ In diesem Ordner finden Sie Dateien, in denen die Vorgabewerte für die grundlegenden TYPO3-Tabellen gesetzt werden (daher auch der Name stddb für standard database). Dazu gehören beispielsweise die Standardwerte für Seitentypen, Backend-Farben sowie Feldbeschriftungen und die wichtigsten Inhalte für die Kontexthilfe. Ändern Sie diese Voreinstellungen niemals direkt in diesen Dateien, sondern verwenden Sie dazu Extensions. Die Werte der Datei tables.php überschreiben Sie über ext_tables. php-Dateien, die Sie in den Extension-Ordnern anlegen. In diesem Kochbuch finden Sie zahlreiche Anwendungsbeispiele dazu, wie Sie diese Methode effektiv einsetzen. In den Kapiteln 15, 16 und 17 erfahren Sie mehr über Extensions Rezept 6.7 zeigt beispielsweise, wie Sie Eingabeformulare im Backend anpassen können.
12 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
typo3/ In diesem Ordner sind sämtliche Dateien abgelegt, die für Darstellung und Funktionen des TYPO3-Backends zuständig sind. Wenn Sie diesen Ordner über die Adresszeile in Ihrem Browser ansprechen, erreichen Sie das Backend Ihrer TYPO3Installation und können Ihre Website bearbeiten und verwalten. In Rezept 3.4 erfahren Sie, wie Sie diesen Ordner gegen Fremdzugriffe absichern oder umbenennen können. typo3/classes/ Der Ordner enthält Klassen, die Kernfunktionen im Backend bereitstellen, wie zum Beispiel die seitenübergreifende Suche oder das Menü zum Leeren der unterschiedlichen Caches. typo3/contrib/ In diesem Ordner werden Softwarebibliotheken von Drittanbietern abgelegt. typo3/css/ In diesem Ordner werden separate modulare CSS-Dateien verwaltet, die für die Darstellung des Backends verantwortlich sind.
Lizensiert für Markus Mueller
typo3/ext/ In diesem Ordner legen Sie global verfügbare Extensions ab. Global verfügbar bedeutet, dass diese Extensions für sämtliche TYPO3-Installationen zur Verfügung stehen, die diesen TYPO3-Kern verwenden. Dieses Verzeichnis muss existent sein, auch wenn keine globalen Extensions vorhanden sind. Außerdem muss der Webserver in dieses Verzeichnis schreiben können, wenn Sie globale Extensions installieren möchten. typo3/gfx/ In diesem Ordner finden Sie alle Grafiken, die im TYPO3-Backend verwendet werden. Manche davon werden auch im Frontend benutzt, beispielsweise wenn Sie Seiteninhalte im Frontend bearbeiten (in Rezept 4.7 erfahren Sie mehr über diese Bearbeitungsmöglichkeit). typo3/install/ In diesem Ordner befindet sich die Installationsroutine von TYPO3. Wenn Sie das TYPO3-Backend zum ersten Mal aufrufen, werden Sie automatisch zu diesem Ordner geführt, um Ihre TYPO3-Installation einzurichten. In Rezept 1.2 erfahren Sie mehr über die grundlegenden Installationsschritte. Haben Sie die Installation abgeschlossen, sollten Sie diesen Ordner entfernen oder zumindest gegen Fremdzugriff schützen, indem Sie die Datei ENABLE-INSTALL-TOOL aus dem Verzeichnis typo3conf/ entfernen. typo3/interfaces/ In diesem Ordner liegen Interface-Definitionen, die dazu genutzt werden, Schnittstellen im TYPO3-Backend zu vereinheitlichen.
Max. Linie
Max. Linie 1.4 Die Ordnerstruktur verstehen | 13 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
typo3/js/ Dieser Ordner dient der Speicherung von JavaScript-Dateien, die für Benutzeraktionen im Backend verantwortlich sind.
Links
typo3/sysext/cms/tslib/ In diesem Ordner finden Sie Dateien, die für die Darstellung der Inhalte auf den einzelnen Webseiten sorgen, daher erwähnen wir diese Extension explizit. Sie bildet die Grundlage für die CMS-Eigenschaften von TYPO3 sowie für die TypoScript-Implementierung. Beispielsweise werden in der Datei class.tslib_content.php sämtliche Inhaltsobjekte definiert, die Sie über TypoScript verwenden können. Die Kapitel 8-14 befassen sich eingehend mit den Möglichkeiten von TypoScript. typo3/templates/ In diesem Ordner finden Sie HTML-Templates, die für die Darstellung des TYPO3Backends eingesetzt werden.
Lizensiert für Markus Mueller
typo3conf/ In diesem Ordner liegen Konfigurationsdateien, über die Sie Einstellungen für die lokale TYPO3-Installation vornehmen können. Außerdem speichert TYPO3 in diesem Ordner standardmäßig die Konfiguration aller aktiven Extensions in CacheDateien. Diese Cache-Dateien beginnen mit dem Präfix temp_CACHED_. In der Datei localconf.php speichert TYPO3 sämtliche Einstellungen, die Sie über das InstallTool vornehmen, wie etwa das Passwort für das Install-Tool, die Zugangsdaten für die Datenbank oder die Liste der momentan aktiven Extensions. Über die Datei extTables.php können Sie zusätzliche Einstellungen an den tables.php-Werten vornehmen. Wir empfehlen die Verwendung dieser Datei nur sehr erfahrenen Benutzern und ziehen hier im TYPO3 Kochbuch Anpassungen von tables.php-Inhalten über eigene Extensions vor. Der Webserver muss dieses Verzeichnis sowie die Datei localconf.php beschreiben können, da TYPO3 sonst keine Cache-Dateien anlegen kann und Konfigurationseinstellungen nicht in der Datei localconf.php verwaltet werden können. typo3conf/ext/ In diesem Ordner finden Sie sämtliche lokalen Extensions. Diese Extensions sind ausschließlich für die jeweilige TYPO3-Installation gültig und stehen nicht – wie beispielsweise globale oder System-Extensions – für weitere Installationen zur Verfügung (in Kapitel 15 erfahren Sie mehr über die unterschiedlichen Extension-Typen). Dieser Ordner muss vom Webserver beschrieben werden können, damit es möglich ist, lokale Extensions zu installieren.
Max. Linie
typo3conf/l10n/ In diesem Ordner befinden sich die jeweiligen Sprachdateien für die Übersetzungen der TYPO3-Oberfläche. Dabei enthält dieser Ordner, je nachdem, welche Sprachpakete Sie installiert haben, weitere Unterordner, die wiederum – abhängig von den installierten Extensions – in unterschiedliche Ordner gegliedert sind. Der Ordnername l10n steht für den englischen Begriff »localization« (die 10 Zeichen zwischen l und n werden dabei der Einfachheit halber durch die 10 ersetzt). Dieser Ordner muss
14 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
vom Webserver beschrieben werden können, wenn Sie lokale Sprachpakete installieren möchten. typo3temp/ In diesem Ordner finden Sie temporäre Dateien, die von TYPO3 erzeugt werden, um Daten zwischenzuspeichern. Dies können beispielsweise Bilddateien sein, die TYPO3 für grafische Menüs oder Bildverkleinerungen erzeugt. Da der Ordner im Laufe der Zeit sehr umfangreich wird, sollten Sie daraus in regelmäßigen Abständen nicht benötigte Dateien entfernen (Rezept 2.6 beschreibt Funktionen, die Ihnen diese Arbeit erleichtern). Dieser Ordner muss vom Webserver beschrieben werden können, damit TYPO3 diese temporären Dateien anlegen kann.
Lizensiert für Markus Mueller
uploads/ In diesem Ordner befinden sich Dateien, die über das Backend mit Inhaltselementen verknüpft wurden. Der Hintergrund hierfür ist folgender: TYPO3 kopiert standardmäßig jede Datei, die mit einem Inhaltselement verknüpft wird, in diesen Ordner (oder einen entsprechenden Unterordner). Ist die Datei dort schon vorhanden – etwa, weil sie bereits mit einem anderen Inhaltselement verknüpft wurde –, fügt TYPO3 dem Dateinamen einen fortlaufenden Zahlenwert an. Außerdem legt TYPO3 in der Datenbanktabelle eine entsprechende Verknüpfung zu dieser eindeutigen Datei ab. So ist sichergestellt, dass die Datei stets eindeutig zugeordnet werden kann und der Inhalt auf der Website auch dann vollständig erhalten bleibt, wenn die ursprüngliche Datei gelöscht wird. Zusätzlich ordnet TYPO3 diese Dateien je nach Verwendung in weitere Unterordner. So finden Sie beispielsweise Bilder im Unterordner pics. PDF-Dokumente und Multimedia-Dateien speichert TYPO3 im Ordner media. Dateien, die mit Datensätzen von Extensions verknüpft sind, werden wiederum in Ordnern gespeichert, deren Namen sich aus einem tx_ sowie dem Extension-Key zusammensetzen. Der Ordner uploads/ muss samt Unterordnern vom Webserver beschrieben werden können, damit die Dateien mit den Inhaltselementen verknüpft werden können. Im Wurzelverzeichnis liegen noch folgende Dateien: /_.htaccess In dieser Datei finden Sie eine vollständig kommentierte Vorlage für eine individuelle .htaccess-Datei, mit der Sie für die jeweilige TYPO3-Installation Einstellungen am Apache-Webserver vornehmen können. Die Vorgaben dienen als Orientierung für die gebräuchlichsten Einstellungen am Apache-Webserver und können je nach Anforderungen angepasst und erweitert werden. Um die Datei zu verwenden, müssen Sie den Unterstrich vor dem Dateinamen entfernen. /clear.gif Eine 1 x 1 Pixel große, transparente GIF-Grafik, die – mehr aus historischen Gründen – vor allem im Backend und im Admin-Panel für die Positionierung oder Darstellung von Eingabeformularen verwendet wird.
Max. Linie
Max. Linie 1.4 Die Ordnerstruktur verstehen | 15 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
/index.php Diese Datei bindet die zentrale Datei index_ts.php der System-Extension cms ein und wird bei jedem Seitenaufruf im Frontend verarbeitet. In der Datei index_ts.php werden zentrale Prozesse für die Erstellung der Webseite koordiniert und Seiteninhalte gemäß der jeweiligen TypoScript-Anweisungen ausgegeben. Sie spielt daher in der Darstellung der Website eine entscheidende Rolle. Die ursprüngliche Quelldatei finden Sie im Ordner typo3/sysext/cms/tslib/.
Links
Zusätzlich können noch weitere Dateien vorhanden sein, die für das Verständnis der Ordnerstruktur nicht entscheidend sind, jedoch nützliche Hintergrundinformationen über das TYPO3-Projekt oder die verwendete TYPO3-Version liefern und erste Schritte erläutern: ChangeLog In dieser Datei werden von sämtlichen Kernentwicklern die Änderungen am Programmcode protokolliert. Wenn Sie erfahren möchten, was sich zwischen zwei Versionen geändert hat, sollten Sie einen Blick in diese Datei werfen. GPL.txt Diese Datei enthält eine vollständige Kopie der GNU GENERAL PUBLIC-Lizenz, unter der TYPO3 vertrieben wird. Lizensiert für Markus Mueller
INSTALL.txt Diese Datei beschreibt erste Installationsschritte. Tiefer gehende Details zur Installation können Sie Rezept 1.2 entnehmen. LICENSE.txt Diese Datei enthält weitere Anmerkungen über die Lizenzbestimmungen von TYPO3. Details zu diesen Bestimmungen erfahren Sie auch auf der Webseite http://typo3.com/ License.1316.0.html. NEWS.txt Diese Datei erläutert Änderungen und Verbesserungen im Programmcode, gegliedert in Kategorien wie Backend, TypoScript oder wichtige Bugfixes. README.txt Diese Datei liefert viele allgemeine Hintergrundinformationen zu TYPO3. RELEASE_NOTES.txt Diese Datei liefert Anmerkungen und Hinweise zur aktuellen Version. Wenn Sie ein Update auf eine neue Version planen, sollten Sie vorab die Release-Notes lesen, um sich über die Neuerungen dieser Version einen Überblick zu verschaffen. Alle ReleaseNotes werden im TYPO3-Wiki gespeichert. Unter dieser Adresse finden Sie eine Liste aller Release-Notes: http://wiki.typo3.org/Category:ReleaseNotes.
Max. Linie
TODO.txt Diese Datei dient den Entwicklern als Notizblock für offene Punkte. Lesen Sie Rezept 20.2, um zu erfahren, wie Sie mithelfen können, diese Liste zu verkleinern.
16 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Siehe auch In Rezept 3.4 wird erläutert, wie Sie den Ordner typo3/ umbenennen können. In Rezept 2.5 erfahren Sie mehr über die Datenbankstruktur von TYPO3. Weiterführende Informationen zu Interfaces finden Sie im PHP-Handbuch unter der Adresse http://www. php.net/manual/de/language.oop5.interfaces.php.
1.5
Systemparameter ermitteln und verstehen
Problem Sie möchten die aktuellen TYPO3-Einstellungen einsehen oder suchen eine Möglichkeit, die passenden Optionen zu finden, beispielsweise um einen bestimmten Systemparameter anzupassen.
Lösung Lizensiert für Markus Mueller
Wechseln Sie in das Modul Konfiguration im Bereich Admin-Werkzeuge. Dort erhalten Sie Einblick in sämtliche Wert der aktuellen Systemvariablen, mit denen TYPO3 momentan arbeitet. Über den Baum können Sie komfortabel alle Wertepaare einsehen. Klicken Sie auf einen Wert, erscheint ein Feld, aus dem Sie die entsprechende Variable samt Wert kopieren können. Diesen Wert können Sie wiederum in eigenen Extensions anpassen. Entscheiden Sie nun über die Auswahlliste, welchen Variablenbereich Sie über die Baumstruktur einsehen wollen. $TYPO3_CONF_VARS Im Array $TYPO3_CONF_VARS werden alle grundlegenden TYPO3-Einstellungen gespeichert. Dazu zählen Installationsoptionen und Extension-Parameter. In der Diskussion dieses Rezepts werden die einzelnen Unterbereiche dieses Arrays tiefer gehend beleuchtet. Die Werte innerhalb von $TYPO3_CONF_VARS können Sie über eigene Extensions in der Datei ext_localconf.php anpassen. $TCA (tables.php) Im Bereich $TCA (tables.php) finden Sie sämtliche Informationen über das Table Configuration Array, in dem TYPO3 Informationen über die vorhandenen Datenbanktabellen und deren Felder speichert. Das TCA spielt außerdem eine zentrale Rolle im Zusammenspiel von Datenbanken mit der Eingabemaske (Näheres über die einzelnen TCA-Eigenschaften erfahren Sie in Rezept 16.3). Werte im TCA können Sie über eigene Extensions in der Datei ext_tables.php anpassen.
Max. Linie
$TYPO3_LOADED_EXT $TYPO3_LOADED_EXT zeigt eine Übersicht der momentan aktiven Extensions. Wenn Sie die Einträge mit dem Pluszeichen öffnen, erhalten Sie weitere Informationen, und zwar zum Extension-Typ, den Pfadangaben und den Pfaden zu den relevanten Dateien der Extension, wie etwa ext_tables.php, ext_tables.sql und ext_localconf.php.
1.5 Systemparameter ermitteln und verstehen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 17
Max. Linie
$TBE_STYLES Im Array $TBE_STYLES speichert TYPO3 sämtliche Angaben, die das Erscheinungsbild des Backends beeinflussen (der Variablenname liest sich daher auch TYPO3 Backend-Styles). Indem Sie diese Werte anpassen, beeinflussen Sie die Darstellung und können beispielsweise eine völlig neue Farbumgebung schaffen.
Links
Wenn Sie sich mit dem grundlegenden Aufbau der hier aufgeführten Arrays vertraut machen, können Sie über dieses Modul sehr schnell Werte ermitteln, die Sie dann über eigene Extensions anpassen.
Diskussion Bevor Sie Änderungen an den oben genannten TYPO3-Einstellungen vornehmen, sollten Sie genau wissen, was Sie tun. Die folgende Übersicht zeigt die Anwendungsbereiche mit Schwerpunkt auf der Extension-Entwicklung. Sie soll Ihnen helfen, sich schneller innerhalb der umfangreichen Einstellungsmöglichkeiten zurechtzufinden. Vor allem die Bereiche $TYPO3_CONF_VARS und $TCA (tables.php) spielen bei der Extension-Entwicklung eine entscheidende Rolle und werden daher im Folgenden genauer beleuchtet.
$TYPO3_CONF_VARS Lizensiert für Markus Mueller
Wie der Name schon andeutet, speichert dieses Array sämtliche Konfigurationsvariablen von TYPO3. Wenn Sie mit den Installationsoptionen aus Rezept 1.6 schon vertraut sind, werden Sie feststellen, dass die Einstellungen, die Sie im Install-Tool oder über Extensions vornehmen, hier übersichtlich als Baum dargestellt werden. Die Unterbereiche von $TYPO3_CONF_VARS haben dabei folgende Bedeutung: GFX Einstellungen für die grafischen Bearbeitungsfunktionen. SYS Grundlegende Systemeinstellungen, die sowohl das Backend als auch das Frontend betreffen. EXT Einstellungen für den Umgang mit Extensions, die sowohl das Backend als auch – indirekt – das Frontend betreffen. BE Backend-Einstellungen. FE Frontend-Einstellungen.
Max. Linie
MODS Hier wurden früher Einstellungen für Backend-Module gespeichert. Dieses Vorgehen ist veraltet, da diese Einstellungen nun in den Backend-Modulen selbst vorgenommen werden. Dieser Punkt wird daher nur der Vollständigkeit halber erwähnt.
18 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
USER Hier wurden früher Parameter für eingebundene PHP-Skripten gespeichert. Dieses Vorgehen wird seit der Version 3.5 durch den Extension-Mechanismus ersetzt, dieser Punkt wird daher nur der Vollständigkeit halber erwähnt. In Rezept 18.1 erfahren Sie, wie Sie diesen Mechanismus effektiv nutzen und TypoScript als zentralen Konfigurationsmechanismus in eigenen Extensions verwenden können. SC_OPTIONS Script-Class-Optionen, über die TYPO3 die Verwendung von sogenannten Hooks verwaltet. EXTCONF Extension-Parameter, mit denen Sie Eigenschaften in Ihren Extensions beeinflussen können (in Rezept 17.14 erfahren Sie mehr über diese Möglichkeiten). SVCONF Parameter, mit denen TYPO3-Services gesteuert und konfiguriert werden.
Lizensiert für Markus Mueller
Mit den Pluszeichen öffnen und schließen Sie die jeweiligen Unterbereiche des Arrays. Wenn Sie einen Wert anklicken, öffnen Sie am Seitenanfang ein Textfeld, das die entsprechende Variable samt Wert ausgibt. Den Feldinhalt können Sie nun ausschneiden und beispielsweise in Ihrer Extension verwenden. Dadurch, dass TYPO3 automatisch die richtige Array-Struktur zu dem gewünschten Wert mit angibt, stellen Sie sicher, dass Sie den Wert eindeutig adressieren und problemlos in eigenen Skripten verwenden können. Achten Sie darauf, dass Sie die Werte in die Datei localconf.php oder ext_localconf.php einfügen, um sie zu verwenden. Beispielsweise können Sie über die Konfigurationseinstellungen den Cache für ExtensionEinstellungen deaktivieren. Besonders beim Entwickeln von Extensions können Sie so viel Zeit sparen, da Änderungen am Code umgehend ausgegeben werden (ansonsten müssten Sie nach jeder Codeänderung die den Konfiguratons-Cache manuell löschen). Stellen Sie sicher, dass Sie in der Menüauswahl die Option $TYPO3_CONF_VARS aktiviert haben. Öffnen Sie dann über das Plussymbol den Bereich EXT. Dort finden Sie nun sämtliche Einstellungen für die Extension-Verwaltung. Klicken Sie hier auf den Wert extCache, um sich die aktuelle Einstellung in dem Textfeld anzusehen. Standardmäßig zeigt dieses Feld $TYPO3_CONF_VARS['EXT']['extCache'] = 1;, was bedeutet, dass der Extension-Cache aktiviert ist. Kopieren Sie diesen Wert aus dem Textfeld in die Zwischenablage und öffnen Sie die Datei localconf.php. Fügen Sie den Wert nun unterhalb der bestehenden Konfigurationsparameter in einer neuen Zeile an und ändern Sie die 1 zu einer 0, um den Cache zu deaktivieren. Am Dateiende steht nun folgende Zeile, mit der Sie die Standardeinstellung überschreiben: $TYPO3_CONF_VARS['EXT']['extCache'] = 0;
Max. Linie
Wenn Sie das Modul Konfiguration neu laden, werden Sie sehen, dass der neue Wert nun auch hier angezeigt wird. Achten Sie darauf, dass Sie diese Einstellung wieder rückgängig machen, wenn Sie Ihre Website veröffentlichen, da Ihre Extension-Einstellungen ansonsten von TYPO3 nicht gecacht werden, was sich negativ auf die Serverperformance auswirkt.
1.5 Systemparameter ermitteln und verstehen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 19
Max. Linie
Links Um den jeweiligen Parameter besser zu verstehen, hat sich folgender Weg bewährt: Notieren Sie sich den Parameter, über den Sie mehr erfahren möchten. Wechseln Sie danach in das Install-Tool und wählen Sie dort den Menüpunkt All Configuration. Suchen Sie hier nach dem Parameter. Dieser wird in eckigen Klammern aufgeführt und ist in der Regel mit einer sehr ausführlichen Erklärung versehen. Nachdem Sie die Einstellungsmöglichkeiten kennen, können Sie den Parameter entsprechend anpassen.
$TCA (tables.php) Die Abkürzung $TCA steht für Table Configuration Array. In diesem Array speichert TYPO3 sämtliche Einstellungen für die in TYPO3 verwendeten Datenbanktabellen. Der geklammerte Dateiname tables.php symbolisiert, dass in diesem Array sämtliche Informationen aus der Datei tables.php gesammelt werden.
Lizensiert für Markus Mueller
Dabei hat dieser Dateiname eher einen symbolischen Charakter, denn TYPO3 erstellt das endgültige TCA über mehrere Schritte: Zuerst wird die Standardkonfiguration in der Datei t3lib/stddb/tables.php festgelegt. Dort werden grundlegende Tabelleneinstellungen vorgenommen. Zusätzlich werden auch noch andere Werte initialisiert, die für die Verwendung von TYPO3 unbedingt notwendig sind, jedoch keinen Einfluss auf das TCA haben. Über Extensions wird diese Grundkonfiguration dann weiter ausgebaut. TYPO3 liest nach der Initialisierung zuerst die Informationen der aktiven System-Extensions aus. Daraufhin werden die globalen Extensions und am Ende die lokalen Extensions berücksichtigt. Innerhalb der Extensions wird die Tabellenstruktur automatisch durch die jeweilige Datei ext_tables.php erweitert, sofern diese vorhanden ist. Anhand des Dateinamens erkennt TYPO3 diese Dateien und sammelt sie nacheinander zu einer großen tables.php-Datei, in der letztendlich die vollständigen Tabelleninformationen aller in TYPO3 verwendeten Tabellen gespeichert sind. In Wirklichkeit setzt sich diese Datei also aus der ursprünglichen tables.php im Ordner t3lib/stddb/ und sämtlichen ext_tables.php-Dateien der aktiven Extensions zusammen. Im Modul Konfiguration werden die Tabellen der relevanten Extensions als erste Baumebene dargestellt. Wenn Sie diese Tabellen mit der eigentlichen Datenbankstruktur vergleichen, werden Sie feststellen, dass einige Tabellen hier ausgeblendet sind. Bei diesen Tabellen handelt es sich um Systemtabellen, die TYPO3 ausschließlich für interne Prozesse benötigt und die daher über keine TCA-Eigenschaften verfügen.
Max. Linie
Tabellen müssen im TCA registriert sein, damit Sie beispielsweise deren Datensätze über Backend-Eingabeformulare pflegen können. Erst durch die TCA-Informationen kann TYPO3 die Backend-Formulare erzeugen. Außerdem wird im TCA auch gespeichert, wie sich die Datenbanktabelle im Backend verhalten soll. All diese Tabelleninformationen können Sie einsehen, wenn Sie auf das Pluszeichen einer Tabelle klicken. Unterhalb des Tabellennamens werden dann die einzelnen Unterbereiche aufgelistet, die alle einem
20 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Muster folgen und einen ganz bestimmten Sinn und Zweck haben. Die folgende Übersicht gibt Ihnen einen groben Überblick darüber. In Rezept 16.3 erfahren Sie mehr über den Aufbau des TCA, dessen Einstellungsmöglichkeiten und wie Sie eigene Tabellen in TYPO3 integrieren und dabei automatisch die entsprechenden TCA-Informationen anlegen. ctrl Legt die grundlegende Tabellendarstellung im Backend fest und wie die jeweiligen Datensätze von der TCE (der TYPO3 Core Engine) behandelt werden. interface Legt die Darstellung der einzelnen Datensätze im Backend fest. feInterface Legt die Felder fest, die über das Frontend angepasst werden können. columns Speichert sämtliche Einstellungen der Datenbankfelder für die Formulardarstellung im Backend. types Speichert die Feldkonfigurationen der einzelnen Datentypen.
Lizensiert für Markus Mueller
palettes Speichert die Feldkonfigurationen der zweiten Optionspalette. Die hier gezeigten Einstellungsmöglichkeiten sind sehr flexibel erweiterbar – in vielen Rezepten dieses Kochbuchs finden Sie Beispiele, in denen Sie die Grundeinstellungen über eigene Extensions anpassen. Bei der Extension-Erstellung werden Sie erfahrungsgemäß immer wieder auf diese Parameter zurückgreifen. Mit dem Modul Konfiguration haben Sie ein nützliches Tool an der Hand, das Ihnen bei der Suche nach dem richtigen Parameter sehr schnell weiterhelfen kann. Wenn Sie sich mit dieser Struktur vertraut machen, finden Sie die nötigen Parameter in kürzester Zeit. Beachten Sie, dass alle Werte aus der Datei localconf.php auch durch Extensions überschrieben werden können. Falls Ihre Einstellung einmal nicht übernommen wird, sollten Sie kontrollieren, ob eine andere Extension diese Einstellung überschreibt. Dafür ist es hilfreich zu wissen, dass Extensions in der Reihenfolge abgearbeitet werden, in der sie im Wert von $TYPO3_CONF_VARS ['EXT']['extList'] angegeben sind. Bevor Sie eine Extension installieren, sollten Sie daher stets prüfen, ob diese Systemparameter oder TCA-Angaben ändert, und stellen Sie dann sicher, dass Ihre Extension am Ende der Liste aufgeführt wird, damit diese Einstellung dann von Ihnen wieder überschrieben werden kann.
Siehe auch
Max. Linie
In Kapitel 16 erfahren Sie, wie Sie TYPO3 über Extensions an eigene Bedürfnisse anpassen können. Das Rezept 16.3 geht in der Diskussion detailliert auf die einzelnen Bereiche des TCA ein.
1.5 Systemparameter ermitteln und verstehen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 21
Max. Linie
1.6
Systemparameter anpassen
Links
Problem Sie möchten nachträglich Änderungen an den Grundeinstellungen von TYPO3 vornehmen, um so beispielsweise bestimmte Funktionen zu aktivieren oder individuell zu konfigurieren.
Lösung Ändern Sie die Systemparameter über das Modul Installation im Bereich Admin-Werkzeuge. Dieses Modul wird auch allgemein als Install-Tool bezeichnet. Dort können Sie Systemeinstellungen und die Zugangsdaten für die Datenbank anpassen. Außerdem stehen Ihnen nützliche Datenbankoperationen und Bearbeitungsfunktionen für Systemdateien zur Verfügung. Das Install-Tool läuft dabei völlig unabhängig von Ihrer eigentlichen TYPO3-Installation als eigenständige Applikation und kann dadurch auch direkt über die URL http://www.example.com/typo3/install/ aufgerufen werden.
Lizensiert für Markus Mueller
Wenn TYPO3 nicht auf dem lokalen Rechner installiert ist, müssen Sie zunächst noch im Verzeichnis typo3conf eine leere Datei mit der Bezeichnung ENABLE_INSTALL_TOOL anlegen. Dies ist eine zusätzliche Sicherheitsmaßnahme, um unberechtigte Zugriffe zu verhindern. Nach einer erfolgten Installation wird empfohlen, die Datei wieder zu löschen.
Bestätigen Sie den nun folgenden Hinweis und geben Sie das Passwort für den Zugang zum Install-Tool ein. Für diesen Zugang benötigen Sie besondere Rechte bzw. ein separates Passwort, das sich vom Administratorpasswort unterscheiden sollte (standardmäßig ist das Passwort joh316 voreingestellt). Je nachdem, welche Einstellungen Sie nun ändern möchten, wählen Sie über einen entsprechenden Menüeintrag den gewünschten Bereich. Diese Bereiche sind wie folgt aufgeteilt: Basic Configuration Hier können Sie die Zugriffsrechte des Webservers auf die wesentlichen Ordner kontrollieren oder Zugangsdaten für den Datenbankserver einrichten. Außerdem finden Sie hier Einstellungsmöglichkeiten für die Grafikfunktionen von TYPO3. Falls Sie hier ein gelbes Warndreieck oder ein rotes Stoppzeichen sehen, lesen Sie bitte die Lösung von Rezept 1.10. Dort werden diese Zeichen erklärt. Database Analyzer Hier kann die Datenbankstruktur überprüft werden (in Rezept 2.5 erfahren Sie Näheres zu diesem Menüpunkt).
Max. Linie
Update Wizard Ab Version 4.0 können ältere TYPO3-Versionen mit dem sogenannten Kompatibilitätsmodus simuliert werden (dieser Modus wird in Rezept 2.3 näher erläutert).
22 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Ebenso werden hier Update-Prozesse aufgelistet, die für die jeweilige TYPO3-Version notwendig sind, zum Beispiel Aktualisierungen der Datenbankinhalte. Image Processing Bildbearbeitungsfunktionen von TYPO3 testen. All configuration Diese Einstellungen repräsentieren die eigentlichen Installationsoptionen. Hier finden Sie sämtliche Einstellungsmöglichkeiten für TYPO3 (dort können Sie zum Beispiel individuelle Fehlerseiten festlegen oder das Cache-System beeinflussen). typo3temp/ Temporäre Dateien kontrollieren oder löschen. Clean up database Funktionen, um bestimmte Systemtabellen zu leeren. phpinfo() Allgemeine Informationen über Ihre TYPO3-Installation. Edit files in typo3conf/ Bearbeitungsmöglichkeiten für Dateien im Ordner typo3conf/.
Lizensiert für Markus Mueller
About Allgemeine Erklärungen zum Install-Tool. Außerdem können Sie hier das Passwort für den Zugang zum Install-Tool ändern. Um Zugriff auf alle Installationseinstellungen zu haben, wählen Sie nun den Eintrag All configuration. Dort finden Sie zahlreiche Einstellungsmöglichkeiten, die wiederum je nach Funktionsbereich in einzelne Abschnitte aufgeteilt sind. Im Abschnitt GFX (gesprochen Graphics) nehmen Sie beispielsweise Einfluss auf die grafischen Bearbeitungsfunktionen von TYPO3. Im Abschnitt FE finden Sie Einstellungen, die hauptsächlich die Darstellung der Website im Frontend betreffen. Wenn Sie Ihre Änderungen über den Button Write to localconf.php bestätigen, werden die Einstellungen in die Datei localconf.php geschrieben. Diese Datei liegt standardmäßig im Ordner typo3conf/. Sämtliche Parameter, die Sie über das Install-Tool einstellen, werden dort gespeichert. Nachdem Sie Ihre Änderungen durchgeführt haben, sollten Sie das InstallTool wieder deaktivieren. Es sollte nicht aktiv sein, wenn Ihre TYPO3-Installation öffentlich erreichbar ist.
Diskussion
Max. Linie
Die Standardeinstellungen werden von TYPO3 vorgegeben und entsprechen den allgemein gültigen Werten, die sich bei der Verwendung von TYPO3 bewährt haben. Diese Standardwerte werden in der Datei t3lib/config_default.php voreingestellt und können alle von eigenen Angaben in der Datei localconf.php überlagert werden. Da TYPO3 diese beiden Dateien nacheinander verarbeitet, werden die Standardwerte aus der Datei t3lib/config_
1.6 Systemparameter anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 23
Max. Linie
default.php mit den Einstellungen in der Datei localconf.php überschrieben. Die Standardeinstellungen sollten Sie daher unberührt lassen und immer über die Installationsoptionen anpassen.
Links
Wenn Sie Installationsoptionen über das Install-Tool anpassen, werden die neuen Werte immer am Dateiende angefügt. Bestehende Optionen werden überschrieben und nicht neu eingefügt. Sämtliche Installationsoptionen werden dabei im Array $TYPO3_CONF_VARS gespeichert. Wie der Name schon verdeutlicht, speichert dieses Array sämtliche TYPO3Konfigurationsvariablen. Es ist nochmals in einzelne Bereiche aufgeteilt, deren Verwendung in Rezept 1.5 besprochen wird. Dadurch, dass Sie im Laufe der Zeit mit diesem Prinzip vertraut werden, können Sie die Optionen auch von Hand in die Datei localconf.php einfügen. Achten Sie dann darauf, dass Sie eigene Optionen stets am Dateiende anfügen. Wir empfehlen Ihnen, die neuen Optionen mit einem aussagekräftigen Kommentar zu versehen und dadurch deren Verwendung deutlich zu machen. Vergewissern Sie sich vor dem Abspeichern dieser Datei, dass Sie alle Parameter richtig geschrieben haben und keine PHP-Fehler vorhanden sind. Sie können TYPO3 nicht verwenden, wenn sich ein Parsefehler in diese Datei eingeschlichen hat. Lizensiert für Markus Mueller
Siehe auch In Rezept 1.5 erfahren Sie, wie Sie mit dem Modul Konfiguration die Systemparameter einsehen können. Außerdem zeigt Ihnen dieses Rezept, wie das Array $TYPO3_CONF_VARS genau aufgebaut ist und wie Sie dessen Werte auch über eigene Extensions beeinflussen können. In den Rezepten von Kapitel 5, 6 und 7 finden Sie zahlreiche Beispiele dafür, wie Sie diese Parameter ändern und so TYPO3 an Ihre Bedürfnisse anpassen können.
1.7
Größere Dateiuploads ermöglichen
Problem Sie möchten größere Dateien hochladen, als es TYPO3 Ihnen momentan erlaubt.
Lösung
Max. Linie
Die maximale Größe für Dateiuploads wird in TYPO3 durch eine Vielzahl von Faktoren beeinflusst. Je nachdem, wo Sie Dateien hochladen möchten, gibt es unterschiedliche Stellen, an denen Sie diese Einstellung anpassen müssen. Dabei ist zum einen die maximal erlaubte Dateigröße für das jeweilige Dateifeld wichtig, zum anderen spielen die Grundeinstellungen von TYPO3 und PHP eine Rolle. Prüfen Sie zuerst Ihre PHP-Einstellungen, bevor Sie Änderungen an TYPO3 vornehmen.
24 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Diese Einstellungen können Sie über das Modul Installation kontrollieren. Wählen Sie dort den Menüeintrag Basic Configuration und anschließend php.ini configuration checked. Ist Ihre Einstellung zu klein, deutet TYPO3 mit der Frage Max Upload filesize too small? auf diesen Punkt hin. Erhöhen Sie daraufhin den entsprechenden Wert upload_ max_filesize in der Konfigurationsdatei php.ini von PHP auf einen ausreichend hohen Wert: upload_max_filesize = 20M
Kontrollieren Sie zusätzlich die Einstellungen für Max Execution Time. Bei langsamen Verbindungen kann die maximale Ausführungszeit eines Skripts auch überschritten werden. Diesen Wert können Sie mit der PHP-Option max_execution_time heraufsetzen. max_execution_time = 120
Starten Sie anschließend den Webserver neu. Wenn diese Einstellungen noch nicht ausreichend sind, können Sie sie in TYPO3 anpassen.
Lizensiert für Markus Mueller
Die globalen Voreinstellungen für TYPO3 kontrollieren Sie über das Modul Installation. Wählen Sie dort den Menüeintrag All Configuration und suchen Sie nach dem Begriff maxFileSize. Mit diesem Wert legen Sie die maximale Dateigröße in KByte fest, die TYPO3 bei sämtlichen Dateioperationen, wie etwa Kopieren, Verschieben oder Hochladen, erlaubt. Der Standardwert beträgt 10000, was 10 MByte entspricht. Geben Sie nun Ihren gewünschten Wert ein. Ein ausreichender Wert könnte 20000 sein, was 20 MByte entspricht. Speichern Sie Ihre Eingabe mit dem Button Write to localconf.php am Seitenende, um die Änderung zu übernehmen. Alternativ dazu können Sie folgenden Wert auch direkt in die Datei localconf.php schreiben. $TYPO3_CONF_VARS['BE']['maxFileSize'] = '20000';
Ändern Sie nun die Feldeigenschaften der Inhaltselemente. Wenn Sie eine Datei mit einem Inhaltselement verknüpfen möchten, hat dieses Inhaltselement eigene Einschränkungen bezüglich der maximalen Dateigröße. Standardmäßig können Sie Bilder von maximal 1 MByte oder Dateien von 10 MByte verknüpfen. Diese Beschränkung können Sie über die TCA-Einstellungen für das jeweilige Feld anpassen. Analysieren Sie mit dem Modul Konfiguration die TCA-Struktur und legen Sie fest, welche Dateifelder Sie erweitern möchten (in Rezept 1.6 erfahren Sie, wie Sie das Modul nutzen). Eine typische erweiterte Feldkonfiguration können Sie der folgenden Liste entnehmen. Hiermit legen Sie die neue maximale Dateigröße für die Felder auf 20 MByte fest (der Code muss pro Feld in einer Zeile stehen): // Seiten: Dateien $TCA['pages']['columns']['media']['config']['max_size'] = 20*1024; // Seitenübersetzungen: Dateien $TCA['pages_language_overlay']['columns']['media']['config']['max_size'] =
Max. Linie
20*1024;
// Inhaltselemente: Bilder $TCA['tt_content']['columns']['image']['config']['max_size'] = 20*1024;
1.7 Größere Dateiuploads ermöglichen | 25 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links // Inhaltselemente: Dateiverweise $TCA['tt_content']['columns']['media']['config']['max_size'] = 20*1024; // Inhaltselemente: Multimedia $TCA['tt_content']['columns']['multimedia']['config']['max_size'] = 20*1024; // Frontend-Benutzer: Bilder $TCA['fe_users']['columns']['image']['config']['max_size'] = 20*1024; // TypoScript-Templates: Ressourcen $TCA['sys_template']['columns']['resources']['config']['max_size'] = 20*1024;
Seit der Version 4.1 können Sie die Feldeigenschaften auch per Seiten-TSconfig überschreiben. Die so festgelegten Werte gelten dann für einzelne Seiten bzw. Seitenbäume, während die oben genannten Methoden die Feldeigenschaften für das gesamte Projekt festlegen. Per Seiten-TSconfig können Sie die Parameter dieser Feldtypen beeinflussen. Die Einstellungen im TSconfig-Feld in den Seiteneigenschaften nehmen Sie dann nach diesem Muster vor: TCEFORM.tt_content.feldname.config.max_size = 100240
Für die oben genannten Felder sähe die Konfiguration folgendermaßen aus: Lizensiert für Markus Mueller
TCEFORM.pages.media.config.max_size = 20*1024 TCEFORM.pages_language_overlay.media.config.max_size = 20*1024 TCEFORM.tt_content.image.config.max_size = 20*1024 TCEFORM.tt_content.media.config.max_size = 20*1024 TCEFORM.tt_content.multimedia.config.max_size = 20*1024 TCEFORM.fe_users.image.config.max_size = 20*1024 TCEFORM.sys_template.resources.config.max_size = 20*1024
Danach können Sie auch größere Dateien über das Backend hochladen und verwalten.
Diskussion Beachten Sie, dass die TYPO3-Einstellungen immer von PHP überschrieben werden. Alle Werte sollten daher unterhalb des Maximalwerts sein, den Sie in den PHP-Einstellungen angegeben haben. Gleiches gilt übrigens für Uploads, die über das Frontend getätigt werden. Auch hier greifen die PHP-Einstellungen, jedoch nicht die oben genannten TCA-Modifikationen. Wenn Sie das Inhaltselement Formular verwenden, um Dateiuploads im Frontend zu ermöglichen, können Sie die maximale Größe der Dateien mit dem Wert formmailMaxAttachmentSize beeinflussen. Diesen Wert können Sie über das Install-Tool im Bereich All Configuration oder direkt in der Datei localconf.php anpassen: $TYPO3_CONF_VARS['FE']['formmailMaxAttachmentSize'] = '250000';
Max. Linie
Nach der Umstellung können dann auch größere Dateien mit dem Formular versendet werden.
26 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Sie sollten sich darüber bewusst sein, dass das HTTP-Protokoll nicht für große Dateitransfers gedacht ist. Standardmäßig können Sie im Modul Dateiliste Dateien von einer Größe bis 10 MByte hochladen, kopieren und verschieben. Größere Dateien sollten Sie per FTP oder SCP (SecureCopy) hochladen. Zu große Dateiuploads werden nach 10 MByte abgebrochen, und es besteht keine Möglichkeit, angefangene Uploads wieder aufzunehmen. Wenn Sie mit größeren Dateien umgehen müssen, empfehlen wir Ihnen die Verwendung von WebDav. Im TYPO3-Wiki finden Sie eine Anleitung dazu, wie Sie eine WebDav-Ressource in TYPO3 integrieren: http://wiki.typo3.org/Apache2_Typo3_WebDAV.
Siehe auch Weitere Informationen zur PHP-Option upload_max_filesize finden Sie unter der Adresse http://php.net/manual/ini.sect.file-uploads.php. Die Option max_execution_time wird im PHP-Handbuch unter der Adresse http://php.net/manual/info.configuration.php näher beleuchtet. Der WebDav-Standard wird in Wikipedia ausführlich unter dieser Adresse beschrieben: http://de.wikipedia.org/wiki/WebDAV. Weiterführende Informationen zum Inhaltselement Formular finden Sie in Rezept 13.10.
1.8
Mehrere Websites mit TYPO3 verwalten
Lizensiert für Markus Mueller
Problem Sie möchten mehrere Websites mit TYPO3 verwalten, beispielsweise um weitere Subdomains einer Website über ein Backend zu administrieren.
Lösung Legen Sie für jede Domain einen eigenen Datensatz vom Typ Domain an und legen Sie diesen in die gewünschten Seiten im Seitenbaum. Dadurch verknüpfen Sie die Domain mit den jeweiligen Seiten, sodass diese über den Browser aufgerufen werden können. Wechseln Sie dafür zuerst in das TYPO3-Backend und aktivieren Sie das Modul Liste. Klicken Sie anschließend auf die Seite, die der ersten Domain zugewiesen werden soll. Erfahrungsgemäß ist dies die Startseite Ihrer jetzigen Website. Legen Sie dort einen neuen Datensatz vom Typ Domain an. In das Feld Domain geben Sie die gewünschte Adresse ein, unter der die Seite gefunden werden soll. Achten Sie darauf, dass Sie hier die komplette Adresse (inkl. Subdomain) ohne Protokoll eingeben und sämtliche Adressen eindeutig sind. TYPO3 ergänzt mehrfach vorkommende Adressen mit einer Null (www.example.com0).
Max. Linie
Wählen Sie anschließend eine weitere Ursprungsseite Ihrer Website an und wiederholen Sie diesen Schritt. Dadurch ordnen Sie die andere Adresse ebenfalls einer bestimmten Seite zu. Wiederholen Sie diesen Vorgang, bis Sie sämtliche Domains in den Seitenbaum
1.8 Mehrere Websites mit TYPO3 verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 27
Max. Linie
integriert haben. TYPO3 kann nun eindeutig zwischen den vorhandenen Domains unterscheiden und die Anfragen des Browsers auf den entsprechenden Teil des Seitenbaums weiterleiten.
Links
Wenn Sie unter zwei Domains eine Website finden möchten, also sowohl unter der Adresse www.example.net als auch unter der Adresse www.example. org, brauchen Sie diesen Schritt nicht durchzuführen. Dann genügt die Umleitung der Domain auf die gleiche IP-Adresse.
Sie haben damit die Grundvoraussetzung dafür geschaffen, dass Ihre Domains nach der Umstellung der DNS-(Domain Name System)Server von TYPO3 der entsprechenden Website korrekt zugeordnet werden können. Richten Sie nun den DNS-Server so ein, dass der Hostname auf dieselbe IP-Adresse zeigt, auf der Ihre existierende TYPO3-Installation liegt. Anschließend registrieren Sie auf dem Server den neuen virtuellen Host. Dadurch wird die Domain auf das gewünschte Verzeichnis auf dem Server umleitet.
Lizensiert für Markus Mueller
Max. Linie
Hierzu müssen Sie Ihren Webserver entsprechend konfigurieren. Beim Apache-Webserver erfolgt diese Konfiguration normalerweise in der Datei httpd.conf. Das genaue Vorgehen weicht aber je nach Distribution bzw. Betriebssystem stark ab. Die beiden Domains werden dann in einer TYPO3-Installation verwaltet und greifen auf die Dateien einer TYPO3Installation zu. TYPO3 analysiert beim Aufruf der Webseite den Domainnamen und liefert dann die entsprechenden Seiten für diese Domain aus.
Diskussion Mit TYPO3 können Sie beliebig viele Domains über eine Oberfläche verwalten. Die jeweiligen Websites bleiben dabei über das durchgängige Seitenbaumprinzip auch bei zahlreichen Domains leicht administrierbar. Wenn Sie mehrere Domains in einer TYPO3-Installation verwalten, die unterschiedliche Websites repräsentieren, sollten Sie für jede Domain einen eigenen Seitenbaum anlegen. In der Praxis hat sich dafür folgendes Prinzip bewährt: Legen Sie für jede Domain eine eigene Hauptseite an, unter der Sie die weiteren Unterseiten einfügen. Die Hauptseite verknüpfen Sie dann über den Seitentyp Verweis mit der Unterseite. Erst diese Unterseite enthält die eigentlichen Webseiten, die über ein entsprechendes Root-Template die Seiteninhalte im Frontend darstellen. Dadurch bleibt die Seitenstruktur sauber und übersichtlich. Wenn der Seitenbaum mit der Zeit umfangreicher wird, können Sie auch sogenannte temporäre Einstiegspunkte im Seitenbaum definieren. Klicken Sie dazu auf das Seitensymbol einer solchen Hauptseite und aktivieren Sie im Kontextmenü die zweite Optionsebene über Weitere Einstellungen. Wählen Sie dort die Option Als Startpunkt für den Seitenbaum festlegen. TYPO3 zeigt danach nur den Seitenbaum dieser Seite an. Um wieder in die reguläre Ansicht zu wechseln, klicken Sie auf den Link Temporären Einstiegspunkt aufheben.
28 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Sämtliche Verlinkungen werden weiterhin über die IDs der Seiten oder Inhaltselemente erzeugt. Auch auf gemeinsame Dateien können Sie über das Modul Dateiliste zugreifen. Jedoch sollten Sie dabei beachten, dass TYPO3 standardmäßig nicht kontrolliert, in welcher Domain diese Seite liegt. So kann es vorkommen, dass bei Verknüpfungen über mehrere Domains hinweg die Domain der aktuellen Website übernommen wird. Da die gewünschte Seite jedoch nicht in den Seiten der aktuellen Domain liegt, führt der Klick auf den Link nicht auf die korrekte Seite. Dieses Phänomen umgehen Sie, indem Sie folgende Option in Ihrem TypoScript-Setup aktivieren: config { typolinkCheckRootline = 1 }
TYPO3 kontrolliert nun für jeden internen Link die dazugehörige Domain. So stellen Sie sicher, dass TYPO3 bei internen Links zusätzlich zu den Sichtbarkeitseinstellungen auch die jeweilige Domain berücksichtigt, in der die Seite liegt. Für die Umsetzung der Links wird dabei der zuerst gefundene Domain-Datensatz ausgewertet. Achten Sie darauf, wenn Sie mehrere Domain-Datensätze für einen Seitenbaum angelegt haben.
Lizensiert für Markus Mueller
Um Verknüpfungen zu internen Seiten zu erstellen, sollten Sie weiterhin ausschließlich die IDs der Datensätze und niemals die absoluten Adressen verwenden. Nur dadurch ist sichergestellt, dass eine Verknüpfung unabhängig von der Position im Seitenbaum hergestellt werden kann. Außerdem kontrolliert TYPO3 automatisch die Sichtbarkeitseinstellungen der Zielseite, sodass die Verknüpfung beispielsweise ausgeblendet wird, wenn die Seite unsichtbar ist oder der aktuelle Benutzer nicht über die nötigen Zugriffsrechte verfügt. Vermeiden Sie unbedingt hardcodierte Verknüpfungen zu internen Seiten. Dies kann zu großen Schwierigkeiten führen, wenn die Seite verschoben oder ausgeblendet wird.
1.9
UTF-8 als Standardzeichensatz verwenden
Problem Sie möchten ein neues TYPO3-Projekt anlegen und für die Datenhaltung und -verarbeitung von vornherein durchgängig UTF-8 als Zeichensatz verwenden. Das ist vor allem dann sinnvoll, wenn Ihre Webseite nicht lateinische Sprachen oder Sonderzeichen – wie das Euro-Symbol – enthält.
Lösung
Max. Linie
Legen Sie die Datenbank für TYPO3 in der MySQL-Konsole oder phpMyAdmin mit dem folgenden SQL-Befehl an:
1.9 UTF-8 als Standardzeichensatz verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 29
Max. Linie
CREATE DATABASE datenbank_name DEFAULT CHARACTER SET = utf8;
Links
Aktivieren Sie anschließend in TYPO3 UTF-8 als Standardkodierung und sorgen Sie dafür, dass bei der Datenbankverbindung ebenso UTF-8 verwendet wird. Setzen Sie dazu im Install-Tool die Option forceCharset auf utf-8 und die Option setDBinit auf SET NAMES utf8. Sie können diese Eingaben mit folgendem Code auch direkt in der Datei localconf.php vornehmen: $TYPO3_CONF_VARS['BE']['forceCharset'] = 'utf-8'; $TYPO3_CONF_VARS['SYS']['setDBinit'] = 'SET NAMES utf8';
Beachten Sie die unterschiedliche Schreibweise von utf-8 mit und ohne Bindestrich. Der Zeichensatz wird für die TYPO3-Einstellung mit Bindestrich angegeben, im SQL-Befehl hingegen wird der Zeichensatz ohne Bindestrich geschrieben.
Auf diese Weise verwendet TYPO3 UTF-8 als Zeichenkodierung und initialisiert auch die SQL-Verbindung entsprechend automatisch für UTF-8. Damit wird die gesamte Kommunikation mit dem MySQL-Server auf UTF-8 gestellt. Lizensiert für Markus Mueller
Sobald Sie die Datei gespeichert haben, wechseln Sie in das Install-Tool und legen über den Database Analyser die Tabellen für TYPO3 an. Wählen Sie dort die Funktion COMPARE, um die nötigen Tabellen anzulegen. Danach können Sie über das Backend Ihre Inhalte eingeben und auf der Webseite anzeigen lassen. TYPO3 kodiert nun den gesamten Datentransfer vom Speichern der Datensätze bis hin zur Ausgabe der Inhalte im Browser im UTF-8-Zeichensatz. Im Backend und im Frontend werden die Zeichen ab sofort im UTF-8-Zeichensatz angezeigt und verarbeitet. Sämtliche Inhalte, die Sie nun über das Backend eingeben, werden UTF-8-kodiert in der Datenbank abgespeichert.
Diskussion UTF-8 bietet Unterstützung für die verschiedensten internationalen Sprachen und Sonderzeichen. Mit der Zeichenkodierung UTF-8, dem 8-bit Unicode Transformation Format, wird es möglich, kyrillische, griechische und asiatische Inhalte und Sonderzeichen jeglicher Art einheitlich in einer Datenbank oder in einem Dokument zu handhaben, ohne zwischen den Zeichensätzen konvertieren oder Sonderzeichen maskieren zu müssen. Das Einzige, was Sie dafür benötigen, ist eine TYPO3-Version höher als 4.0, mindestens einen MySQL-5.1-Datenbankserver und mindestens PHP 5. Moderne Browser und alle gängigen Betriebssysteme unterstützen UTF-8 auf breiter Front.
Max. Linie
Der MySQL-Server unterstützt Zeichensatzeinstellungen auf verschiedenen Ebenen, wie auf der Verbindung, der Anfrage, dem Ergebnis, der Datenbank, der Tabelle, bis hinunter zu abweichenden Zeichensatzeinstellungen einzelner Felder. Die Konfigurationsmög-
30 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
lichkeiten sind sehr komplex, der MySQL-Server nimmt dabei teilweise automatisch selbstständig entsprechende Zeichenkonvertierungen vor. Hierdurch schleichen sich sehr leicht Fehler ein, die nicht sofort sichtbar werden. Beachten Sie, dass alle Datenbankverbindungen zum MySQL-Server von PHP aus immer mit dem LATIN1-Zeichensatz aufgebaut werden. Das PHPMySQL-Modul berücksichtigt dabei auch keinerlei abweichende Einstellungen in den MySQL-Konfigurationsdateien. Aus diesem Grund ist es bei der Verwendung von UTF-8 sehr wichtig, mit der Einstellung setDBinit eine entsprechende Initialisierungssequenz zu verwenden. Sonst wird MySQL möglicherweise die Anfragen und Ergebnisse von und zu TYPO3 zwischen UTF-8 und LATIN1 konvertieren, was innerhalb der TYPO3-Umgebung nicht auffallen wird, aber zu falsch kodierten Zeichen in der Datenbank führt.
Wenn Sie Zugriff auf die MySQL-Konfigurationsdatei haben, gibt es über die Option init-connect noch eine alternative Möglichkeit, einen entsprechenden InitialisierungsString global festzulegen. Dazu sind die folgenden Parameter in der Datei my.conf zu setzen:
Lizensiert für Markus Mueller
[client] default-character-set=utf8 [mysqld] default-character-set=utf8 init-connect=SET NAMES `utf8`
Starten Sie anschließend den MySQL-Server neu. MySQL wird nun bei der Kommunikation immer UTF-8 als Standardkodierung nutzen. Bedenken Sie aber, dass dies wieder Stolperfallen mit sich bringen kann, beispielsweise wenn das TYPO3-Projekt auf einen anderen Server übertragen wird, etwa vom Test- auf den Produktionsserver des Kunden. Dann muss sichergestellt sein, dass die Kodierung auf dem Zielserver exakt so eingestellt ist wie zuvor. Wir empfehlen auch in diesem Fall, die TYPO3-Konfigurationsoption setDBinit beizubehalten, um die Einstellung im Kontext des Projekts zu speichern. Das hilft, Problemen bei einem späteren Umzug von vornherein aus dem Weg zu gehen.
Max. Linie
Sobald Sie die oben genannte Einstellung vorgenommen haben, ist TYPO3 so konfiguriert, dass die Inhalte Ihrer Website in UTF-8 gespeichert und ausgegeben werden. Bei der Ausgabe der Inhalte auf der Website gibt es jedoch noch eine kleine Stolperfalle: Sie können per TypoScript festlegen, in welcher Zeichenkodierung Ihre Webseiten ausgegeben werden. Wenn Sie die Zeichenkodierung per TypoScript fest vorgeben, wird TYPO3 diese Zeichenkodierung verwenden. Kontrollieren Sie daher (am besten über den TypoScript-Object-Browser), ob die folgenden beiden Parameter im TypoScript-Setup gesetzt sind, da diese den Zeichensatz für die Ausgabe an den Browser ändern:
1.9 UTF-8 als Standardzeichensatz verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 31
Max. Linie
config { renderCharset = iso-8859-1 metaCharset = iso-8859-1 }
Links
Entfernen Sie diese Einstellungen – sofern vorhanden –, um auch bei der Seitenausgabe UTF-8 zu verwenden. Soweit die von Ihnen verwendeten Zeichen in einem anderen Zeichensatz als UTF-8 abgebildet werden können, ist es aber auch durchaus möglich, diesen über renderCharset für die Frontend-Ausgabe zu verwenden.
Siehe auch MySQL unterstützt UTF-8 ab Version 5.1. Für UTF-8 ist utf8_general_ci die Standard-Sortierreihenfolge. Das bedeutet, dass deutsche Umlaute korrekt sortiert werden. Zum Beispiel wird ein »Ö« mit einem »O« gleichgestellt. Weitere Details zu Zeichenkodierungen in MySQL finden Sie im MySQL-Handbuch unter http://dev.mysql.com/doc/refman/5.1/de/ charset-syntax.html. Unter http://dev.mysql.com/doc/refman/4.1/en/charset-collation-effect. html finden Sie eine Gegenüberstellung der Effekte verschiedener Sortierreihenfolgen. Rezept 2.10 zeigt Ihnen, wie Sie eine vorhandene TYPO3-Installation auf UTF-8 konvertieren. Lizensiert für Markus Mueller
1.10 Der richtige Umgang mit Fehlermeldungen Problem Sie erhalten beim Aufruf einer Seite eine Fehlermeldung und möchten diesen Fehler beheben beziehungsweise die Ursache für diese Meldung verstehen.
Lösung TYPO3 bietet Ihnen die Möglichkeit, viele Fehlerquellen schon über das Install-Tool zu analysieren. Wenn Sie sicherstellen, dass Ihre Installationseinstellungen korrekt sind, können Sie erfahrungsgemäß die meisten Fehler bereits beheben. Wechseln Sie dazu in das Install-Tool Ihrer TYPO3-Installation und melden Sie sich mit dem entsprechenden Passwort an (das Standardpasswort lautet joh316). Wählen Sie anschließend den Menüpunkt Basic Configuration. Dort können Sie die grundlegenden Einstellungen kontrollieren, die für den Einsatz von TYPO3 notwendig sind.
Max. Linie
Jede Einstellungsmöglichkeit ist dort in einzelne Funktionsbereiche eingeteilt. So erhalten Sie hier beispielsweise Informationen zu den jeweiligen Zugriffsrechten der Ordner sowie den wesentlichen PHP-, Grafik- und Datenbankeinstellungen. Viele dieser Einstellungen sind mit einem Icon versehen, anhand dessen Sie sehr leicht den aktuellen Status erkennen können. Diese Fehlersymbole haben folgende Bedeutung:
32 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Rotes Stoppzeichen – Schwerer Fehler Hierbei handelt es sich um eine fehlerhafte Einstellung, die Sie umgehend beheben sollten. Gelbes Warndreieck – Warnung Hierbei handelt es sich um eine Einstellung, die entweder ungültig ist oder früher oder später zu Problemen führt. Lesen Sie in jedem Fall die entsprechende Erklärung unterhalb der Meldung. Weiße Sprechblase – Hinweis Hierbei handelt es sich nicht um eine Fehlermeldung, sondern um einen Hinweis. TYPO3 weist Sie damit auf wichtige Einstellungen oder einen Bereich hin, dem Sie besondere Aufmerksamkeit widmen sollten. Grünes Häkchen – Alles okay Die Einstellung ist korrekt. So soll es sein. TYPO3 kann mit der Einstellung problemlos laufen.
Lizensiert für Markus Mueller
Damit gibt TYPO3 Ihnen Hinweise auf mögliche Fehlerquellen und macht Ihnen Probleme bewusst. Achten Sie daher im Install-Tool darauf, dass Sie keine Fehlersymbole mehr sehen. Im ersten Abschnitt können Sie die Zugriffsrechte auf die Verzeichnisse kontrollieren. Der Webserver benötigt für die folgenden Verzeichnisse und deren Unterverzeichnisse Schreibrechte: uploads/ typo3temp/ typo3conf/
In diese Verzeichnisse sollte der Webserver schreiben dürfen, wenn Sie Dateien über das Modul Dateiliste verwalten oder lokale Extensions installieren möchten: fileadmin/ typo3conf/ext/
Um Extensions global installieren zu können, benötigt der Webserver zusätzlich Schreibrechte für folgendes Verzeichnis: typo3/ext/
Im nächsten Abschnitt php.ini configuration checked kontrolliert TYPO3 die PHP-Einstellungen. Falls Sie hier Fehlermeldungen sehen, sollten Sie Ihre Einstellungen in der Datei php.ini überprüfen. TYPO3 arbeitet sehr eng mit der Datenbank zusammen, daher müssen Sie den Zugriff auf die Datenbank sicherstellen. Stimmt die Adresse des Datenbankservers? Sind die Zugangsdaten korrekt? Überprüfen Sie, ob sämtliche Tabellen in der Datenbank vorhanden sind. Vor allem, wenn Sie Ihre TYPO3-Instanz aktualisiert haben, müssen Sie die Tabellen in der Datenbank aktualisieren.
Max. Linie
Speichern Sie abschließend diese Werte über den Button Update localconf.php und kontrollieren Sie nochmals die entsprechenden Einstellungen.
1.10 Der richtige Umgang mit Fehlermeldungen | 33 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Achten Sie besonders darauf, dass Sie auf öffentlichen Websites keine PHP-Fehlermeldungen auf den Webseiten ausgeben, sondern diese in einer eigenen Fehlerprotokolldatei speichern. Die Ausgabe von PHP-Fehlern in Ihrer TYPO3-Installation können Sie ebenfalls über das Install-Tool anpassen, indem Sie unter All Configuration die Option displayErrors auf 0 setzen. Alternativ dazu können Sie auch direkt folgende Zeile in die Datei localconf.php einfügen:
Links
$TYPO3_CONF_VARS['SYS']['displayErrors'] = '0';
Richten Sie danach in der PHP-Konfigurationsdatei über den Wert error_log eine entsprechende Protokolldatei ein.
Diskussion Es gibt viele und sehr unterschiedliche Arten von Fehlermeldungen. Sämtliche Szenarien können hier nicht abgebildet werden, daher behandelt dieses Rezept nur die am häufigsten vorkommenden Fehlermeldungen, die TYPO3 beim Aufruf einer Seite im Frontend ausgeben kann. Bevor Sie hier weiterlesen, sollten Sie sicherstellen, dass Sie Ihren Browser korrekt eingestellt haben, um diese Fehlerquellen auszuschließen (um TYPO3 zu verwenden, muss Ihr Browser beispielsweise Cookies für die Website zulassen). In Rezept 3.1 erfahren Sie mehr über diese Einstellungsmöglichkeiten. Lizensiert für Markus Mueller
Nachdem Sie die grundlegenden Fehlerquellen ausgeschlossen haben, können bei der Benutzung von TYPO3 Meldungen erscheinen, die erfahrungsgemäß vor allem mit einer falschen Konfiguration von TYPO3 zu tun haben, beispielsweise wenn Sie noch keine Seiten im Seitenbaum angelegt oder die Seiten noch nicht mit einem TypoScript-Template verknüpft haben. TYPO3 gibt Ihnen dann im Frontend eine entsprechende Fehlermeldung aus, um Sie darauf hinzuweisen, diesen Schritt nachzuholen. Meist sind diese Meldungen sehr kurz und auf Englisch. Daher finden Sie im Folgenden eine Auflistung der häufigsten Meldungen, die Ihnen helfen soll, die Ursache der Meldung besser zu verstehen:
Database Error (Datenbankfehler) The current username, password or host was not accepted when the connection to the database was attempted to be established! Diese Meldung erscheint, wenn TYPO3 die Verbindung zum Datenbankserver nicht herstellen konnte. Überprüfen Sie die Daten für Ihre Datenbankverbindung, indem Sie in das Install-Tool Ihrer TYPO3-Installation wechseln und unter dem Menüpunkt Basic Configuration im Abschnitt Update localconf.php die Felder Username, Password und Host die Zugangsdaten kontrollieren.
Max. Linie
Über das Feld Username legen Sie den Benutzernamen fest. Im Feld Password speichern Sie das Passwort für die Verbindung. Beachten Sie, dass das Passwort im Klartext angezeigt wird. Stellen Sie daher sicher, dass Ihnen niemand über die Schulter guckt. Im Feld Host speichern Sie die Host-Adresse des Datenbankservers. Speichern
34 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Sie abschließend diese Werte über den Button Update localconf.php und kontrollieren Sie dann die gewünschte Seite im Frontend. No database selected Diese Meldung taucht auf, wenn TYPO3 zwar eine Verbindung zum Datenbankserver herstellen kann, aber keine Datenbank findet. Kontrollieren Sie, ob Sie im Install-Tool eine Datenbank angegeben haben, auf die TYPO3 zugreifen kann. Wechseln Sie dazu in das Install-Tool Ihrer TYPO3-Installation. Unter dem Menüpunkt Basic Configuration finden Sie den Abschnitt Update localconf.php. Wählen Sie dort im Auswahlfeld Database eine bestehende Datenbanktabelle aus oder legen Sie über das Eingabefeld unterhalb der Auswahlliste eine neue, leere Datenbank an. Bestätigen Sie die Einstellungen anschließend mit einem Klick auf den Button Update localconf.php. Wenn Sie eine neue Datenbank angelegt haben, muss diese nun noch mit den nötigen Tabellen gefüllt werden. Wählen Sie dazu den Menüpunkt Database Analyzer und führen Sie bei dem Punkt Update required tables den Befehl compare aus. TYPO3 vergleicht danach die bestehende Tabellenstruktur in der zuvor gewählten Datenbanktabelle mit den benötigten Tabellen. Über den Button Write to database schreiben Sie dann diese Angaben in die neue Datenbank.
Lizensiert für Markus Mueller
Cannot connect to the current database datenbank_name. Diese Meldung erscheint, wenn der Zugang zur Datenbank nicht hergestellt werden kann. Prüfen Sie, ob die Datenbank auf dem Datenbankserver vorhanden ist und der angegebene Benutzer Zugriff auf diese Datenbank hat. TYPO3 kann ansonsten nicht auf die benötigten Tabellen zugreifen.
Seitenkonfiguration Page is being generated. If this message does not disappear within 30 seconds, please reload. Diese Meldung wird ausgegeben, wenn die Seite gerade von TYPO3 erstellt wird und noch nicht angezeigt werden kann. Häufig taucht diese Meldung auch auf, wenn die Cache-Einstellungen der Seite nicht optimal eingestellt sind oder zwei Anfragen in kurzen Abständen auf eine Seite erfolgen. Die Meldung kann ebenfalls erscheinen, wenn sich ein Skriptfehler in einer Extension eingeschlichen hat und dadurch die Cache-Datei nicht erstellt werden kann oder wenn der Server schlichtweg überlastet ist. Tritt diese Meldung bei bestimmten Seiten häufiger auf, sollten Sie dort über die Seiteneigenschaften die Cache-Einstellungen kontrollieren. Diese Meldung können Sie über TypoScript anpassen. Geben Sie dazu folgenden Code in das Setup-Feld Ihres TypoScript-Templates ein: config { message_page_is_being_generated = HTML-Code fuer Seiteninhalt }
Max. Linie
Beachten Sie, dass der Wert in das HTML-Gerüst eingefügt wird und daher kein eigener -Bereich angegeben werden sollte. In dem Wert können Sie zwei dyna-
1.10 Der richtige Umgang mit Fehlermeldungen | 35 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
mische Marker nutzen. Mit ###TITLE### steht Ihnen der Titel der jeweiligen Seite zur Verfügung. Der Marker ###REQUEST_URI### wird mit der URL ersetzt, die zur Seite führte.
Links
No pages are found on the rootlevel! Diese Meldung erscheint, wenn im Seitenbaum Ihrer TYPO3-Installation noch keine Seiten vorhanden sind oder die bestehenden Seiten ausgeblendet wurden. Überprüfen Sie, ob in Ihrem Seitenbaum schon Seiten vorhanden sind. Bei bestehenden Seiten sollten Sie in den Seiteneigenschaften im Bereich Allgemeine Optionen die Sichtbarkeitseinstellungen wie Start, Stopp und Zugriff überprüfen. Falls noch keine Seite vorhanden ist, legen Sie eine neue Seite vom Typ Standard oder Erweitert an (in Rezept 4.1 erfahren Sie, wie Sie Seiten schnell erzeugen). No template found! Überprüfen Sie, ob für die gewünschte Seite ein TypoScript-Template vorhanden ist. In diesem Template muss unbedingt das Kontrollkästchen Rootlevel aktiviert sein (in Rezept 8.2 erfahren Sie mehr über die Grundeigenschaften von TypoScript-Templates).
Lizensiert für Markus Mueller
Um solch ein Template zu erstellen, wechseln Sie im Backend in das Modul Template und wählen im Seitenbaum die gewünschte Seite aus, auf der Sie das Template speichern möchten. Stellen Sie sicher, dass in der Auswahlliste in der rechten oberen Ecke der Eintrag Info/Modify aktiviert ist. Im rechten Fenster erscheint nun eine Meldung, die besagt, dass auf der gewünschten Seite noch kein Template vorhanden ist. Klicken Sie anschließend im Abschnitt Create new website auf den Button Create template for a new site. Nachdem Sie das folgende Dialogfenster mit OK bestätigt haben, erzeugt TYPO3 das neue Template, und es erscheinen unterhalb des Bereichs Template information die grundlegenden Informationen über das Template. Wenn Sie nun zurück in das Frontend wechseln, werden Sie sehen, dass die Fehlermeldung dem Ausruf HELLO WORLD! gewichen ist. Da dies wahrscheinlich nicht dem Inhalt entspricht, den Sie auf Ihrer Website anzeigen möchten, wechseln Sie zurück in das Backend und passen über die Bearbeitungssymbole den Titel und den Inhalt dieses Templates nach eigenen Wünschen an. Sie benötigen für jeden Seitenbaum prinzipiell nur ein Template, da TYPO3 bei jedem Seitenaufruf den Pfad zu dieser Seite nach Templates durchsucht. Dabei werden die Templates von der Startseite bis zur aktuellen Seite abgearbeitet. Da es mit der Zeit sehr unübersichtlich werden kann, den gesamten TypoScript-Code Ihrer Website in einem Template zu speichern, bietet Ihnen TYPO3 Möglichkeiten, diese komfortabel aufzuteilen.
Max. Linie
The requested page does not exist! Diese Meldung erscheint, wenn die aufgerufene Seite nicht existiert. Standardmäßig sucht TYPO3 automatisch in der Rootline nach der nächstgelegenen Seite, wenn die gewünschte Seite nicht gefunden werden kann (mehr über den Begriff Rootline erfahren Sie in Rezept 12.5). Kontrollieren Sie über das Backend, ob die gewünschte
36 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Seite vorhanden ist. Diese Meldungen können Sie serverseitig abfangen, indem Sie eine eigene 404-Seite einrichten. Wechseln Sie dazu in das Install-Tool und wählen Sie die Option All Configuration. Suchen Sie dort nach der Option pageNotFound_handling und geben Sie in dem Feld die Seite an, auf die TYPO3 weiterleiten soll, wenn die gewünschte Seite nicht gefunden werden konnte. The requested page didn't have a proper connection to the tree-root! Diese Meldung taucht auf, wenn die angeforderte Seite keine Verknüpfung zum RootTemplate der Ursprungsseite hat. TYPO3 kann in diesem Fall keine Verknüpfung zum Template mit der Eigenschaft Rootlevel herstellen. Kontrollieren Sie, ob die Seite im richtigen Seitenbaum liegt und dort auf das korrekte TypoScript-Template zugreifen kann. Beachten Sie, dass die Wurzelseite Ihrer Website ausschließlich über die Template-Eigenschaft Rootlevel aktiviert wird und nicht über die Position im Seitenbaum. The page is not configured! [type=aufgerufener_typ][] Diese Meldung erscheint, wenn die angeforderte Seite nicht dem gewünschten Seitentyp zugeordnet werden kann. Meist ist in diesem Fall der Get-Parameter type mit einem Zahlenwert in der Adresszeile vorhanden. Kontrollieren Sie, ob das Seitenobjekt im TypoScript-Template mit der Eigenschaft typeNum für diesen Seitentyp angelegt wurde. In Kapitel 9 erfahren Sie mehr über die Möglichkeiten von Seitentypen.
Lizensiert für Markus Mueller
This page is temporarily unavailable. Es ist ein Systemfehler aufgetreten, oder die Seite wird gerade Wartungsarbeiten unterzogen.
Sprachbezogen Error. Reason: Page is not available in the requested language. Diese Meldung wird ausgegeben, wenn die Systemeinstellungen vorgeben, dass Seiten standardmäßig ausgeblendet werden sollen, wenn sie mit einem Sprachparameter aufgerufen werden und noch keine Inhalte in der gewünschten Sprache vorliegen. Kontrollieren Sie, ob die Seite schon übersetzt wurde und ob Sie die folgende Systemeinstellung aktiviert haben: $TYPO3_CONF_VARS['FE']['hidePagesIfNotTranslatedByDefault'] = '1';
In Rezept 1.5 erfahren Sie, wie Sie diesen Wert kontrollieren können.
Max. Linie
Error. Reason: Page is not available in the requested language (strict). Diese Meldung erscheint, wenn Sie die Ausgabe von übersetzten Inhalten über TypoScript so begrenzt haben, dass eine Seite nur dann ausgeliefert wird, wenn in der gewünschten Sprache Inhalte vorliegen. Kontrollieren Sie, ob die Seite in der gewünschten Übersetzung vorliegt (in Rezept 4.9 erfahren Sie, wie Sie Übersetzungen Ihrer Inhalte komfortabel überprüfen können) und ob Sie folgenden Wert in Ihrem TypoScript-Setup gesetzt haben:
1.10 Der richtige Umgang mit Fehlermeldungen | 37 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
config { sys_language_mode = strict }
Links
Der empfohlene Wert dieser Option ist content_fallback. TYPO3 würde in diesem Fall die Seiteninhalte in der Standardsprache ausgeben und keine Fehlermeldung erzeugen. Error. Reason: Page is not available in default language. Diese Meldung taucht auf, wenn Sie über die Seiteneigenschaften der aufgerufenen Seite die Option Standard-Übersetzung verstecken aktiviert haben und der Seitenaufruf ohne Sprachparameter erfolgte. Wird bei einem Seitenaufruf kein Sprachparameter übergeben, gibt TYPO3 die Inhalte in der Standardsprache aus. Mit der Option Standard-Übersetzung verstecken unterbinden Sie, dass TYPO3 die Seite in der Standardsprache anzeigt, und erzwingen damit gleichzeitig, dass die Seite immer nur in einer Übersetzung angezeigt wird. Vergewissern Sie sich, ob die Seite in Ihrem Seitenbaum in der gewünschten Übersetzung vorliegt und ob die Option StandardÜbersetzung verstecken aktiv ist.
Besondere Fehlermeldungen Lizensiert für Markus Mueller
Could not set logfile path. Check filepath and permissions. Diese Meldung wird ausgegeben, wenn bei der Erzeugung der Apache-Statistiken im gewünschten Logverzeichnis ein Fehler aufgetreten ist. Kontrollieren Sie, ob das gewünschte Verzeichnis sowie die Datei vorhanden sind und vom Webserver beschrieben werden dürfen. Die Einstellungen für den Logmechanismus nehmen Sie über Systemparameter und das TypoScript-Setup vor. Geben Sie folgenden Code in Ihr TypoScript-Setup ein, um den Namen der Logdatei festzulegen: config.stat_apache_logfile = log_datei.log
Der Webserver benötigt Schreibrechte auf diese Datei. Den Pfad zu dieser Datei geben Sie über die Option logfile_dir an. Sie können den Pfad anpassen, indem Sie in das Install-Tool wechseln, im Bereich All Configuration nach der Option logfile_dir suchen und in das entsprechende Feld den gewünschten Pfad eingeben. Alternativ dazu können Sie auch folgende Zeile direkt in die Datei localconf.php schreiben: $TYPO3_CONF_VARS['FE']['logfile_dir'] = 'pfad';
Das Verzeichnis muss innerhalb Ihrer TYPO3-Installation liegen. Wenn Sie den Pfad zu der Logdatei absolut angeben, achten Sie darauf, dass der Pfad in der Option lockRootPath freigeschaltet wurde. Kontrollieren Sie dazu die Option lockRootPath im Install-Tool und geben Sie in das entsprechende Feld den Pfad zum Ordner an, in dem die Logdatei liegt. Alternativ dazu können Sie den Wert auch hier mit folgendem Code direkt in die Datei localconf.php schreiben:
Max. Linie
$TYPO3_CONF_VARS['BE']['lockRootPath'] = 'pfad_zum_logfile_dir';
38 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Zusätzlich gibt es noch spezielle Hinweise, mit denen TYPO3 auf Besonderheiten hinweist: PREVIEW! Diese Meldung erscheint, wenn Sie im Vorschaumodus arbeiten – etwa indem Sie im Admin-Panel die Option Versteckte Datensätze anzeigen aktivieren. Einige Inhalte auf der aktuellen Seite sind dann für andere Besucher nicht in dem Umfang sichtbar, wie sie momentan für Sie erscheinen (wenn Sie die Option Versteckte Seiten anzeigen aktiviert haben, können diese Seiten sogar für andere Benutzer unsichtbar sein). Das Erscheinungsbild dieser Nachricht können Sie per TypoScript anpassen. Geben Sie dazu folgenden Code in das Setup-Feld Ihres TypoScript-Templates ein: config { message_preview = HTML-Code }
Preview of workspace XY (XY) Diese Meldung taucht auf, wenn Sie einen nicht öffentlichen Bereich eines Workspace betrachten und im Vorschaumodus arbeiten – etwa indem Sie im Admin-Panel die Option Versteckte Datensätze anzeigen aktiviert haben. Kontrollieren Sie die Sichtbarkeitseinstellungen für diesen Workspace und schalten Sie ihn bei Bedarf für die Öffentlichkeit frei. Lizensiert für Markus Mueller
Page shortcuts were looping in uids X,Y...! Diese Meldung erscheint, wenn Sie eine Seite vom Typ Verweis aufrufen und dieser Verweis auf sich selbst zeigt. Dann entsteht eine Endlosschleife, da die Seite sich immer wieder selbst aufruft. Kontrollieren Sie die Seiteneigenschaften der jeweiligen Seite und ändern Sie die Einstellungen für den Verweis. Im Feld Verweis zur Seite können Sie die Verknüpfung anpassen.
Umgang mit PHP-Fehlermeldungen Neben den von TYPO3 erzeugten Fehlermeldungen treten oft Fehler im PHP-Skriptinterpreter selbst auf. Diese werden je nach Einstellung in $TYPO3_CONF_VARS['SYS']['displayErrors']
am Bildschirm oder in einer speziellen Logdatei ausgegeben. Zur Bedeutung einzelner Fehlermeldungen bietet sich eine entsprechende Recherche über eine Suchmaschine an. Oft treten Fehler in Verbindung mit den für PHP verfügbaren Ressourcen auf. Diese können Sie wie folgt umgehen:
PHP-Ressourceneinstellungen
Max. Linie
TYPO3 ist eine ressourcenintensive Anwendung. Die für PHP zur Verfügung stehenden Ressourcen werden in der Datei php.ini festgelegt. Die von PHP vorgegebenen Standardwerte sind für den Betrieb von TYPO3 teilweise nicht ausreichend und sollten angepasst werden. Wir empfehlen, die folgenden Werte in der Datei php.ini anzupassen:
1.10 Der richtige Umgang mit Fehlermeldungen | 39 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
;;;;;;;;;;;;;;;;;;; ; Resource Limits ; ;;;;;;;;;;;;;;;;;;; memory_limit = 32M max_execution_time = 60
Links ; Maximum amount of memory a script may consume (8MB) ; Maximum execution time of each script, in seconds
Eine solche Änderung erfordert den Zugriff auf die entsprechende Datei. Dies ist in Shared-Hosting-Umgebungen in der Regel nicht möglich. In diesem Fall ist eine Änderung eventuell noch über eine .htaccess-Datei möglich: php_value memory_limit "32M" php_value max_execution_time "60"
Sollte auch diese Methode nicht zum Erfolg führen, bleibt Ihnen nur die Möglichkeit, eine entsprechende Änderung bei Ihrem Serverbetreiber zu erbitten.
Lizensiert für Markus Mueller
Grundsätzlich sollten Sie eine Website intern ausgiebig testen, bevor sie öffentlich gemacht wird. Die meisten der oben genannten Fehler lassen sich mit entsprechenden Einstellungen im TYPO3-Backend beheben bzw. von vornherein umgehen. Es kann jedoch vorkommen, dass es aus unterschiedlichen Gründen zu weiteren Fehlermeldungen kommt, die nicht so leicht zu repoduzieren sind. Falls bei Ihnen ein Fehler auftritt, der hier nicht beschrieben wurde, können Sie folgendermaßen vorgehen: Suchen Sie in der entsprechenden Newsgroup nach Hilfestellungen. In Rezept 20.6 finden Sie eine Liste der vorhandenen Newsgroups. In Rezept 20.5 erfahren Sie, wie Sie die nötigen Informationen sammeln, um den Fehler auch für andere Leser in den Newsgroups reproduzierbar zu machen und so schneller Hilfestellung zu erhalten. Wenn Sie möchten, können Sie auch eine E-Mail mit der Fehlermeldung an das Autorenteam senden (
[email protected]). Wurde Ihre Fehlermeldung geklärt, können wir den Fehler dann in einer nächsten Auflage hier einbinden.
Siehe auch Auf der PHP-Seite http://de3.php.net/manual/de/ref.errorfunc.php#ini.error-log erfahren Sie, wie Sie die PHP-Fehler in einer externen Protokolldatei sichern. Falls dieses Rezept noch nicht zur Lösung des Problems beigetragen hat, haben Sie folgende weitere Möglichkeiten: Eventuell handelt es sich um eine fehlerhafte Browsereinstellung. Lesen Sie dann 3.1, um fehlerhafte Browsereinstellungen zu umgehen. Außerdem finden Sie in Rezept 20.6 Adressen von Newsgroups, in denen Sie Fragen zu tiefer gehenden Fehlern mit anderen TYPO3-Nutzern besprechen können.
Max. Linie
Max. Linie 40 | Kapitel 1: Installation und Konfiguration This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
First
Kapitel 2
KAPITEL 2
Wartung und Systempflege
2.0
Einführung
In diesem Kapitel finden Sie Lösungen zu Aufgaben, die im laufenden Betrieb von TYPO3 anfallen.
Lizensiert für Markus Mueller
Max. Linie
Wenn Ihre TYPO3-Installation erst mal läuft, wird eine der am häufigsten vorzunehmenden Aufgaben sein, ein Update auf eine nächsthöhere TYPO3-Version zu planen und durchzuführen. Die Rezepte 2.1 und 2.2 helfen Ihnen dabei, die nötigen Schritte zu überdenken und optimal zu planen. Rezept 2.3 geht darauf ein, wie Sie eine aktuelle TYPO3Installation dazu bringen, sich beim Rendern der Webseiten wie eine ältere TYPO3-Version zu verhalten. Wenn Sie technische Umstellungen oder Wartungsarbeiten an Ihrer Website vornehmen, kann dies auch die Verfügbarkeit beeinflussen. Kann oder soll Ihre Website kurzzeitig nicht mehr dargestellt werden, können Sie auf der Website eine entsprechende Meldung ausgeben. Rezept 2.4 erläutert die dafür nötigen Schritte. Weiterhin fallen im laufenden Betrieb der Website Arbeiten an, die Sie im Auge behalten sollten. Zum einen kann die Datenbank durch die Installation bzw. Deinstallation von Extensions defragmentiert werden oder Referenzen zu Datensätzen können nicht mehr aufgelöst werden. So können sich unnötige Datenbestände anhäufen, die sich zwar nicht direkt auf Ihre Website auswirken, jedoch die Verwaltung unnötig erschweren und den Blick auf die wesentlichen Daten erschweren. Sie sollten daher stets die Übersichtlichkeit fördern, indem Sie veraltete oder nicht mehr benötigte Daten entfernen. Prüfen Sie regelmäßig, ob das Datenbankschema noch konsistent ist und ob ungenutzte Daten oder Dateien vorliegen. Die dafür nötigen Tools und Vorgehensweisen werden ausführlich in den Rezepten 2.5 und 2.6 erklärt. Wie Sie die Relationen zwischen Ihren Datensätzen in Ihrer TYPO3-Datenbank darstellen und aktuell halten können, wird in den Rezepten 2.8 und 2.7 beschrieben.
| 41 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Ebenso wichtig wie die Integretät der Daten ist, dass Sie die Daten Ihrer Website regelmäßig sichern, um sie zum Beispiel nach einem Hardwarefehler schnell wiederherstellen zu können. Rezept 2.9 beleuchtet die nötigen Schritte, mit denen Sie Ihre Daten einfach und zuverlässig sichern können.
Links
Eine immer häufiger werdende Aufgabe für bestehende TYPO3-Projekte wird die Konvertierung der bestehenden Daten in den Zeichensatz UTF-8. Durch diesen Zeichensatz wird es möglich, Inhalte in unterschiedlichen Zeichensätzen in einer Datenbank zu speichern. Für die Konvertierung sollten Sie einige Vorüberlegungen treffen und ein paar wichtige Punkte beachten. Das Rezept 2.10 geht detailliert auf diese Anforderungen ein und unterstützt Sie bei der erfolgreichen Konvertierung zum UTF-8-Zeichensatz. Um Fehler im laufenden Betrieb zu ermitteln, können Sie das Syslog von TYPO3 zur Hilfe nehmen. Damit können Sie Aktivitäten und Fehlermeldungen von TYPO3 protokollieren und auswerten. Diese umfangreiche Möglichkeit, die Protokollfunktion von TYPO3 zu nutzen, wird in Rezept 2.11 beschrieben.
Lizensiert für Markus Mueller
Bei umfangreichen Datenbeständen wird es erfahrungsgemäß immer schwieriger, den Überblick zu behalten und Inhalte wiederzufinden. Rezept 2.12 zeigt Ihnen, wie Sie als Administrator sehr schnell in der TYPO3-Datenbank Inhalte finden und bearbeiten können. Auch kommt es immer häufiger vor, dass Administratoren verlorene bzw. verloren geglaubte Dateien wiederfinden müssen, weil die Verknüpfungen im TYPO3-Backend für Redakteure nicht mehr nachvollziehbar sind. In Rezept 2.13 erfahren Sie, wie Sie solche Situationen schnell meistern können.
2.1
TYPO3 auf eine neue Version aktualisieren
Problem Sie möchten eine aktuellere TYPO3-Version installieren und Ihre bestehende TYPO3Installation auf eine neue Version aktualisieren.
Lösung Laden Sie sich die aktuellsten Pakete von dieser Adresse herunter und tauschen Sie anschließend die Quelldaten Ihrer bestehenden TYPO3-Installation aus: http://typo3.org/download/packages/
Max. Linie
Wir empfehlen, Updates in einer unabhängigen Testumgebung zu testen und auf jeden Fall ein vollständiges Backup der alten TYPO3-Installation zu erstellen. Zudem beschreiben wir in der Lösung nur die grundlegenden Aktualisierungsschritte. Beachten Sie, dass Sie vorab einige Fragen klären sollten, auf die wir in der Diskussion näher eingehen. Die Diskussion gibt Ihnen die nötigen Hintergrundinformationen an die Hand, um die möglichen Risiken eines Updates besser abschätzen zu können.
42 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Linux/Unix 1. Laden Sie sich das TAR.GZ-Paket mit dem TYPO3-Source-Paket auf Ihre Festplatte und entpacken Sie das Archiv. 2. Legen Sie die entpackten Daten in ein Verzeichnis außerhalb des Webroots. 3. Tauschen Sie den Symlink typo3_src zu Ihren TYPO3-Source-Dateien aus (falls Sie keine Symlinks verwenden oder Ihnen der Begriff neu ist, sollten Sie vor dem Update unbedingt das Rezept 1.2 lesen). Beachten Sie, dass die Rechte vom Symlink und dem Source-Paket identisch sein müssen. Der Austausch wird durch folgende Kommandos ermöglicht: rm typo3_src ln -s /pfad/zu/typo3_src typo3_src
4. Öffnen Sie im Browser das Install-Tool unter typo3/install und melden Sie sich mit Ihrem gewohnten Passwort an. 5. Prüfen Sie im Database Analyser mit der Funktion COMPARE, ob Änderungen an der Datenbank notwendig sind. Führen Sie diese wenn nötig durch. 6. Entfernen Sie – falls vorhanden – die nicht mehr benötigten Symlinks media, tslib und showpic.php. Diese werden in der aktuellsten TYPO3-Version nicht mehr benötigt. Lizensiert für Markus Mueller
Windows- und Shared Hosts-Installationen Beim Update auf Windows oder einen Shared Host per FTP-Zugang hat sich folgendes Vorgehen bewährt: 1. Laden Sie sich das ZIP-Paket mit dem TYPO3-Source-Paket auf Ihre lokale Festplatte und entpacken Sie das ZIP-Paket. 2. Fügen Sie den beiden Verzeichnisse t3lib und typo3 sowie der Datei index.php ein Präfix neu_ hinzu. Das Verzeichnis misc brauchen Sie nicht auf den Server zu legen. 3. Laden Sie diese Verzeichnisse und die Datei auf den Server. Es liegen nun die alten und neuen Dateien parallel zueinander auf dem Server. 4. Prüfen Sie die Zugriffsrechte für die neuen Verzeichnisse und die Dateien. Der Webserver sollte keine Schreibrechte darauf haben. 5. Fügen Sie den alten Verzeichnisse t3lib und typo3 sowie der Datei index.php das Präfix alt_ hinzu. 6. Entfernen Sie anschließend das Präfix neu_ bei den neuen Verzeichnissen. Ihre Website wird während dieser Umbenennungen kurz nicht erreichbar sein. 7. Öffnen Sie im Browser das Install-Tool (im neuen) TYPO3-Verzeichnis typo3/install und melden Sie sich mit Ihrem gewohnten Passwort an.
Max. Linie
8. Prüfen Sie im Database Analyser mit der Funktion COMPARE, ob Änderungen an der Datenbank notwendig sind. Führen Sie diese wenn nötig durch. 9. Passen Sie wenn gewünscht weitere Systemparameter im Abschnitt All Configuration an. Dieser Schritt ist optional.
2.1 TYPO3 auf eine neue Version aktualisieren | 43 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
10. Ebenfalls optional: Kopieren Sie die globalen Extensions aus alt_typo3/ext/ nach typo3/ext. Beachten Sie hierzu unsere Anmerkungen in der Diskussion.
Links
11. Entfernen Sie abschließend alle nicht mehr benötigten Dateien und Verzeichnisse wie zum Beispiel media, misc, tslib, showpic.php. Diese werden in der aktuellsten TYPO3Version nicht mehr benötigt. Ihre TYPO3-Installation ist nach diesen Schritten auf den neuesten Stand. Aktualisieren Sie danach Ihre Extensions. Wenn Sie Extensions aus dem TER importieren möchten, achten Sie darauf, dass Sie unter Settings die Option Enable extensions without review aktiviert haben, da die gesuchten Extensions sonst möglicherweise nicht erscheinen. Führen Sie zur schnellen Aktualisierungsüberprüfung im Erweiterungs-Manager Check for Extension Updates durch.
Diskussion
Lizensiert für Markus Mueller
Max. Linie
Auch wenn das Aktualisieren der TYPO3-Quelldateien sehr einfach ist, müssen bei jedem Update auch noch zahlreiche andere Dinge beachtet werden, damit gewährleistet werden kann, dass Ihre Website weiterhin läuft. Das Wichtigste und erfahrungsgemäß auch das Schwierigste ist es, sicherzustellen, dass alle installierten Extensions korrekt (weiter-)laufen und es durch das Update zu keinen Nebeneffekten mit installierten Extensions kommt. Die Überlegungen und Maßnahmen bei einem Update unterscheiden sich aufgrund der unterschiedlichen Versionen. Je nachdem, ob Sie auf eine Minor-, Major- oder BugfixVersion aktualisieren, müssen Sie Ihre Schritte für die Aktualisierung überdenken und mögliche Risiken berücksichtigen. Ändert sich die letzte Stelle in der Versionsnummer zum Beispiel von 4.2.1 auf 4.2.2, handelt es sich um sogenannte Patch level releases. Die TYPO3-Version enthält dann ausschließlich Bugfixes und keine funktionalen Änderungen. Sie können Ihre alte Version in diesem Fall bedenkenlos aktualisieren. Ändert sich die zweite Stelle, zum Beispiel von 4.2.0 auf 4.3.0, wurde TYPO3 um neue Funktionen erweitert. Solche Versionen enthalten – zusätzlich zu allen vorangegangenen Bugfixes – meist funktionale Änderungen, die Sie vor dem Update ausgiebig auf einem Testsystem testen sollten. Ändert sich die erste Nummer zum Beispiel von 4.2 auf 5.0, wurden völlig neue Funktionen in TYPO3 eingebaut und Änderungen an der Systemarchitektur vorgenommen. Solche Versionen unterscheiden sich im Funktionsumfang meist so deutlich von der vorherigen, dass Sie die Tragweite einer Aktualisierung langfristig und sorgfältig prüfen sollten. Der TYPO3-Kern wird von einem festen Entwicklerkreis geprüft und getestet, sodass eine sehr hohe Qualität und Abwärtskompatibilität gesichert ist. Diese Qualitätssicherung ist bei Extensions von Drittanbietern meist nur gering oder gar nicht vorhanden. Sie sollten daher bei jedem Update jede Extension prüfen, ob es zu Nebeneffekten durch das Update kommt. Meist folgt eine Inkompatibilität mit einer neuen TYPO3-Version daraus, dass
44 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
der Extension-Entwickler die TYPO3-API nicht (durchgehend) genutzt hat. Andererseits kann es sein, dass die Extension in den TYPO3-Kern aufgenommen wurde und somit nun standardmäßig zur Verfügung steht. Ebenso kann eine Extension durch eine Änderung am TYPO3-Kern obsolet werden oder im Extension-Repository nicht mehr verfügbar sein, da sie von Entwickler nicht mehr weiterentwickelt wird. Achten Sie beim Update auf inkompatible Extensions und prüfen Sie, ob eine Extension den XClass-Mechanismus nutzt, um Klassen von TYPO3 zu erweitern. Dies führt erfahrungsgemäß häufig zu Nebeneffekten bei Updates. Gegebenenfalls müssen Sie auch ein Update der Extension in Erwägung ziehen, was sich dann vor allem bei Modifikationen an der Extension als aufwendig herausstellt. Alle diese Punkte können den Aktualisierungsprozess erheblich verzögern. Planen Sie daher genügend Zeit für die Aktualisierung ein, um alle Schritte systematisch und in Ruhe durchzuführen.
Siehe auch
Lizensiert für Markus Mueller
Grundsätzlich sollten Sie sich vor dem Update über die Änderungen im Programmcode informieren. Hier geben Changelog, Release-Notes und das TYPO3-Wiki wichtige Hinweise und Hilfestellungen zu den jeweiligen Änderungen. Eine Übersicht der vorhandenen Release-Notes finden Sie unter der Adresse http://wiki.typo3.org/Category:ReleaseNotes. Dort finden Sie auch das Changelog. Wenn Sie bei neuen Releases automatisch per E-Mail benachrichtigt werden möchten, empfehlen wir Ihnen, sich an der Mailingliste TYPO3announce anzumelden: http://lists.netfielders.de/cgi-bin/mailman/listinfo/typo3-announce. Mehr über den XClass-Mechanismus und warum Sie ihn bei Extensions vorsichtig einsetzen sollten, erfahren Sie in Rezept 17.12.
2.2
Die aktuell verwendete TYPO3-Version ermitteln
Problem Sie möchten die Versionsnummer Ihrer momentanen TYPO3-Installation erfahren, beispielsweise um zu prüfen, welche Extensions Sie installieren können, ob Updates nötig sind oder ob Sie bestimmte TYPO3-Funktionen nutzen können.
Lösung Die aktuelle Versionsnummer finden Sie im Modul Über Module im Copyright-Vermerk. Zusätzlich können Sie die Versionsnummer in der Anmeldemaske anzeigen lassen. Aktivieren Sie dazu im Install-Tool die Option loginCopyrightShowVersion oder geben Sie folgende Zeile in die Datei localconf.php ein:
Max. Linie
$TYPO3_CONF_VARS['SYS']['loginCopyrightShowVersion'] = '1';
2.2 Die aktuell verwendete TYPO3-Version ermitteln | 45 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Danach erscheint die Versionsnummer mit dem Copyright-Vermerk in der Anmeldemaske. Anstatt TYPO3 CMS wird dann zum Beispiel TYPO3 CMS ver. 4.2.0 ausgegeben. Die Angabe ver. 4.2.0 steht dabei für Version 4.2.0.
Links
Diskussion Die Versionsnummer ist in drei Bereiche aufgeteilt und kann am Ende noch einen weiteren Zusatz haben, der eine besondere Entwicklerversion markiert. Je nach Wichtigkeit und Bedeutung der Änderungen wird entweder die Hauptversion oder die Unterversion erhöht. Die erste Position steht für die Hauptversion. Erscheint eine neue Hauptversion, enthält TYPO3 neue Kern-Features und grundlegende Neuerungen. Die zweite Position steht für die Unterversion. Wurde diese geändert, enthält TYPO3 neue kleinere Features und Verbesserungen. Die dritte Position steht für die aktuelle Patch-Version. Solche Veröffentlichungen enthalten wichtige Bugfixes für die aktuelle Unterversion.
Lizensiert für Markus Mueller
Hat die Versionsnummer die Endung -dev, -alpha oder -beta, handelt es sich um eine Entwicklerversion beziehungsweise um eine Alpha- oder Betaversion. RC steht für Release Candidate. Diese Versionsbezeichnungen sind optional und dienen den Entwicklern zur Unterscheidung der einzelnen Veröffentlichungsschritte. Enthält Ihre TYPO3-Version eine solche Endung, sollten Sie diese nicht in Produktionsumgebungen verwenden. Etwa zwei Monate vor einem Veröffentlichungstermin werden zunächst Betaversionen als Testversionen bereitgestellt. Nach Einarbeitung der letzten neuen Features und eines Feedbacks werden die sogenannten Release Candidates veröffentlicht. Diese RCs sind mit einem Featurefreeze verbunden. Das heißt, dass keine neuen Features mehr eingebaut werden, sondern sich die Entwickler auf das Beheben von Fehlern konzentrieren. Vor der finalen Veröffentlichung werden dann weitere Release Candidates herausgegeben, die ausschließlich der Qualitätssicherung dienen und intensiv auf Fehler geprüft werden. Sollten Fehler auftauchen, werden diese behoben, und ein neuer Release Candidate wird veröffentlicht. Mehrere Release Candidates werden von 1 bis n durchgezählt. Aus dem letzten Release Candidate wird dann eine stabile TYPO3-Version erzeugt. Danach geht der Zyklus wieder von vorne los. Bei der Entwicklung von eigenen Extensions oder TypoScript-Templates kann es sehr hilfreich sein, diese Versionsnummern zum Implementieren neuer Funktionen zu berücksichtigen. Zum Beispiel können Sie dadurch sicherstellen, dass Ihr Code mit älteren TYPO3-Versionen kompatibel bleibt und auch über größere Versionssprünge stabil läuft.
Max. Linie
Wenn Sie die TYPO3-Version bei der Entwicklung Ihrer TYPO3-Erweiterungen benötigen, sollten Sie auf die TYPO3-Konstante TYPO3_version zugreifen. In dieser Konstanten speichert TYPO3 die vollständige Versionsnummer der aktuellen Installation. Kombiniert mit der Funktion t3lib_div::int_from_ver(), generieren Sie dann aus diesem Wert eine eindeutige Zahlenfolge, mit der Sie die Versionsnummer sicher abfragen können:
46 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
$version = t3lib_div::int_from_ver(TYPO3_version); if ($version > 4002000) { // Ihr Programmcode die('Ihre TYPO3-Version ist aktuell.'); } else { die('Bitte aktualisieren Sie Ihre TYPO3-Version.'); }
Jeder Versionsabschnitt wird dabei automatisch mit Nullen auf drei Stellen erweitert, wobei führende Nullen entfernt werden. In unserem Beispiel wird daher die Versionsnummer »4.2.0« in »4002000« umgewandelt. Da es sich um einen Zahlenwert handelt, werden die führenden Nullen nicht übernommen (der eigentliche Wert wäre 004002000). Anhand dieses Zahlenwerts können Sie dann versionsgenau die gewünschten Abfragen durchführen, etwa um Funktionen oder Hooks vorauszusetzen oder entsprechende Fehlermeldungen anzuzeigen, wenn Ihre Extension auf einer veralteten TYPO3-Version installiert wird.
Siehe auch
Lizensiert für Markus Mueller
Wenn Sie in Sachen TYPO3-Versionen auf dem Laufenen bleiben möchten, erhalten Sie unter http://news.typo3.org/xml-feeds/ die Möglichkeit, Meldungen über neue TYPO3-Versionen direkt in Ihren Newsreader zu laden. Einen Überblick über die aktuellen stabilen TYPO3-Versionen finden Sie auf der offiziellen Webseite unter http://typo3.org/download/ packages/. Anhand von Rezept 1.2 erfahren Sie, welches TYPO3-Paket Sie je nach Ihren Anforderungen herunterladen sollten. Der Release-Workflow sowie die Bedeutung der Versionsnummer wird auf dieser Seite beschrieben: http://typo3.org/teams/core/resources/ release-workflow/.
2.3
Den Kompatibilitätsmodus nutzen
Problem Sie möchten Ihre TYPO3-Version aktualisieren und das Verhalten Ihrer alten TYPO3Version beim Rendern der Webseiten weitestgehend beibehalten.
Lösung
Max. Linie
Wenn Sie das gewohnte Render-Verhalten Ihrer alten TYPO3-Version beibehalten möchten, brauchen Sie nach der Aktualisierung nichts zu unternehmen. Sofern Sie von einer TYPO3-Version kleiner als 4.0 aktualisieren, wird standardmäßig die Version 3.8 simuliert. Dadurch wird sichergestellt, dass sich die aktuelle Version bei der Darstellung Ihrer Website so weit wie möglich wie die vorherige TYPO3-Version verhält. Sie erhalten dann im Backend unter Über Module lediglich einen Hinweis, dass die Compat-Version von der aktuellen TYPO3-Version abweicht.
2.3 Den Kompatibilitätsmodus nutzen | 47 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Wenn Sie nach der Aktualisierung neue Features bei der Seitengenerierung aktivieren möchten, hilft Ihnen der Update Wizard im Install-Tool, diese zu aktivieren, und gibt Ihnen gleichzeitig eine Übersicht über die geänderten Features, sodass Sie die nötigen Maßnahmen ergreifen können, um Nebeneffekte zu verhindern.
Links
Öffnen Sie hierzu das Install-Tool und setzen Sie im Update Wizard den Kompatibilitätsmodus (Compat Mode) auf die gewünschte TYPO3-Version. Klicken Sie in der Box mit der Überschrift changeCompatibilityVersion auf den Button Next. Im zweiten Schritt können Sie dann über das Auswahlfeld die gewünschte Version festlegen. Klicken Sie abschließend auf Perform updates!, damit Ihre Auswahl übernommen wird. TYPO3 schreibt Ihre Einstellung daraufhin als neuen Wert für die Variable $TYPO3_CONF_VARS['SYS']['compat_version'] in die Datei localconf.php.
Diskussion Der Kompatibilitätsmodus wurde in TYPO3-Version 4.0 eingeführt, um Aktualisierungen auf eine neue TYPO3-Version zu vereinfachen und eine Aktualisierung des Programmcodes unabhängig von Änderungen in der Darstellung der Website zu machen. Der Kompatibilitätsmodus hat dabei nur Auswirkungen auf das Frontend. Das Backend bleibt von den Änderungen am Kompatibilitätsmodus unberührt. Lizensiert für Markus Mueller
Wenn sich Änderungen im Programmcode auf die Darstellung der Website auswirken, kann eine Aktualisierung schnell länger dauern und zu einer mühsamen Suche ausarten. Oft wird ein Update dann gar nicht durchgeführt, wenn sich die Änderungen als zu umfangreich herausstellen. Genau hier setzt der Kompatibilitätsmodus an, denn durch diesen werden die Änderungen im TYPO3-Code von der Website-Darstellung entkoppelt. Das Darstellungsverhalten Ihrer Website wird so beibehalten, wie es in einer älteren TYPO3-Instanz der Fall war. Sie können dadurch TYPO3 aktualisieren, ohne Änderungen an Ihrer Website befürchten zu müssen. Gleichzeitig werden dadurch die Änderungen, die Auswirkungen auf die Darstellung der Website haben, protokolliert. Über den Update Wizard können Sie dann jede Änderung der Reihe nach einsehen und erhalten gleichzeitig nützliche Tipps dazu, wie Sie die Änderung vornehmen können. Sie brauchen also nicht sofort Ihr TypoScript zu überarbeiten, sondern können die Änderungen in Ruhe zu einem späteren Zeitpunkt durchführen und dann anschließend die Kompatibilitätsversion anpassen.
Max. Linie
Technisch gesehen, wird dieser Modus über eine if-Abfrage möglich, die an den Stellen verwendet wird, an denen neue Features implementiert werden. Diese Abfrage überprüft, welche Kompatibilitätsversion gesetzt ist, und führt daraufhin den entsprechenden Code aus oder blendet vorhandenen Code aus. Die Abfrage kann sowohl in PHP als auch in TypoScript formuliert werden.
48 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Diese Abfrage können Sie selbstverständlich auch in Ihrem Code nutzen – zum Beispiel um sicherzustellen, dass Ihre Applikation in unterschiedlichen TYPO3-Versionen funktioniert, etwa um alternative TypoScript-Bereiche zu definieren, in denen Sie die älteren Funktionsaufrufe verwenden und auf neue Funktionsaufrufe verzichten. Fügen Sie in Ihren Code Bedingungen ein, in denen Sie die Kompatibilitätsversion abfragen. Die Version setzt sich immer aus der Hauptversion und der ersten Unterversion zusammen. Das Patch-Level auf der dritten Position wird nicht benötigt. Mit den folgenden Anweisungen würde der umschlossene Code zum Beispiel nur dann ausgeführt, wenn die TYPO3-Version 4.2.0 oder höher wäre: if (t3lib_div::compat_version('4.2')) { // PHP-Code }
In TypoScript können Sie die Versionsnummer mit folgender TypoScript-Bedingung auslesen und bestimmen, welcher Code bei der Generierung der Inhalte berücksichtigt werden soll: [compatVersion >= 4.2.0] # TypoScript-Code [global] Lizensiert für Markus Mueller
Dadurch können Sie alternative Codebereiche definieren, in denen Sie die älteren Funktionsaufrufe verwenden und auf neue Funktionsaufrufe verzichten. Indem Sie mögliche Versionsunterschiede abfangen, wird Ihr Code flexibler und läuft in unterschiedlichen TYPO3-Versionen stabil.
Siehe auch Wenn Sie im Kompatibilitätsmodus den TypoScript-Object-Browser nutzen, sollten Sie darauf achten, dass Sie die jeweiligen Conditions aktivieren. Ansonsten sehen Sie nur die TypoScript-Werte der TYPO3-Version 3.8. Weitere Anwendungsmöglichkeiten mit dem TypoScript-Object-Browser finden Sie in Rezept 8.3.
2.4
Die Website temporär für Wartungsarbeiten sperren
Problem Sie möchten Wartungsarbeiten an Ihrer Website durchführen und Ihren Besuchern eine entsprechende Meldung ausgeben. Gleichzeitig soll das Backend für alle Redakteure gesperrt werden, damit nicht aus Versehen Inhalte verloren gehen.
Max. Linie
Max. Linie 2.4 Die Website temporär für Wartungsarbeiten sperren | 49 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Lösung
Links
Sperren Sie das Backend, um auszuschließen, dass während der Wartungsarbeiten Inhalte eingepflegt werden und möglicherweise Daten verloren gehen. Des Weiteren können Sie Ihren Besuchern eine Meldung im Frontend ausgeben, auf die alle Anfragen umgeleitet werden. Setzen Sie dazu im Install-Tool die Optionen adminOnly und pageUnavailable_force auf den Wert 1 oder geben Sie die beiden Werte direkt in die Datei localconf.php ein, indem Sie dort folgende Zeilen einfügen: $TYPO3_CONF_VARS['BE']['adminOnly'] = 1; $TYPO3_CONF_VARS['FE']['pageUnavailable_force'] = 1;
Leeren Sie nach dem Abspeichern den Extension-Cache. Nun gibt TYPO3 für Besucher und normale Backend-Benutzer beim Seitenaufruf im Frontend und Backend eine Fehlermeldung aus. Beachten Sie, dass Administratoren weiterhin Zugriff auf das Backend haben. Ebenso sehen Benutzer, deren IP-Adresse in $TYPO3_CONF_VARS['SYS']['devIPmask'] angegeben ist, die Website wie gewohnt. Lizensiert für Markus Mueller
Diskussion Mit den oben genannten Einstellungen weisen Sie TYPO3 an, bei schwerwiegenden Serverfehlern eine entsprechende Meldung auszugeben. Diese Meldungen erscheinen zum Beispiel dann, wenn Schwierigkeiten bei der Verbindung zum Datenbankserver auftreten. TYPO3 sendet in diesem Fall den HTTP-Status: HTTP/1.0 503 Service Temporarily Unavailable
Wenn Ihnen ein anderer Status sinnvoller erscheint, können Sie ihn mit der Option pageUnavailable_handling_statheader im Install-Tool anpassen. Auf Ihrer Webseite erscheint im Fehlerfall standardmäßig eine TYPO3-Fehlermeldung. Diese Standardmeldung können Sie an das Erscheinungsbild Ihrer Website anpassen, indem Sie zum Beispiel eine individuelle HTML-Seite ausgeben. TYPO3 bietet Ihnen mit der Option pageUnavailable_handling die Möglichkeit, vollständig Einfluss auf das Fehlerverhalten zu nehmen und den Prozess nach eigenen Wünschen zu modifizieren. Die Option erwartet dabei immer eine Zeichenkette, die je nach Einsatzgebiet nach einem bestimmten Muster aufgebaut sein muss: Auf eine andere Domain umleiten Beginnt der Wert mit dem Präfix REDIRECT:, wird TYPO3 den Besucher auf die angegebene Website umleiten.
Max. Linie
$TYPO3_CONF_VARS['FE']['pageUnavailable_handling'] = ' REDIRECT:http://www.example.com ';
50 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Eine statische HTML-Datei auslesen Beginnt der Wert mit READFILE: wird TYPO3 die Datei auslesen und deren Inhalt ausgeben. In der Datei können Sie diese Marker nutzen, um dynamische Werte im Template zu positionieren: ###CURRENT_URL### wird mit der Umgebungsvariablen REQUEST_URI ersetzt, der Marker ###REASON### mit dem Grund für die Fehlermeldung. $TYPO3_CONF_VARS['FE']['pageUnavailable_handling'] = ' READFILE:fileadmin/errors/503.html ';
Das Fehlerverhalten über eine eigene Logik implementieren Beginnt der Wert mit dem Präfix USER_FUNCTION:, wird TYPO3 die nachfolgende Dateireferenz auflösen und das angegebene Skript initiieren. Die Datei und deren Inhalt müssen bestimmte Konventionen einhalten: Sie muss eine PHP-Klasse namens user_pageUnavailable enthalten, die wiederum eine Methode pageUnavailable() benötigt, die die beiden Parameter $param und $ref erwartet. Diese Parameter werden von TYPO3 gefüllt und können dann in der Klasse verwendet werden. $params enthält ein Array mit den Werten currentUrl, reasonText und pageAccessFailureReasons. $ref enthält eine Referenz auf das Seiten-Objekt von TYPO3 (TSFE). Lizensiert für Markus Mueller
$TYPO3_CONF_VARS['FE']['pageUnavailable_handling'] = ' USER_FUNCTION:typo3conf/pageUnavailableHandling.php:user_pageUnavailable-> pageUnavailable ';
Der Text muss immer in einer Zeile stehen, da er sonst von TYPO3 nicht richtig interpretiert wird. Wir haben den Code nur der Übersichtlichkeit halber in mehrere Zeilen aufgeteilt.
Achten Sie darauf, dass die Meldung im Ernstfall nur bei schwerwiegenden Problemen erscheinen. In diesen Situationen kann es sein, dass TYPO3 auch nicht mehr wie gewohnt reagiert oder unvollständig geladen wird. Sie sollten daher auf so wenig TYPO3-Features wie nötig zurückgreifen und Fehlermeldungen auch serverseitig abfangen.
Siehe auch Rezept 9.9 geht darauf ein, wie Sie Ihren Benutzern eine individuelle Fehlerseite für den Status »404 - Seite nicht gefunden« präsentieren können. Indem Sie die beiden Fehlercodes individuell abfangen, können Sie Ihre Website auch im Fehlerfall benutzerfreundlich halten. Eine Übersicht der möglichen HTTP-Fehlercodes finden Sie auf dieser Seite in Englisch: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.4.
Max. Linie
Max. Linie 2.4 Die Website temporär für Wartungsarbeiten sperren | 51 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
2.5
Die Datenbank prüfen und warten
Links
Problem Sie möchten Ihre TYPO3-Datenbank an die aktuelle TYPO3-Konfiguration anpassen. Das ist vor allem bei einer Aktualisierung der TYPO3-Version notwendig, weil bei einem Update oftmals einzelne Felder oder Tabellen der bestehenden Datenbank hinzugefügt oder geändert werden müssen. Demgegenüber kann es nach der Deinstallation oder Modifikation von Extensions sowie vor einem Datenbank-Backup sinnvoll sein, nicht mehr benötigte Tabellen und Daten aus der Datenbank zu entfernen.
Lösung Das Install-Tool stellt mit dem Database Analyzer ein mächtiges Werkzeug bereit, um eine laufende TYPO3-Datenbank in Schuss zu halten. Mit dem Database-Analyzer können Sie: • das Datenbankschema auf Konsistenz prüfen und gegebenenfalls anpassen, Lizensiert für Markus Mueller
• Datenbank-Dumps aus SQL-Dateien in typo3conf/ einspielen, • Daten in die Systemtabellen static_* einspielen sowie • einige weitere datenbankorientierte Operationen durchführen. Der Database-Analyzer stellt Ihnen damit ein sehr wichtiges Werkzeug zur Prüfung und Verwaltung Ihres Datenbankschemas zur Verfügung. Mindestens nach einem Update der TYPO3-Installation ist seine Verwendung wegen eines möglicherweise geänderten Datenbankschemas Pflicht. Um den Database-Analyzer aufzurufen, wechseln Sie in das Modul Installation im Bereich Admin-Werkzeuge. Bestätigen Sie den nun folgenden Hinweis zur Absicherung des Install-Tools durch einen Klick auf OK und geben Sie das Passwort für den Zugang zum Install-Tool ein. Für den Zugang zum Install-Tool benötigen Sie besondere Rechte bzw. ein separates Passwort, das sich vom Administratorpasswort unterscheiden sollte (standardmäßig ist das Passwort joh316 voreingestellt). Wählen Sie anschließend aus dem Menü den Eintrag Database Analyzer.
Das Datenbankschema prüfen
Max. Linie
Klicken Sie ganz unten neben der Bezeichnung Update required tables auf den Link COMPARE. Das Install-Tool führt daraufhin einen Abgleich zwischen den in TYPO3 und den Extensions abgelegten Metainformationen zur Datenbank und der tatsächlich in der Datenbank vorhandenen Struktur durch. Wenn Sie nach diesem Aufruf eine Meldung Table and field definitions are OK. erhalten, können Sie die Überprüfung an dieser
52 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Stelle bereits abschließen. In anderen Fällen erhalten Sie eine Liste mit allen Abweichungen, die TYPO3 ermittelt hat. In dieser Liste ist jeder Eintrag jeweils mit einem Kontrollkästchen versehen. Unter den Überschriften Add fields und Add tables werden Felder und Tabellen gelistet, die aufgrund der Konfiguration von TYPO3 erwartet werden, die sich aber nicht in der Datenbank finden lassen. Bei diesen Einträgen werden die Kontrollkästchen automatisch aktiviert. Solange Sie Einträge unter den Bezeichnungen Add Fields oder Add tables finden, können bei der Arbeit mit TYPO3 schwer wiegende Probleme auftreten.
Lizensiert für Markus Mueller
Zusätzlich enthält die Liste unter Remove unused fields (rename with prefix) und Removing tables (rename with prefix) alle Felder und Tabellen, die in der Datenbank vorhanden sind, die aber ausgehend von der aktuellen Konfiguration nicht mehr benötigt werden. Eine möglicherweise sinnvolle Löschung muss explizit manuell veranlasst werden und wird zweistufig durchgeführt. Um jedes Restrisiko bei einer Löschung auszuschließen, werden die ausgewählten Felder und Tabellen von TYPO3 im ersten Schritt lediglich umbenannt und mit einem Präfix zzz_deleted* versehen. Nur Felder und Tabellen, deren Bezeichnung bereits mit zzz_deleted* beginnt, werden tatsächlich gelöscht. Lassen Sie TYPO3 solche Tabellen und Felder zunächst umbenennen. Danach können Sie wie gewohnt mit TYPO3 arbeiten. Erst wenn Sie nach einiger Zeit keine Probleme feststellen, entfernen Sie diese endgültig.
Für alle Änderungen ist unbedingt ein abschließender Klick auf Write to database erforderlich. Erst dadurch werden Ihre Änderungen tatsächlich in der Datenbank durchgeführt.
Statische Daten importieren Einige Extensions liefern nicht nur ein bestimmtes Tabellenschema mit, sondern auch noch zusätzlich Daten, mit denen diese Tabellen gefüllt werden sollen. Hierunter fallen beispielsweise die vorgefertigten TypoScript-Templates, die in der Tabelle static_template gespeichert werden, sowie die Daten für die eingebaute TypoScript-Referenz in der Tabelle static_tsconfig_help. Neben der Bezeichnung Dump static data finden Sie den Link IMPORT. Über diesen Link rufen Sie eine Liste aller Tabellen auf, für die Daten für einen Import bereitgestellt werden. Typischerweise haben solche Tabellen das Präfix static*. Sie können nun über die Kontrollkästchen einzelne oder alle Tabellen für den Import auswählen und die Aktion durch einen Klick auf den Button Write to database ausführen.
Max. Linie
Max. Linie 2.5 Die Datenbank prüfen und warten | 53 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Links Da diese Tabellen in der Regel keine Daten von Benutzern enthalten, können Sie gefahrlos die kompletten statischen Daten auswählen und aktualisieren. So können Sie sicherstellen, dass diese Tabellen den jeweils aktuellsten Datenbestand enthalten.
Systemtabellen leeren Unter dem Link Clear tables erhalten Sie die Möglichkeit, die Inhalte aus bestimmten Systemtabellen zu entfernen. Auch hier müssen Sie die Tabellen jeweils durch Anklicken der einzelnen Kontrollkästchen auswählen und die Aktion durch Write to database bestätigen.
Lizensiert für Markus Mueller
TYPO3 erzeugt die Seiten typischerweise nicht bei jedem Aufruf, sondern speichert das Ergebnis eines einmaligen Seitenaufbaus zur späteren Verwendung in sogenannten Cache-Tabellen. Mit diesem Verfahren muss die Seite nicht jedes Mal über viele Datenbankabfragen neu aufgebaut werden, was die Serverlast reduziert. Da hierbei zum Teil komplette HTML-Ausgaben gespeichert werden, können diese Tabellen sehr groß werden. Wenn Sie die Tabellen cache_pages, cache_pagesection und cache_hash löschen, werden diese Caches gelöscht. Das Ergebnis entspricht der Funktion Alle Caches löschen in der Backend-Menüleiste. Vor einem Backup (siehe Rezept 2.9) kann dies sinnvoll sein, führt jedoch bei folgenden Seitenaufrufen zu einer erhöhten Serverlast, da die Inhalte neu aufgebaut werden müssen. Ein ausführliches Verlaufsprotokoll, mit dem Sie allerhand kontrollieren können, wird Ihnen von TYPO3 zur Verfügung gestellt. Einmal werden in der Tabelle sys_log sämtliche Benutzeraktionen aufgezeichnet, die im Backend durchgeführt werden. In der Tabelle sys_history speichert TYPO3 das Verlaufsprotokoll für jeden Datensatz ab. Dies ist beispielsweise wichtig, wenn Sie Änderungen an einem Datensatz rückgängig machen möchten oder einen Workflow eingerichtet haben. Mit der Zeit werden diese Tabellen sehr groß, wenn Sie diese Tabellen hier aber auswählen und leeren, können Sie die Größe der Datenbank verringern. Jedoch steht Ihnen diese Kontrollfunktion dann nicht mehr zur Verfügung – bedenken Sie diesen Schritt daher besonders genau, bevor Sie die Daten löschen. TYPO3 speichert für jeden Benutzer Werte in einer sogenannten Session. Damit können benutzergebundene Daten gespeichert werden (in Rezept 18.5 erfahren Sie, wie Sie das Session-Management von TYPO3 in eigenen PHP-Skripten verwenden können). Je nachdem, wie viele Besucher sich auf Ihrer Website befinden, können diese Tabellen ebenfalls sehr groß werden. Wir empfehlen, diese Tabellen nicht manuell zu löschen. Standardmäßig werden Sessions nach 24 Stunden gelöscht.
Max. Linie
Achten Sie auch darauf, dass Sie das Install-Tool nicht dauerhaft geöffnet lassen, denn hier waltet keine Session – jeder kann das Install-Tool weiterverwenden, wenn Sie das Fenster nicht schließen.
54 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Diskussion Insbesondere durch die Evaluierung und den Test von Extensions werden oftmals zusätzliche Tabellen und Felder in der Datenbank angelegt. Aus Gründen der Datensicherheit werden diese bei der Deinstallation einer Extension aber nicht wieder entfernt. Damit stehen Ihnen bereits anlegte Daten bei einer erneuten Installation wieder zur Verfügung. Sie sollten aber, je nach Grad der Entwicklungstätigkeit, regelmäßig prüfen, ob Ihre Datenbank nicht unnötigen Ballast enthält, und diesen gegebenenfalls entsorgen. Der Database Analyser greift bei der Prüfung auf die in dem Array $TCA (Table Configuration Array) gespeicherte Metakonfiguration für die Datenbanktabellen zurück und prüft diese gegen die Felder und Tabellen der verwendeten Datenbank. Die im Database Analyser zusätzlich vorhandene Funktion Compare with $TCA führt eine gegenüber COMPARE noch weiter gehende Analyse aus. Hier werden alle Felder und Tabellen mit der Metakonfiguration von TYPO3 verglichen. Dadurch werden auch bestimmte Systemfelder gelistet, die prinzipbedingt nicht in der $TCA-Konfiguration enthalten sind. Diese Funktion wird jedoch für normale Wartungsarbeiten nicht benötigt.
Datenbank-Dumps in typo3conf/ Lizensiert für Markus Mueller
Mit dem Database Analyser können auch eigene Datenbank-Dumps importiert werden. Dazu werden entsprechende SQL-Dateien im Ordner typo3conf/ erwartet. Wenn der Database Analyser dort solch eine Datei vorfindet, sind für jede dieser Dateien die Funktionen IMPORT, COMPARE und VIEW verfügbar. Dies ist nützlich, um die Installation mit einem lauffähigen Beispielprojekt zu bestücken. So können Seitenstrukturen, Inhalte, Benutzer und TypoScript-Templates übernommen werden.
Hinweise zum Namensschema von Tabellen Tabellen von Extensions sehen standardmäßig so aus: tx_extkey_name
Zusätzliche Felder von Extensions präsentieren sich standardmäßig so: tabelle.tx_extkey_feld
Die TYPO3-Standardtabellen Die folgende Aufstellung gibt Ihnen einen Überblick über alle von einer jungfräulichen TYPO3-Standardinstallation verwendeten Tabellen sowie deren Sinn und Zweck: be_groups Daten der Backend-Benutzergruppen.
Max. Linie
be_sessions Session-Informationen der angemeldeten Backend-Benutzer.
2.5 Die Datenbank prüfen und warten | 55 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
be_users Profile der Backend-Benutzer.
Links
cache_hash Referenzierungsdaten für den Cache-Mechanismus. Diese Tabelle wird vollständig geleert, wenn Sie den Button FE-Cache löschen anklicken. cache_imagesizes Daten für den Cache-Mechanismus von Vorschaubildern. cache_md5params MD5-Werte von URL-Parametern (nur in Verbindung mit der Option simulateStaticDocuments). cache_pages Daten für den Cache-Mechanismus von Seiten. Umfangreiche Datenbankabfragen zur Erstellung dieser Seiten können dadurch entfallen. Diese Tabelle wird vollständig geleert, wenn Sie den Button FE-Cache löschen anklicken. cache_pagesection Daten für den Cache-Mechanismus von Seiteninhalten. Diese Tabelle wird vollständig geleert, wenn Sie den Button FE-Cache löschen anklicken. Lizensiert für Markus Mueller
cache_typo3temp_log Referenzierungsdaten für den Cache-Mechanismus von temporären Dateien. fe_groups Daten der Frontend-Benutzergruppen. fe_sessions Session-Informationen von Frontend-Besuchern. fe_session_data Session-Daten von Frontend-Besuchern. fe_users Daten der Frontend-Benutzer. pages Die Seitenstruktur und -daten. Diese Tabelle bildet über das Seitenkonzept die Hauptstrukturierung aller Daten und Inhalte in TYPO3 ab. Hieraus werden die Navigationen und der Seitenbaum im Backend erzeugt. pages_language_overlay Übersetzungen von Seiten. Diese Felder überlagern die Seite der Standardseite aus der Tabelle pages. static_template Standard-TypoScript-Templates.
Max. Linie
static_tsconfig_help Inhalte des TSconfig-Hilfesystems.
56 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
sys_be_shortcuts Backend-Shortcuts. sys_domain Domain-Datensätze. sys_filemounts Mount-Punkte im Dateisystem. sys_history Verlaufsprotokoll für einzelne Datensätze. sys_language Aktivierte Sprachen. sys_lockedrecords Aktuell geöffnete Datensätze. sys_log Systemprotokoll. In dieser Tabelle speichert TYPO3 das Verlaufsprotokoll, in dem beispielsweise die einzelnen Bearbeitungsschritte der Backend-Benutzer aufgezeichnet werden. Dieses Verlaufsprotokoll erreichen Sie über das Modul Log im Bereich Admin-Werkzeuge.
Lizensiert für Markus Mueller
sys_note Notizen von Backend-Benutzern. Diese Notizen können über das Modul Aufgaben angelegt werden, wenn Sie die Extension sys_notepad installiert haben. sys_refindex Verknüpfungen von Inhaltselementen, Dateien oder anderen Datensätzen miteinander. sys_template TypoScript-Templates. sys_workspace Informationen und Zugriffsrechte für Workspaces. tt_address Adressen-Datensätze. tt_content Inhaltselemente der Seiten. Die PID entspricht immer der Seiten-ID, in der das jeweilige Inhaltselement liegt. tx_impexp_presets Gespeicherte Exporteinstellungen. Auf diese Exporteinstellungen können Sie dann bequem über das Modul Aufgaben zugreifen (in Rezept 5.10 erfahren Sie, wie Sie mit der Exportfunktion Inhalte aus dem TYPO3-Seitenbaum auf Ihre lokale Festplatte speichern können).
Max. Linie
tx_rtehtmlarea_acronym Informationen über Akronyme oder Abkürzungen für die Verwendung im Rich Text Editor (RTE).
2.5 Die Datenbank prüfen und warten | 57 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Siehe auch
Links
Rezept 2.8 zeigt Ihnen, wie Sie den Referenzindex nutzen können, um Ihren Datenbestand weiter zu bereinigen.
2.6
Im Dateisystem aufräumen
Problem Sie möchten Ordnung in Ihren TYPO3-Verzeichnissen schaffen und nicht mehr benötigte Dateien entfernen, um auf Ihrem Server Platz zu schaffen und Altlasten in Ihrer TYPO3-Installation zu entsorgen.
Lösung
Lizensiert für Markus Mueller
TYPO3 erzeugt beim Betrieb temporäre Dateien, die zu einem späteren Zeitpunkt teilweise nicht mehr benötigt werden. Außerdem beinhaltet der TYPO3-Quellcode einige Dateien, die für einen regulären Betrieb nicht erforderlich sind. Zusätzlich haben Sie möglicherweise einige Extensions ausprobiert, die aber gar nicht in den produktiven Betrieb übernommen wurden. Die folgenden Punkte helfen Ihnen, unnötigen Ballast zu entsorgen und Ihr TYPO3-Projekt zu entschlacken: • Löschen Sie nicht verwendete Extensions im Ordner typo3conf/ext/. • Leeren Sie regelmäßig den Ordner typo3temp/. Prinzipiell können hier alle Dateien gelöscht werden. Die Dateien werden bei Bedarf automatisch von TYPO3 neu erzeugt. Leider gibt es zum Zeitpunkt der Drucklegung dieses Buchs keine Möglichkeit herauszufinden, welche Dateien noch benötigt werden und welche nicht. Eine sinnvolle Strategie ist, sich an den Zugriffszeiten zu orientieren. Je länger auf eine Datei nicht mehr zugegriffen wurde, desto höher ist die Wahrscheinlichkeit, dass sie nicht mehr benötigt wird. Das Install-Tool bietet Ihnen mit der Funktion typo3temp/ die Möglichkeit, diese temporären Dateien selektiv zu entfernen. • Das Verzeichnis misc/ im TYPO3-Quellenpaket kann grundsätzlich gefahrlos und vollständig gelöscht werden. Hier befinden sich einige zusätzliche Skripten und Beispieldateien.
Max. Linie
• Über die Funktion Database Relations im Modul Admin-Werkzeuge/DB-Überprüfung erhalten Sie eine Liste von Dateien im Ordner uploads/, die nicht mehr benötigt werden. Sollte sich hier eine größere Anzahl von Dateien gesammelt haben, können Sie diese Liste als Ausgangspunkt nehmen, um diese Dateien zu entfernen. Eine solche Löschung muss allerdings von Hand vorgenommen werden, da das Modul derzeit keine Funktionalität zum direkten Löschen bereitstellt.
58 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Diskussion Neben dem Ordner für lokale Extensions typo3conf/ext sollten Sie auch in der Liste der globalen Extensions in typo3/ext prüfen, ob diese noch verwendet werden oder möglicherweise gelöscht werden können. Eine Übersicht der vorhandenen Extensions erhalten Sie, wenn Sie sich am TYPO3Backend der gewünschten Installation anmelden und in den Erweiterungs-Manager wechseln. Wählen Sie dann im Funktionsmenü Install extensions. Als Sortierung sollten Sie in dem Auswahlfeld group by die Option type wählen. Alle Extensions, bei denen links das kleine Icon grau unterlegt ist, werden momentan nicht verwendet und können entfernt werden. Auf die globalen Extensions wird je nach Installationsart und Betriebssystem möglicherweise von mehreren TYPO3-Installationen zurückgegriffen. Beim Löschen von globalen Extensions müssen Sie darauf achten, dass die Extensions in keiner dieser TYPO3-Installationen verwendet wird.
Das Löschen der Dateien im typo3temp/-Ordner können Sie unter Linux über den folgenden kleinen Befehl erledigen: Lizensiert für Markus Mueller
find /ABSOLUTERPFAD/typo3temp/ -atime +20 -exec rm -f "{}" \;
Hiermit werden alle Dateien, deren letztes Zugriffsdatum länger als 20 Tage zurückliegt, gelöscht. Der Wert sowie der Pfad müssen auf die Gegebenheiten angepasst werden. Diese Befehlszeile lässt sich auch gut regelmäßig, beispielsweise täglich, als Cronjob ausführen.
Siehe auch Nicht mehr verwendete Extensions hinterlassen auch in der Datenbank überflüssige Daten. Das Rezept 2.5 zeigt Ihnen, wie Sie Ihre Datenbank aufräumen. Wie Sie eine Extension mit dem Erweiterungs-Manager deinstallieren oder löschen, können Sie in Rezept 15.7 nachschlagen. Rezept 2.8 zeigt Ihnen, wie Sie mit Hilfe des Referenzindex Dateileichen aufspüren können.
2.7
Den Referenzindex aktuell halten
Problem Sie möchten den Referenzindex von TYPO3 auf dem aktuellen Stand halten.
Lösung
Max. Linie
Sie können den Referenzindex als Administrator im Backend unter Admin-Werkzeuge ➝ bB-Überprüfung ➝ Manage Reference Index aufrufen. Dort haben Sie die Möglichkeit,
2.7 Den Referenzindex aktuell halten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 59
Max. Linie
den Referenzindex zu prüfen oder zu aktualisieren. Da es sich jeweils um komplexe und umfangreiche Prüfroutinen handelt, die zudem sinnvollerweise regelmäßig ausgeführt werden sollten, ist die Verwendung der webbasierten Oberfläche nur begrenzt sinnvoll.
Links
Die Funktionalität des Referenzindex wird daher auch auf der Kommandozeile zur Verfügung gestellt. Rufen Sie dazu das TYPO3-Kommandozeilen-Interface mit dem Parameter lowlevel_refindex für den Referenzindex auf: /pfad/zu/php -f /absoluter_pfad/typo3/cli_dispatch.phpsh lowlevel_refindex
Sie erhalten dann eine kurze Übersicht über die Aufrufoptionen. Mit -c wird der Referenzindex nur auf seine Konsistenz geprüft, mit -e aktualisieren Sie den Referenzindex. Ein solcher Aufruf kann dann auch als täglicher Cronjob eingetragen werden. Für die Benutzung des Kommandozeilen-Interface ist es unbedingt erforderlich, dass ein Backend-Benutzer mit dem Benutzernamen _cli_lowlevel vorhanden ist. Vor der erstmaligen Benutzung müssen Sie diesen zunächst anlegen. Bei dem Benutzer darf das Admin-Flag nicht aktiv sein. Das Kommandozeilen-Interface gibt Ihnen bei Unstimmigkeiten bezüglich des BackendBenutzers aber auch entsprechende Hinweise.
Lizensiert für Markus Mueller
Diskussion Im Referenzindex verwaltet TYPO3 Bezüge von Datensätzen zu anderen Datensätzen (und Dateien). Über den Referenzindex kann man also schnell ermitteln, ob und welche Bezüge im System für ein Element bestehen. Das kommentarlose Löschen einer Seite oder Datei, auf die von einer anderen Seite heraus verlinkt wird, ist schließlich in der Praxis selten erwünscht. Die entsprechenden Referenzbezüge werden von TYPO3 dementsprechend in der eigenen Datenbanktabelle sys_refindex verwaltet. Die Aktualisierung dieser Bezüge geschieht bei sachgemäßem Gebrauch jeweils vollständig automatisch im Hintergrund. Dennoch gibt es Situationen, in denen der Referenzindex nicht mehr 100%ig aktuell ist. Dies kann beispielsweise passieren, wenn Datenbankeinträge ohne Verwendung der TYPO3-API gelöscht wurden. Aus diesem Grund ist es sinnvoll, den Referenzindex regelmäßig zu aktualisieren. Sie können den Referenzindex jeweils täglich um 2:30 Uhr nachts aktualisieren lassen, wenn Sie auf der Befehlszeile den Befehl crontab -e aufrufen und die folgende Zeile eintragen: 30 2 * * * /pfad/zu/php -f /pfad/zu/typo3installation/typo3/cli_dispatch.phpsh lowlevel_ refindex -e
Max. Linie
Referenzen werden nicht nur über einfache Datenbankrelationen auf Feldern erfasst. Auch entsprechende Konstrukte wie im Fließtext oder FILE.file bzw. includeCSS im TypoScript-Setup werden vom Referenzindex erfasst. Solche Referenzen werden auch als softRef bezeichnet. Der Referenzindex ist lediglich ein Verzeichnis, in dem alle Bezüge der Datensätze gelistet sind. Die Meldung Index Integrity was perfect! bedeutet lediglich, dass der Index alle 60 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
aktuellen Bezüge beinhaltet. Der Referenzindex selbst übernimmt keinerlei Prüfung, ob diese Bezüge noch intakt (d.h. erreichbar/abrufbar) sind. Für eine solche Überprüfung steht die in Rezept 2.8 besprochene Funktion lowlevel_cleaner zur Verfügung.
2.8
Den Referenzindex nutzen
Problem Sie möchten den Referenzindex nutzen, um die Datenintegrität Ihrer Installation zu prüfen und fehlerfrei zu halten.
Lösung Die Wartungsfunktionalitäten, die auf dem in Rezept 2.7 beschriebenen Referenzindex basieren, stehen ausschließlich auf der Kommandozeile zur Verfügung. Rufen Sie dazu das TYPO3-Kommandozeilen-Interface für das Analyse- und Wartungswerkzeug mit dem Parameter lowlevel_cleaner auf: /pfad/zu/php -f /absoluter_pfad/typo3/cli_dispatch.phpsh lowlevel_cleaner Lizensiert für Markus Mueller
Sie erhalten dann eine im GNU-Manual-Style verfasste Anleitung, mit der Sie die verschiedenen Funktionen nutzen können. Für die Benutzung des Kommandozeilen-Interface ist es unbedingt erforderlich, dass ein Backend-Benutzer mit dem Benutzernamen _cli_lowlevel vorhanden ist. Vor der erstmaligen Benutzung müssen Sie diesen zunächst anlegen. Bei dem Benutzer darf das Admin-Flag nicht aktiv sein. Das KommandozeilenInterface gibt Ihnen bei Unstimmigkeiten bezüglich des Backend-Benutzers aber auch entsprechende Hinweise.
Diskussion Der Cleaner hält die folgenden Funktionalitäten für Sie bereit: missing_files Hiermit werden alle Datensätze ausgegeben, die auf eine nicht mehr existierende Dateiressource verweisen. Eine automatische Reparatur ist dabei nicht in allen Fällen möglich. Gegebenenfalls müssen die Datensätze von Hand geprüft oder die Dateien wiederhergestellt werden.
Max. Linie
missing_relations Gibt alle Daten aus, die auf nicht mehr existierende Referenzen verweisen. Dies kann beispielsweise passieren, weil die Zielseite eines Links in der Zwischenzeit gelöscht wurde.
2.8 Den Referenzindex nutzen | 61 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
double_files Listet alle von TYPO3 verwaltete Dateiressourcen, die doppelt referenziert werden. Dieser Test dürfte eigentlich nie ein Ergebnis liefern, weil TYPO3 keine doppelte Referenzierung für von TYPO3 verwaltete Dateiressourcen unterstützt.
Links
rte_images Prüft die Originalreferenzen zu allen RTEmagic-Bilddateien. Diese Funktionalität ist nur in Fällen relevant, in denen innerhalb des Rich Text Editor im Fließtext Bilder eingefügt werden können. lost_files Listet die von TYPO3 verwalteten Dateiressourcen (in uploads/), die nicht mehr referenziert werden, und daher gelöscht werden können. Hier ist eine automatische Korrektur möglich. orphan_records Gibt eine Übersicht über verlorene Datensätze aus. Verlorene Datensätze sind Datensätze, die keine reguläre Verknüpfung zum Seitenbaum mehr besitzen. Diese sollten gefahrlos gelöscht werden können.
Lizensiert für Markus Mueller
deleted Gibt alle als gelöscht markierten Datensätze aus. Diese können bequem automatisch entfernt werden. versions Listet Detailinformationen zu versionierten Datensätzen und Workspaces. cleanflexform Hiermit können die XML-Strukturen von Flexform-Feldern geprüft und korrigiert werden. syslog Diese Funktion listet die aktuellsten Einträge aus der Tabelle sys_log, in der TYPO3 die Benutzeraktivitäten im Backend protokolliert. Diese Funktion ist lediglich eine Hilfsfunktion, um diese Einträge automatisch per Cronjob via E-Mail zu verteilen. tx_templavoila_unusedce Diese Funktion gibt die von TemplaVoilà nicht genutzten Content-Elemente aus. Im Gegensatz zum Referenzindex aus Rezept 2.7 sind hier deutlich mehr Operationen und Optionen verfügbar. Die grundlegende Aufrufsyntax lautet: /pfad/zu/php -f /absoluter_pfad/typo3/cli_dispatch.phpsh lowlevel_cleaner FUNKTION -r
Max. Linie
Für Funktion setzen Sie die gewünschte Aktion aus der obigen Liste ein. Der Schalter -r sorgt dafür, dass die Aktion ausgeführt wird. Ohne -r erhalten Sie zunächst noch mal einen detaillierten Hilfescreen zur Verwendung des jeweiligen Tools. Mit der Option --AUTOFIX können Sie eine automatische Reparatur veranlassen, diese ist jedoch in einigen Fällen nicht möglich. In diesem Fall müssen Sie die Ausgabe des lowlevel_cleaner als Grundlage für eine manuelle Problembeseitigung nehmen.
62 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Hier die Aufrufsyntax am Beispiel von missing_files. Für [cli_dispatch.phpsh] müssen Sie den vollständigen Aufruf wie in den obigen Beispielen einsetzen, wir haben das hier der Übersichtlichkeit wegen gekürzt: # Die Hilfefunktion aufrufen [cli_dispatch.phpsh] lowlevel_cleaner missing_files # Die Funktion mssing_files ausführen [cli_dispatch.phpsh] lowlevel_cleaner missing_files -r # Soweit möglich, eine automatische Reparatur veranlassen [cli_dispatch.phpsh] lowlevel_cleaner missing_files -r --AUTOFIX
Beachten Sie, dass der lowlevel_cleaner jeweils einen aktuellen Referenzindex erfordert. Der Referenzindex wird standardmäßig jeweils vom lowlevel_cleaner auf seine Aktualität geprüft. Mit der zusätzlichen Option --refindex update können Sie auch eine Aktualisierung veranlassen, mit der option --refindex ignore veranlassen Sie, dass der cleaner den Referenzindex nicht prüft.
Mit dem folgenden Aufruf erhalten Sie eine ausführliche Zusammenfassung über die empfohlene Nutzung des lowlevel_cleaner inklusive eines Tipps zum Einbau in einen Cronjob: Lizensiert für Markus Mueller
/pfad/zu/php -f /absoluter_pfad/typo3/cli_dispatch.phpsh lowlevel_cleaner --showhowto
Siehe auch In Rezept 2.7 finden Sie einführende Hinweise zum Referenzindex und eine Hilfestellung, wie Sie diesen aktuell halten können.
2.9
Ein Backup der TYPO3-Installation erstellen
Problem Sie möchten ein Backup Ihrer TYPO3-Installation erstellen, beispielweise um einem Datenverlust vorzubeugen oder die Daten auf ein anderes System zu überspielen.
Lösung Für ein Backup einer TYPO3-Installation sind sowohl bestimmte Ordner und Dateien als auch die Datenbank zu berücksichtigen.
Backup der Ordner und Dateien
Max. Linie
In jedem Fall sollten die beiden folgenden Ordner und diese Datei vollständig gesichert werden:
2.9 Ein Backup der TYPO3-Installation erstellen | 63 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
uploads/ fileadmin/ typo3conf/localconf.php
Links
Wenn in der Datei typo3conf/localconf.php die Konfigurationsvariable $typo_ db_extTableDef_script = 'extTables.php'; gesetzt ist, muss auch die entsprechende Datei typo3conf/extTables.php mit in das Backup einbezogen werden.
Wenn Sie Extensions beim Backup berücksichtigen wollen, sollten Sie zusätzlich folgende Ordner aufnehmen: typo3conf/ext/ typo3/ext
Dateien im Ordner typo3temp/ werden beim Aufrufen der neuen Seiten automatisch neu angelegt, daher brauchen Sie diesen Ordner nicht zu sichern. Im Ordner typo3conf/ kann insbesondere auf die Cache-Dateien, die einfach anhand des mit temp* beginnenden Dateinamens erkannt werden können, verzichtet werden. Diese temporären Dateien werden beim nächsten Aufruf automatisch von TYPO3 neu angelegt.
Backup der Datenbank Lizensiert für Markus Mueller
Für ein Backup der Datenbank verwenden Sie am sinnvollsten das entsprechende Werkzeug des eingesetzten Datenbanksystems. MySQL liefert beispielsweise zu diesem Zweck das Tool mysqldump aus. Ein Backup mit diesem Werkzeug lässt sich einfach auf der Kommandozeile mit mysqldump --opt --host=localhost --user=dbbenutzer --password=dbpasswort ihre_datenbank > /pfad/datei.sql
erstellen. Dabei müssen Sie die Werte für den Datenbankbenutzer, das Passwort, den Datenbanknamen, den Datenbank-Host und den Dateinamen auf Ihre Gegebenheiten anpassen. Ab der Version 4.0 verwendet mysqldump automatisch UTF-8 als Zeichenformat. Mit der Option --default-character-set können Sie auch eine alternative Kodierung erzwingen. Beachten Sie, dass mysqldump beim Export möglicherweise Zeichensatzkonvertierungen vornimmt. Sie sollten daher immer prüfen, ob das Ergebnis des Dumps korrekt ist. Im Rezept 2.10 finden Sie einige Hilfestellungen zur Handhabung von Zeichensätzen in Verbindung mit MySQL. Mit der Option --compatible ist es möglich, den Dump automatisch in einem zu älteren MySQL-Versionen kompatiblen Format zu erzeugen. Mit der Option --compact erzeugen Sie ein kompakteres Export-Format
Unter Unix oder Linux können Sie den Dump direkt komprimieren, was eine erheblich kleinere Dateigröße bewirkt:
Max. Linie
mysqldump --opt --host=localhost --user=dbbenutzer --password=dbpasswort ihre_datenbank | gzip -c > /pfad/datei.sql.gz
64 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Ein solcher Aufruf ist auch gut, um einen regelmäßigen Cronjob zu integrieren. Wenn Ihnen der Umgang mit der Kommandozeile nicht vertraut ist, können Sie ein Backup auch über ein beliebiges anderes Werkzeug erstellen. Weit verbreitet und oftmals bei Hostern vorinstalliert ist beispielsweise phpmyadmin, ein webbasiertes Datenbankwerkzeug, das auch als eigene TYPO3-Extension verfügbar ist. Bei webbasierten BackupWerkzeugen entstehen jedoch oftmals Probleme mit größeren Datenbanken. Um die Dateigröße des Datenbank-Dumps weiter zu verringern, können Sie vor dem Backup wie in Rezept 2.5 beschrieben einige Datenbankdaten entfernen.
Diskussion Bei einem Backup stehen Sie oft vor dem Problem, dass dieses auf einem anderen Host in den Produktivbetrieb genommen werden soll. In einem solchen Fall können Sie das Datenbank-Backup auch auf bestimmte Tabellen beschränken. Ebenso bietet es sich in diesem Fall an, in der Datei typo3conf/localconf.php
ein include-Statement einzubinden, das mithilfe von PHP eine weitere Datei in die Konfiguration einbindet: Lizensiert für Markus Mueller
include_once('host_localconf.php');
Damit können Sie hostspezifische Konfigurationen, die sich in den verschiedenen Systemen unterscheiden, wie beispielsweise Pfade zu ImageMagick oder Datenbankkennungen, getrennt halten. Bei einem Backup wird diese hostspezifische Datei dann nicht berücksichtigt.
Dieses Vorgehen erfordert natürlich etwas Umsicht bei der Änderung von Konfigurationsvariablen, damit nicht unbeabsichtigt hostspezifische Variablen über das Install-Tool in die reguläre Konfigurationsdatei typo3conf/localconf.php geschrieben werden.
Max. Linie
Hilfreich kann auch die TYPO3-Extension Full Backup (w4x_backup) sein. Diese fasst die anfangs genannten Lösungsschritte zusammen, sodass Sie das Backup bequem über das Backend steuern können. Mehr Informationen zu dieser Extension finden Sie unter http://typo3.org/extensions/repository//w4x_ backup/. Unter Windows sind für diese Extension jedoch zusätzliche Werkzeuge notwendig, und der Einsatz funktioniert aufgrund der Anforderungen nicht in jeder TYPO3-Umgebung
2.9 Ein Backup der TYPO3-Installation erstellen | 65 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links
Siehe auch In Rezept 5.10 erfahren Sie, wie Sie Inhalte direkt aus TYPO3 heraus lokal sichern können. Im folgenden Rezept 2.10 finden Sie einige Hilfestellungen zur Handhabung von Zeichensätzen in Verbindung mit TYPO3 und MySQL, die sich auch auf den Backup-Prozess auswirken können.
2.10 Den Zeichensatz einer bestehenden TYPO3Installation prüfen und auf UTF-8 umstellen Problem Sie möchten Ihre bereits in Betrieb befindliche Website in den UTF-8-Zeichensatz konvertieren oder auch nur deren korrekte Zeichensatzkodierungen überprüfen. Die Verwendung von UTF-8 ist vor allem sinnvoll, wenn Sie Sprachen verwenden wollen, die nicht auf dem lateinischen Alphabet basieren. Aber auch ohne chinesische Inhalte ist UTF-8 ein zukunftsfähiger Standard und hilft, Probleme beim Datenaustausch zu vermeiden. Lizensiert für Markus Mueller
Lösung Eine saubere Zeichensatzkonvertierung und -handhabung ist eine komplexe Aufgabenstellung, bei der auch mit umfangreicher Erfahrung immer wieder kleinere Probleme auftreten können. Sie sollten für dieses Rezept etwas Geduld mitbringen. Wir haben auch eine entsprechende Extension zu diesem Rezept bereitgestellt, die Ihnen umfangreiche Hilfestellung bei der Konvertierung bietet.
Bevor Sie Ihre Daten sauber nach UTF-8 konvertieren können, müssen Sie zunächst einmal herausfinden, in welcher Kodierung Ihre Daten momentan vorliegen. Das klingt wesentlich trivialer, als es in der Praxis ist. Technisch bedingt gibt es keine sichere Möglichkeit, den tatsächlich verwendeten Zeichensatz einer Zeichenkette zu bestimmen. Allenfalls kann man sich den Text in verschiedenen Kodierungen ansehen und dann prüfen, ob die gewünschten Sonderzeichen korrekt dargestellt werden. Dabei spielen aber auch die Einstellungen des verwendeten Text-Editors, der Betriebssystemumgebung und auch des Datenbankservers eine Rolle. Leider kommt es leicht zu unsauber kodierten Daten, was nicht immer sofort auffällt, da sich die Fehler innerhalb einer bestimmten Umgebung (beispielsweise TYPO3) gegenseitig aufheben und alles korrekt erscheint. Um Ihre Ausgangssituation für eine erfolgreiche Konvertierung zu berücksichtigen, teilt sich die Lösung in die folgenden vier Schritte auf:
Max. Linie
1. Den in der DB hinterlegten Zeichensatz bestimmen 2. Die Zeichensatzhandhabung der MySQL-Verbindung analysieren
66 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
3. Die Zeichensatzkonfiguration von TYPO3 bestimmen 4. Einen Datenexport und -import vornehmen Wenn Ihre Daten, insbesondere die Umlaute, sowohl mit dem MySQL-Kommandozeilenwerkzeug als auch mit phpMyAdmin korrekt dargestellt werden, spricht dies für ein korrektes Datenformat. Sollten Ihre Daten innerhalb von TYPO3 vollständig korrekt verarbeitet werden, aber beispielsweise mit phpMyAdmin nicht völlig richtig angezeigt werden, ist dies ein ernst zu nehmendes Zeichen dafür, dass möglicherweise etwas mit den Kodierungen nicht stimmt. Die folgenden Ausführungen helfen Ihnen dann, die Probleme zu analysieren und zu beseitigen.
In der Datenbank hinterlegter Zeichensatz
Lizensiert für Markus Mueller
Bei aktuellen MySQL-Versionen (ab 4.1) ist der Zeichensatz einzeln für jedes (Text-)Feld einer Tabelle festgelegt. Dabei wird dieser Zeichensatz ohne weitere Vorkehrungen beim Erzeugen von Tabellen bzw. Spalten automatisch von der übergeordneten Ebene (Server, Datenbank, Tabelle) vererbt. In der Regel wird man innerhalb einer Datenbank durchgängig eine Zeichensatzkodierung verwenden, dies ist aber prinzipiell nicht zwingend erforderlich. Mit dem folgenden SQL-Befehl können Sie sich einen einfachen Überblick über alle in Ihrer TYPO3-Datenbank hinterlegten Zeichensätze verschaffen, für TYPO3_DB setzen Sie bitte den Namen Ihrer TYPO3-Datenbank ein: mysql> SELECT distinct(character_set_name) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'TYPO3_DB' AND NOT character_set_name IS NULL;
Die INFORMATION_SCHEMA-Tabellen sind erst ab MySQL-Version 5.02 verfügbar. In MySQL-Versionen ab 4.1 können Sie die Informationen zu den für die einzelnen Felder konfigurierten Zeichensätzen über den folgenden SQLBefehl erhalten: mysql> SHOW FULL COLUMNS FROM TYPO3_DB.tbl_name;
MySQL-Versionen vor 4.1 unterstützen Zeichensätze nicht auf Spaltenebene.
Mit diesen Befehlen sollten Sie ermitteln können, welche Zeichensatzkodierung im MySQL-Server für Ihre Daten hinterlegt ist. Normalerweise sollte dies entweder latin1 oder utf8 sein. Sollte der seltene Fall eintreten, dass Sie mehrere verschiedene Kodierungen verwenden, hilft Ihnen der folgende Befehl, die hinterlegte Zeichensatzkoderung für die einzelnen Felder/Spalten zu ermitteln: mysql> SELECT table_name,column_name,character_set_name,collation_name FROM INFORMATION_ SCHEMA.COLUMNS WHERE table_schema = 'TYPO3_DB' AND NOT character_set_name IS NULL ORDER BY table_name,character_set_name,column_name;
Max. Linie
Das vierspaltige Ergebnis gibt den Tabellennamen, den Feldnamen sowie den konfigurierten Zeichensatz und den konfigurierten Sortier-/Such-Algorithmus aus. Letzterer wird als collation bezeichnet und ist eng mit dem Zeichensatz verbunden.
2.10 Den Zeichensatz einer bestehenden TYPO3-Installation prüfen und auf UTF-8 umstellen | 67 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Damit haben wir den ersten Schritt für eine erfolgreiche Konvertierung und Handhabung erledigt. Wir wissen nun, welcher Zeichensatz in MySQL zur Speicherung der Daten hinterlegt ist, diesen bezeichnen wir im Folgenden mit »Zeichensatz-Datenbank«.
Links
Dieser Wert bedeutet noch nicht, dass die Daten auch wirklich korrekt in der entsprechenden Kodierung vorliegen. Erst mal ist dieser Wert nur der Wert, von dem MySQL bei der Verarbeitung ausgeht. Es ist technisch nicht möglich, herauszufinden, ob die Kodierung der angelieferten Daten auch entsprechend korrekt ist. Wie wir gleich noch sehen werden, kann es durchaus zu abweichend oder falsch kodierten Daten kommen.
Zeichensatzhandhabung der MySQL-Verbindung Neben den bei den einzelnen Feldern einer Datenbank hinterlegten Zeichensatzkodierungen nehmen einige weitere Optionen einen starken Einfluss auf die Datenhandhabung bei den SQL-Abfragen und -Ergebnissen. Um die Thematik Zeichensatzkodierung in den Griff zu bekommen, ist ein Verständnis für die grundsätzliche Handhabung der Zeichensätze in MySQL bei den Abfrage-Ergebnis-Zyklen sehr empfehlenswert, dieses werden wir im Folgenden vermitteln. Lizensiert für Markus Mueller
Zunächst sind die folgenden drei Einstellungen für den Anfrage-Ergebnis-Zyklus zwischen einer MySQL-Clientanfrage und dem MySQL-Server von zentraler Bedeutung: character_set_client Mit diesem Wert teilt der Client dem MySQL-Server mit, welche Zeichensatzkodierung er bei den Anfragen verwendet. character_set_connection Dieser Wert legt den Zeichensatz fest, den der MySQL-Server verwendet, nachdem er eine Anfrage erhalten hat. Wenn dieser Wert nicht dem Wert in character_set_client entspricht, konvertiert MySQL die eintreffenden Daten entsprechend. Die Konvertierung läuft von character_set_client zu character_set_connection. Der Wert ist nur für eingehende Anfragen und in Verbindung mit character_set_client relevant. character_set_result Mit diesem Wert wird dem MySQL-Server mitgeteilt, in welchem Zeichensatz er die Ergebnisse zurückliefern soll. Ausgehend von dem Zeichensatz, der für die Datenbank, die Tabelle oder die Spalte gesetzt wurde, werden die Daten des Ergebnisses nötigenfalls in diesen Zeichensatz konvertiert. Mit dem folgenden SQL-Befehl können Sie diese Parameter für Ihre aktuelle Session ermitteln: mysql> SHOW VARIABLES LIKE 'character_set_%';
Max. Linie
Relevant sind hier nur die oben genannten drei Parameter character_set_client, character_set_connection und character_set_result. Diese drei Werte sollten im Normalfall übereinstimmen.
68 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Beachten Sie, dass diese Werte nur innerhalb der jeweiligen Session gültig sind. Diese Abfrage führt aus diesem Grund innerhalb der TYPO3-DB-API, dem MySQL-Konsolenclient und phpMyAdmin oft zu verschiedenen Ergebnissen. Zur Untersuchung Ihrer Ausgangslage sind jedoch nur die von TYPO3 verwendeten Werte relevant. Die Werte dieser drei Variablen sind im MySQL-Modul von PHP standardmäßig immer auf latin1 gesetzt. Um die Werte entsprechend zu beeinflussen, steht in TYPO3 die Option setDBinit im Install-Tool zur Verfügung, die dann dafür sorgt, dass die Datenbankverbindung von TYPO3 entsprechend initialisiert wird. Die Extension zu diesem Rezept zeigt Ihnen die von TYPO3 verwendeten Werte an.
Diesen Wert nennen wir im folgenden »Zeichensatz-Verbindung«.
Zeichensatz-Konfiguration TYPO3 Nun müssen Sie prüfen, welchen Zeichensatz TYPO3 bisher verwendet hat. Wenn Sie bereits die Option forceCharset im Install-Toll gesetzt haben, ist dies der Zeichensatz, den TYPO3 zum Verarbeiten und Speichern verwendet hat. Sollten Sie forceCharset bisher nicht verwendet haben, benutzt TYPO3 standardmäßig den Zeichensatz ISO 8859-1. Dies ist auch unproblematisch, weil dieser zumindest die in Westeuropa verwendeten Sprachen – bis auf wenige Sonderzeichen – vollständig unterstützt. Lizensiert für Markus Mueller
Max. Linie
Diesen Zeichensatz bezeichnen wir als »Zeichensatz-TYPO3«.
Datenexport und -import Nachdem wir nun die drei Parameter Zeichensatz-Datenbank, Zeichensatz-Verbindung und Zeichensatz-TYPO3 ermittelt haben, können wir uns mit der Datenübernahme befassen. Die folgende Tabelle gibt eine Übersicht über alle möglichen auftretenden Kombinationen: Zeichensatz-TYPO3
Zeichensatz-Verbindung
Zeichensatz-Datenbank
Ergebnis
Latin1
Latin1
Latin1
OK: Latin1
Latin1
Latin1
UTF-8
OK: UTF-8 (TYPO3 vor 4.2: Binärfelder: Latin1)
Latin1
UTF-8
Latin1
nicht möglich, sofern Umlaute verwendet werden
Latin1
UTF-8
UTF-8
nicht möglich, sofern Umlaute verwendet werden
UTF-8
Latin1
Latin1
durchgängig UTF-8-kodierte Daten in Latin1-Datenbank
UTF-8
Latin1
UTF-8
doppelt UTF-8-kodierte Daten in Datenbank (TYPO3 vor 4.2: Binärfelder: korrektes UTF-8)
UTF-8
UTF-8
Latin1
OK: Latin1 (TYPO3 vor 4.2: Binärfelder: UTF-8)
UTF-8
UTF-8
UTF-8
OK: UTF-8
2.10 Den Zeichensatz einer bestehenden TYPO3-Installation prüfen und auf UTF-8 umstellen | 69 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
mysqldump bei UTF-8-kodierten Daten in der Latin1-Datenbank
Links
Verwenden Sie das folgende mysqldump-Kommando, für USER und TYPO3_DB setzen Sie dabei die entsprechenden Werte ein: mysqldump -u USER -p --default-character-set=latin1 TYPO3_DB > t3dbdump.sql
Da es sich aus Sicht von MySQL um eine Latin1-Datenbank handelt, werden keine Konvertierungen durchgeführt, wenn Sie Latin1 als gewünschten Zeichensatz für den Dump angeben. Im Ergebnis haben Sie dann korrekt kodierte UTF-8-Daten in der Dump-Datei.
mysqldump bei doppelt UTF-8-kodierten Daten Da TYPO3 aus Sicht von MySQL Latin1-kodierte Daten angeliefert hat (ZeichensatzVerbindung Latin1), wurden diese von MySQL beim Speichern von Latin1 in UTF-8 konvertiert. Beim Auslesen der Daten hat MySQL das Ergebnis wiederum von UTF-8 in Latin1 umgewandelt. Damit kommen die Daten in TYPO3 wieder korrekt in UTF-8 an. Innerhalb von TYPO3 fällt auch dieses Problem deswegen nicht auf. Verwenden Sie das folgende mysqldump-Kommando, für USER und TYPO3_DB setzen sie dabei die entsprechenden Werte ein: Lizensiert für Markus Mueller
mysqldump -u USER -p --default-character-set=latin1 TYPO3_DB > t3dbdump.sql
Auch wenn Sie hier vermeintlich eine UTF-8-Datenbank in den Zeichensatz Latin1 konvertieren, das Ergebnis ist eine korrekte UTF-8-kodierte Datei. Mit diesem Befehl macht mysqldump lediglich die doppelt durchgeführte Konvertierung rückgängig.
mysqldump für alle anderen Fälle Verwenden Sie das folgende mysqldump-Kommando, für USER und TYPO3_DB setzen Sie dabei die entsprechenden Werte ein: mysqldump -u USER -p TYPO3_DB > t3dbdump.sql
Das weitere Vorgehen Sie haben nun in jedem Fall einen Datenbank-Dump, der korrekt UTF-8-kodierte Daten enthält.
Max. Linie
Allerdings speichert mysqldump den beim Dump verwendeten Zeichensatz, ebenso wie den Zeichensatz der Datenbank, innerhalb der Dump-Datei. Da Ihre Daten nun aber UTF-8kodiert vorliegen und auch die Zieldatenbank die UTF-8-Kodierung verwenden soll, müssen Sie nun in der erzeugten Datei mit einem beliebigen Text-Editor alle Vorkommen der Zeichenkette latin1 suchen und durch utf8 (innerhalb von SET NAMES latin1 oder DEFAULT CHARSET latin1) ersetzen. Achten Sie dabei darauf, dass alle Zeichen in Ihrem Editor korrekt dargestellt und nicht möglicherweise von diesem konvertiert werden. Unter Linux
70 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
eignen sich hier alle Editoren, unter Windows ist Notepad++ ein geeignetes Werkzeug. Nachdem Sie in t3dbdump.sql latin1 durch utf8 ersetzt haben, kann die Datei direkt in eine korrekt für UTF-8 eingerichtete TYPO3-Installation eingespielt werden. Beachten Sie dazu das Rezept 1.9 und führen Sie die dort genannten Schritte aus. Nachdem Sie die Installation korrekt eingerichtet haben, können Sie den Datenbank-Dump mit dem folgenden Befehl einspielen: mysql -u USER -p TYPO3_DB < t3dbdump.sql
Beachten Sie, dass auch die von TYPO3 verwendeten HTML-Vorlagen nun in UTF-8 kodiert sein sollten. Vorhandene Dateien können Sie leicht mit dem Werkzeug recode nach UTF-8 konvertieren: recode latin1..utf-8 latin 1datei.html
Achten Sie darauf, dass Sie zur formatierten Ausgabe von Datumsangaben auch das TypoScript-Setup config.locale_all auf einen entsprechenden Wert mit UTF-8-Unterstützung setzen sollten: config.locale_all=de_DE.UTF-8
Diskussion Lizensiert für Markus Mueller
Die folgende Liste hilft Ihnen bei der Überprüfung möglicher Fehlerquellen und gibt Ihnen einige nützliche Hintergrundinformationen: Betriebssystem unterstützt den Zeichensatz? Ihr Betriebssystem sollte grundsätzlich UTF-8 verarbeiten können. Das ist in allen modernen Betriebsystemen der Fall. Unter Linux sollten Sie ein entsprechendes Locale mit UTF-8-Unterstützung einrichten. Mit dem folgenden Befehl können Sie auf der Kommandozeile alle unterstützten Lokalisierungseinstellungen einsehen: user@rechner:~$ locale -a
Terminal/Textverarbeitungsprogramm stellt Text in UTF-8 dar? Prüfen Sie sicherheitshalber, ob Ihr Terminal und Ihre Editoren für UTF-8 eingerichtet sind. MySQL-Kommandozeile. Auf der MySQL-Kommandozeile können Sie mit den folgenden Befehlen den für die Kommunikation zu verwendenden Zeichensatz festlegen: mysql> set names utf8
Der UTF-8-Zeichensatz wird von MySQL prinzipiell unterstützt? Stellen Sie sicher, dass die Zeichenkodierung vom MySQL-Server auch unterstützt wird. Geben Sie diesen Befehl in die MySQL-Konsole ein, um die Einstellungen zu prüfen: mysql> SHOW CHARACTER SET;
Max. Linie
In der linken Spalte muss der Wert utf8 erscheinen, wie in diesem Auszug dargestellt:
2.10 Den Zeichensatz einer bestehenden TYPO3-Installation prüfen und auf UTF-8 umstellen | 71 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
+----------+--------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+--------------------+---------------------+--------+ | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | +----------+--------------------+---------------------+--------+
Links
Ebenfalls muss bei dieser Abfrage der Wert utf8_general_ci in der Liste erscheinen: mysql> SHOW COLLATION LIKE 'utf8%';
Die Tabelle sollte mindestens diese Werte zeigen: +--------------------+---------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +--------------------+---------+-----+---------+----------+---------+ | utf8_general_ci | utf8 | 33 | Yes | Yes | 1 | | utf8_unicode_ci | utf8 | 192 | | Yes | 8 | +--------------------+---------+-----+---------+----------+---------+
Zeichensatzkodierung der aktuellen Datenbank-Verbindung? Nutzen Sie den folgenden SQL-Befehl zur Abfrage der Zeichensatzeinstellungen einer MySQL-Verbindung: mysql> SHOW VARIABLES LIKE 'character_set_%';
Lizensiert für Markus Mueller
Daraufhin erhalten Sie eine Liste mit den momentanen Zeichensatzeinstellungen der aktuellen Verbindung. Die Liste gibt unter anderem Auskunft über den verwendeten Zeichensatz der Datenbank und über die Kodierung der MySQL-Verbindung. Beachten Sie, dass diese Werte auf der MySQL-Kommandozeile von den Werten der TYPO3-Datenbank-API abweichen können! +--------------------------+-----------------------------------------+ | Variable_name | Value | +--------------------------+-----------------------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | latin1 | +--------------------------+-----------------------------------------+
Werden Templates in TYPO3 eingebunden? Sonderzeichen in HTML-Templates werden nicht korrekt dargestellt, wenn sie nicht in UTF-8 vorliegen. Notieren Sie sich alle Templates, die konvertiert werden müssen.
Max. Linie
Sonderzeichen in PHP? Sie sollten prüfen, ob Sonderzeichen im PHP-Code enthalten sind. Sprachwerte sollten Sie unbedingt in XML-Dokumente auslagern und über die TYPO3-API ausgeben. Alternativ können Sie die PHP-Skripten auch in UTF-8 speichern. Wir empfehlen Ihnen jedoch, die Sprachwerte vollständig über die TYPO3-API einzubinden. Die dafür nötigen Schritte werden in Rezept 17.7 erläutert. System-Extensions speichern die Sprachwerte standardmäßig in diesem Format. Prüfen Sie, ob die von Ihnen installierten Extensions es diesen gleichtun.
72 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Sperren Sie das Backend für Redakteure Sorgen Sie dafür, dass während der Umstellung keine Inhalte über das Backend eingegeben werden. In Rezept 2.4 werden die dafür nötigen Schritte beschrieben. Wenn größere Redakteurteams an der Website arbeiten, sollte die Umstellung frühzeitig kommuniziert werden. In den TYPO3-Versionen kleiner als 4.2 wird das TypoScript-Setup in einem Feld mit einem binären Datentyp gespeichert, in TYPO3-Versionen kleiner als 4.1 gilt das auch für Page- und User-TSconfig. Dies führt unter gewissen Umständen bei der Konvertierung zu Problemen mit Sonderzeichen oder Umlauten in diesen Feldern. Aktualisieren Sie Ihre Installation also erst nach dem Durcharbeiten diese Rezepts.
Die Datenbankparameter im Detail Die Parameter sind aufgeteilt in zwei Gruppen: die »Verbindungs- und Kommunikationsparameter« und die »Parameter für Datenspeicherung«. Verbindungs- und Kommunikationsparameter: character_set_client, character_set_connection und character_set_result Die Verbindungsparameter wurden bereits in der Lösung beschrieben. Lizensiert für Markus Mueller
Parameter für Datenspeicherung: character_set_server Der Standardzeichensatz für neue Datenbanken, wenn bei der Erstellung der Datenbank (CREATE DATABASE) kein Zeichensatz angegeben wurde. Der Parameter kann über die globalen Einstellungen in der my.conf-Datei, bei der Erstellung der Datenbank und während einer Datenbanksitzung [interaktiv] festgesetzt werden. character_set_database Der Standardzeichensatz für die aktuell verwendete Datenbank. Dieser wird bei der Erstellung von neuen Tabellen verwendet, wenn bei der Erstellung (CREATE TABLE) kein abweichender Zeichensatz angegeben wird. Sollte aktuell keine Datenbank verwendet werden, wird dieser Wert von character_set_server geerbt. character_set_system Die Zeichenkodierung für den Datenbanktabellen- und Spaltennamen. Dieser Wert steht standardmäßig auf utf8.
Was passiert unter der Haube?
Max. Linie
Durch die forceCharset-Einstellungen setzt TYPO3 automatisch weitere Parameter, die wichtig für eine vollständige UTF-8-Unterstützung sind. Sie brauchen diese Einstellungen nicht manuell zu ändern, es lohnt sich jedoch zu wissen, was unter der Haube von TYPO3
2.10 Den Zeichensatz einer bestehenden TYPO3-Installation prüfen und auf UTF-8 umstellen | 73 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
noch passiert, um zum Beispiel mögliche Fehlerursachen bei der Ausgabe von Sonderzeichen besser einschätzen zu können:
Links
1. Es wird explizit ein Content-Type: text/html;charset=utf-8 als Header gesendet, falls Sie das Senden dieses Headers nicht explizit per TypoScript mit der Option config.disableCharsetHeader = 1 unterbinden. 2. Die Frontend-Ausgabe erfolgt automatisch im entsprechenden Zeichensatz des TYPO3-Backends. Im Kopfbereich des HTML-Dokuments wird die Kodierung des Dokuments angegeben. Mit dem folgenden TypoScript-Wert können Sie gegebenenfalls einen abweichenden Zeichensatz für die Frontend-Ausgabe festlegen, TYPO3 konvertiert die Daten dann automatisch und passt die entsprechenden Meta-Auszeichnungen an: config.renderCharset = utf-8
3. Der Wert metaCharset legt fest, welcher Wert für den Zeichensatz in den Meta-Angaben ausgegeben wird. Eine Anpassung dieses Werts ist nicht sinnvoll, da er automatisch entsprechend der Option renderCharset übernommen wird: config.metaCharset = utf-8 => <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> Lizensiert für Markus Mueller
4. Wenn Sie den Dokumenttyp mit config.doctype auf ein XHTML-Format festlegen, wird TYPO3 die Zeichenkodierung auch im XML-Prolog angegeben:
Der Zeichensatz Latin1 Der in Westeuropa meistverbreitete Zeichensatz ISO 8859-1 wird auch als Latin1 bezeichnet. Mit ISO 8859-15 und CP1252 existieren einige minimale Varianten von ISO 8859-1 beziehungsweise Latin1, die zusätzlich das €-Symbol enthalten. CP1252 findet sehr weite Verbreitung, weil es der von Microsoft in Windows verwendete Zeichensatz ist. Dementsprechend handelt es sich auch bei dem von MySQL als Latin1 bezeichneten Zeichensatz tatsächlich um den Zeichensatz CP1252. Wenn Sie mit Werkzeugen wie recode oder iconv zur Zeichensatzkonvertierung arbeiten, sollten Sie aus diesem Grund besser CP1252 statt Latin1 verwenden. Der folgende Wikipedia-Artikel geht auf die Unterschiede dieser Varianten ein: http://de.wikipedia.org/wiki/ISO_8859-1.
Siehe auch
Max. Linie
MySQL unterstützt UTF-8 ab Version 5.1. Die Sortierreihenfolge utf8_general_ci ist dann Standard. Das bedeutet, dass deutsche Umlaute korrekt sortiert werden. Zum Beispiel wird das Ö mit O gleichgestellt. Weitere Details finden Sie im MySQL-Handbuch unter http://dev.mysql.com/doc/refman/5.1/de/charset-unicode-sets.html. Einen detaillierten Einblick in die TYPO3-Funktionen zur Konvertierung zwischen unterschiedlichen Zeichensätzen finden Sie in der Datei t3lib/class.t3lib_cs.php.
74 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Die Windows-Version von recode finden Sie unter dieser Adresse: http://gnuwin32.sourceforge.net/packages/recode.htm. Ein lesenswerter Artikel zu den einzelnen Varianten von ISO 8859-1 findet sich unter http://de.wikipedia.org/wiki/ISO_8859-1.
2.11 Systemprozesse mit dem Syslog protokollieren Problem Sie möchten TYPO3 so konfigurieren, dass bestimmte Aktionen oder Prozesse protokolliert werden, beispielsweise um Informationen über Systemprozesse innerhalb von TYPO3 zu ermitteln.
Lösung Aktivieren Sie das Syslog von TYPO3. Wechseln Sie dazu in das Install-Tool und wählen Sie den Menüpunkt All Configuration. Beim Schlüssel systemLog tragen Sie einen Wert nach diesem Muster ein: Lizensiert für Markus Mueller
file,/pfad/datei.log
Alternativ können Sie diesen Wert auch direkt in die Datei localconf.php schreiben, indem Sie dort diese Codezeile hinzufügen: $TYPO3_CONF_VARS['SYS']['systemLog'] = 'file,/pfad/datei.log';
Ersetzen Sie den hervorgehobenen Text mit dem absoluten Pfad zur Logdatei und stellen Sie sicher, dass der Webserver Schreibrechte in diesem Verzeichnis hat. Zwischen dem Komma und dem Pfad darf kein Leerzeichen sein. Nachdem Sie diesen Wert gespeichert haben, schreibt TYPO3 alle Logeinträge in die angegebene Datei. Um die Protokollierung zu testen, melden Sie sich bei der Anmeldung am Backend mit ungültigen Benutzerdaten an. TYPO3 wird dann einen Protokolleintrag nach diesem Muster einfügen: 02-08-08 18:18 - Core: Login-attempt from 127.0.0.1 (), username 'admin', password not accepted!
Diese Einträge können Sie dann nutzen, um bestimmte Informationen oder Fehlerverhalten zu analysieren. Beachten Sie, dass die Logdatei je nach Loglevel und Alter an Größe zunimmt. Löschen Sie von Zeit zu Zeit Logeinträge, um den Speicherbedarf der Datei zu reduzieren.
Max. Linie
Diskussion Im Programmcode von TYPO3 sind an zahlreichen Stellen Protokollfunktionen eingebunden, die es erlauben, Aktionen und Prozesse mitzuschreiben. Standardmäßig wird
2.11 Systemprozesse mit dem Syslog protokollieren | 75 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
der Schreibvorgang dieser Protokollfunktionen jedoch unterdrückt und muss erst, wie in der Lösung gezeigt, aktiviert werden. Erst wenn Sie TYPO3 mitteilen, wo und wie die Protollierung erfolgen soll, werden die Protokolldaten sichtbar.
Links
Das Syslog protokolliert ausschließlich Systemmeldungen. Es hat damit eine gänzlich andere Zielsetzung als der Logmechanismus im TYPO3-Backend, der die verschiedenen ausgeführten Aktionen von Backend-Benutzern in der Datenbanktabelle sys_log protokolliert.
Den Umfang der Datei könenn Sie begrenzen, indem Sie die Priorität angeben, ab der TYPO3 die Protokollierung starten soll. Die einzelnen Meldungen erfolgen unter Angabe einer Priorität, die in Zahlen von 0 bis 4 angegeben wird. Über das Install-Tool können Sie über die Option systemLogLevel die minimale Priorität festlegen, ab der TYPO3 protokollieren soll. Der Standardwert ist 0, wodurch Logmeldungen jeder Priorität erfasst werden. Den Parameter systemLogLevel können Sie auch direkt in der Datei localconf.php angeben, indem Sie dort diese Codezeile einfügen: $TYPO3_CONF_VARS['SYS']['systemLogLevel'] = '0';
Den Wert können Sie aus diesen Werten wählen: Lizensiert für Markus Mueller
0 (info) Allgemeine Informationen über Prozesse; Standardwert. 1 (notice) Hinweise bzw. Informationen, die Entscheidungen in TYPO3 beeinflussen. 2 (warning) Warnungen, Meldungen, die auf mögliche Probleme hinweisen. 3 (error) Fehlermeldungen, die beim Ablauf eines Prozesses geworfen wurden. TYPO3 wird im Ablauf nicht direkt beeinflusst, es kann jedoch zu Datenverlust bzw. inkonsistenten Daten und Fehlfunktionen kommen. 4 (fatal error) Schwerwiegende Fehler, die Abläufe und Kernfunktionen von TYPO3 direkt beeinflussen und dringend behoben werden sollten. Um beispielsweise lediglich Fehlermeldungen zu protokollieren, setzen Sie den Wert auf 3.
Max. Linie
Was aber, wenn Sie unterschiedliche Protokollierungen implementieren möchen, zum Beispiel eine, die alle Meldungen in eine Datei schreibt, und eine, die Sie bei Einträgen mit höchster Priorität per E-Mail informiert? Neben der in der Lösung gezeigten Möglichkeit stehen Ihnen noch weitere Optionen zur Handhabung der Logmeldungen zur Verfügung, die genau dieses Verhalten ermöglichen. Sie können die Syslog-Meldungen auch per Mail verteilen oder an den Syslog-Dienst des Betriebssystems oder das PHP-eigene Fehlerprotokoll weiterreichen. Jede dieser Methoden verfügt über weitere Konfigurationsparameter, die durch Kommata voneinander getrennt eingetragen werden. Die folgende Liste
76 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
zeigt alle bereitgestellten Logmethoden und ihre Parameter. Optionale Parameter sind in eckige Klammern gefasst: file,/pfad/datei.log[,severity]
Die Meldungen werden in eine Datei geschrieben. mail,EmpfängerMail[/AbsenderMail] [,severity]
Die Meldungen werden per E-Mail an die Adresse EmpfängerMail versendet. syslog,Facility[,severity]
Die Meldungen werden über die PHP-Funktion syslog() an den Logservice des Betriebssystems übergeben. Als Facility sollten Sie die Zeichenkette 'USER' eintragen. Die ganzzahlige Priorität wird dabei intern automatisch in eine der PHP-Konstanten LOG_INFO, LOG_NOTICE, LOG_WARNING, LOG_ERR und LOG_CRIT übersetzt. error_log[,,severity]
Die Meldungen werden entsprechend den Einstellungen in der PHP-Konfiguration error_log verarbeitet. Tragen Sie in der Syslog-Konfiguration die gewünschte Konfiguration ein, beispielsweise syslog, um das Protokoll an den betriebssystemeigenen Syslog-Dienst zu übergeben, oder den Wert error_log, um das PHP-Fehlerprotokoll zu nutzen (diese Protokolle müssen natürlich auf Ihrem System eingerichtet sein): Lizensiert für Markus Mueller
$TYPO3_CONF_VARS['SYS']['systemLog'] = 'syslog,USER';
Derzeit können Sie maximal zwei Logmethoden kombinieren, indem Sie die Werte mit einem Semikolon voneinander trennen: $TYPO3_CONF_VARS['SYS']['systemLog'] = 'file,/pfad/datei.log;syslog,USER';
TYPO3 wird die Protokolleinträge dann in beide Dateien schreiben. Mit der folgenden Zeile werden Einträge ab Priorität 1 (message) in eine TYPO3-spezifische Logdatei geschrieben und kritische Fehler (Priorität 4) zusätzlich per E-Mail versendet: $TYPO3_CONF_VARS['SYS']['systemLogLevel'] = '0'; $TYPO3_CONF_VARS['SYS']['systemLog'] = 'file,/pfad/datei.log,1;mail,
[email protected],4';
Beachten Sie, dass systemLogLevel einen Mindestschwellenwert darstellt. Bei den einzelnen Loggern können abweichend nur höhere Prioritäten vergeben werden. Wenn Sie also den Wert systemLogLevel auf 3 gesetzt haben, können Sie in keinem Ihrer Protokolle niedriger priorisierte Meldungen erfassen. Wir empfehlen Ihnen daher, systemLogLevel auf einen niedrigen Wert zu konfigurieren, und Einschränkungen nur bei den jeweiligen Protokollangaben vorzunehmen.
Max. Linie
Wenn die vorhandenen Logging-Möglichkeiten von Syslog für Ihre Zwecke nicht ausreichend sind oder Sie die Funktionalität erweitern möchten, besteht zusätzlich noch die Möglichkeit, über einen Hook individuelle Logging-Methoden zu implementieren. Die Verwendung von Hooks wird in Rezept 17.13 beschrieben.
2.11 Systemprozesse mit dem Syslog protokollieren | 77 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Neben dem bisher besprochenen Syslog gibt es noch eine weitere Logging-Schnittstelle, die als devLog bezeichnet wird. Gedacht ist dieses Logging als Hilfestellung bei der Entwicklung. Um dieses devLog zu aktivieren, sind einige weitere Schritte notwendig:
Links
• Die Installation einer zusätzlichen entsprechenden Extension, die eine solche Funktionalität bereitstellt. Im TER finden Sie hierzu die folgenden Extensions: devlog und rlmp_filedevlog. • Das Aktivieren des devLog im Install-Tool unter der Bezeichnung enable_DLOG. • Gegebenenfalls müssen in den Kernklassen noch weitere Klassenvariablen, die erweiterte Logging-Funktionalitäten aktivieren/deaktivieren, entsprechend angepasst werden. Als Beispiel sei hier $writeDevLog in der Klasse t3lib/class.t3lib_userauth.php genannt. In den folgenden Klassen des TYPO3-Kerns wird das devLog verwendet:
Lizensiert für Markus Mueller
t3lib/class.t3lib_svbase.php t3lib/class.t3lib_formmail.php t3lib/class.t3lib_div.php t3lib/class.t3lib_modsettings.php t3lib/class.t3lib_db.php t3lib/class.t3lib_userauth.php typo3/template.php typo3/sysext/sv/class.tx_sv_auth.php typo3/sysext/sv/class.tx_sv_authbase.php typo3/sysext/cms/tslib/index_ts.php typo3/sysext/cms/tslib/class.tslib_fe.php typo3/sysext/cms/tslib/class.tslib_feuserauth.php
Siehe auch Prinzipiell steht die mit TYPO3-Version 4.1 eingeführte Syslog-Funktionalität auch für Extensions offen. Leider machen bisher nur ganz wenige Extensions hiervon Gebrauch. Eine genaue Funktionsbeschreibung für die PHP-Funktionen syslog() und error_log() finden Sie unter http://php.net/syslog und http://php.net/error_log.
2.12 Inhalte im Backend schnell finden Problem
Max. Linie
Sie suchen einen bestimmten Begriff in Ihrer Website und wissen nicht mehr genau, auf welcher Seite bzw. in welchem Inhaltselement Sie diesen angegeben haben.
78 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lösung Verwenden Sie die Volltextsuche im Modul DB-Überprüfung. Diese Suche durchsucht die gesamte TYPO3-Datenbank nach Ihrem Suchbegriff und listet alle Datensätze auf, in denen der Suchbegriff vorkommt. Anschließend können Sie jeden dieser Datensätze öffnen und dessen Inhalt kontrollieren. Klicken Sie auf das Modul DB-Überprüfung und wählen Sie anschließend die Funktion Ganze Datenbank durchsuchen bzw. in der Auswahlliste den Eintrag Full search. Anschließend erscheint ein Eingabefeld, in das Sie Ihren Suchbegriff eingeben können. Die Suchergebnisse werden dann gruppiert nach der jeweiligen Tabelle in einer Liste ausgegeben. Mit einem Klick auf das Bearbeitungssymbol öffnet sich der Datensatz, und Sie können direkt den Suchbegriff ändern. Wenn Sie die Bearbeitung abgeschlossen haben, gelangen Sie über den Schließen-Button wieder zurück auf die Ergebnisliste.
Diskussion
Lizensiert für Markus Mueller
Die Suche listet Ihnen alle Datensätze auf, in denen Ihr Suchbegriff gefunden wird. Dies kann nützlich sein, wenn Sie sich schnell orientieren möchten, jedoch kann diese Liste gerade bei feinkörnigen Suchbegriffen sehr umfangreich werden, was die Listen ziemlich unhandlich macht. Für diesen Fall können Sie Ihre Suche weiter verfeinern und auf eine Tabelle begrenzen. Wählen Sie hierzu in der Auswahlliste die Option Advanced query und verfeinern Sie Ihre Suche, indem Sie im Feld Select a table eine einzelne Tabelle auswählen. Nach der Auswahl öffnet sich eine umfangreiche Formularmaske, mit der Sie Ihre eigene Abfrage formulieren können. Ihnen stehen dabei alle im TCA der Tabelle definierten Felder zur Verfügung. In der Ergebnisliste können Sie jeden Datensatz wie gewohnt über das Bearbeitungssymbol öffnen und bearbeiten. Das Info-Icon öffnet die Datensatzübersicht in einem neuen Fenster. Besonders interessant ist diese Suchfunktion, wenn Sie gelöschte Inhalte wiederfinden möchten. Standardmäßig werden gelöschte Inhalte nicht über die Suche gefunden. Aktivieren Sie jedoch die Option Show even deleted entries (with undelete buttons), werden auch bereits gelöschte Inhalte in der Liste angezeigt. Gleichzeitig erscheinen bei dem Eintrag zwei Icons. Über das linke stellen Sie den Datensatz wieder her. Das rechte Icon stellt den Datensatz wieder her und öffnet gleichzeitig die Bearbeitungsmaske für den Datensatz, sodass Sie umgehend Änderungen vornehmen können. Dadurch wird es sehr leicht, gelöschte Inhalte zu finden und wiederherzustellen.
Max. Linie
Siehe auch Eine Alternative, um gelöschte Datensätze wiederherzustellen, finden Sie in Rezept 5.9.
2.12 Inhalte im Backend schnell finden | 79 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
2.13 Verloren geglaubte Dateien wiederfinden
Links
Problem Sie haben vergessen, wo Sie welche Datei abgelegt haben, und benötigen schnell einen Hinweis, damit Sie die Datei finden könnten.
Lösung Öffnen Sie das Modul DB-Überprüfung und wählen Sie die Funktion Alle Dateinamen nach einem Muster durchsuchen. Geben Sie in das Feld den Dateinamen oder einen Teil des Dateinamens ein (z.B. die Dateiendung) und suchen Sie nach dem Wert. TYPO3 durchsucht danach die Verzeichnisse fileadmin/, typo3temp/ und uploads/ inklusive deren Unterverzeichnisse und gibt Ihnen entsprechende Treffer in einer Liste aus.
Diskussion Lizensiert für Markus Mueller
Die Suche ist vor allem dann nützlich, wenn Sie keinen direkten Zugriff auf das Dateisystem des Servers haben und schnell eine Rückmeldung benötigen, ob eine Datei im Dateisystem vorhanden ist. Das Modul eignet sich hervorragend dazu, sich einen ersten Überblick über die vorhandenen Template-Dateien und Skripten zu verschaffen, zum Beispiel wenn Sie bestehende TYPO3-Projekte übernehmen und sich schnell einarbeiten müssen. Der Standardsuchbegriff ist mit einem regulären Ausdruck belegt, der nach allen PHPDateien in fileadmin/, typo3temp/ und uploads/ sucht: \.php[3-6]?(\..*)?$|^\.htaccess$
Die Suchergebnisse können Sie mit der DB-Suche aus Rezept 2.12 kombinieren und so zum Beispiel Pfade zu Template-Dateien nachvollziehen und auf ihre Richtigkeit hin überprüfen.
Siehe auch Mit dem Referenzindex von TYPO3 können Sie verhindern, dass Datensätze mit Relationen zu anderen Datensätzen oder Dateien gelöscht werden. In den Rezepten 2.7 und 2.8 erfahren Sie mehr über den Referenzindex. Wenn Ihnen reguläre Ausdrücke noch fremd erscheinen, empfehlen wir Ihnen das Buch Reguläre Ausdrücke von Jeffrey E.F. Friedl, O’Reilly Verlag.
Max. Linie
Max. Linie 80 | Kapitel 2: Wartung und Systempflege This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
First
Kapitel 3
KAPITEL 3
Der richtige Zugang zum Backend
3.0
Einführung
In diesem Kapitel erfahren Sie, wie Sie Zugang zum Backend, der Verwaltungsoberfläche von TYPO3, erhalten und wie Sie die Anmeldemaske an Ihre Bedürfnisse anpassen und mit weiteren Funktionen ausstatten. Lizensiert für Markus Mueller
Über das Backend haben Sie die Kontrolle über die Datenbankinhalte und Dateien, die in Ihre Website integriert werden können. Sämtliche Inhalte, Dateien und TYPO3-Einstellungen Ihrer TYPO3-Installation werden über das TYPO3-Backend gepflegt. Die Verwaltung der Inhalte findet dabei vollständig im Webbrowser statt. Zudem bietet das Backend für Administratoren einige nützliche Funktionen, um häufig anfallende Aufgaben zügig zu erledigen. Wie Sie Ihren Browser für die Verwendung des TYPO3-Backends vorbereiten, erfahren Sie in Rezept 3.1. Der Zugang zum Backend wird über ein Anmeldeformular geschützt. So ist sichergestellt, dass nur zugangsberechtigte Benutzer Inhalte pflegen oder Einstellungen vornehmen können. In Rezept 3.2 erfahren Sie, wie Sie sich am Backend anmelden. Sollten Sie einmal Ihre Zugangsdaten für das Backend verlegt haben, zeigt Ihnen Rezept 3.3, wie Sie diese wiederherstellen können. Da TYPO3 die Daten für die Anmeldung in Cookies abspeichert, ist es notwendig, dass Sie Cookies für die jeweilige Website erlauben. Zudem sollten Sie JavaScript aktivieren, denn bei der Anmeldung wird das Passwort über eine JavaScript-Funktion in ein MD5-Hash umgewandelt. So ist sichergestellt, dass alle Passwörter verschlüsselt übertragen werden – eine sehr sinnvolle Funktion, die zusätzliche Sicherheit bietet. In Rezept 3.4 erfahren Sie darüber hinaus, wie Sie die Formulardaten über HTTPS übertragen und somit abhörsicher machen können.
Max. Linie
Das Standardformular kann leicht an Ihre Gestaltungsvorgaben angepasst werden, indem Sie verschiedene Elemente ändern oder ergänzen. In Rezept 3.5 erfahren Sie, wie Sie die Beschriftung Ihrer gewünschten Sprache entsprechend ändern und sogar auf unterschiedliche Spracheinstellungen der Besucher reagieren können. Außerdem können
| 81 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Sie eigene Bilder einbinden oder auch das Formular vollständig umgestalten. Näheres zu diesen Anpassungsmöglichkeiten erfahren Sie in den Rezepten 3.6 und 3.7.
Links
Da jeder Benutzer, der im Backend arbeitet, über diese Seite in das System gelangt, kann es sinnvoll und nützlich sein, aktuelle Nachrichten oder Tipps anzeigen zu lassen, die jeden Benutzer beim Login erreichen. Wie Sie dies technisch umsetzen, wird ausführlich in den Rezepten 3.8 bis 3.9 beschrieben. Weiterhin können Backend-Benutzer nach dem Anmelden am Backend auf die Website, das TYPO3-Frontend, umgeleitet werden. Dies kann sehr hilfreich sein, wenn Sie mit dem Frontend-Editing arbeiten. Näheres zur Umleitung von Backend-Benutzern erfahren Sie in Rezept 3.10. Grundlegende Informationen zum Frontend-Editing erhalten Sie in Rezept 4.7. Die einzelnen Benutzereinstellungen zu testen, kann sehr mühsam sein. Rezept 3.11 zeigt Ihnen, wie Sie die dafür nötigen Arbeitsschritte beschleunigen können. Um sicherzustellen, dass Benutzer einheitliche Einstellungen haben, können Sie diese per BenutzerTSconfig vorbelegen oder sogar erzwingen. Hierdurch wird der administrative Aufwand erheblich reduziert. Rezept 3.12 zeigt Ihnen die dafür notwendigen Schritte.
Lizensiert für Markus Mueller
3.1
Yeah, that’s a classic – Den Browser richtig einstellen
Problem Sie möchten Probleme vermeiden, die durch falsche Browsereinstellungen verursacht werden.
Lösung Grundsätzlich können Sie das TYPO3-Backend auf jedem modernen Browser stabil und zuverlässig verwenden. Oft führen jedoch falsche Browsereinstellungen zu schwer nachvollziehbaren Fehlern. Folgende Checkliste enthält einige Optionen, die für die Arbeit im TYPO3-Backend freigeschaltet werden sollten: JavaScript aktivieren TYPO3 verwendet JavaScript für die Passwortverschlüsselung in der Anmeldemaske, das Kontextmenü, den Elementbrowser oder das automatische Logout nach einer gewissen Zeit.
Max. Linie
Pop-ups für die jeweilige Domain freischalten TYPO3 öffnet zum Bearbeiten oder Verknüpfen von Inhalten an manchen Stellen Pop-up-Fenster, die für die Verwaltung der Daten essenziell sind. Zudem öffnet TYPO3 nach einer gewissen Zeit der Inaktivität ein Fenster, in dem Sie Ihre Anmel-
82 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
dung erneuern können. Schalten Sie daher die jeweilige Domain für die Verwendung von Pop-up-Fenstern frei. Cookies akzeptieren TYPO3 speichert wichtige Daten in Cookies ab (beispielsweise die aktuelle Ansicht des Seitenbaums oder ob ein Benutzer am Backend angemeldet ist).
Diskussion Zusätzlich zu den oben genannten Einstellungen gibt es noch weitere, die das Arbeiten im Backend komfortabler machen und eng mit den Browser- bzw. Clienteinstellungen zusammenhängen. Hier wird erklärt, welche Besonderheiten für den Gebrauch des Backends zu beachten sind, wie man TYPO3 etwas weniger restriktiv einstellt, sodass es auch hinter einer Firewall gut läuft, Inhalte nicht mehr vollständig gecacht werden und Entwickler flüssig arbeiten können.
Cache-Einstellung: Seiten bei jedem Seitenaufruf neu auslesen
Lizensiert für Markus Mueller
Gerade beim Entwickeln von Extensions sollte der Browser die Webseiten stets neu vom Server anfordern. Aktivieren Sie daher auf jeden Fall die Option, die sicherstellt, dass der Browser bei jedem Zugriff auf die Seite den Cache erneuert. Zusätzlich sollten Sie den Seiten-Cache von TYPO3 bei Ihren Arbeiten am Backend stets im Hinterkopf behalten. Es kommt häufig vor, dass die gerade eingegebenen Inhalte nicht auf der Webseite erscheinen, weil TYPO3 anhand der Cache-Einstellungen den Inhalt noch aus dem Zwischenspeicher liest. Gerade beim Entwickeln einer Website ist es jedoch sehr wichtig, dass Sie Änderungen umgehend sehen. Fügen Sie diesen Code in Ihr TypoScript-Setup ein, um den Caching-Mechanismus von TYPO3 für Webseiten zu deaktivieren: config { no_cache = 1 }
Achten Sie darauf, dass Sie diesen Wert in der Produktionsumgebung wieder auf 0 setzen. Sehr nützlich beim Entwickeln von Extensions ist auch das Deaktivieren des ExtensionCaches. TYPO3 erzeugt normalerweise beim ersten Aufruf der Webseite eine Liste aller eingebundenen Extensions und deren Einstellungen. Dabei liest TYPO3 zuerst SystemExtensions, dann global installierte Extensions und abschließend die lokal installierten Extensions ein. Dies erklärt beispielsweise auch, warum lokal installierte Extensions globale Extensions überschreiben. Um den Extension-Cache zu deaktivieren, setzen Sie einfach die Option extCache im Install-Tool auf 0. Wechseln Sie in das Modul und wählen Sie den Menüeintrag All Configuration. Suchen Sie den Begriff extCache und geben Sie in das entsprechende Eingabefeld eine Null ein. Alternativ dazu können Sie auch folgenden Code direkt in die Datei localconf.php eingeben:
Max. Linie
Max. Linie
$TYPO3_CONF_VARS['EXT']['extCache'] = '0';
3.1 Yeah, that’s a classic – Den Browser richtig einstellen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 83
Dadurch werden sämtliche Extension-Einstellungen bei jedem Seitenzugriff immer wieder direkt ausgelesen und nicht wie gewöhnlich in einer Cache-Datei zwischengespeichert. Auf Entwicklungsservern sollten Sie diese Option aus Performancegründen wieder aktivieren. Setzen Sie dafür den Wert mit folgender Angabe zurück auf den Standardwert:
Links
$TYPO3_CONF_VARS['EXT']['extCache'] = '1';
doNotCheckReferer aktivieren Wenn Sie sich darüber wundern, dass Sie so oft Ihre Anmeldung am TYPO3-Backend erneuern müssen, sollten Sie überprüfen, ob Sie hinter einer Firewall oder einem Proxyserver arbeiten. TYPO3 überprüft bei jedem Seitenaufruf im Backend, ob sich der aufrufende Host vom zuvor gespeicherten Host unterscheidet. Arbeiten Sie hinter einer Firewall oder einem Proxyserver, wird diese Information möglicherweise unterdrückt oder nicht eindeutig übermittelt, sodass TYPO3 von einem Fremdzugriff ausgeht und das Backend sperrt. Diese Überprüfung können Sie deaktivieren, indem Sie in das Install-Tool wechseln und unter General Options nach dem Begriff doNotCheckReferer suchen. Aktivieren Sie das entsprechende Kontrollkästchen. Alternativ dazu können Sie auch folgenden Code in die Datei localconf.php schreiben: $TYPO3_CONF_VARS['SYS']['doNotCheckReferer'] = '1'; Lizensiert für Markus Mueller
Siehe auch In den nächsten Rezepten erfahren Sie, wie Sie sich am Backend anmelden. Lesen Sie in Rezept 3.4, wie Sie den Ordner typo3 umbenennen können und Ihr Backend über einen anderen Ordner erreichen.
3.2
Am Backend anmelden
Problem Sie möchten sich am Backend anmelden, um die Inhalte Ihrer Website zu bearbeiten oder administrative Arbeiten durchzuführen.
Lösung Um sich am Backend anzumelden, benötigen Sie die korrekte Adresse Ihrer TYPO3Installation, einen Benutzernamen und ein Passwort. Die standardmäßige URL für das TYPO3-Backend baut sich wie folgt auf: http://www.ihre_website/typo3/
Max. Linie
Der Platzhalter ihre_website entspricht dabei Ihrem Domainnamen inklusive der TopLevel-Domain, beispielsweise .de, .com oder .org.
84 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Nun benötigen Sie einen Benutzernamen und ein Passwort. Der Benutzername darf keine Sonderzeichen enthalten und sollte kleingeschrieben werden. Für den Benutzernamen können Sie maximal 20 Zeichen verwenden. Folgende Anmeldedaten sind standardmäßig vorhanden: Benutzer: admin Passwort: password
Achten Sie darauf, dass Sie diese Zugangsdaten umgehend ändern. Aus Sicherheitsgründen sollten Sie keine Website mit diesen Standardeinstellungen öffentlich zugänglich machen. Ändern Sie umgehend nach Ihrer ersten Anmeldung diese Standardwerte. Wechseln Sie dazu in das Modul Benutzerwerkzeuge ➝ Einstellungen. Im Bereich Persönliche Daten finden Sie den Abschnitt Neues Passwort. Geben Sie dort Ihr neues Passwort an und bestätigen Sie die Änderungen.
Lizensiert für Markus Mueller
Falls die Anmeldung mit den Standardwerten fehlschlägt, können Sie über das InstallTool einen neuen Administratorzugang einrichten. Melden Sie sich dazu am Install-Tool an und klicken Sie auf den zweiten Menüpunkt Database Analyzer. Am Ende der Seite finden Sie weitere Links. Wählen Sie dort den Link Create »admin« user aus. Es folgt eine Eingabemaske, mit der Sie einen neuen Benutzer mit Administratorstatus anlegen können. Wählen Sie diese neuen Zugangsdaten sorgfältig, denn nach der Bestätigung mit dem Button Write to database wird der Zugang sofort aktiv. Wechseln Sie dann mit dem Link Backend admin in new window oder über das anfangs erwähnte Adressenschema zur Backend-Anmeldemaske.
Diskussion Zusätzlich zu dem sicheren Passwort sollten Sie in Ihrem Benutzerprofil auch Ihren Namen und die E-Mail-Adresse angeben. TYPO3 verwendet diese Angaben für Benachrichtigungsfunktionen, die vor allem für Administratoren sehr nützlich sind. Beispielsweise aktivieren Sie mit der Option Unterrichte mich per Email wenn jemand sich mit meinem Account anmeldet eine Überwachungsfunktion, die Sie informiert, wenn sich jemand am Backend mit Ihren Benutzerdaten anmeldet. So werden Sie umgehend darüber informiert. Diese Option können Sie standardmäßig aktivieren, indem Sie in Ihrem Benutzer-TSconfig den folgenden Code eingeben: setup { default.emailMeAtLogin = 1 }
Um sicherzugehen, dass diese Option aktiviert ist, können Sie den Wert auch fest vorgeben:
Max. Linie
setup { override.emailMeAtLogin = 1 }
Der Wert ist dann standardmäßig aktiviert und kann über die Benutzereinstellungen nicht mehr abgewählt werden.
3.2 Am Backend anmelden | 85 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Zusätzlich bietet TYPO3 Administratoren noch zwei weitere Kontrollmöglichkeiten. Zum einen können Sie im Installtool eine E-Mail-Adresse angeben, an die eine E-Mail gesendet wird, wenn sich ein Backend-Benutzer viermal mit falschen Zugangsdaten anmeldet. Wechseln Sie dazu in das Install-Tool und wählen Sie den Eintrag All Configuration. Suchen Sie dann nach warning_email_addr. Geben Sie in das dazugehörige Feld die gewünschte E-Mail-Adresse ein. Alternativ können Sie diese Option auch direkt aktivieren, indem Sie folgenden Code in die Datei localconf.php eingeben:
Links
$TYPO3_CONF_VARS['BE']['warning_email_addr'] = 'email_adresse';
Diese Funktion können Sie noch verschärfen, wenn Sie die Warnstufe mit dem Wert warning_mode erhöhen. Setzen Sie die Option auf 1 Bit, wird bei jeder Anmeldung eines Backend-Besuchers eine Meldung versendet. Aktivieren Sie das zweite Bit, wird die Meldung nur versandt, wenn sich Administratoren anmelden. Im Installtool befindet sich die Einstellung unter warning_mode. Setzen Sie im dazugehörigen Feld die gewünschten Werte. Auch hier können Sie die Anpassung direkt über die Datei localconf.php vornehmen, indem Sie folgenden Wert hinzufügen: $TYPO3_CONF_VARS['BE']['warning_mode'] = '1';
Beachten Sie, dass diese Einstellung nur Auswirkungen hat, wenn Sie zuvor eine gültige E-Mail-Adresse angegeben haben. Lizensiert für Markus Mueller
Siehe auch Um zusätzliche Sicherheit für Ihre TYPO3-Installation zu gewährleisten, sollten Sie Rezept 3.4 lesen. Dort erfahren Sie, wie Sie das Backend zusätzlich gegen unbefugten Zugriff sichern können. Rezept 3.1 erläutert, welche grundlegenden Optionen aktiviert sein müssen, um im Backend optimal arbeiten zu können.
3.3
Ein verlorenes Passwort für das Backend wiederherstellen
Problem Sie haben Ihr Passwort für den Zugang zum Backend vergessen oder verlegt und möchten es wiederherstellen.
Lösung
Max. Linie
Wählen Sie das Modul Liste und wechseln Sie in das Wurzelverzeichnis der Website. Dort finden Sie sämtliche Backend-Benutzer-Accounts. Öffnen Sie nun den gewünschten Benutzerdatensatz und vergeben Sie über das Feld Passwort ein neues Passwort. Nach der Eingabe wird es automatisch MD5-verschlüsselt und beim Speichervorgang entspre-
86 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
chend in der Datenbank gespeichert. Sollten Sie keinen Zugriff auf die Benutzerdatensätze haben, können Sie auch mit der Funktion Switch User in die Rolle des jeweiligen Benutzers schlüpfen und die Anmeldedaten über dessen Benutzereinstellungen ändern. Wechseln Sie dazu in das Modul Verwaltung unterhalb von Admin-Werkzeuge und klicken Sie, wie in Abbildung 3-1 gezeigt, auf das rechte Icon.
Abbildung 3-1: Mit diesem Button wechseln Sie temporär in die Rolle des jeweiligen Benutzers
Aus Sicherheitsgründen speichert TYPO3 die Passwörter für Backend-Benutzer standardmäßig MD5-verschlüsselt in der Datenbank ab. Durch den MD5-Algorithmus werden die Passwörter in eine zufällige Zeichenkette umgewandelt, die keine Rückschlüsse auf den ursprünglichen Wert zulässt. Als Administrator können Sie daher die Passwörter der Backend-Benutzer nur erneuern und nicht direkt auslesen. Lizensiert für Markus Mueller
Diskussion Wenn Sie Ihr Administratorpasswort zum Backend verlegt haben, gibt es mehrere Möglichkeiten, dies wiederherzustellen. Haben Sie noch Zugang zum Install-Tool, können Sie dort einen neuen Administratorzugang anlegen. Geben Sie dazu die Adresse zum InstallTool in die Adresszeile Ihres Browsers ein. Diese Adresse ist standardmäßig folgendermaßen aufgebaut: http://www.ihre-website.tld/typo3/install/
Max. Linie
Sollten Sie das Install-Tool über diese Adresse nicht erreichen, überprüfen Sie, ob im Ordner typo3/install/ in der Datei index.php die Bedingung in Zeile 50 erfüllt und die Datei ENABLE_INSTALL_TOOL im Verzeichnis typo3conf vorhanden ist. Erst dann können Sie das Install-Tool verwenden. Ansonsten wird das Skript an dieser Stelle automatisch beendet, sodass Sie keinen Zugang zum Install-Tool herstellen können. Wenn Sie das Anmeldeformular im Install-Tool sehen, geben Sie dort Ihr neues Passwort in das Eingabeformular ein und bestätigen die Eingabe mit dem Button Log in. Die Anmeldung wird fehlschlagen. Jedoch zeigt Ihnen TYPO3 unterhalb des Formulars den MD5-Wert des eingegebenen Passworts an. Kopieren Sie diesen Wert in die Zwischenablage und öffnen Sie anschließend die Datei localconf.php im Verzeichnis typo3conf. Suchen Sie dort nach der Variablen $TYPO3_CONF_VARS['BE']['installToolPassword']. Diese Variable enthält das alte Passwort für das Installtool als MD5-verschlüsselte Zeichenkette. Ersetzen Sie diesen Wert nun mit Ihrem neuen MD5-Wert aus der Zwischenablage.
3.3 Ein verlorenes Passwort für das Backend wiederherstellen | 87 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Beachten Sie dabei, dass TYPO3 die Werte vorheriger Install-Tool-Passwörter nicht direkt ersetzt, sondern den neuen Wert unterhalb des alten Werts einfügt, sodass er dadurch überschrieben wird. Passen Sie daher unbedingt die unterste Variablenzuweisung an, da Ihre Passwortänderung ansonsten nicht übernommen wird.
Links
Nachdem Sie Zugang zum Install-Tool erhalten haben, wechseln Sie zum Punkt Database Analyzer. Dort finden Sie am Seitenende den Menüeintrag Create »admin« user. Klicken Sie auf diesen Punkt und geben Sie abschließend die nötigen Benutzerdaten ein. Achten Sie darauf, dass der neue Benutzername von Ihrem alten Administrator-Account abweicht, denn TYPO3 überprüft, ob der Benutzername schon in der Datenbank existiert. Nachdem Sie einen neuen Administrator-Account angelegt haben, können Sie sich damit wie gewohnt am Backend anmelden und die Passwortänderung bei Ihrem alten Account durchführen. Anschließend wechseln Sie über die Benutzerverwaltung in Ihren alten Account und entfernen den soeben erstellten Account wieder.
Lizensiert für Markus Mueller
Wenn Sie keinerlei Zugang mehr zum TYPO3-Backend haben, jedoch noch über einen Datenbankzugriff verfügen, gehen Sie wie folgt vor: Erstellen Sie mit der MySQL-Funktion MD5() anhand eines neuen Passworts eine MD5-Prüfsumme und aktualisieren Sie damit Ihren Backend-Benutzer. Wichtig ist hierbei, dass Sie den Benutzernamen exakt so eingeben, wie Sie ihn auch bei der Anmeldung am TYPO3-Backend verwenden. Verbinden Sie sich mit der TYPO3-Datenbank und führen Sie folgenden SQL-Befehl aus: UPDATE be_users SET password = MD5('neues_passwort') WHERE username = 'Benutzername';
Ihr neues Passwort ist danach sofort aktiv, sodass Sie sich wieder wie gewohnt am TYPO3-Backend anmelden können.
3.4
Das Backend absichern
Problem Sie möchten das Backend mit weiteren Sicherheitsvorkehrungen ausstatten, zum Beispiel indem Sie die Datenübertragung über eine HTTPS-Verbindung verschlüsseln.
Lösung
Max. Linie
Um für die Datenübertragung bei der Anmeldung am Backend eine HTTPS-Verbindung zu nutzen, bietet TYPO3 die Möglichkeit, das Anmeldeformular automatisch auf eine HTTPS-Verbindung umzuleiten. Wechseln Sie dazu in das Install-Tool und melden Sie sich an. Wählen Sie anschließend den Menüpunkt All Configuration, suchen Sie dort nach dem Begriff lockSSL und geben Sie in das entsprechende Feld den Wert 2 ein. Alternativ dazu können Sie auch den folgenden Code direkt in die Datei localconf.php eintragen: $TYPO3_CONF_VARS['BE']['lockSSL'] = '2';
88 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Wenn Sie den Wert auf 3 setzen, wird ausschließlich die Anmeldung verschlüsselt übertragen. Nach der Anmeldung leitet TYPO3 die Adresse wieder auf das HTTP-Protokoll um. $TYPO3_CONF_VARS['BE']['lockSSL'] = '3';
Mit dem Wert 1 ermöglichen Sie eine HTTPS-Verbindung – eine Anmeldung über HTTP ist jedoch noch möglich und bietet daher keine effektive Absicherung. Um eine HTTPS-Verbindung zum Server aufzubauen, benötigen Sie ein gültiges SSL-Zertifikat für den Server. Ein solches Zertifikat erhalten Sie beispielsweise über die Website von http://www.cacert.org/. Beachten Sie, dass jeder IP-Adresse nur ein SSL-Zertifikat zugewiesen werden kann. Wenn Sie mehrere Domains auf einem Server betreiben, beispielsweise bei mehreren virtuellen Hosts, sollten Sie sich zu Beginn der Registrierung entscheiden, für welche Domain das Zertifikat erstellt werden soll. Erfolgt zu einer nicht registrierten Domain ein Aufruf über die HTTPS-Verbindung, erhält der Besucher eine entsprechende Warnung, die ihn darauf hinweist, dass ein ungültiges Zertifikat für die aktuelle Domain vorliegt. Diese Meldung kann viele Benutzer davon abhalten, die Seite weiter zu verwenden. Wenn Ihr SSL-Port von dem Standardport 443 abweicht, können Sie mit dieser Einstellung die Portnummer eintragen: Lizensiert für Markus Mueller
$TYPO3_CONF_VARS['BE']['lockSSLPort'] = '443';
TYPO3 verwendet dann diesen Port für SSL.
Um die Sicherheit Ihrer TYPO3-Installation zusätzlich zu erhöhen, können Sie das Backend auch in einen anderen Ordner verschieben. Weicht der Ordner vom Standardwert typo3 ab, wird es für potienzielle Angreifer schwerer, die Adresse für das BackendAnmeldeformular zu erraten. Um die Änderungen vorzunehmen, gehen Sie wie folgt vor: Ändern Sie das Verzeichnis typo3 auf den von Ihnen gewünschten Namen. Achten Sie darauf, dass Sie keine Leerzeichen oder Sonderzeichen im Ordnernamen verwenden. Suchen Sie danach die Konstante TYPO3_mainDir in den folgenden Dateien und ersetzen Sie sie mit dem neuen Ordnernamen: /neues_verzeichnis/init.php /neues_verzeichnis/thumbs.php /neues_verzeichnis/sysext/cms/tslib/index_ts.php /neues_verzeichnis/sysext/cms/tslib/showpic.php /neues_verzeichnis/t3lib/class.t3lib_superadmin.php /neues_verzeichnis/t3lib/thumbs.php
Ändern Sie dort den Inhalt dieser Konstanten von typo3/ auf Ihren neuen Ordnernamen.
Max. Linie
Zusätzlich müssen Sie in der Datei index.php noch den Pfad zur Extension cms anpassen, da TYPO3 ansonsten die nötigen Skripte für die TypoScript-Bibliothek nicht einbinden kann. Die Datei index.php finden Sie im Wurzelverzeichnis Ihrer TYPO3-Installation. Ersetzen Sie dort die hervorgehobenen Werte mit Ihren Angaben:
3.4 Das Backend absichern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 89
Max. Linie
... if (@is_dir(PATH_site.'typo3/sysext/cms/tslib/')) { define('PATH_tslib', PATH_site.'typo3/sysext/cms/tslib/'); } elseif (@is_dir(PATH_site.'tslib/')) { define('PATH_tslib', PATH_site.'tslib/'); ...
Links
Es kann vorkommen, dass die Konstante zum TYPO3-Verzeichnis in Extension-Dateien neu definiert wird. Suchen Sie daher sicherheitshalber in Ihrer TYPO3-Installation nach dem Funktionsaufruf define('TYPO3_mainDir', 'typo3/');, um sämtliche Stellen zu finden, an denen das Verzeichnis typo3/ definiert wird, und ändern Sie die Zuweisung entsprechend. Zudem sollten Sie in Ihren Skripten keine absoluten Pfade zum typo3-Verzeichnis angeben, sondern stets die Konstante TYPO3_mainDir verwenden, um entsprechend flexibel auf Änderungen der Ordnerstruktur eingehen zu können.
Lizensiert für Markus Mueller
Außerdem müssen Sie noch bei jedem lokal installierten Backend-Modul die Variable $BACK_PATH anpassen. Dieser Variablen wird während des Installationsvorgangs standardmäßig der Ordner typo3/ hinzugefügt, damit beim Aufruf des Backend-Moduls der TYPO3-Ordner ermittelt werden kann. Diese Angabe müssen Sie nun bei den bereits installierten Modulen ändern. Wechseln Sie dazu in das Verzeichnis typo3conf/ext und kontrollieren Sie bei den vorhandenen Extensions, ob Unterordner mit dem Namen mod1 vorhanden sind. (Die 1 steht hier für das erste Modul. Wenn mehrere Module vorhanden sind, wird dieser Zähler entsprechend erhöht.) Öffnen Sie dort die Datei conf.php und passen Sie die Variable $BACK_PATH entsprechend an. Aus dem Wert $BACK_PATH='../../../../typo3/';
wird dann $BACK_PATH='../../../../neues_verzeichnis/';
Aktualisieren Sie abschließend den Extension-Cache, um auch eventuell zwischengespeicherte Pfadangaben neu zu laden und Fehler zu vermeiden. Wenn Sie Backend-Module installieren, nachdem Sie die Anpassungen vorgenommen haben, erkennt der Erweiterungs-Manager den neuen TYPO3-Ordner automatisch und passt die Pfadangaben bei der Installation neuer Extensions entsprechend an. Wenn Sie die Werte zu dem TYPO3-Verzeichnis nicht korrekt ersetzen, erhalten Sie diese Fehlermeldung: Error in init.php: Path to TYPO3 main dir could not be resolved correctly.
Die hier beschriebenen Maßnahmen sind natürlich nutzlos, wenn Sie die grundlegenden Sicherheitsvorkehrungen nicht berücksichtigen: Ändern Sie umgehend die Standardpasswörter für den Backend-Zugang sowie für das Install-Tool und achten Sie auf die Sicherheitshinweise im Modul Über Module.
Max. Linie
Max. Linie 90 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Diskussion Auch wenn Sie keine HTTPS-Verbindung einrichten können, stellt TYPO3 sicher, dass Ihr Passwort verschlüsselt übertragen wird. Sobald Sie das Anmeldeformular absenden, wird das Passwort über eine JavaScript-Funktion mit dem MD5-Algorithmus verschlüsselt. Diese MD5-Verschlüsselung lässt keinerlei Rückschlüsse über Ihr ursprüngliches Passwort zu, sodass dies zu keinem Zeitpunkt im Klartext übertragen wird. Ebenso verhält es sich, wenn Sie das Passwort im Backend in Ihren Benutzereinstellungen ändern. Zusätzlich können Sie auch noch weitere Vorkehrungen treffen, um das Backend gegen unbefugten Gebrauch zu sichern (in der Diskussion von Rezept 3.2 werden weitere nützliche Funktionen vorgestellt, etwa wie Sie fehlerhafte Anmeldeversuche frühzeitig erkennen können). Um beispielsweise nur Benutzer aus einem bestimmten IP-Bereich zu erlauben, sollten Sie im Install-Tool über das Feld IPmaskList einen IP-Adressbereich oder eine konkrete IP-Adresse angeben, über die sich die Benutzer ausschließlich anmelden dürfen. Dies ist beispielsweise für Intranet-Applikationen sehr interessant. Das Eingabefeld für diese IPNummer finden Sie unter All Configuration. Suchen Sie dort nach dem Begriff IPmaskList. Geben Sie dann in das entsprechende Feld die IP-Adresse ein. Alternativ können Sie folgenden Code direkt in die Datei localconf.php eingeben: $TYPO3_CONF_VARS['BE']['IPmaskList'] = 'ip_adresse';
Lizensiert für Markus Mueller
Wenn Sie einen konkreten IP-Adressbereich erlauben möchten, können Sie auch Platzhalterzeichen in Form eines Sternchens für den jeweiligen Zahlenwert einsetzen. TYPO3 erkennt dann automatisch die IP-Adressen unterhalb des erlaubten Bereichs. Geben Sie etwa folgenden Code ein, erlauben Sie den Zugriff über alle IP-Adressen, die mit 192.168 beginnen – das Anmelden aus einem anderen IP-Bereich wird hingegen vollständig unterbunden: $TYPO3_CONF_VARS['BE']['IPmaskList'] = '192.168.*.*';
Möchten Sie die Anmeldung nur für einzelne Benutzer oder Benutzergruppen auf einen bestimmten IP-Bereich festlegen, ist die oben genannte Möglichkeit etwas zu unflexibel. Für diesen Fall stellt Ihnen TYPO3 die Option enabledBeUserIPLock zur Verfügung. Diese Option finden Sie ebenfalls im Install-Tool unter All Configuration. Suchen Sie dort nach dem Begriff enabledBeUserIPLock. Falls die Option nicht standardmäßig voreingestellt ist, aktivieren Sie nur das entsprechende Kontrollkästchen, um die Funktion freizuschalten. Auch hier können Sie wieder den Code direkt in die Datei localconf.php eingeben: $TYPO3_CONF_VARS['BE']['enabledBeUserIPLock'] = 1;
Mit dieser Funktion ermöglichen Sie die Überprüfung der IP-Nummer jedes einzelnen Benutzers, der sich am Backend anmeldet. In den Benutzereinstellungen können Sie dann über das Feld TSconfig mit folgendem Code die IP-Adressen festlegen, über die sich der Benutzer anmelden darf:
Max. Linie
option { lockToIP = ip_adresse }
3.4 Das Backend absichern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 91
Folgendes Beispiel würde die Anmeldung ausschließlich über eine IP-Adresse mit dem Muster 192.168.*.* zulassen:
Links
option { lockToIP = 192.168.*.* }
Auch hier können Sie Adressbereiche definieren, indem Sie die Zahlen durch das Platzhalterzeichen * ersetzen. TYPO3 erkennt dann automatisch die IP-Adressen innerhalb dieses Bereichs. Diese Funktion ist sehr ähnlich der Option IPmaskList, hat jedoch den feinen Unterschied, dass Sie hier für jeden Benutzer oder jede Benutzergruppe eine eigene IP-Adresse vergeben und daher sehr flexibel auf die jeweiligen IP-Adressen Ihrer Benutzer eingehen können. Falls Sie den Zugang zum Backend einmal komplett sperren möchten, beispielsweise um die TYPO3-Version zu aktualisieren, bietet Ihnen TYPO3 die Möglichkeit, mit der Option adminOnly das Backend für reguläre Benutzer zu sperren: $TYPO3_CONF_VARS['BE']['adminOnly'] = 1;
Der Zugang zum Backend ist damit nur noch für Administratoren möglich. Wenn sich reguläre Benutzer anmelden möchten, erhalten diese eine Meldung, die darüber informiert, dass das Backend zurzeit gesperrt ist. Lizensiert für Markus Mueller
Wenn Sie das gesamte TYPO3-Backend sperren möchten – beispielsweise um umfangreiche Änderungen an der Datenbank vorzunehmen –, geben Sie folgenden Code in die Datei localconf.php ein: $TYPO3_CONF_VARS['BE']['adminOnly'] = -1;
Beachten Sie, dass Sie mit dieser Option wirklich das gesamte Backend vollständig deaktivieren. Eine Anmeldung und der Zugriff auf das Install-Tool sind dann selbst für Administratoren nicht mehr möglich – auch wenn diese bereits am Backend angemeldet waren. Um diese Sperre aufzuheben, müssen Sie den Wert direkt in der Datei localconf.php ändern und ihn beispielsweise wieder auf den Standardwert 0 zurücksetzen: $TYPO3_CONF_VARS['BE']['adminOnly'] = 0;
Siehe auch Achten Sie darauf, dass Sie alle nötigen Browsereinstellungen vorgenommen haben, da Sie sich sonst womöglich nicht am Backend anmelden können. In Rezept 3.1 wird erläutert, welche grundlegenden Optionen aktiviert sein müssen. In der Diskussion von Rezept 3.2 finden Sie grundsätzliche Hinweise darauf, wie Sie sich am Backend anmelden. In Rezept 1.4 erfahren Sie mehr über die Ordnerstruktur von TYPO3.
Max. Linie
Max. Linie 92 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
3.5
Die Beschriftung im Anmeldeformular ändern
Problem Sie möchten das Anmeldeformular mit eigenen Feldbezeichnungen darstellen.
Lösung Ändern Sie die Beschriftungen des Anmeldeformulars über die Variable $TYPO3_CONF_ VARS['BE']['loginLabels']. Diese Variable können Sie über das Installtool ändern. Wechseln Sie dazu in das Modul Installation (falls Sie keinen Zugang zum Install-Tool haben, lesen Sie die Diskussion von Rezept 3.3). Wählen Sie anschließend den Abschnitt All Configuration und suchen Sie nach der Überschrift [loginLabels]. Ändern Sie in dem entsprechenden Eingabefeld die gewünschten Textpassagen. Speichern Sie abschließend die neuen Werte über den Button Write to localconf.php in der Datei localconf.php. Alternativ dazu können Sie die Beschriftungen auch direkt in der Datei localconf.php vornehmen. Für ein deutsches Anmeldeformular geben Sie zum Beispiel folgende Werte ein:
Lizensiert für Markus Mueller
$TYPO3_CONF_VARS['BE']['loginLabels'] = ' Benutzername|Passwort|Interfacemodus|Anmelden|Abmelden|Backend,Frontend| Verwaltungsbereich der Seite Seitenname| (Hinweis: Cookies müssen aktiviert sein!)| Wichtige Nachrichten:| Ihre Anmeldung ist fehlgeschlagen. Stellen Sie sicher, dass Sie Ihre Zugangsdaten korrekt eingegeben haben und Sie nicht aus Versehen die Groß- und Kleinschreibung vertauscht haben. ';
Als Seitentitel können Sie ab Version 4.2 auch den Marker ###SITENAME### nutzen. Dieser Marker wird dann automatisch mit dem Wert ersetzt, den Sie während der Installation als Sitenamen angegeben haben. Um diesen langen Wert nicht vollständig eingeben zu müssen, hat sich folgender Weg als Arbeitserleichterung bewährt: Wechseln Sie dazu wie anfangs beschrieben über das Install-Tool zu dem Eingabefeld unterhalb von der Überschrift [loginLabels]. Fügen Sie in das Eingabefeld ein Leerzeichen vor dem Wert Username ein und speichern Sie dann den neuen Wert über den Button Write to localconf.php. TYPO3 erkennt die Änderung und schreibt den gesamten Variableninhalt in die Datei localconf.php. Danach können Sie dort den Wert bequem über Ihren Texteditor ändern.
Max. Linie
Ihre neuen Angaben werden nach dem Speichern der Datei direkt im Anmeldeformular angezeigt. Beachten Sie, dass Sie mit den Werten nur die Beschriftungen der Felder ändern können und keinen Einfluss auf die Feldanordnung haben. Das bedeutet, dass Sie auch nicht benötigte Feldbezeichnungen angeben müssen, um die Reihenfolge der Werte zu erhalten. Der Grund hierfür: In der Funktion, die das Anmeldeformular darstellt, wird der String mithilfe der Pipes (|) in ein Array umgewandelt. Anhand der Schlüsselwerte
3.5 Die Beschriftung im Anmeldeformular ändern | 93 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
dieses Arrays wird daraufhin der entsprechende Text ermittelt. Achten Sie deshalb besonders darauf, dass Sie kein |-Zeichen löschen und so aus Versehen die Reihenfolge ändern. Außerdem sollten Sie keine HTML-Tags verwenden, da diese aus Sicherheitsgründen nicht unterstützt werden.
Links
Stellen Sie vor dem Speichern auch unbedingt sicher, dass keine Fehler vorhanden sind, denn sonst wird das gesamte Formular nicht mehr angezeigt. Eine Anmeldung wäre dann nicht mehr möglich.
Diskussion
Lizensiert für Markus Mueller
Max. Linie
Durch die oben dargestellten Methoden können Sie das Anmeldeformular in der von Ihnen gewünschten Sprache darstellen. Was aber, wenn an Ihrer Website Benutzer arbeiten, die nochmals eine andere Sprachen sprechen? Besser wäre hier, die Benutzer in ihrer jeweiligen Landessprache anzusprechen. Fragen Sie hierfür in der Datei localconf.php die Spracheinstellungen über die Browsereigenschaften des aktuellen Benutzers ab. Diese Information wird in der Variablen HTTP_ACCEPT_LANGUAGE gespeichert. TYPO3 bietet Ihnen dafür mit getIndpEnv() eine entsprechende Funktion, mit der Sie diesen Wert unabhängig von Betriebsystem und Servertyp abfragen können. Somit stellen Sie sicher, dass der Wert plattformunabhängig ermittelt wird. Analysieren Sie dann das Ergebnis mit einer CaseAbfrage, um die jeweiligen Sprachwerte entsprechend zuzuweisen: $lang = t3lib_div::getIndpEnv('HTTP_ACCEPT_LANGUAGE'); $lang = substr($lang, 0, 2); switch ($lang) { case 'de': $TYPO3_CONF_VARS['BE']['loginLabels'] = ' Benutzername|Passwort|Interfacemodus|Anmelden|Abmelden|Backend,Frontend| Verwaltungsbereich der Seite Seitenname| (Hinweis: Cookies müssen aktiviert sein!)| Wichtige Nachrichten:| Ihre Anmeldung ist fehlgeschlagen. Stellen Sie sicher, dass Sie Ihre Zugangsdaten korrekt eingegeben haben und Sie nicht aus Versehen die Groß- und Kleinschreibung vertauscht haben. '; break; case 'en': $TYPO3_CONF_VARS['BE']['loginLabels'] = ' Username|Password|Interface|Log In|Log Out|Backend,Frontend| Administration Login on Sitenname| (Note: Cookies and JavaScript must be enabled!)| Important Messages:| Your login attempt did not succeed. Make sure to spell your username and password correctly, including upper/lowercase characters. '; break; default: $TYPO3_CONF_VARS['BE']['loginLabels'] = ' Benutzername|Passwort|Interfacemodus|Anmelden|Abmelden|Backend,Frontend|
94 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Verwaltungsbereich der Seite Seitenname| (Hinweis: Cookies müssen aktiviert sein!)| Wichtige Nachrichten:| Ihre Anmeldung ist fehlgeschlagen. Stellen Sie sicher, dass Sie Ihre Zugangsdaten korrekt eingegeben haben und Sie nicht aus Versehen die Groß- und Kleinschreibung vertauscht haben. '; break; }
Zusätzlich zur Anmeldemaske können Sie auch das gesamte Backend an die jeweilige Sprache des Benutzers anpassen, sodass alle Sprachfelder in der entsprechenden Sprache ausgegeben werden. Wählen Sie dazu in dem jeweiligen Benutzerprofil für die BackendSprache den gewünschten Eintrag aus der Liste der möglichen Sprachen aus. Achten Sie dabei darauf, dass das Sprachpaket für die gewünschte Sprache vorhanden ist. Standardmäßig ist nur das englische Sprachpaket installiert. Weitere Sprachpakete installieren Sie über den Erweiterungs-Manager. Das Rezept 15.10 geht näher auf die Installation und Verwaltung dieser Sprachpakete ein. Beachten Sie auch, dass einige Sprachpakete möglicherweise noch nicht vollständig übersetzt sind. Falls Ihnen ein bestimmtes Sprachpaket fehlt, erfahren Sie in Rezept 20.4, wie Sie TYPO3 selbst in die exotischsten Sprachen übersetzen können. Lizensiert für Markus Mueller
Vielleicht fragen Sie sich, warum Sie für diese Funktionalität nicht die Sprachoptionen von TYPO3 verwenden können. Der Grund dafür ist folgender: Diese Informationen stehen TYPO3 zum Zeitpunkt der Anmeldung noch nicht zur Verfügung, denn TYPO3 erzeugt das Backend-Benutzerobjekt BE_USER erst, wenn der Benutzer vollständig authentifiziert werden konnte.
Siehe auch In Rezept 3.8 erfahren Sie, wie Sie das Anmeldeformular mit weiteren Funktionen ausstatten. Die Ausgabe mehrsprachiger Inhalte erläutert Rezept 9.4. In Rezept 20.4 erfahren Sie, wie Sie dabei helfen können, TYPO3 zu übersetzen.
3.6
Eigene Bilder im Anmeldeformular anzeigen
Problem Sie möchten im Anmeldeformular eigene Bilder anzeigen.
Lösung
Max. Linie
Erstellen Sie eine neue, leere Extension und installieren Sie diese über den ErweiterungsManager. In Rezept 16.2 erfahren Sie mehr über die nötigen Schritte. Anschließend legen Sie in dem Extension-Ordner einen Unterordner res/ sowie die Datei ext_tables.php an.
3.6 Eigene Bilder im Anmeldeformular anzeigen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 95
Max. Linie
Der Ordner res/ enthält später sämtliche Bilddateien, die im Anmeldeformular erscheinen sollen. Die Datei ext_tables.php enthält den PHP-Code, um TYPO3 so einzustellen, dass diese Bilder im Anmeldeformular angezeigt werden.
Links
Für eine bessere Übersicht sollten Sie nun im Ordner res einen weiteren Unterordner mit dem Namen login_bilder erzeugen. Speichern Sie dort die Bilder im PNG-, JPG- oder GIFFormat. Wenn Sie nur ein Bild einfügen, wird immer dieses Bild angezeigt. Liegen mehrere Bilder vor, erscheinen diese in zufälliger Reihenfolge. Geben Sie abschließend folgenden Code in die Datei ext_tables.php ein: $ext_pfad = t3lib_extMgm::extRelPath($_EXTKEY); $ext_pfad_bilder = $ext_pfad . 'res/login_bilder/'; $GLOBALS['TBE_STYLES']['loginBoxImage_rotationFolder'] = $ext_pfad;
Zuerst ermitteln Sie mit der Funktion t3lib_extMgm::extRelPath($_EXTKEY) den Pfad zur Extension. Danach weisen Sie diesem Pfad den Wert des Unterordners zu. Je nachdem, ob dort gültige Bilddateien vorliegen, wird nun die Standardgrafik automatisch mit einem Bild aus diesem Ordner ersetzt. Wenn keine Bilder geladen werden können, erscheint kein Bild. Achten Sie auch darauf, dass die Bilder einheitlich groß sind, denn sie werden nicht an eine bestimmte Größe angepasst. Die Größe der Standardbilder beträgt 500 x 100 Pixel. Lizensiert für Markus Mueller
Diskussion Zusätzlich können Sie noch das TYPO3-Logo gegen eine eigene Grafik austauschen. Ergänzen Sie den Code um die zwei hervorgehobenen Zeilen: $ext_pfad = t3lib_extMgm::extRelPath($_EXTKEY); $ext_pfad_bilder = $ext_pfad . 'res/login_bilder/'; $ext_pfad_logo = $ext_pfad . 'logo/'; $GLOBALS['TBE_STYLES']['loginBoxImage_rotationFolder'] = $ext_pfad_bilder; $GLOBALS['TBE_STYLES']['logo_login'] = $ext_pfad_logo .'logo_grafik';
Fügen Sie das Logo in den Unterordner logo ein und passen Sie den Platzhalter logo_grafik entsprechend dem Dateinamen an. Das Standardlogo hat eine Größe von 128 x 59 Pixeln. Beachten Sie, dass Sie das TYPO3-Logo unter der Anmeldemaske unter keinen Umständen ändern oder entfernen dürfen.
3.7
Das Layout der Anmeldemaske ändern
Problem Sie möchten das Anmeldeformular an Ihr eigenes Layout anpassen.
Max. Linie
Max. Linie 96 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Lösung Erweitern Sie die Datei index.php per XClass-Verfahren. Legen Sie dafür die Datei class. ux_SC_index.php in den Extension-Ordner. In dieser Datei überschreiben Sie die Funktion wrapLoginForm aus der ursprünglichen Datei index.php. Geben Sie abschließend folgenden Code in die Datei ext_localconf.php ein: $ext_pfad = t3lib_extMgm::extPath('ext_key'); $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/index.php'] = $ext_pfad .'class.ux_SC_index.php';
Mit dieser Zuweisung überlagern Sie die Datei index.php mit der Datei class.ux_SC_ index.php. Dadurch können Sie sämtliche Funktionen dieser Datei ändern und erweitern. Für die Darstellung des Anmeldeformulars ist die Funktion wrapLoginForm zuständig. Dort können Sie das Logo, die Bilder sowie das Anmeldeformular völlig frei positionieren und wie folgt anpassen:
Lizensiert für Markus Mueller
Diskussion
Lizensiert für Markus Mueller
Beachten Sie, dass sich diese Änderungen auch auf das Anmeldeformular auswirken, das erscheint, wenn Sie Ihre Anmeldung am TYPO3-Backend erneuern müssen. Da dieses Anmeldeformular in einem Pop-up-Fenster mit fester Größe erscheint, sollten Sie Ihre Darstellung darauf abstimmen oder die Login-Box vielleicht wieder im ursprünglichen Zustand anzeigen lassen. Um diesen Zustand zu unterscheiden, können Sie den GETParameter loginRefresh abfragen: if (t3lib_div::_GET('loginRefresh')) { ... }
Über diesen Parameter können Sie ermitteln, ob die Anmeldemaske im Pop-up-Fenster angezeigt wird, und etwaige Änderungen am Code bzw. am Layout vornehmen. Begrenzen Sie Ihre Änderungen an der Klasse auf die Methode wrapLoginForm(), da Sie ansonsten womöglich Abläufe im Anmeldeprozess ändern, die Auswirkungen auf die Sicherheit Ihrer TYPO3-Installation haben können. Wenn Sie in der Datei class.ux_SC_ index.php eine Methode nicht überschreiben, bleibt die ursprüngliche Funktionalität der Originaldatei index.php erhalten. Sie müssen also nicht zwingend alle Methoden überschreiben. Achten Sie besonders darauf, dass Sie die Funktion makeCopyrightNotice() nicht ändern oder ausblenden. Diese Funktion ist verantwortlich für die Copyright-Hinweise und darf auf keinen Fall geändert werden.
Siehe auch
Max. Linie
In Rezept 3.6 erfahren Sie, wie Sie komfortabel die Bilder der Anmeldemaske anpassen können. Zusätzlich können Sie unterhalb der Anmeldemaske aktuelle Meldungen anzeigen; die dafür nötigen Schritte werden in Rezept 3.8 beschrieben. Mehr über den XClassMechanismus erfahren Sie in Rezept 17.12.
98 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
3.8
Aktuelle Meldungen unter dem Anmeldeformular anzeigen
Problem Sie möchten unter dem Anmeldeformular aktuelle Meldungen ausgeben, beispielsweise um Redakteure über neue Optionen im Backend zu informieren.
Lösung Geben Sie in der Datei ext_tables.php folgenden Code ein: $GLOBALS['TYPO3_CONF_VARS']['BE']['loginNews'][] = array( 'date' => '11.10.2008', 'header' => 'Überschrift', 'content' => 'Ein Meldungstext' );
Lizensiert für Markus Mueller
Mit diesem Array können Sie unter dem Formular Texte nach dem Muster Datum, Überschrift, Text anzeigen lassen. Möchten Sie mehrere Texte zeigen, erweitern Sie das Array entsprechend: $GLOBALS['TYPO3_CONF_VARS']['BE']['loginNews'][] = array( 'date' => '11.10.2008', 'header' => 'Überschrift 1', 'content' => 'Ein Meldungstext' ); $GLOBALS['TYPO3_CONF_VARS']['BE']['loginNews'][] = array( 'date' => '11.11.2008', 'header' => 'Überschrift 2', 'content' => 'Ein zweiter Meldungstext' );
Die Meldungen werden dann in der angegebenen Reihenfolge untereinander aufgelistet. Jedoch werden sie unter jedem Anmeldeformular angezeigt – auch unter dem, das erscheint, wenn Sie Ihre Anmeldung erneuern müssen. Die Größe des Pop-up-Fensters ist für eine vollständige Darstellung der Meldungen allerdings nicht ausreichend. Um die Meldungen dort auszublenden, setzen Sie den Code in folgende Abfrage: if (!t3lib_div::_GET('loginRefresh')) { $GLOBALS['TYPO3_CONF_VARS']['BE']['loginNews'][] = array( 'date' => '11.10.2008', 'header' => 'Überschrift', 'content' => 'Ein Meldungstext' ); }
Max. Linie
Max. Linie 3.8 Aktuelle Meldungen unter dem Anmeldeformular anzeigen | 99 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Damit erscheinen die Meldungen nur auf der Seite mit der Hauptanmeldung. Wenn Ihnen die Datei ext_tables.php noch fremd ist, erfahren Sie in Rezept 16.2 mehr über den grundlegenden Aufbau einer Extension.
Links
Diskussion Mit der oben beschriebenen Methode können Sie Meldungen wie gewünscht unter dem Anmeldeformular anzeigen lassen. Jedoch müssen Sie für jede Änderung die Datei öffnen und das Array entsprechend anpassen. Einfacher wäre es, die Aktualisierung – wie bei regulären Seiteninhalten – über das Backend vorzunehmen. Verwenden Sie zur Pflege der Meldungen die Extension tt_news. Nachdem Sie sie über den Erweiterungs-Manager installiert haben, legen Sie im Backend einen neuen SysOrdner an. In diesem SysOrdner speichern Sie später alle Meldungen, die unter dem Anmeldeformular erscheinen sollen. Geben Sie dann folgenden Code in die Datei ext_tables.php ein: if (!t3lib_div::_GET('loginRefresh')) { if (t3lib_extMgm::isloaded('tt_news')) { require_once(PATH_t3lib.'class.t3lib_befunc.php');
Lizensiert für Markus Mueller
$table = 'tt_news'; $enableFields = t3lib_BEfunc::BEenableFields($table) . t3lib_BEfunc::deleteClause($table); $pid = ihre_seiten_id; $limit = maximale_meldungen; $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( '*', $table, 'pid='. $pid .' '. $enableFields, '', 'crdate DESC', $limit ); if ($GLOBALS['TYPO3_DB']->sql_num_rows($res)) { while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { $GLOBALS['TYPO3_CONF_VARS']['BE']['loginNews'][] = Array( 'date' => strftime('%e. %B %Y', $row['datetime']), 'header' => $row['title'], 'content' => nl2br($row['bodytext']) ); } } } }
Max. Linie
Passen Sie den Platzhalter ihre_seiten_id an die Seiten-ID des SysOrdners an, in dem die Meldungen gespeichert werden. Diese Angabe bewirkt, dass die Abfrage nur noch Meldungen in dem dafür vorgesehenen SysOrdner berücksichtigt (in Rezept 7.3 erfahren Sie, wie Sie die Seiten-ID schnell herausfinden).
100 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Nach der Überprüfung, ob die Extension tt_news installiert ist, bereiten Sie die Abfrage an die Datenbank vor, um die aktuellen Meldungen aus der Tabelle tt_news auszulesen. Der Wert $pid beschränkt die Abfrage auf Datensätze, die in dem gewünschten SysOrdner liegen. Um sicherzustellen, dass nur sichtbare Datensätze angezeigt werden, binden Sie die Funktionen BEenableFields und deleteClause ein. Diese Funktionen erzeugen für die angegebeneTabelle eine passende WHERE-Klausel, mit der die Felder hidden, deleted, starttime und endtime automatisch berücksichtigt werden. So ist sichergestellt, dass alle Sichtbarkeitseinstellungen korrekt übernommen werden. Die gesamte WHERE-Klausel speichern Sie abschließend in der Variablen $enableFields. require_once(PATH_t3lib.'class.t3lib_befunc.php'); $enableFields = t3lib_BEfunc::BEenableFields($table) . t3lib_BEfunc::deleteClause($table);
Danach führen Sie die Datenbankabfrage durch. Diese sollten Sie ausschließlich über das TYPO3-Datenbankobjekt $GLOBALS['TYPO3_DB'] vornehmen. Dadurch stellen Sie sicher, dass Ihre Abfragen auch mit anderen Datenbanksystemen funktionieren (in Rezept 17.5 erfahren Sie mehr über die Verwendung der TYPO3-API und wie diese Ihre Programmierarbeit erleichtern kann). Abschließend füllen Sie das Array $GLOBALS['TYPO3_CONF_ VARS']['BE']['loginNews'] mit den Ergebnissen aus der Datenbank, die dann auch unter dem Anmeldeformular angezeigt werden. Lizensiert für Markus Mueller
Wenn Sie diese Funktionalität auch in anderen TYPO3-Projekten einsetzen möchten, wäre es hilfreich, wenn Sie die Seiten-ID und die Anzahl der Meldungen ohne Eingriff in den Code anpassen könnten. Legen Sie dazu im Extension-Ordner eine neue Datei mit dem Namen ext_conf_template.txt an. Auf diese Weise erzeugen Sie automatisch eine Eingabemaske im Abschnitt Information Ihrer Extension. Diese Eingabemaske erreichen Sie, wenn Sie im Erweiterungs-Manager auf den Titel der Extension klicken. Dort können Sie dann die Extension-Variablen direkt editieren und über den Button Update aktivieren. Alle Werte, die Sie in dieser Datei vorgeben, dienen als Standardwerte, wenn das Eingabefeld leer bleibt. Legen Sie nun mit folgendem Code die Standardwerte für die gewünschten Abfrageparameter an: # cat=basic/enable; type=int+; label=Seiten-ID der aktuellen Meldungen: Geben Sie hier die Seiten-ID des Ordners an, der die Meldungen für das Anmeldeformular enthält. login_news_pid = id_der_seite # cat=basic/enable; type=int+; label=Maximale Anzahl der aktuellen Meldungen: Geben Sie hier die maximale Anzahl der Meldungen an. login_news_limit = 5
Max. Linie
Diese Werte speichert TYPO3 in einer serialisierten Zeichenkette in der Datei localconf. php. Beachten Sie, dass die Kommentare in einer Zeile stehen müssen und hier nur als Platzgründen in eine neue Zeile gerutscht sind (weitere Einstellungsmöglichkeiten und Verwendungsbeispiele für die Datei ext_conf_template.txt erhalten Sie in Rezept 17.14). Um die Werte in dem PHP-Code wieder auszulesen, verwenden Sie folgenden Code: $lConf = unserialize($TYPO3_CONF_VARS['EXT']['extConf'][$_EXTKEY]);
3.8 Aktuelle Meldungen unter dem Anmeldeformular anzeigen | 101 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Wandeln Sie zuerst den serialisierten String wieder in ein reguläres Array um. Anschließend greifen Sie mit dieser Zuweisung auf die Werte zu:
Links
$pid = intval($lConf['login_news_pid']); $limit = intval($lConf['login_news_limit']);
In der Datenbankabfrage werden diese Werte nun wie folgt eingesetzt: $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( '*', $table, 'pid='. $pid .' '. $enableFields, '', 'crdate DESC', $limit );
Die Meldungen erscheinen nun wie gewünscht unter dem Anmeldeformular. Einstellungen an der Datenbankabfrage können Sie über die Extension-Einstellungen vornehmen. Im nächsten Schritt aktivieren Sie die Unterstützung für mehrsprachige Meldungen und nehmen Feineinstellungen an der Darstellung vor.
Lizensiert für Markus Mueller
Zuerst ermitteln Sie anhand der Browsereinstellungen die Sprache des Besuchers. Anschließend übersetzen Sie diesen Wert über eine CASE-Abfrage in die ID der jeweiligen Systemsprache und erweitern die WHERE-Klausel der Datenbankabfrage. Ergänzen Sie dazu den zuvor genannten Code um die hervorgehobenen Zeilen (zur Verdeutlichung der Position sehen Sie schon den Funktionsaufruf der Datenbankabfrage): ... $lang = t3lib_div::getIndpEnv('HTTP_ACCEPT_LANGUAGE'); $lang = substr($lang, 0, 2); switch ($lang) { case 'de': $lang_id = 0; break; case 'en': $lang_id = 1; break; default: $lang_id = 0; break; } $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( ...
Max. Linie
Bei dieser Abfrage ist es wichtig, den Zusammenhang zwischen der gewünschten Sprache und der Sprach-ID zu verstehen: Sobald Sie dem TYPO3-Backend eine neue Sprache hinzufügen, erhält diese eine eindeutige Identifizierungsnummer (die Sprach-ID). Wenn Sie Datensätze übersetzen, speichert TYPO3 die jeweilige Sprach-ID automatisch im Feld sys_ language_uid. Indem Sie nun diese Sprach-ID über die Variable $lang_id in Ihrer Abfrage berücksichtigen, können Sie die Meldungen auf die gewünschte Sprache reduzieren:
102 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( '*', $table, 'pid='. $pid .'AND sys_language_uid = '. $lang_id .' '. $enableFields, '', 'crdate DESC', $limit ); ...
Die hervorgehobene Codezeile muss in dem weiter oben gezeigten Code ersetzt werden, da ansonsten die Spracheinstellungen nicht von der Datenbankabfrage berücksichtigt werden. Um dem Formular jetzt noch optisch den letzten Schliff zu geben, können Sie zusätzliche CSS-Angaben im Seitenkopf der Anmeldeseite einfügen. Über diese CSS-Stile können Sie die Darstellung der Meldungen visuell sehr genau an Ihre Bedürfnisse anpassen. Fügen Sie dazu unter der Datenbankabfrage noch folgenden Code ein:
Lizensiert für Markus Mueller
... $TBE_STYLES['inDocStyles_TBEstyle'] = ' DIV#loginNews { width: 70%; margin-top: 30px; } DIV#loginNews H2 { background: #666; color: #fff; font-size: 12px; } DIV#loginNews DL DD { padding-right: 10px; padding-left: 10px; } DIV#loginNews DL DT { font-weight: bold; } DIV#loginNews DL DT SPAN { color: #333; } DIV#loginNews DL DT { background: #fff; color: #333; } DIV#loginNews DL DD { color: #666; } '; ...
Hier eine Zusammenfassung des besprochenen Codes: if (!t3lib_div::_GET('loginRefresh')) { if (t3lib_extMgm::isloaded('tt_news')) { require_once(PATH_t3lib.'class.t3lib_befunc.php'); // Konfiguration einlesen $lConf = unserialize($TYPO3_CONF_VARS['EXT']['extConf'][$_EXTKEY]); // Tabelleneinstellungen $table = 'tt_news'; $enableFields = t3lib_BEfunc::BEenableFields($table) . t3lib_BEfunc::deleteClause($table); $pid = intval($lConf['login_news_pid']); $limit = intval($lConf['login_news_limit']);
Max. Linie
// Mehrsprachigkeit $lang = t3lib_div::getIndpEnv('HTTP_ACCEPT_LANGUAGE'); $lang = substr($lang, 0, 2); switch ($lang) { case 'de': $lang_id = 0; break;
3.8 Aktuelle Meldungen unter dem Anmeldeformular anzeigen | 103 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
case 'en': $lang_id = 1; break; default: $lang_id = 0; break;
Links
} // Datenbank abfragen $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( '*', $table, 'pid='. $pid .' AND sys_language_uid = '. $lang_id .' '. $enableFields, '', 'crdate DESC', $limit );
Lizensiert für Markus Mueller
// Werte zuweisen if ($GLOBALS['TYPO3_DB']->sql_num_rows($res)) { while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { $GLOBALS['TYPO3_CONF_VARS']['BE']['loginNews'][] = Array( 'date' => strftime('%e. %B %Y', $row['datetime']), 'header' => $row['title'], 'content' => nl2br($row['bodytext']) ); } } // CSS anpassen $TBE_STYLES['inDocStyles_TBEstyle'] = ' DIV#loginNews { width: 70%; margin-top: 30px; } DIV#loginNews H2 { background: #666; color: #fff; font-size: 12px; } DIV#loginNews DL DD { padding-right: 10px; padding-left: 10px; } DIV#loginNews DL DT { font-weight: bold; } DIV#loginNews DL DT SPAN { color: #333; } DIV#loginNews DL DT { background: #fff; color: #333; } DIV#loginNews DL DD { color: #666; } '; } }
Siehe auch
Max. Linie
Im nächsten Rezept 3.9 wird erklärt, wie Sie auf ähnliche Weise zufällige Texte unter der Anmeldung anzeigen lassen. In Rezept 3.5 erfahren Sie, wie Sie die Beschriftungen im Anmeldeformular in mehreren Sprachen darstellen können. In Rezept 3.7 erfahren Sie, wie Sie das gesamte Layout der Anmeldemaske anpassen können. Rezept 17.1 verrät mehr über die verwendeten TYPO3-Funktionen. In Rezept 4.9 erfahren Sie Genaueres zum Zusammenhang zwischen der ID und der gewünschten Sprache. Mehr über die PHP-Funktion unserialize erfahren Sie auf der PHP-Website unter http://de3.php.net/ unserialize.
104 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
3.9
Tipp des Tages auf der Anmeldeseite anzeigen
Problem Sie möchten unter dem Anmeldeformular bei jedem Seitenaufruf wechselnde Tipps anzeigen lassen.
Lösung Geben Sie dazu folgenden Code in die Datei ext_tables.php ein:
Lizensiert für Markus Mueller
if (!t3lib_div::_GET('loginRefresh')) { $tipps = array( array( 'date' => 'Tipp Nr. 1', 'header' => 'Überschrift', 'content' => 'Beschreibung des ersten Tipps' ), array( 'date' => 'Tipp Nr. 2', 'header' => 'Überschrift', 'content' => 'Beschreibung des zweiten Tipps' ), array( 'date' => 'Tipp Nr. 3', 'header' => 'Überschrift', 'content' => 'Beschreibung des dritten Tipps' ) ); srand((float) microtime() * 10000000); $tipp_id = array_rand($tipps, 1); $GLOBALS['TYPO3_CONF_VARS']['BE']['loginNews'][] = $tipps[$tipp_id]; }
Legen Sie zuerst eine Sammlung nützlicher Tipps in einem Array an. Dann erzeugen Sie mit der PHP-Funktion array_rand einen zufälligen Zeiger, um bei jedem Seitenaufruf einen neuen Wert aus dem Array auszulesen. Später weisen Sie das Ergebnis dem Array $GLOBALS['TYPO3_CONF_VARS']['BE']['loginNews'] zu. Dieses Array speichert die Texte, die später unter dem Formular als Tipps nach dem Muster Tipp-ID, Überschrift, Erklärung angezeigt werden. Um die Tipps nur auf der Hauptanmeldeseite anzuzeigen, umschließen Sie den gesamten Code mit folgender Abfrage (ansonsten würden die Tipps auch in dem kleinen Fenster erscheinen, das beim Aktualisieren des Passworts erscheint):
Max. Linie
if (!t3lib_div::_GET('loginRefresh')) { ... }
3.9 Tipp des Tages auf der Anmeldeseite anzeigen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 105
Diskussion
Links
Mit der oben beschriebenen Methode können Sie Ihre Tipps wie gewünscht unter dem Anmeldeformular anzeigen lassen. Jedoch müssen Sie für jede Änderung die Datei öffnen und das Array entsprechend anpassen. Wenn Sie die Eingabe über das Backend vornehmen würden, wäre es einfacher, die Tipps zu verwalten. Installieren Sie dazu die Extension tt_news über den Erweiterungs-Manager und legen Sie im Backend einen neuen SysOrdner an. In diesem SysOrdner speichern Sie alle Tipps, die Sie auf der Anmeldeseite anzeigen möchten. Geben Sie dann folgenden Code in die Datei ext_tables.php ein: // Tipp des Tages if (t3lib_extMgm::isloaded('tt_news')) { require_once(PATH_t3lib.'class.t3lib_befunc.php'); $table = 'tt_news'; $enableFields = t3lib_BEfunc::BEenableFields($table) . t3lib_BEfunc::deleteClause($table); $pid = ihre_seiten_id;
Lizensiert für Markus Mueller
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( '*', $table, 'pid = '. $pid .' '. $enableFields, '', 'RAND()', 1 ); $count = $GLOBALS['TYPO3_DB']->sql_num_rows($res); if ($count) { while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { $GLOBALS['TYPO3_CONF_VARS']['BE']['loginNews'][] = Array( 'date' => 'Tipp Nr. '. $row['uid'], 'header' => $row['title'], 'content' => nl2br($row['bodytext']) ); } } }
Passen Sie den Platzhalter ihre_seiten_id abschließend an die Seiten-ID des SysOrdners an, in dem die Tipps gespeichert werden. Die Tipps erscheinen nun wie gewünscht in zufälliger Reihenfolge unter dem Anmeldeformular. Im nächsten Schritt nehmen Sie noch Feineinstellungen an der Datenbankabfrage sowie der Darstellung vor, indem Sie über CSS die Darstellung anpassen.
Max. Linie
Wenn Sie diese Funktionalität in anderen TYPO3-Projekten einsetzen möchten, wäre es hilfreich, wenn Sie diese Seiten-ID ohne Eingriff in den Code anpassen könnten. Legen
106 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Sie dazu im Extension-Ordner eine neue Datei mit dem Namen ext_conf_template.txt an und speichern Sie darin folgenden Code: # cat=basic/enable; type=int+; label=Seiten-ID der aktuellen Tipps: Geben Sie hier die Seiten-ID des Ordners an, der die Tipps für das Anmeldeformular enthält. login_news_pid = id_der_seite
Dadurch erzeugen Sie automatisch eine Eingabemaske im Abschnitt Information Ihrer Extension. Diese Eingabemaske erreichen Sie, wenn Sie im Erweiterungs-Manager auf den Titel der Extension klicken. Dort können Sie dann die Extension-Variablen direkt editieren und über den Button Update aktivieren. Alle Werte, die Sie in der Datei vorgeben, dienen als Standardwerte, wenn das Eingabefeld leer bleibt. Weitere Einstellungsmöglichkeiten und Verwendungsbeispiele für die Datei ext_conf_template.txt erhalten Sie in Rezept 17.14. Die Darstellung der Tipps können Sie über CSS an Ihre Gestaltungsvorgaben anpassen. Geben Sie dazu folgenden Code unterhalb Ihrer Datenbankabfrage ein:
Lizensiert für Markus Mueller
... $TBE_STYLES['inDocStyles_TBEstyle'] = ' DIV#loginNews { width: 70%; margin-top: 30px; } DIV#loginNews H2 { background: #666; color: #fff; font-size: 12px; } DIV#loginNews DL DD { padding-right: 10px; padding-left: 10px; } DIV#loginNews DL DT { font-weight: bold; } DIV#loginNews DL DT SPAN { color: #333; } DIV#loginNews DL DT { background: #fff; color: #333; } DIV#loginNews DL DD { color: #666; } '; ...
Ändern Sie abschließend noch die Werte der Überschrift Important Messages: in Tipp des Tages. Geben Sie dazu folgenden Code ein: $TYPO3_CONF_VARS['BE']['loginLabels'] = ' Benutzername|Passwort|Interfacemodus|Anmelden|Abmelden|Backend,Frontend| Verwaltungsbereich der Seite ###SITENAME###| (Hinweis: Cookies müssen aktiviert sein!)| Tipp des Tages| Ihre Anmeldung ist fehlgeschlagen. Stellen Sie sicher, dass Sie Ihre Zugangsdaten korrekt eingegeben haben und Sie nicht aus Versehen die Groß- und Kleinschreibung vertauscht haben. ';
Hier noch mal zusammenfassend der gesamte Code dieses Beispiels: // Tipp des Tages if (!t3lib_div::_GET('loginRefresh')) { if (t3lib_extMgm::isloaded('tt_news')) { require_once(PATH_t3lib.'class.t3lib_befunc.php');
Max. Linie
// Konfiguration auslesen $lConf = unserialize($TYPO3_CONF_VARS['EXT']['extConf'][$_EXTKEY]);
3.9 Tipp des Tages auf der Anmeldeseite anzeigen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 107
// Tabelleneinstellungen $table = 'tt_news'; $enableFields = t3lib_BEfunc::BEenableFields($table) . t3lib_BEfunc::deleteClause($table); $pid = intval($lConf['login_news_pid']);
Links
// Datenbank abfragen $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( '*', $table, 'pid = '. $pid .' '. $enableFields, '', 'RAND()', 1 ); $count = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
Lizensiert für Markus Mueller
// Werte zuweisen if ($count) { while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { $GLOBALS['TYPO3_CONF_VARS']['BE']['loginNews'][] = Array( 'date' => 'Tipp Nr. '. $row['uid'], 'header' => $row['title'], 'content' => nl2br($row['bodytext']) ); } } // CSS anpassen $TBE_STYLES['inDocStyles_TBEstyle'] = ' DIV#loginNews { width: 70%; margin-top: 30px; } DIV#loginNews H2 { background: #666; color: #fff; font-size: 12px; } DIV#loginNews DL DD { padding-right: 10px; padding-left: 10px; } DIV#loginNews DL DT { font-weight: bold; } DIV#loginNews DL DT SPAN { color: #333; } DIV#loginNews DL DT { background: #fff; color: #333; } DIV#loginNews DL DD { color: #666; } '; } }
Siehe auch In Rezept 3.5 finden Sie weitere Hinweise für die Umbenennung der Formularbeschriftung. Rezept 17.10 erläutert die Konfiguration von Extensions über die Datei ext_conf_ template.txt.
Max. Linie
Max. Linie 108 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
3.10 Backend-Benutzer auf das Frontend umleiten Problem Sie möchten nach der Anmeldung am Backend direkt im Frontend arbeiten, beispielsweise um dort die Inhalte Ihrer Website über Frontend-Editing-Mechanismen zu pflegen.
Lösung Wechseln Sie in das Modul Installation. Nach der Authentifizierung wählen Sie den vierten Punkt All Configuration und suchen nach dem Wort interfaces im Bereich BE. Geben Sie dort den Wert frontend ein. Alternativ dazu können Sie auch folgenden Code direkt in die Datei localconf.php eintragen: $TYPO3_CONF_VARS['BE']['interfaces'] = 'frontend';
Nach dem Speichern wird die neue Einstellung direkt aktiv. TYPO3 leitet nun jede Anmeldung am TYPO3-Backend automatisch auf das Frontend um.
Diskussion Lizensiert für Markus Mueller
Aus dem Frontend heraus erreichen Sie das Backend, indem Sie die URL direkt in der Adressleiste des Browsers ändern und so in das Backend wechseln. Diese URL baut sich nach folgendem Muster auf: www.example.com/typo3/
Beachten Sie, dass der Ordner je nach Installation vom Standard abweichen kann. In Rezept 3.4 erfahren Sie, wie Sie den Ordner umbenennen. Eine andere Möglichkeit besteht darin, das Backend über das Admin-Panel zu öffnen. Um diese Einstellung vorzunehmen, benötigen Sie unbedingt Administratorrechte. Wechseln Sie dazu in den Modus Liste und wählen Sie die Wurzelseite mit der ID 0 aus. Dort speichert TYPO3 die Benutzerprofile sämtlicher Backend-Benutzer sowie die Benutzergruppen. Öffnen Sie nun den entsprechenden Backend-Benutzer und geben Sie anschließend folgenden Code in das Feld TSconfig ein: admPanel { hide = 0 enable.edit = 1 }
Max. Linie
Wenn Sie die Option für eine Benutzergruppe freischalten möchten, geben Sie den Code in das TSconfig-Feld der Benutzergruppe ein. Sie wird dann automatisch für alle Benutzer dieser Gruppe aktiviert, sofern sie im Benutzerprofil nicht wieder überschrieben wird. Wechseln Sie nach dem Speichern wieder ins Frontend. Wie in Abbildung 3-2 gezeigt, finden Sie nun im Bereich Eingabe des Admin-Panels den Link TYPO3 Backend öffnen.
3.10 Backend-Benutzer auf das Frontend umleiten | 109 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links
Abbildung 3-2: Mit diesem Link öffnen Sie das Backend in einem neuen Fenster
Mit einem Klick auf diesen Link öffnet sich das Backend in einem neuen Fenster. Da Sie bereits als Backend-Benutzer angemeldet sind, können Sie umgehend im Backend weiterarbeiten. Wenn Sie bei jeder Anmeldung selbst bestimmen möchten, in welche Ansicht Sie nach der Anmeldung gelangen, erweitern Sie den Code von $TYPO3_CONF_VARS['BE']['interfaces'] = 'frontend';
auf $TYPO3_CONF_VARS['BE']['interfaces'] = 'frontend,backend';
Lizensiert für Markus Mueller
Damit erzeugen Sie ein Auswahlfeld, mit dem Sie die gewünschte Ansicht selbst wählen können. Mit der Reihenfolge der Werte bestimmen Sie die Anordnung der Optionen in der Auswahlliste. Folgende Angabe zeigt die Option Backend an oberster Stelle: $TYPO3_CONF_VARS['BE']['interfaces'] = 'backend,frontend';
Mit einem Komma fügen Sie der Liste ein leeres Feld hinzu: $TYPO3_CONF_VARS['BE']['interfaces'] = ',frontend,backend';
Achten Sie darauf, dass Sie die Werte korrekt eingeben. Bleibt das Feld leer oder ist der Wert ungültig, verwendet TYPO3 standardmäßig die Backend-Ansicht. Zusätzlich können Sie über das Benutzer-TSconfig festlegen, dass Sie nach dem Login auf eine spezielle Adresse umgeleitet werden. Das ist vor allem dann nützlich, wenn nur Teilbereiche der Seite bearbeitet werden können. Um diese Weiterleitung einzurichten, geben Sie folgenden Code in das Feld TSconfig ein: auth.BE { redirectToURL = http://www.example.com/index.php?id=seiten_id }
Als Wert können Sie jede URL eingeben, die Sie als sinnvoll erachten. Wichtig ist vor allem, dass sie korrekt aufgebaut und erreichbar ist. Um Seiten innerhalb von TYPO3 anzuspringen, können Sie die URL auch folgendermaßen angeben: auth.BE { redirectToURL = ../index.php?id=seiten_id }
Max. Linie
Beachten Sie, dass Sie das Backend danach nicht mehr wie gewohnt über die URL www. example.com/typo3/ erreichen können, da TYPO3 bei jedem Zugriff über die Datei index.
110 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
php den im Benutzerprofil gespeicherten Wert ausliest und eine entsprechende Weiterleitung durchführt. Um in das Backend zu gelangen, geben Sie die URL dann nach folgendem Muster ein: www.example.com/typo3/backend.php
Ergänzend dazu können Sie auch in Ihren Seiteninhalten Links angeben, mit denen der Benutzer nach der Anmeldung umgeleitet wird. Dazu müssen Sie dem Link lediglich den Parameter redirect_url anhängen. Dieser Parameter speichert die Adresse, auf die der Benutzer nach erfolgter Anmeldung weitergeleitet wird. Das folgende Beispiel verdeutlicht den Aufbau: Frontend-Editing aktivieren
Selbstverständlich können solche Links auch über TypoScript erstellt und damit beispielsweise fest in der Seitennavigation verankert werden. Binden Sie folgendes Codefragment in ein Menüobjekt in Ihrem TypoScript-Template ein:
Lizensiert für Markus Mueller
... 10 = TEXT 10 { value = Frontend-Editing aktivieren typolink.parameter = typo3/index.php typolink.parameter.dataWrap = |?redirect_url=../index.php?id={page:uid} } ...
Mit diesem TypoScript-Code wandeln Sie den Text Frontend-Editing aktivieren in einen Hyperlink um. Diesem Hyperlink übergeben Sie zusätzlich den Parameter redirect_url mit der Adresse zur aktuellen Seite im Frontend. Um vom Backend-Formular wieder auf diese Seite umgeleitet zu werden, müssen Sie diese relativ zum Backend angeben. Achten Sie darauf, dass Sie den Wert {page:uid} nicht anpassen, da er vom TypoScript-Parser automatisch in die aktuelle Seiten-ID umgewandelt wird. In Kapitel 12 erfahren Sie mehr über die Menütypen und deren Anwendungsmöglichkeiten. Beachten Sie, dass Sie eine mögliche Sicherheitslücke öffnen, wenn Sie einen Link zum Backend öffentlich anzeigen. Überprüfen Sie, ob es genügt, wenn Sie den Link nur für registrierte Benutzer sichtbar schalten. Ergänzen Sie den Code dann bei Bedarf um die hervorgehobene Zeile:
Max. Linie
... 10 = TEXT 10 { if.isTrue.data = TSFE:loginUser value = Frontend-Editing aktivieren typolink.parameter = typo3/index.php typolink.parameter.dataWrap = |?redirect_url=../index.php?id={page:uid} } ...
3.10 Backend-Benutzer auf das Frontend umleiten | 111 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Wenn Sie – wie in Rezept 3.4 gezeigt – Änderungen am TYPO3-Verzeichnis vorgenommen haben, sollten Sie die Pfadangabe entsprechend anpassen. Als registrierter Backend-Benutzer haben Sie die Möglichkeit, Seiteninhalte direkt über das Frontend zu bearbeiten. Lesen Sie hierzu in Rezept 4.7 mehr über die Einstellungsmöglichkeiten dieser Bearbeitungsform.
Links
Siehe auch In Rezept 4.7 erfahren Sie, wie Sie Inhalte über das Frontend pflegen.
3.11 Einen bestimmten Backend-Benutzer simulieren Problem Sie möchten als Administrator die Zugriffsrechte eines bestimmten Backend-Benutzers prüfen und möchten (temporär) in die jeweilige Benutzerrolle schlüpfen.
Lösung Lizensiert für Markus Mueller
Wechseln Sie in das Modul Verwaltung unterhalb von Admin-Werkzeuge, aktivieren Sie in der Auswahlliste die Option Compare User Settings und suchen Sie in der Liste nach dem Namen des Benutzers, in dessen Rolle Sie wechseln möchten. Nach dem Klick auf das rot hervorgehobene Icon wechseln Sie temporär in die Ansicht des gewählten Benutzers (siehe Abbildung 3-3). Mit dem Button Verlassen rechts oben wechseln Sie wieder zurück in Ihre ursprüngliche Rolle.
Abbildung 3-3: Über dieses Icon wechseln Sie in die Ansicht des Benutzers
Diskussion Diese Funktion eignet sich hervorragend, wenn Sie Zugriffsrechte, Benutzer-TSconfigEinstellungen oder bestimmte Einstellungen des Benutzers prüfen oder nachvollziehen möchten. Etwaige Fehlermeldungen lassen sich so sehr direkt und verlässlich nachvollziehen, sodass die Unklarheiten meist schnell gefunden sind.
Max. Linie
Wenn Sie lediglich die Benutzereinstellungen prüfen oder das Passwort zurücksetzen möchten, können Sie dies auch über einen anderen, schnelleren Weg durchführen.
112 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Zum einen können Sie die Benutzerprofile über das Modul Verwaltung bearbeiten, indem Sie auf den Bearbeitungsstift neben dem Benutzernamen klicken. Hierauf öffnet sich direkt der gewählte Datensatz des Backend-Benutzers. Nach dem Schließen des Datensatzes befinden Sie sich wieder in der Benutzerübersicht. Zum andern können Sie auch direkt in die Benutzereinstellungen des Benutzers wechseln. Dies ist vor allem dann sehr hilfreich, wenn Sie das Benutzer-TSconfig testen möchten, um bestimmte Benutzereinstellungen vorzubelegen, wie in Rezept 3.12 beschrieben. Ebenso können Sie auch hier das Benutzerpasswort zurücksetzen oder den Namen anpassen. Um diese Einstellungen vorzunehmen, wechseln Sie in Ihre Benutzereinstellungen und wählen den Reiter Admin-Funktionen. Dort erscheint nun eine Auswahlliste, mit der Sie den gewünschten Benutzernamen auswählen können. Durch die Auswahl werden automatisch die Benutzereinstellungen des gewählten Benutzers geladen. Nun können Sie zum Beispiel das Passwort zurücksetzen oder den Benutzernamen korrigieren. Durch das TSconfig fest vorgegebene Werte werden in den Einstellungen visuell abgeblendet und können nicht überschrieben werden. Indem Sie wieder auf das Modul Verwaltung klicken, gelangen Sie zurück in Ihr ursprüngliches Benutzerprofil. So können Sie schnell Einstellungen von Benutzern anpassen, ohne das gesamte Backend neu zu laden.
Lizensiert für Markus Mueller
Die Benutzereinstellungen können Sie so noch schneller einsehen und anpassen als über den in der Lösung genannten Weg. Jedoch beschränkt sich der Einblick hier auf die Benutzereinstellungen. Um die Zugriffsrechte im Seitenbaum oder tiefer gehende SeitenTSconfig-Einstellungen zu prüfen, müssen Sie den ersten Lösungsweg gehen.
3.12 Benutzereinstellungen vorgeben Problem Sie möchten standardmäßig bestimmte Benutzereinstellungen aktivieren.
Lösung Nutzen Sie das Benutzer-TSconfig, um die Einstellungen für den gewählten Benutzer fest vorzugeben. Wenn Sie den TSconfig-Code in die Benutzergruppe einfügen, erhalten automatisch alle Benutzer dieser Gruppe die jeweiligen Standardeinstellungen. Um den TSconfig-Code einzugeben, wechseln Sie in das Modul Verwaltung und klicken dort rechts neben dem Benutzernamen auf das Stiftsymbol. Aktivieren Sie im Datensatzdetail den Reiter Optionen und setzen Sie den Cursor in das Feld TSconfig.
Max. Linie
Klicken Sie nun rechts vom Eingabefeld auf das Icon TS (siehe Abbildung 3-4). Hierauf öffnet sich die TSconfig-Kurzreferenz in einem neuen Pop-up-Fenster. Dort können Sie über
3.12 Benutzereinstellungen vorgeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 113
Max. Linie
einen Codeassistenten schnell nach TSconfig-Parametern suchen und erhalten gleichzeitig zu jedem Wert eine nähere Funktionsbeschreibung. Zudem hilft Ihnen der Assistent, den TSconfig-Code richtig zu schreiben und einzurücken. So sparen Sie viel Tipparbeit und vermeiden Fehlerquellen.
Links
Abbildung 3-4: Über diese Schaltfläche aktivieren Sie die TSconfig-Kurzreferenz
Die möglichen TSconfig-Parameter werden in einer Baumstruktur dargestellt, durch die Sie sich mit der Maus klicken können. Über die rot hervorgehobenen Links GO gehen Sie eine Ebene tiefer in den TSconfig-Einstellungen und erhalten mehr Details über den gewünschten Bereich. Mit dem Link am linken oberen Rand gelangen Sie zurück in die Parameterübersicht.
Lizensiert für Markus Mueller
Wenn Sie eine passende Einstellung gefunden haben, klicken Sie auf das kleine Plussymbol am linken Rand. Hierdurch wird der Wert in den Codeassistenten eingefügt. Wenn Sie mehrere Werte einfügen möchten, wiederholen Sie diesen Schritt bei jeder Option. Anschließend wandeln Sie Ihre Auswahl über den Link Umbruch in wohlgeformten TSconfig-Code um und übertragen ihn anschließend in das TSconfig-Feld des Backend-Benutzers. Um Ihre Auswahl zu starten, klicken Sie nun auf das rot hervorgehobene GO bei setup. [default] (Abbildung 3-5).
Abbildung 3-5: Die TSconfig-Kurzreferenz, mit der Sie alle TSconfig-Einstellungen formulieren können
Max. Linie
Wählen Sie abschließend in der Liste mit dem Plussymbol die gewünschten Optionen aus, die Sie festlegen möchten. TYPO3 fügt diese Werte dann nacheinander in das Texteingabefeld ein, das sich am unteren Seitenrand befindet. Wenn Sie mit der Auswahl fertig sind, scrollen Sie zu diesem Feld, setzen die gewünschten Werte und klicken auf den
114 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Link Umbruch. TYPO3 wird die gewählten Werte dann den richtigen TSconfig-TopLevel-Objekten zuweisen (siehe Abbildung 3-6). Das ist wichtig, um die Werte in den richtigen Kontext zu setzen, damit sie von TYPO3 interpretiert werden können. Wenn Sie diese Einrückung nicht vornehmen, werden die Einstellungen von TYPO3 ignoriert.
Abbildung 3-6: Der Code vor und nach der Einrückung
Klicken Sie abschließend auf Übertragen & schließen. Der Assistent überträgt danach die Werte in das TSconfig-Feld des Backend-Benutzers und schließt das Pop-up-Fenster. Lizensiert für Markus Mueller
Zum Beispiel können Sie in der Liste die beiden Optionen recursiveDelete und allSaveFunctions aktivieren. Nach dem Klick auf die Option Umbruch sollte der Code dann so aussehen: setup.default { recursiveDelete = 0 allSaveFunctions = 1 }
Wenn Sie im Pop-up-Fenster direkt auf den Wert geklickt haben, fügt der Assistent lediglich den Wert ein und schließt das Fenster. Sie müssen den Code dann noch entsprechend dem oben gezeigten Code anpassen, damit Ihre TSconfig-Einstellungen von TYPO3 korrekt interpretiert werden können. Nachdem Sie den Benutzer gespeichert haben, sind die gewählten Eigenschaften auch standardmäßig in seinen Einstellungen aktiv.
Diskussion
Max. Linie
Hiermit stehen Ihnen zahlreiche Optionen zur Verfügung, mit denen Sie die Benutzereinstellungen beeinflussen können. Sie werden feststellen, dass nicht alle angebotenen Optionen im Benutzerprofil erscheinen und daher vom Benutzer nicht geändert werden können. Diese Werte haben eher administrativen Charakter und können dazu genutzt werden, grundlegende Einstellungen wie zum Beispiel die Breite für den Seitenbaumbereich zentral festzulegen (ein solches Anwendungsbeispiel finden Sie in Rezept 7.4).
3.12 Benutzereinstellungen vorgeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 115
Max. Linie
Der Benutzer kann seine Einstellungen nach seinen eigenen Wünschen über das Modul Einstellungen anpassen. Was aber, wenn Sie bestimmte Werte erzwingen möchten? Beispielsweise soll der Benutzer die Option Rekursives Löschen niemals aktivieren können, um potenzielle Fehlerquellen auszuschließen.
Links
Um Werte fest vorzubelegen, geben Sie anstatt des Werts default den Wert override an. Die Optionen werden dann nach dem Speichern immer wieder von TYPO3 auf diese festgelegten Werte zurückgesetzt, sodass der Benutzer keine Änderungen vornehmen kann: setup.override { recursiveDelete = 0 allSaveFunctions = 1 }
Somit stellen Sie sicher, dass alle Optionen nach Ihren Wünschen übernommen werden und sich auch nachträglich nicht ändern lassen.
Siehe auch
Lizensiert für Markus Mueller
Falls Ihnen der Begriff TSconfig noch neu ist, sollten Sie die Einleitung von Kapitel 6 lesen. Dort gehen wir auf den Begriff näher ein. Zudem finden Sie in Kapitel 6 weitere Anwendungsbeispiele für die Einsatzmöglichkeiten von TSconfig. Eine Übersicht über alle TSconfig-Parameter und Top-Level-Objekte finden Sie im Dokument TSconfig unter http://typo3.org/documentation/document-library/core-documentation/doc_core_tsconfig/ current/.
Max. Linie
Max. Linie 116 | Kapitel 3: Der richtige Zugang zum Backend This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
First
Kapitel 4
KAPITEL 4
Inhalte eingeben
4.0
Einführung
In diesem Kapitel erfahren Sie, wie Sie Seiten komfortabel erstellen und mit Inhalt füllen. Die Rezepte 4.1 und 4.2 bieten Ihnen Lösungen und Tipps, wie Sie redaktionelle Änderungen an Ihrer Website in kürzester Zeit vornehmen können. Selbst aufwendigere Anpassungen an der Seitenstruktur lassen sich dadurch in der Regel schnell und bequem erledigen. Lizensiert für Markus Mueller
Rezept 4.3 zeigt Ihnen, wie Sie Eingabefelder mit häufig benötigten Werten vorbelegen und so viel Zeit bei der Eingabe der Inhalte sparen. Zusätzlich können Sie auch festlegen, welche Felder beim Kopieren von Datensätzen automatisch übernommen werden. In Rezept 4.4 erfahren Sie, wie Sie diese Möglichkeit effektiv einsetzen können. Wenn Sie Änderungen an den Inhalten vornehmen, ist es auch hilfreich, die jeweiligen Datensätze während der Bearbeitung zu verstecken, sodass Besucher Ihrer Website davon nichts mitbekommen. Sie können zum Beispiel sämtliche Inhalte in Ruhe eingeben und erst dann freischalten, wenn Sie mit dem Ergebnis zufrieden sind. In Rezept 4.5 erfahren Sie, wie Sie Datensätze standardmäßig verstecken. Vor allem wenn Sie mit mehreren Benutzern innerhalb einer TYPO3-Installation arbeiten, möchten Sie vielleicht die Erzeugung bestimmter Datensätze auf manchen Seiten unterbinden, etwa um sicherzustellen, dass Seiteninhalte ausschließlich auf regulären Seiten erstellt werden dürfen. In Rezept 4.6 finden Sie dazu die passende Lösung.
Max. Linie
Wenn sich Ihre Website mit der Zeit mit Inhalten füllt und umfangreicher wird, kann die Verwaltung über das TYPO3-Backend zunehmend abstrakt und unübersichtlich werden, und Sie verlieren dadurch möglicherweise den Blick für die Zusammenhänge auf der jeweiligen Webseite. TYPO3 bietet Ihnen die Möglichkeit, die Seiteninhalte auch direkt im Frontend zu ändern. Dadurch können Sie unmittelbar in der Website arbeiten und gelangen erfahrungsgemäß schneller an die gewünschte Stelle, an der Sie dann über die gewohnten Bearbeitungssymbole die Eingabemaske öffnen und die Inhalte anpassen können. Rezept 4.7 beschreibt die nötigen Schritte, um diese intuitive Eingabemöglichkeit zu aktivieren.
| 117 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Um Inhalte einzugeben, bietet Ihnen TYPO3 standardmäßig ein interaktives Textbearbeitungsmodul, mit dem Sie sehr intuitiv Seiteninhalte formatieren können. Dieser Editor ist hochgradig anpassbar und äußerst flexibel einzustellen. In Rezept 4.8 erfahren Sie, wie Sie die Einstellungen an Ihre Bedürfnisse anpassen.
Links
Sämtliche Inhalte Ihrer Website können Sie in mehreren Sprachen anlegen und auf Ihrer Website entsprechend den Einstellungen Ihrer Besucher präsentieren. Wenn Sie die Inhalte Ihrer Website in mehreren Sprachen anbieten möchten, sollten Sie Rezept 4.9 lesen. Dort erfahren Sie, welche Einstellungen Sie vornehmen müssen, um mehrsprachige Inhalte einzugeben und zu verwalten. Wenn Sie die Inhaltseingabe der Benutzer kontrollieren möchten oder müssen, stellt Ihnen TYPO3 sogenannte Workspaces zur Verfügung. Über Workspaces können mehrere Benutzer an Inhalten arbeiten, wobei alle Änderungen automatisch von TYPO3 protokolliert werden. Rezept 4.10 erläutert anhand eines beispielhaften Workflows die grundlegenden Einstellungsmöglichkeiten der Workspaces.
Lizensiert für Markus Mueller
Wenn Sie sensible Inhalte auf Ihren Webseiten ausgeben, können Sie mit einem Workflow erheblich zur Qualitätssicherung beitragen. Die Inhalte werden dann durch das VierAugen-Prinzip von mehreren Personen gegengelesen, sodass mögliche Fehler frühzeitig erkannt werden können. Wie Sie einen solchen Workflow mit TYPO3-Bordmitteln einrichten, erfahren Sie in Rezept 4.11.
4.1
Seiten schnell erzeugen
Problem Sie möchten schnell eine oder mehrere Seiten erstellen.
Lösung Falls noch keine Seite in Ihrem Seitenbaum existiert, aktivieren Sie zuerst das Modul Seite und klicken auf die Weltkugel im Seitenbaum. Wählen Sie dann im Kontextmenü den Eintrag Neu und klicken Sie anschließend auf den Eintrag Seite (in). Es erscheint eine Eingabemaske, über die Sie die Seiteneigenschaften festlegen können. Nach dem Speichern klicken Sie auf das Modul Funktionen.
Max. Linie
Im Modul Funktionen finden Sie den Assistenten Erzeuge mehrere Seiten. In den Eingabefeldern geben Sie die Titel der neuen Seiten an. Die restlichen Eigenschaften der Seite ändern Sie, nachdem die Seiten erzeugt wurden. Nach einem Klick auf den Button Seiten anlegen erzeugen Sie die neuen Seiten oberhalb der bestehenden. Mit der Option Neue Seiten nach existierenden Unterseiten anlegen fügen Sie die Seiten danach ein. Arbeiten Sie in einer Produktionsumgebung, sollten Sie die Option Neue Seiten verbergen aktivieren. Dadurch haben Sie die Möglichkeit, die Seiten vor dem Freischalten mit Inhalt zu füllen.
118 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Diskussion Möchten Sie nur einzelne Seite erzeugen, ist der oben erwähnte Weg auf Dauer etwas umständlich. TYPO3 bietet Ihnen die Möglichkeit, neue Seiten direkt aus einer bestehenden Seite heraus zu erstellen. Aktivieren Sie dazu mit folgendem Benutzer-TSconfig die Funktion Dokument sichern und neues anlegen in der Aktionspalette (allgemeine Informationen zu TSconfig-Anweisungen finden Sie in der Einleitung zu Kapitel 6): options { saveDocNew.pages = 1 }
Nach dem Speichern der TSconfig-Angaben wird, wie in Abbildung 4-1 gezeigt, die Aktionspalette im Bearbeitungsformular der Seiteneigenschaften um einen neuen Button mit der gewünschten Funktion erweitert.
Abbildung 4-1: Die Aktionspalette vor und nach der Aktivierung des Buttons »Speichern und neuen Datensatz anlegen« Lizensiert für Markus Mueller
Die neuen Seiten werden standardmäßig unterhalb der bestehenden Seiten angelegt. Wenn Sie jedoch möchten, dass die neuen Seiten darüber angelegt werden, geben Sie folgenden Code in Ihr Benutzer-TSconfig-Feld: options { saveDocNew.pages = top }
Zusätzlich können Sie die Inhalte über die Listenansicht anlegen. Aktivieren Sie dazu im Listenmodul die Option Erweiterte Ansicht. Daraufhin erscheint in der Optionspalette das Symbol Neue Seite nach dieser Seite anlegen. Abbildung 4-2 zeigt dieses Icon, mit dem Sie individuell bestimmen können, nach welchem Datensatz der neue Inhalt angelegt wird.
Abbildung 4-2: Die Listenansicht in der erweiterten Ansicht; neue Datensätze können so sehr intuitiv an der gewünschten Position erstellt werden
Mit dem in Abbildung 4-3 gezeigten Symbol erstellen Sie einen neuen Datensatz direkt am Anfang der Seite.
Max. Linie
Abbildung 4-3: Mit diesem Symbol erstellen Sie einen neuen Datensatz am Seitenanfang 4.1 Seiten schnell erzeugen | 119 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Siehe auch
Links
Erfahren Sie in Rezept 4.2, wie Sie neue Seiten schnell mit Inhalt füllen. Rezept 5.4 erläutert, wie Sie bestehende Inhalte im Handumdrehen in die neuen Seiten einfügen. In Rezept 5.6 erfahren Sie, wie Sie mehrere Inhalte gleichzeitig bearbeiten.
4.2
Die Inhaltseingabe beschleunigen
Problem Sie möchten Ihre Inhalte schneller und effizienter eingeben.
Lösung Verwenden Sie den Bearbeitungsmodus Schnelleingabe im Modul Seite. Mit der Schnelleingabe steht Ihnen ein Eingabemodus zur Verfügung, mit dem Sie Inhaltselemente schnell bearbeiten und neu erzeugen können.
Lizensiert für Markus Mueller
Wechseln Sie also in das Modul Seite und klicken Sie auf die Seite, deren Inhalt Sie bearbeiten möchten. Der Seiteninhalt wird dann dem aktuellen Darstellungsmodus entsprechend entweder nach Spalten, Sprachen oder im Schnelleingabe-Modus angezeigt. Falls die Schnelleingabemaske nicht gleich erscheint, finden Sie rechts oben ein Auswahlfeld, mit dem Sie den Bearbeitungsmodus einstellen können. Wählen Sie dort die Option Schnelleingabe. Danach ändert sich die Eingabemaske, und Sie können über das Schnelleingabeformular Inhalte direkt anwählen und editieren. Unterhalb der Eingabemaske für den Datensatz werden alle anderen Seiteninhalte aufgelistet, die sich in der Seite befinden. Der aktuelle Datensatz wird in der Liste mit einem roten Pfeil gekennzeichnet. Klicken Sie auf einen der Titel, öffnet sich umgehend die Eingabemaske für das entsprechende Inhaltselement. Beachten Sie dabei, dass Ihre Änderungen unwiderruflich verloren gehen, wenn Sie vor dem Wechsel die Inhalte nicht abspeichern. Innerhalb der Liste können Sie auch neue Seitenelemente hinzufügen. Klicken Sie dazu auf den Pfeil an der gewünschten Position. Nach dem Speichern erzeugt TYPO3 den Datensatz an der gewünschten Stelle. Beachten Sie, dass der Bearbeitungsmodus Schnelleingabe in SysOrdnern ausgeblendet wird.
Diskussion Um die Eingabe noch effektiver zu gestalten, können Sie in der Schnelleingabe die Feldanordnung über das Benutzer- oder Seiten-TSconfig anpassen. Mit dem folgenden Code verschieben Sie das Feld Text vor das Feld Überschrift:
Max. Linie
mod.web_layout.tt_content { fieldOrder = bodytext, header }
120 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Dies ist dann hilfreich, wenn Sie bestimmte Felder hintereinander bearbeiten möchten, etwa um Inhalte in einer festen Reihenfolge zu kopieren. Beispielsweise können Sie damit die Tabulator-Reihenfolge so optimieren, dass Sie mit jeweils einem Tabulator-Schritt ins nächste Feld springen. Alle übrigen Felder werden nach den Standardangaben angeordnet. Beachten Sie, dass die Angaben im Benutzer-TSconfig die Angaben im Seiten-TSconfig überschreiben. Eine vollständige Liste der möglichen Feldnamen erhalten Sie über das Modul Konfiguration. Wählen Sie dort den Eintrag $TCA (tables.php) in der Auswahlliste. Danach klappen Sie beim Eintrag tt_content den Wert columns auf. Damit erhalten Sie eine Liste der möglichen Feldnamen, die Sie umstellen können (in Rezept 1.5 erfahren Sie mehr über das Modul Konfiguration). Um die Inhaltseingabe zusätzlich zu beschleunigen, geben Sie folgenden Code in das Benutzer-TSconfig-Feld ein: options.saveDocNew = 1
Damit erweitern Sie die Optionspalette zum Speichern um die Funktion Dokument sichern und neues anlegen für alle Datensätze. In Abbildung 4-4 sehen Sie die Palette vor und nach der Aktivierung dieser Funktion. Lizensiert für Markus Mueller
Abbildung 4-4: Die neue Option »Dokument sichern und neues anlegen« ist unten nun aktiv
Neue Datensätze können Sie so direkt aus der aktuellen Eingabemaske heraus anlegen. Möchten Sie diese Speicherfunktion nur auf spezielle Tabellen anwenden, verwenden Sie folgenden Code: options.saveDocNew = 0 options.saveDocNew.[tabellen_name] = 1
Die Option Speichern und neu wird so nur bei der angegebenen Tabelle sichtbar. Umgekehrt können Sie diese Option in der Form auch für spezielle Tabellen deaktivieren: options.saveDocNew = 1 options.saveDocNew.[tabellen_name] = 0
Standardmäßig werden die so erzeugten Datensätze immer unterhalb des bestehenden Datensatzes geschrieben. Möchten Sie die Datensätze oberhalb der bestehenden anlegen, geben Sie folgenden Code ein: options.saveDocNew = top
Analog zu den oben beschriebenen Einstellungen können Sie diese Option auch nur auf spezielle Tabellen anwenden:
Max. Linie
options.saveDocNew.[tabellen_name] = top
4.2 Die Inhaltseingabe beschleunigen | 121 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Beachten Sie, dass im Seitenmodus Schnelleingabe die Option Speichern und neu nicht vorhanden ist. Sie können jedoch unter jedem Element automatisch einen neuen Datensatz anlegen, wenn Sie auf einen der grauen Pfeile zwischen den vorhandenen Seitenelementen klicken. Daraufhin öffnet sich gleich die Eingabemaske des neuen Elements. Indem Sie auf den Titel eines bestehenden Datensatzes klicken, öffnen Sie den entsprechenden Datensatz für die Bearbeitung.
Links
Siehe auch In Rezept 4.3 erfahren Sie, wie Sie Felder mit einem bestimmten Wert vorbelegen können. Rezept 4.4 zeigt Wege, wie Sie Ihre Dateneingabe weiter optimieren können, indem Sie Werte vorangegangener Elemente beim Erstellen oder Kopieren übernehmen. Rezept 5.4 erläutert, wie Sie lange Seiten komfortabel aufteilen und so Ihre Inhalte für Ihre Besucher aufbereiten können.
4.3
Standardwerte für Felder vorgeben
Problem Lizensiert für Markus Mueller
Sie möchten bestimmte Felder mit Standardwerten vorbelegen, um die Eingabe wiederkehrender Inhalte zu beschleunigen.
Lösung Setzen Sie die Standardwerte mit TCAdefaults über das Benutzer- oder Seiten-TSconfig. Die Angaben von TCAdefaults sind immer nach diesem Muster aufgebaut: TCAdefaults.[tabellen_name].[spalten_name] = Wert
Geben Sie zum Beispiel folgenden Code in das TSconfig-Feld einer Backend-Benutzergruppe ein, um zu erreichen, dass alle von den Benutzern dieser Gruppe neu angelegten Inhaltselemente standardmäßig versteckt sind: TCAdefaults.tt_content { hidden = 1 }
Geben Sie den Code in das TSconfig-Feld einer Seite ein, gelten die Standardwerte für alle Unterseiten.
Diskussion
Max. Linie
Jedes Feld im TYPO3-Backend lässt sich über TCAdefaults mit Werten vorbelegen. Dafür ist es entscheidend, dass Sie wissen, welches Feld welche Datenbankspalte abbildet. Um dies herauszufinden, können Sie entweder im HTML-Quelltext der jeweiligen Eingabemaske nach dem Feldnamen suchen oder den Wert über die Datenbankstruktur herleiten.
122 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
So erhalten Sie den Wert aus dem HTML-Code: Öffnen Sie die Eingabemaske und lassen Sie sich den Quelltext des Frames anzeigen, in dem das Formular angezeigt wird. Suchen Sie im Code nach dem Eingabefeld. Im HTML-Code finden Sie für jedes Feld einen eindeutigen Namen. Über diesen Namen wird jedes Feld eindeutig einem Wert in der Datenbank zugewiesen. Der Feldname ist immer nach diesem Muster aufgebaut: data[tabellen_name][uid][spalten_name]
[tabellen_name] kennzeichnet die Tabelle, in der dieser Datensatz liegt. [uid] steht für
die UID des aktuellen Datensatzes. Die Abkürzung UID steht für Unique ID und repräsentiert einen eindeutigen Zahlenwert, anhand dessen TYPO3 Datensätze eindeutig abfragen und zuordnen kann. Jedoch spielt sie bei der Verwendung in TCAdefaults keine Rolle und kann ignoriert werden. Mit dem Wert [spalten_name] setzen Sie den Namen derjenigen Tabellenspalte fest, in der der Wert gespeichert wird. Über die Datenbankstruktur finden Sie die passende Struktur folgendermaßen heraus: Schauen Sie, in welchem Datensatz Sie welches Feld ausblenden möchten. Seiten finden Sie in der Tabelle pages. Seiteninhalt wird standardmäßig in der Tabelle tt_content gespeichert. Lesen Sie die Diskussion in Rezept 2.5, um einen Überblick über die vorhandenen Datenbanktabellen zu erhalten. Außerdem finden Sie in Rezept 16.4 eine Übersicht über die Tabellenfelder der Tabelle tt_content und deren Bedeutung. Lizensiert für Markus Mueller
Siehe auch Rezept 4.4 beschreibt, wie Sie bestimmte Werte von bestehenden Datensätzen automatisch beim Kopieren oder Erstellen neuer Datensätze übernehmen.
4.4
Werte anderer Datensätze übernehmen
Problem Sie möchten Werte vorangegangener Datensätze automatisch übernehmen, wenn Sie neue Datensätze anlegen, beispielsweise um schnell eine Serie ähnlicher Inhaltstypen zu erstellen.
Lösung Passen Sie den ctrl-Bereich im TCA der jeweiligen Tabelle an und fügen Sie dort die Eigenschaft useColumnsForDefaultValues ein. In useColumnsForDefaultValues geben Sie die Feldnamen an, die vom vorangehenden Datensatz übernommen werden sollen. Falls Ihnen der Begriff ctrl-Bereich noch neu ist, sollten Sie zuerst das Rezept 16.3 lesen, bevor Sie weiterlesen.
Max. Linie
Max. Linie 4.4 Werte anderer Datensätze übernehmen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 123
In eigenen Extensions genügt es dazu, die folgende Zeile in den ctrl-Abschnitt des TCA der Tabelle einzufügen:
Links
$TCA['tabellen_name'] = Array ( 'ctrl' => Array ( 'useColumnsForDefaultValues' => 'feld_namen', ), );
Den ctrl-Bereich bestehender Tabellen ändern Sie über eine Extension, in der Sie über die Datei ext_tables.php die bestehenden TCA-Einstellungen an Ihre Bedürfnisse anpassen (wenn Ihnen der Umgang mit Extensions noch neu ist, erfahren Sie in Kapitel 16 die nötigen Hintergründe). Zuerst laden Sie das TCA der gewünschten Tabelle. Danach können Sie dort die Änderungen vornehmen. Ersetzen Sie feld_namen durch den entsprechenden Feldnamen aus der Tabelle. Die Feldnamen werden mit Kommata voneinander getrennt: t3lib_div::loadTCA('tabellen_name'); $TCA['tabellen_name']['ctrl']['useColumnsForDefaultValues'] = 'feld1, feld2, feldn';
Mit dem folgenden Code legen Sie beispielsweise fest, dass der Inhaltstyp eines Datensatzes beim Anlegen neuer Datensätze übernommen wird: t3lib_div::loadTCA('tt_content'); $TCA['tt_content']['ctrl']['useColumnsForDefaultValues'].= ',CType'; Lizensiert für Markus Mueller
Beachten Sie, dass Sie mit dem Code die bestehenden Einstellungen der Tabelle mit der Zuweisung .= erweitern. Dadurch bleiben die ursprünglichen Standardwerte colPos und sys_language_uid erhalten. Möchten Sie jedoch nur den Wert des Inhaltstyps übernehmen, ändern Sie die Wertzuweisung, indem Sie den Punkt und das Komma entfernen.
Diskussion Möchten Sie bestimmte Werte auch beim Kopieren von Datensätzen übernehmen, fügen Sie die Eigenschaft copyAfterDuplFields in den ctrl-Bereich der gewünschten Tabelle ein: t3lib_div::loadTCA('tabellen_name'); $TCA['tabellen_name']['ctrl']['copyAfterDuplFields'] = 'feld1, feld2, feldn';
Wenn Sie Datensätze aus der Zwischenablage hinter einen anderen Datensatz kopieren, werden mit dieser Einstellung alle leeren Felder mit den Werten des vorangehenden Datensatzes übernommen. Beispielsweise wird mit folgendem Code das Layout der Überschrift des vorangegangenen Datensatzes übernommen: t3lib_div::loadTCA('tt_content'); $TCA['tt_content']['ctrl']['copyAfterDuplFields'].= 'header_layout';
Siehe auch
Max. Linie
In Rezept 1.5 erfahren Sie, wie Sie die aktuellen Konfigurationseinstellungen analysieren können und so eine bessere Übersicht erhalten.
124 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
4.5
Seiten und Inhalte standardmäßig verstecken
Problem Sie möchten Datensätze standardmäßig ausblenden, um deren Inhalt beispielsweise vor dem Veröffentlichen nochmals gegenzulesen.
Lösung Setzen Sie per TCAdefaults den Standardwert des Felds hidden auf 1. Geben Sie dazu folgenden Code in das TSconfig-Feld in Ihrem Benutzerprofil, der Benutzergruppe oder der Seite ein und passen Sie den Tabellennamen an die gewünschte Tabelle an: TCAdefaults { tabellen_name.hidden = 1 }
Mit folgendem Code verstecken Sie beispielsweise neue Seiten und Seiteninhalte:
Lizensiert für Markus Mueller
TCAdefaults { pages.hidden = 1 tt_content.hidden = 1 }
Wenn Sie den Code in das TSconfig-Feld einer Benutzergruppe schreiben, wird das Feld automatisch bei allen Benutzern dieser Gruppe aktiviert.
Diskussion Mit diesen Einstellungsmöglichkeiten lässt sich auch leicht ein einfacher WorkflowMechanismus einrichten. Mit diesem Workflow stellen Sie beispielsweise sicher, dass Inhalte nur dann freigegeben werden, nachdem sie von einem anderen Benutzer authentifiziert wurden. Um diesen Mechanismus in TYPO3 einzurichten, gehen Sie wie folgt vor: Legen Sie zwei Benutzer und zwei Benutzergruppen an. Die eine Benutzergruppe darf das Feld Verstecken sehen und ändern. Die andere Benutzergruppe darf dieses Feld nicht sehen und dadurch auch nicht ändern. Der Wert für das Feld Verstecken wird in der Datenbank standardmäßig über das Feld hidden gespeichert. Um dieses Feld nun im Backend vorzubelegen, setzen Sie bei der ersten Benutzergruppe den Standardwert für dieses Feld auf 0. Bei der zweiten Benutzergruppe wird das Feld mit dem Wert 1 belegt, sodass es standardmäßig aktiviert ist. Für die erste Gruppe wählen Sie jetzt in der Auswahlliste Allowed excludefields die Option Seiteninhalt: Verstecken. Im Feld TSconfig geben Sie diesen Code ein:
Max. Linie
TCAdefaults.tt_content { hidden = 0 }
4.5 Seiten und Inhalte standardmäßig verstecken | 125 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Speichern Sie dann den Datensatz und wechseln Sie in die zweite Gruppe. Stellen Sie die Auswahlliste in Allowed excludefields wie bei der ersten Benutzergruppe ein, achten Sie jedoch unbedingt darauf, dass in der Auswahlliste die Option Seiteninhalt: Verstecken nicht aktiv ist. Im Feld TSconfig geben Sie folgenden Code ein:
Links
TCAdefaults.tt_content { hidden = 1 }
Dadurch aktivieren Sie das Feld Versteckt für diese Gruppe. Da das Feld selbst jedoch ausgeblendet ist, können Benutzer dieser Gruppe keine Seiteninhalte freischalten. Die Freischaltung muss von einem Benutzer der ersten Gruppe vorgenommen werden. Um diesen Workflow bei eigenen Tabellen zu verwenden, müssen Sie lediglich den Namen der Tabelle anpassen. Am schnellsten finden Sie diese Tabellennamen über den Erweiterungs-Manager heraus. Wählen Sie dort in der Auswahlliste die Option Geladene Extensions anzeigen und sehen Sie sich die Extension-Details der gewünschten Extension an. Unter dem Punkt Database requirements finden Sie die Namen der Tabellen, die von dieser Extension verwendet werden. Sollten Tabellen mit der Endung _mm angezeigt werden, können Sie diese ignorieren. Diese Tabellen dienen der Verknüpfung von Datensätzen zweier Tabellen und können nicht mit TCAdefaults-Werten belegt werden (in Rezept 16.3 erfahren Sie, wie Sie eigene Tabellen in TYPO3 integrieren). Lizensiert für Markus Mueller
Um sicherzustellen, dass Datensätze nicht durch versehentliches Kopieren veröffentlicht oder doppelt angezeigt werden, sollten Sie die Option hideAtCopy im ctrl-Bereich der jeweiligen Tabelle aktivieren. ctrl-Bereich bedeutet so viel wie control-Bereich. Dort speichert TYPO3 die grundlegenden Tabelleneigenschaften und damit auch, wie sich die Datensätze beim Kopieren verhalten. Um die Datensätze nun stets versteckt zu halten, geben Sie folgenden Code in die Datei ext_tables.php ein: t3lib_div::loadTCA('tt_content'); $TCA['tt_content']['ctrl']['hideAtCopy'] = 1;
Wenn Sie diese Eigenschaft bei eigenen Tabellen aktivieren möchten, müssen Sie folgenden Code in den TCA-Abschnitt ctrl einfügen: $TCA['tabellen_name'] = Array ( 'ctrl' => Array ( 'hideAtCopy' => 1, ), );
Diese Eigenschaft können Sie wiederum – beispielsweise für administrative Aufgaben – mit folgendem Code über TSconfig für bestimmte Benutzer oder Benutzergruppen überschreiben:
Max. Linie
TCEMAIN.table.tt_content { disableHideAtCopy = 1 }
126 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Achten Sie darauf, dass Sie das Kontrollkästchen für die Eigenschaft Versteckt nicht über TCEFORMS-Angaben ausblenden, da sonst die Bearbeitung der Felder für beide Gruppen nicht möglich ist (wenn Sie mit dem Begriff TCEFORMS noch nichts anfangen können, sollten Rezept 6.6 lesen. Dort erfahren Sie mehr über die Möglichkeit, Eingabeformulare im Backend zu reduzieren).
Siehe auch Eine Übersicht der möglichen Tabellennamen erhalten Sie in der Diskussion von Rezept 2.5. Wenn Sie mehr zum Thema Workflow wissen möchten, sollten Sie auch einen Blick auf das Workflow-Projekt von TYPO3 werfen: http://typo3.org/development/projects/ workflow-engine/. In Rezept 16.3 erfahren Sie mehr über die Einstellungsoptionen für Tabellen in TYPO3.
4.6
Datensätze nur in bestimmten Seiten erlauben
Problem Lizensiert für Markus Mueller
Sie möchten die Verwendung von Datensätzen eingrenzen, beispielsweise um in SysOrdnern reguläre Seiteninhalte auszuschließen.
Lösung Wählen Sie die Seite, in der Sie die Inhalte einschränken möchten, und bearbeiten Sie die Seiteneigenschaften. Geben Sie nun in das Feld TSconfig folgenden Code ein: mod.web_list { allowedNewTables = tabellen_name }
Ersetzen Sie den Platzhalter tabellen_name mit dem Namen der gewünschten Tabelle, deren Inhalte Sie auf der Seite nicht erlauben möchten. Um beispielsweise in einem SysOrdner nur TypoScript-Templates zu ermöglichen, geben Sie in das Feld TSconfig dieses SysOrdners folgenden Code ein: mod.web_list { allowedNewTables = sys_template }
Die folgende Auflistung zeigt die häufigsten Tabellennamen, die Sie als Wert verwenden können:
Max. Linie
Max. Linie 4.6 Datensätze nur in bestimmten Seiten erlauben | 127 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Tabelle 4-1: Tabellennamen und ihre Verwendung Tabellenname
Verwendung
be_groups
Backend-Benutzergruppen
be_users
Backend-Benutzer
fe_groups
Frontend-Benutzergruppen
fe_users
Frontend-Benutzer
pages
Seiten
pages_language_overlay
Übersetzungen von Seiten
sys_dmail
Newsletter bzw. Direct-Mail-Datensätze
sys_domain
Domains
sys_filemounts
Datei-Mounts für Backend-Gruppen oder -Benutzer
sys_note
Textnotizen im Backend
sys_template
TypoScript-Templates
tt_address
Adressendatensätze
tt_content
Seiteninhalte
tt_news
Aktuelle Meldungen
Links
Lizensiert für Markus Mueller
Natürlich können Sie auch mehrere Tabellen angeben, indem Sie deren Namen durch Kommata voneinander trennen.
Diskussion Beachten Sie, dass Sie trotz der TSconfig-Einstellungen prinzipiell noch Datensätze anderer Tabellen in die Seite einfügen können – dann etwa, wenn diese über die Zwischenablage eingefügt werden. Möchten Sie unerwünschte Datensätze wirklich unterbinden, müssen Sie die Seiteneigenschaften anpassen. Dort definieren Sie dann die Tabellen, die innerhalb der Seite vorkommen dürfen. TYPO3 speichert sämtliche Seiteneigenschaften im Array $PAGES_TYPES. In diesem Array werden, wie der Name schon vermuten lässt, sämtliche Seitentypen verwaltet, die Sie im Backend über die Seiteneigenschaften auswählen können. Jeder Seitentyp kann über eine eindeutige Identifizierungsnummer (ID) angesprochen werden. TYPO3 speichert diesen Seitentyp standardmäßig im Feld doktype der Tabelle pages ab. Die folgende Tabelle zeigt die vorhandenen Seitentypen mit deren IDs und verdeutlicht diesen Zusammenhang: Tabelle 4-2: Diese Seitentypen sind vorgegeben
Max. Linie
ID
Seitentypen
1
Standard
3
Link zu externer URL
4
Verweis
6
Backend-Benutzerbereich
128 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Tabelle 4-2: Diese Seitentypen sind vorgegeben (Fortsetzung) ID
Seitentypen
7
Einstiegspunkt
199
Visuelles Trennzeichen für Menü
254
SysOrdner
255
Papierkorb
Die Seitentypen oberhalb von 200 sind standardmäßig nicht über das Frontend erreichbar und werden in Navigationselementen ausgeblendet. Mit den Seitentypen unterhalb von 199 erzeugen Sie die Seiten, die für die Verwendung im Frontend vorgesehen sind. Eine Sonderrolle nimmt dabei der Seitentyp 199, Abstand, ein. Dieser kann zwar im Frontend als Trennelement in Navigationselementen eingebunden werden, ist jedoch nicht direkt über einen Seitenaufruf erreichbar. Um dieses Array um Ihren eigenen Seitentyp zu erweitern, sollten Sie – wie in Rezept 16.2 beschrieben – eine eigene Extension verwenden. Dadurch, dass Sie Ihre Änderungen in Extensions kapseln, trennen Sie Ihre eigenen Einstellungen sauber vom TYPO3-Kern und behalten so leichter den Überblick. Über die Extension erweitern Sie anschließend das Array $PAGES_TYPES um den neuen Seitentyp mit dem Wert 253. Lizensiert für Markus Mueller
Öffnen Sie nun in dem Extension-Ordner die Datei ext_tables.php und erweitern Sie mit folgendem Code das Array $PAGE_TYPES: $PAGES_TYPES['253'] = array( 'allowedTables' => 'tabellen_name' );
Sie haben Ihren Seitentyp damit registriert, und TYPO3 weiß nun, welche Tabellen in den Seiten dieses Typs gespeichert werden dürfen. Mit der Eigenschaft onlyAllowedTables können Sie die Einschränkung nochmals dahingehend verschärfen, dass der Seitentyp nicht geändert werden kann, wenn sich bereits Datensätze von unerwünschten Tabellen in der Seite befinden. Sie müssten dann sicherstellen, dass keine unerlaubten Datensätze vorhanden sind, bevor Sie den Seitentyp ändern. Erst wenn keine Datensätze anderer Tabellen mehr vorhanden sind, können Sie den Seitentyp umstellen. Ergänzen Sie für diese Einstellung den PHP-Code um die folgende hervorgehobene Zeile: $PAGES_TYPES['253'] = array( 'allowedTables' => 'tabellen_name', 'onlyAllowedTables' => '0' );
Fügen Sie nun unerlaubte Datensätze in eine Seite dieses Typs ein, würde TYPO3 Ihnen mit einer entsprechenden Meldung mitteilen, dass dieser Vorgang nicht durchgeführt werden kann.
Max. Linie
Wenn Sie die Datei ext_tables.php nun speichern und die Auswahlliste der Seitentypen kontrollieren, werden Sie feststellen, dass Ihr neuer Seitentyp dort noch nicht auftaucht.
4.6 Datensätze nur in bestimmten Seiten erlauben | 129 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Das liegt daran, dass der Seitentyp nun zwar konfiguriert ist, das Auswahlfeld in der Eingabemaske jedoch noch nicht erweitert wurde. Dies holen Sie nun im nächsten Schritt nach.
Links
Die Auswahlliste für die Seitentypen wird über die Feldeigenschaften im TCA der Tabelle pages erzeugt. Dort wird festgelegt, dass das Datenbankfeld doktype in einem BackendFormular als Auswahlliste dargestellt wird. Über eine weitere Feldeigenschaft werden die Einträge dieser Auswahlliste definiert. Diese Auswahlliste erweitern Sie nun um Ihren eigenen Seitentyp. Dazu müssen Sie lediglich die vorhandene Listeneinstellung im TCA der Tabelle korrekt ansprechen und erweitern. Öffnen Sie dazu wiederum die Datei ext_tables.php. Um die TCA-Einstellungen für die Tabelle pages zu erweitern, müssen Sie die jeweiligen TCA-Informationen zuerst einlesen. Erst danach werden die Änderungen am TCA wirksam. t3lib_div::loadTCA('pages');
Dann erweitern Sie über die PHP-Funktion array_push das TCA für die Tabelle pages, sodass Ihr Eintrag am Ende der Auswahlliste eingetragen wird. $pageItems = &$TCA['pages']['columns']['doktype']['config']['items']; array_push($pageItems, array('Eigener Seitentyp', '253'));
Lizensiert für Markus Mueller
Max. Linie
Um Ihren Eintrag stärker von den anderen Seitentypen abzuheben, können Sie mit dem Wert --div-- noch ein zusätzliches Trennelement vor den Eintrag setzen, sodass er deutlicher von den restlichen Einträgen separiert wird: array_push($pageItems, array('-----', '--div--')); $pageItems = &$TCA['pages']['columns']['doktype']['config']['items']; array_push($pageItems, array('Eigener Seitentyp', '253'));
Der neue Seitentyp kann nun wie gewünscht über die Seiteneigenschaften gewählt werden. Zusammenfassend hier der vollständige Code zur Erstellung des neuen Seitentyps: $PAGES_TYPES['253'] = array( 'allowedTables' => 'tabellen_name', 'onlyAllowedTables' => '0' ); t3lib_div::loadTCA('pages'); $pageItems = &$TCA['pages']['columns']['doktype']['config']['items']; array_push($pageItems, array('-----', '--div--')); array_push($pageItems, array('Eigener Seitentyp', '253'));
Eine häufige Fehlerquelle bei Anpassungen dieser Art ist, dass sie von anderen Extensions überschrieben werden, sofern diese nach Ihrer Extension installiert werden. Daher sollte vor dem Installieren einer neuen Version genau darauf geachtet werden, welche Änderungen diese vornimmt. Installieren Sie prinzipiell nur Extensions, die keine Ihrer Einstellungen überschreiben. In Rezept 1.5 finden Sie nützliche Tipps, wie Sie diese Einstellungen verlässlich überprüfen und sicherstellen, dass Ihre Änderungen korrekt übernommen werden.
130 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Siehe auch In Rezept 6.5 erfahren Sie, wie Sie das Auswahlfeld für Seitentypen auch ohne PHP-Code erweitern können. In Rezept 7.8 wird erläutert, wie Sie Ihre Seiten mit eigenen Icons ausstatten können und diesen so ein eigenes Erscheinungsbild im Seitenbaum verpassen. In Rezept 1.5 erfahren Sie mehr über den Aufbau des TCA und die Möglichkeit, die gewünschten TCA-Werte schnell zu ermitteln.
4.7
Inhaltseingabe über das Frontend ermöglichen
Problem Sie möchten die Inhalte Ihrer Website direkt auf der Webseite pflegen.
Lösung
Lizensiert für Markus Mueller
Aktivieren Sie über die TSconfig-Einstellungen das Frontend-Editing für den jeweiligen Benutzer, indem Sie das Admin-Panel aktivieren und dort die Bearbeitungsmöglichkeiten für das Frontend freischalten. Fügen Sie dazu folgenden Code in das Benutzer-TSconfig ein: admPanel { enable.edit = 1 override.edit.displayFieldIcons = 1 hide = 1 }
Mit enable.edit = 1 schalten Sie die Bearbeitungsmöglichkeiten zuerst einmal frei. Die Option override.edit.displayFieldIcons = 1 blendet daraufhin die Bearbeitungssymbole ein. Mit hide = 1 verstecken Sie das Admin-Panel, sodass nur die Bearbeitungssymbole auf der Website angezeigt werden. Wenn Sie nun auf ein solches Bearbeitungssymbol klicken, öffnet sich im Frontend die entsprechende Bearbeitungsmaske.
Diskussion Um weitere Arbeiten im Frontend zu erledigen, bietet Ihnen TYPO3 das sogenannte Admin-Panel. Mit dem Admin-Panel können Sie unterschiedliche Arbeiten direkt im Frontend durchführen, ohne ins Backend wechseln zu müssen.
Max. Linie
Dadurch können Sie auch umfangreiche Aufgaben schnell und flexibel im Frontend erledigen und direkter in der Seite arbeiten. Über das Admin-Panel können Sie beispielsweise Datensätze intuitiv auf der Seite verschieben, ausblenden oder löschen. Zudem lässt sich das Admin-Panel sehr fein konfigurieren und bietet – wie der Name schon vermuten lässt – vor allem für Administratoren viele nützliche Funktionen, die im Folgenden beschrieben werden.
4.7 Inhaltseingabe über das Frontend ermöglichen | 131 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Bevor Sie das Admin-Panel einsetzen können, sollten Sie überprüfen, ob es für die gewünschte Seite im TypoScript-Setup freigeschaltet ist. Für die Überprüfung empfehlen wir Ihnen den TypoScript Object Browser. Falls Ihnen die Verwendung mit dem ObjectBrowser noch fremd ist, sollten Sie unbedingt das Rezept 8.3 lesen, um die Grundlagen für die weiteren Schritte zu legen.
Links
Die Aktivierung des Admin-Panels erfolgt über mehrere Stufen. Zuerst muss es generell aktiviert sein. Diese Aktivierung wird über die Seitenkonfiguration vorgenommen. Geben Sie dazu folgende Zeilen in Ihr TypoScript-Setup ein oder stellen Sie sicher, dass die Option über den Object Browser entsprechend aktiviert wurde. Der Wert config.admPanel muss auf 1 stehen, damit Sie mit dem Admin-Panel arbeiten können. Alternativ können Sie auch folgenden Code direkt in das TypoScript-Setup einfügen: config { admPanel = 1 }
Im zweiten Schritt blenden Sie das Admin-Panel über die TSconfig-Einstellungen der jeweiligen Benutzergruppe oder des einzelnen Benutzers ein, indem Sie in das Feld TSconfig folgenden Code eingeben:
Lizensiert für Markus Mueller
admPanel { hide = 0 }
Die Einstellungsmöglichkeiten des Admin-Panels sind dann wiederum in einzelne Funktionsbereiche aufgeteilt. Nach folgendem Muster können Sie jeden dieser Bereiche aktivieren: admPanel { enable.bereich = 1 }
Sie können auch mehrere Bereiche gleichzeitig freischalten, indem Sie pro Zeile eine neue Einstellung vornehmen. Als Administrator haben Sie standardmäßig Zugriff auf alle Bereiche. Sie können jedoch auch einzelne Bereiche ausblenden, wenn Sie die entsprechenden Befehle in das Feld TSconfig eingeben: admPanel { enable.bereich = 0 }
Für jeden Bereich gibt es mehrere Optionen, die Sie nach folgendem Muster aktivieren können: override.bereich.funktion = 1
Max. Linie
Ersetzen Sie nun den Platzhalter mit einem der folgenden Werte. Die Überschriften stellen den jeweiligen Namen des Bereichs dar, den Sie in das zuvor genannte Beispiel einsetzen können. Die untergeordneten Funktionsaufrufe werden immer in eine eigene Zeile geschrieben. Manche Funktionen werden nicht aktiv, wenn der entsprechende Bereich im
132 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Admin-Panel geschlossen ist. Öffnen Sie dann mit dem Plussymbol den entsprechenden Bereich im Admin-Panel.
preview = 1 Schaltet den Bereich Vorschau ein. Damit können Sie versteckte Seiten und deren Inhalte sichtbar schalten und ein Datum oder eine bestimmte Benutzergruppe simulieren. Mit folgenden Optionen lässt sich das Vorschauverhalten weiter anpassen: override.preview.showHiddenPages = 1 Versteckte Seiten werden standardmäßig angezeigt. So ist es beispielsweise möglich, neue Seitenbäume zu erstellen oder Navigationsstrukturen intutiv über das Frontend zu testen. Sie erhalten dadurch einen direkten Eindruck davon, wie sich die neuen Seiten in die bisherige Seitenstruktur einfügen. Beispielsweise können Sie so auch Testbenutzern Zugang zu neuen Bereichen Ihrer Seite geben, die dann vor dem Launch auf Benutzbarkeit getestet werden können.
Lizensiert für Markus Mueller
override.preview.showHiddenRecords = 1 Versteckte Inhalte werden standardmäßig angezeigt und können wie reguläre Inhalte über das Frontend bearbeitet werden. Dies ist vor allem dann sehr nützlich, wenn Sie vor der Veröffentlichung die Formatierungen der Inhalte begutachten und eventuelle Anpassungen im Seitenkontext vornehmen möchten. Beide Funktionen ermöglichen Arbeiten an der Website, ohne dass reguläre Besucher davon Notiz nehmen. Sobald Sie die Datensätze sichtbar schalten, werden die Anpassungen auf der Website für alle Besucher sichtbar. Lesen Sie in Rezept 4.5, wie Sie Inhalte standardmäßig verstecken und so mit diesen Optionen optimal verknüpfen können. override.preview.simulateDate = (zeitstempel) Ein Veröffentlichungsdatum wird fest vorgegeben. Das Format entspricht dem UnixZeitstempel. Ein gültiger Wert wäre beispielsweise 1223676000. Dies würde das Erscheinungsdatum für den 11.10.2008 simulieren. override.preview.simulateUserGroup = 1 Mit dieser Einstellung können Sie eine Benutzergruppe fest vorgeben, indem Sie als Wert eine Benutzergruppen-ID angeben, die Sie eingerichtet haben.
cache = 1 Schaltet den Bereich Cache frei. Hiermit kann der Seitencache individuell für jede Seite gelöscht werden. override.cache.noCache = 1 Mit der Option Kein Caching deaktivieren Sie das Caching der Inhalte dauerhaft.
Max. Linie
override.cache.clearCacheLevels = 1 Über das Auswahlfeld Löschebenen können Sie festlegen, ob der Seitencache auch für die aktuellen Unterseiten gelöscht werden soll. Diese Cache-Optionen sollten nur Administratoren zugänglich sein.
4.7 Inhaltseingabe über das Frontend ermöglichen | 133 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
publish = 1
Links
Schaltet den Bereich Veröffentlichen frei. Hiermit können Sie Seiten als statische HTMLDatei rendern. Die Seiten werden dann in ihrem aktuellen Zustand als HTML-Seite im Dateisystem abgelegt. Dadurch können Sie die Systemperformance erheblich erhöhen, da die mitunter sehr aufwendigen Datenbankabfragen entfallen. Jedoch sind die Seiten dann nicht mehr direkt über TYPO3 editierbar. Ändern Sie beispielsweise einen Navigationspunkt, müssen Sie sämtliche Seiten neu publizieren, die den alten Navigationspunkt beinhalten. override.publish.publish_levels = 1 Um Ihnen diese Arbeit zu erleichtern, stellt Ihnen das Admin-Panel dafür die Option Veröffentlichungsebenen zur Verfügung, mit denen Sie mehrere Seiten gleichzeitig rendern oder aktualisieren können.
edit = 1 Schaltet den Bereich Eingabe frei. Dieser ermöglicht die Bearbeitung der Inhalte über das Frontend. Zusätzlich können Sie diesen Bereich noch mit folgenden Optionen anpassen:
Lizensiert für Markus Mueller
override.edit.displayFieldIcons = 1 Die Bearbeitungssymbole werden für jedes Feld des Datensatzes angezeigt. Beispielsweise erhalten bei einem Datensatz Text das Feld Überschrift und das Feld Fließtext jeweils ein Icon, mit dem das jeweilige Bearbeitungsfenster geöffnet werden kann. override.edit.displayIcons = 1 Eine umfangreiche Bearbeitungsleiste wird angezeigt. Damit stehen Ihnen vielfältige Bearbeitungsfunktionen zur Verfügung. Beispielsweise können Sie Datensätze über die Webseite bearbeiten, ausblenden oder innerhalb der aktuellen Seite bzw. im gesamten Seitenbaum verschieben. override.edit.editFormsOnPage = 1 Wenn Sie zusätzlich die Option Eingabeformular auf Webseite aktivieren, erscheint die Eingabemaske für den gesamten Datensatz direkt auf der Webseite, wenn Sie die Datensätze über die Bearbeitungsleiste öffnen. override.edit.editNoPopup = 1 Das Bearbeitungsformular für den gesamten Datensatz erscheint direkt in der Seite, wenn Sie die Felder über die Bearbeitungs-Icons öffnen. Zusätzlich enthält der Bereich Eingabe einen Link zum TYPO3-Backend. Wenn Sie auf den Link TYPO3 Backend öffnen klicken, öffnet sich ein neues Browserfenster, in dem das Backend geladen wird.
Max. Linie
Max. Linie 134 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts Frontend-Editing vor TYPO3-Version 4.0 In TYPO3-Versionen vor 4.0 stehen Ihnen die zuvor gezeigten Optionen für den Bereich Eingabe noch nicht zur Verfügung. Verwenden Sie dann folgende Angaben, um das Frontend-Editing zu beeinflussen: module.edit.forceDisplayIcons = 1 Eine umfangreiche Bearbeitungsleiste wird angezeigt. Damit stehen Ihnen vielfältige Bearbeitungsfunktionen zur Verfügung. Beispielsweise können Sie Datensätze über die Webseite bearbeiten, ausblenden oder innerhalb der aktuellen Seite bzw. im gesamten Seitenbaum verschieben. module.edit.forceDisplayFieldIcons = 1 Die Bearbeitungssymbole werden für jedes Feld des Datensatzes angezeigt. Beispielsweise erhalten bei einem Datensatz Text das Feld Überschrift und das Feld Fließtext jeweils ein Icon, mit dem das jeweilige Bearbeitungsfenster geöffnet werden kann. module.edit.forceNoPopup = 1 Das Bearbeitungsformular für den gesamten Datensatz erscheint direkt in der Seite, wenn Sie die Felder über die Bearbeitungs-Icons öffnen. Das Beispiel aus der anfangs genannten Lösung würde mit diesen Befehlen folgendermaßen lauten: Lizensiert für Markus Mueller
admPanel { enable.edit = 1 module.edit.forceDisplayFieldIcons = 1 hide = 1 }
tsdebug = 1 Schaltet den Bereich TypoScript frei. Hier können Sie Werte in der TypoScript-Engine nachverfolgen und sehen, wie Ihre Seite von TYPO3 verarbeitet wird. Dieser Bereich dient ausschließlich zum Entwickeln und sollte nur Administratoren zugänglich sein. In Rezept 8.4 erfahren Sie mehr über die Debug-Funktionen von TYPO3 und wie diese Ihnen beim Entwickeln von TYPO3-Seiten helfen können. override.tsdebug.tsdebug_tree = 1 Aktiviert die Baumdarstellung der TypoScript-Parameter. override.tsdebug.displayTimes = 1 Die Rendering-Zeiten werden in weiteren Spalten angezeigt. override.tsdebug.displayMessages = 1 Zeigt Nachrichten vom TypoScript-Parser an.
Max. Linie
override.tsdebug.LR = 1 Verfolgt das Rendering der Inhalte.
4.7 Inhaltseingabe über das Frontend ermöglichen | 135 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
override.tsdebug.displayContent = 1 Zeigt die generierten Inhalte.
Links
override.tsdebug.displayQueries = 1 Erklärt die SELECT-Anweisung der Datenbankabfragen.
info = 1 Schaltet den Bereich Info frei. Dieser zeigt zahlreiche Parameter der aktuellen Seite, wie etwa die Seiten-ID, den Seitentyp und die IDs der Benutzergruppen, die Zugriff auf diese Seite haben. Außerdem wird sichtbar, ob der Seitencache aktiviert ist und welche ID der aktuelle Besucher der Seite hat. Wenn Sie im Bereich Cache die Option Kein Caching aktiviert haben, zeigt Ihnen TYPO3 auch eine Liste der verwendeten Grafiken inklusive Dateigröße sowie die Gesamtgröße der endgültigen Webseite an. Abschließend erfahren Sie über Total parsetime, wie lange TYPO3 für die Erstellung der Seite gebraucht hat. Der Bereich Info liefert Ihnen detaillierte Seiteninformationen und Hinweise zur Performance der Website, die vor allem für administrative Aufgaben äußerst nützlich sind.
Beispiel Lizensiert für Markus Mueller
Hier sehen Sie die vollständigen Einstellungsmöglichkeiten des Admin-Panels mit möglichen Beispielwerten: admPanel { hide = 0 enable.all = 0 enable.preview = 1 override.preview.showHiddenRecords = 0 override.preview.showHiddenPages = 0 override.preview.simulateDate = 0 override.preview.simulateUserGroup = 0 enable.cache = 0 override.cache.noCache = 0 override.cache.clearCacheLevels = 2 enable.publish = 0 override.publish.publish_levels = 0 enable.edit = 1 override.edit.displayFieldIcons = 0 override.edit.displayIcons = 0 override.edit.editNoPopup = 0 override.edit.editFormsOnPage = 0
Max. Linie
enable.tsdebug = 0 override.tsdebug.tsdebug_tree = 0 override.tsdebug.displayTimes = 0 override.tsdebug.displayMessages = 0
136 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
override.tsdebug.LR = 0 override.tsdebug.displayContent = 0 override.tsdebug.displayQueries = 0 override.tsdebug.forceTemplateParsing = 0 enable.info = 0 }
Die Bereiche Vorschau und Bearbeiten sind hierbei aktiviert. Versteckte Datensätze und Seiten werden angezeigt. Das Bearbeiten von Seiteninhalten ist dadurch über das Frontend möglich, das Admin-Panel wird jedoch auf der Webseite ausgeblendet, sodass nur die jeweiligen Bearbeitungssymbole sichtbar sind. Alle übrigen Bereiche sind ausgeblendet.
Siehe auch Das Rezept 9.5 beschäftigt sich damit, wie Sie die Frontend-Editing-Optionen weiter ausbauen und auf Ihre Bedürfnisse abstimmen können. In Rezept 4.2 erfahren Sie, wie Sie Inhalte über das Backend schnell eingeben.
4.8
Den interaktiven Texteditor RTE konfigurieren
Lizensiert für Markus Mueller
Problem Sie möchten die interaktive Texteingabemaske, den sogenannten Rich Text Editor (RTE), auf Ihre Bedürfnisse anpassen.
Lösung Zur Anpassung des Texteditors stehen Ihnen für die am häufigsten auftretenden Bedürfnisse bereits entsprechende Optionen bei der Installation der Extension zur Verfügung. Seit der TYPO3-Version 4.0 wird rtehtmlarea in TYPO3 als Standard-WYSIWYG-Editor verwendet. Die Integration dieses RTE ist sehr weit fortgeschritten, es gibt jedoch noch verschiedene andere RTEs zum Gebrauch mit TYPO3. Dieses Rezept ist auf die mit der TYPO3-Version 4.0 gelieferte System-Extension rtehtmlarea ausgerichtet. Die Diskussion liefert aber auch einige nützliche Hinweise, die in Verbindung mit anderen RTE-Extensions ebenfalls gültig sind.
Auswahloptionen in der Installationsmaske
Max. Linie
Die Konfigurationsmaske der Extension rtehtmlarea wird direkt bei der Installation aufgerufen. Sie können sie aber zu jedem späteren Zeitpunkt erneut verwenden, indem Sie im Erweiterungs-Manager die Funktion Loaded extensions aufrufen und auf den entsprechenden Extension-Titel klicken.
4.8 Den interaktiven Texteditor RTE konfigurieren | 137 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Die ersten Optionen in der Konfiguration sind nur für die optionale Rechtschreibprüfung relevant, darauf werden wir noch in der Diskussion eingehen. Dies sind die zunächst zentral wichtigsten Einstellungen bei der Installation:
Links
List of htmlArea RTE plugins Innerhalb von htmlArea gibt es mehrere optionale Features, die auch als plugins bezeichnet werden. In der Konfiguration legen Sie unter List of htmlArea RTE plugins zunächst fest, welche der Plugins generell aktiviert werden können. Eine Übersicht über die Plugins und ihre Bedeutung finden Sie in der Diskussion. Default configuration settings Da htmlArea eine Unzahl von Optionen und Konfigurationsmöglichkeiten bereitstellt, deren Beherrschung nicht ganz trivial ist, bietet die Extension drei verschiedene Grundkonfigurationen an. Dadurch ist eine sinnvolle Grundkonfiguration auch für unbedarfte Anwender leicht möglich. Für diese Grundkonfiguration stehen Ihnen die folgenden Auswahloptionen zur Verfügung. • Minimal
Lizensiert für Markus Mueller
Diese Option stellt im RTE nur sehr rudimentäre Möglichkeiten zur Verfügung. Der RTE stellt dann als einzige Formatierungsoptionen Buttons zur fetten und kursiven Auszeichnung zur Verfügung. Weitere Optionen müssen entsprechend manuell hinzugefügt werden. • Typical Durch die Auswahl dieser Option werden im RTE die wichtigsten und am häufigsten verwendeten Optionen und Features zur Verfügung gestellt. Diese Einstellung wird insbesondere für unerfahrene Administratoren unbedingt empfohlen, da sie gleichzeitig noch versucht zu verhindern, dass die Datenbank unnötig mit einem unübersichtlichen Ballast von HTML-Auszeichnungen überschwemmt wird. Doch dazu später mehr. • Demo Mit der Einstellung Demo werden alle verfügbaren Optionen und Features freigeschaltet. Dabei wird das erzeugte (oder per Copy-and-Paste übernommene) HTML auch beim Speichern nur in sehr geringem Umfang geprüft. Diese Option sollte nur gewählt werden, um den Funktionsumfang des RTE zu testen. Enable images in the RTE Eine heiß diskutierte Frage ist, ob es über den RTE möglich sein soll, Bilder innerhalb des Textfelds zu verwenden. Eigentlich sieht TYPO3 für die Verwendung von Bildern die beiden Inhaltselemente Bild und Text m/Bild vor. Da deren Layoutoptionen für manche Anwendungsfälle nicht ausreichend sind, ist es möglich, auch in einem Textfeld Bilder einzubinden. Durch Aktivierung dieser Option können Sie die Standardkonfiguration Typical so gegebenenfalls einfach erweitern, um den Redakteuren
Max. Linie
Max. Linie 138 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
entsprechende Buttons zur Verwendung von Bildern im Fließtext zur Verfügung zu stellen. Enable Mozilla/Firefox extension Eine häufige Nutzung im RTE ist auch das berühmte Copy-and-Paste aus Office-Programmen oder anderen Webseiten. Standardmäßig verhindert das Sicherheitskonzept der Mozilla- bzw.- Firefox-Browser teilweise die Benutzung von Copy-and-Paste. Statt umständlich in den Konfigurationsprofilen von Mozilla/Firefox manuell Änderungen vornehmen zu müssen, kann htmlArea in einem solchen Fall anbieten, eine entsprechende Erweiterung für den Browser zu installieren. Wenn Sie sich das Anpassen der Profildateien von Mozilla/Firefox ersparen wollen, sollten Sie die Option aktivieren. Die Installation der Extension muss allerdings auch dann im Bedarfsfall noch explizit vom Anwender erlaubt werden. Durch einen Klick auf den Button Update speichern Sie diese Extension-Konfiguration ab. Wenn Sie bei Default Configuration settings den Eintrag Typical gewählt haben, verfügen Sie damit bereits über eine sehr sinnvolle und in sich stimmige Grundkonfiguration, die sich an den häufigsten Anforderungen und etablierten TYPO3-Standards orientiert. Wenn Sie den RTE detailliert an Ihre Bedürfnisse anpassen wollen, helfen Ihnen die Ausführungen in der Diskussion.
Lizensiert für Markus Mueller
Diskussion Die Konfiguration des RTE erfolgt grundsätzlich über Page- und/oder User-TSconfig. Abhängig von den im Erweiterungs-Manager gewählten Einstellungen, werden dazu entsprechende unterschiedliche Standardwerte für Page- bzw. User-TSconfig eingebunden. Eine individuelle Detailanpassung ist darauf aufbauend durch zusätzliche Einträge in die Felder für Page- bzw. User-TSconfig möglich. Das eingebundene Page-TSconfig können Sie über die Funktion Seiten TSconfig im Modul Web/Info komfortabel einsehen oder bearbeiten. Die Unterfunktion Inhalt des TSconfig-Felds anzeigen zeigt Ihnen dabei unter der Überschrift Standard-Konfiguration aus TYPO3_CONF_VARS das eingebunden Page-TSconfig mit zusätzlichen Kommentaren versehen an, über die Bleistifte am unteren Ende der Ausgabe können Sie bequem eigene Page-TSconfig-Einträge bearbeiten. Über die Unterfunktion RTE. erhalten Sie eine Baumansicht der entsprechenden RTE-Einstellungen. Das User-TSconfig lässt sich am komfortabelsten im Modul Admin-Werkzeuge/ Verwaltung bei aktivierten Kontrollkästchen TSconfig bzw. TSconfig HL einsehen und bearbeiten.
Die RTE-Konfiguration mit Page-TSconfig TYPO3 bietet im Kern eine API, um die Einbindung verschiedener RTEs zu unterstützen.
Max. Linie
Max. Linie 4.8 Den interaktiven Texteditor RTE konfigurieren | 139 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Links Zur Konfiguration des Rich Text Editors reserviert TYPO3 im Kern den PageTSconfig-Schlüssel RTE. Unterhalb des Schlüssels RTE. legt die Eigenschaft RTE.default das Standardverhalten des RTE fest. Allerdings kann diese Konfiguration über RTE.config.[tabelle].[feld] für einzelne Felder überschrieben werden. Beachten Sie, dass Letzteres insbesondere im Zusammenspiel mit der Nutzung des RTE für Felder aus Extensions teilweise notwendig ist. Zur Prüfung des Page-TSconfig sollten Sie, wie bereits weiter oben angesprochen, die Funktion Seiten TSconfig im Modul Web/Info verwenden.
Das folgende Codebeispiel zeigt das Prinzip der Page-TSconfig-Hierarchie für die RTEKonfiguration, [tabelle] und [feld] sind dabei jeweils Platzhalter für konkrete Tabellenund Feldbezeichnungen:
Lizensiert für Markus Mueller
RTE { default { # RTE-spezifische Config # ... proc { # individuelle Transformationskonfiguration # RTE-unabhängiges TYPO3-Kernfeature } } config { [tabelle] { [feld] { # RTE-spezifische Config # ... proc { # individuelle Transformationskonfiguration # RTE-unabhängiges TYPO3-Kernfeature } } } } # RTE-spezifische Optionen # ... }
Der Schlüssel proc hat eine Sonderstellung, da der TYPO3-Kern hier die Optionen für die Konvertierung (die sogenannte Transformation) des Inhalts zwischen Datenbank und RTE ausliest. Darauf wird detailliert im Abschnitt »Das Parsen des vom Rich Text Editor erzeugten Inhalts beeinflussen« weiter unten eingegangen.
Max. Linie
Individualisierung der Symbolleiste und Auswahloptionen des Rich Text Editors htmlArea Mit dem folgenden Codebeispiel für Page-TSconfig entfernen Sie die beiden Symbole zur Auszeichnung als hoch- bzw. tiefgestellter Text. Dabei nutzen wir ein neues Feature der Version 4.0 von TYPO3, um Werte aus einer Liste zu entfernen, statt den modifizierten
140 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Wert zuzuweisen. Bitte lesen Sie dazu auch das Rezept 8.11, in dem dieses Prinzip detailliert erläutert wird. Die Eigenschaft showButtons legt allgemein die zur Verfügung stehenden Buttons fest. RTE { default { showButtons:=removeFromList(subscript,superscript) # Alternativ, falls Sie mit der als advanced bezeichneten # eingeschränkten Grundkonfiguration arbeiten # Achtung: eine lange Zeile # # # #
showButtons:=addToList(blockstylelabel, blockstyle, textstylelabel, textstyle, bold, italic, underline, formatblock, orderedlist, unorderedlist, copy, cut, paste, undo, redo )
} }
Sie können auch die Eigenschaft hideButtons verwenden, um bestimmte Symbole aus der Anzeige zu entfernen. Beachten Sie, dass bei Konflikten die Einstellungen in hideButtons Vorrang vor denen in showButtons haben.
Lizensiert für Markus Mueller
Wenn Sie die angezeigten Buttons für bestimmte Benutzer abweichend festlegen möchten, können Sie die Eigenschaft options.RTEkeyList im User-TSconfig nutzen. options { RTEkeyList ( bold, italic, underline, formatblock, orderedlist, unorderedlist, copy, cut, paste, undo, redo ) }
Beachten Sie, dass diese Eigenschaft per Default mit dem Wert »*« festgelegt wird. Es werden für die einzelnen Redakteure also alle mit showButtons festgelegten Buttons angezeigt. Sie müssen in options.RTEkeyList gegebenenfalls explizit eine entsprechende Liste der anzuzeigenden Buttons zuweisen.
htmlArea stellt Ihnen über die mit formatblock bezeichnete Option ein Auswahlfeld zur HTML-Auszeichnung eines Absatzes zur Verfügung. Standardmäßig können Sie über das Auswahlfeld die Blockauszeichnungen Normal (Absatz), Überschrift x, Vorformatiert und Adresse zuweisen. Über die Eigenschaft hidePStyleItems können Sie diese Liste reduzieren. Das folgende Beispiel für Page-TSconfig verdeutlicht dies:
Max. Linie
RTE { default { hidePStyleItems = h1,h2,h4,h5,h6 } }
4.8 Den interaktiven Texteditor RTE konfigurieren | 141 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Sie können in dem Auswahlfeld nun zwischen Normal (Absatz), Überschrift 3, Vorformatiert und Adresse wählen. Diese Einstellung ist nur wirksam, wenn der Button formatblock in showButtons respektive RTEkeyList freigeschaltet ist.
Links
Beachten Sie, dass die Auszeichnung im Standard-Template css_ styled_content bei der Ausgabe mit dem TypoScript-Setup nicht zu den erlaubten Tags gehört. Mit folgendem TypoScript-Setup können Sie dies ändern, in Rezept 10.5 finden Sie eine Beschreibung zu diesen beiden TypoScript-Objektpfaden: lib.parseFunc.allowTags:=addToList(address) lib.parseFunc_RTE.allowTags:=addToList(address)
Die beiden Plugins DynamicCSS und InlineCSS in htmlArea stellen Ihnen über die Optionen blockstyle und textstyle darüber hinaus in einem Auswahlfeld Möglichkeiten zur Verfügung, einem Absatz oder Textbereich CSS-Klassen zuzuweisen. Die einfachste Möglichkeit, um die Optionen in diesen Auswahlfeldern anzupassen, ist, über contentCSS ein eigenes Stylesheet zuzuweisen. Standardmäßig wird die Datei EXT:rtehtmlarea/htmlarea/ plugins/DynamicCSS/dynamiccss.css verwendet, mit folgendem Page-TSconfig können Sie eine alternative, selbst erstellte Datei verwenden: Lizensiert für Markus Mueller
Max. Linie
RTE { default { contentCSS = fileadmin/styles/rte.css # showTagFreeClasses = 1 } }
Hier ein Beispiel für eine solche via contentCSS in htmlArea eingebundene Stylesheet-Datei: p.layout-1 { border: 1px solid red; } h3.layout-3 { margin: 20px; } span.important { font-weight: bold; }
Die CSS-Selektoren in einem solchen Stylesheet werden dynamisch ausgewertet und in htmlArea kontextabhängig in den beiden Auswahlfeldern Absatz: und Text: zur Verfügung gestellt. Es werden nur jeweils die CSS-Klassen zur Auswahl angeboten, die im Stylesheet für den Kontext definiert sind, in dem sich der Mauszeiger gerade befindet. Die CSS-Klasse layout-1 steht somit über den CSS-Selektor p.layout-1 {} nur innerhalb eines regulären Absatzes
zur Verfügung und eine CSS-Klasse layout-3 über den CSS-Selektor h3.layout-3 {} nur innerhalb einer Überschrift . Um einen Textbereich mit einer CSS-Klasse auszeichnen zu können, muss zunächst ein Textbereich markiert werden, anschließend stehen alle CSS-Klassen zur Auswahl, die im eingebundenen Stylesheet mit
142 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
dem <span>-Tag verbunden sind, z.B. span.important {}. Sie können diese CSS-Datei ganz nach eigenen Bedürfnissen gestalten, die entsprechenden Styles werden bei Auswahl eines Eintrags auch automatisch innerhalb des htmlArea-Bearbeitungsfelds angewendet. Wenn Sie auch reine, klassenbasierte CSS-Selektoren ohne Tags wie beispielsweise .layout-1 {} verwenden wollen, können Sie die Eigenschaft showTagFreeClasses = 1 aktivieren. Eine mögliche Stolperfalle ist dabei, dass es zusätzlich Page-TSconfig-Optionen (default. classes*) gibt, mit denen bestimmte CSS-Klassen an bestimmte Tags gebunden werden können und diese in der Typical und Demo-Konfiguration auch verwendet werden. Im Folgenden sehen Sie ein Beispiel für ein modifiziertes Setup für dynamische CSS-Auszeichnungen. Das Page-TSconfig ist dabei zur Benutzung mit dem Typical-Setup optimiert:
Lizensiert für Markus Mueller
Max. Linie
# Optionales Anlegen von Klassen # zur Bezeichnung und Auszeichnung in den # Dynamic- und Inline-CSS-Selekt-Feldern RTE { classes { layout-1 { name = rechtsbündig/Rahmen value = text-align: right; border: 1px solid red; } layout-2 { name = Aussenabstand value = margin: 3px; } important { name = wichtig value = font-weight: bold; } } # Optionales Anlegen von Klassen # zur Benutzung im Link-Dialog classesAnchor { externalLink { class = external-link type = url titleText = externer Link altText = Link öffnen image > # image = fileadmin/images/external_link.png } internalLink { class = internal-link type = page titleText = interner Link altText = Link öffnen image > # image = fileadmin/images/external_link.png } }
4.8 Den interaktiven Texteditor RTE konfigurieren | 143 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
default { #Einbinden der CSS-Datei contentCSS = fileadmin/styles/rte.css
Links
Lizensiert für Markus Mueller
# Zuweisen von bestimmten CSS-Klassen an bestimmte Tags. # Wenn hier Werte vorhanden sind, werden nicht automatisch # alle kontextabhängigen Selektoren aus der CSS-Datei verwendet, # sondern nur die jeweils hier angegebenen. classesParagraph > classesCharacter > classesImage > classesTable > classesTD > classesTD > classesAnchor = external-link, internal-link classesAnchor { default { page = internal-link url = external-link #file = class #mail = class } } # für Erklärung zu .proc, siehe Abschnitt: # 'Das Parsen des vom Rich Text Editor erzeugten Inhalts beeinflussen' proc { # Liste von erlaubten CSS-Klassen allowedClasses = layout-1, layout-2, important } } }
Über die Hauptschlüssel classes und classesAnchor werden Klassen zur Benutzung angelegt. Der Vorteil ist dabei, dass dadurch im Auswahlfeld über die Eigenschaft name ein vom CSS-Klassennamen abweichendes Label verwendet werden kann, das auch sprachabhängig sein kann. Im Fall von classesAnchor können außerdem einige besondere Möglichkeiten im Link-Dialog genutzt werden wie das zusätzliche Einfügen eines und Klassen abhängig von der Art des Links. Der Nachteil ist, dass man die Config wieder an zwei Stellen (in der eingebundenden CSS-Datei und im Page-TSconfig) pflegen muss. Die angelegten CSS-Klassen können über die default.classes*-Optionen an bestimmte Tags gebunden werden. Sollte eine solche Bindung vorhanden sein, werden nur diese Klassen angezeigt. Daher ist es einfacher, die entsprechenden default.classes*-Config gegebenenfalls zu löschen, dann werden nämlich automatisch alle passenden Selektoren aus der CSS-Datei verwendet.
Max. Linie
Max. Linie 144 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts Beachten Sie, dass es einige weitere Optionen und Möglichkeiten zur Konfiguration bzw. Einbindung von CSS-Auszeichnungen gibt, die teilweise nur aus historischen Gründen bzw. zur Kompatibilität mit dem in früheren Versionen verwendeten RTE vorhanden sind. Außerdem müssen Sie beachten, dass die Inhalte beim Speichern noch mal geparst werden, dabei werden möglicherweise bestimmte Tags oder CSS-Klassen ausgefiltert, die nicht in der Konfiguration erlaubt sind. Vgl. dazu die Ausführungen im folgenden Abschnitt. Außerdem müssen Sie beachten, dass diese CSS-Datei nicht automatisch im Frontend eingebunden wird. Bei Änderungen an der Datei müssen Sie gegebenenfalls Ihren Browser-Cache (!) leeren, um die Änderungen wirksam werden zu lassen.
Lizensiert für Markus Mueller
Das Parsen des vom Rich Text Editor erzeugten Inhalts beeinflussen Von sehr zentraler Bedeutung ist ein Verständnis für die Handhabung der Inhalte durch TYPO3, wenn diese mit einem RTE bearbeitet werden. Der Rich Text Editor ist prinzipiell ein vollwertiger HTML-Editor, mit dem der gesamte Umfang an HTML-Auszeichnungen genutzt werden kann. Insbesondere im Zusammenhang mit Copy-and-Paste aus anderen Anwendungen entsteht dabei sehr oft ein qualitativ minderwertiges (verschmutztes) HTML. Eine Kernaufgabe eines CMS wie TYPO3 ist es, dafür Sorge zu tragen, dass die Inhalte in einem sauberen und konsistenten Format gespeichert werden, damit diese langfristig nutzbar bleiben. Hierbei spielen auch weitere Tatsachen, wie beispielsweise die korrekte Verlinkung der einzelnen Inhalte miteinander und der historische Hintergrund, dass die gespeicherten Inhalte möglichst einfach von Menschen lesbar sein sollten, eine Rolle. Aus diesem Grund werden die Inhalte bei der Bearbeitung mit dem RTE sowohl vor der Bearbeitung mit dem RTE als auch vor der Speicherung in der Datenbank in jeweils optimierte Formate konvertiert (geparst). Bei Bedarf können Sie auf diesen Prozess Einfluss nehmen, um beispielsweise zu vermeiden, dass bestimmte Auszeichnungen oder Attribute ausgefiltert werden, oder aber um die bereits erlaubten weiter einzuschränken. Für all diese Optionen stehen Ihnen im Page-TSconfig mehrere verschiedene Optionen im Schlüssel proc zur Verfügung. Dabei müssen Sie auch darauf achten, dass die dem Redakteur zur Verfügung gestellten Optionen sinnvoll dazu passen. Es macht beispielsweise wenig Sinn, das -Tag innerhalb des Textfelds nicht zur Speicherung zuzulassen, aber dem Redakteur das Bildauswahlsymbol anzubieten. Die Optionen zum Parsen, die unterhalb des Schlüssels proc festgelegt werden, sind ein Kern-Feature und prinzipiell unabhängig vom jeweils genutzten RTE.
Max. Linie
RTE { default { proc { # den Transformationsmodus überschreiben overruleMode = ts_css # Liste von erlaubten HTML-Tags # eingeschränktes Beispiel!
4.8 Den interaktiven Texteditor RTE konfigurieren | 145 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Lizensiert für Markus Mueller
allowTags = p, h3, adress, blockquote, ul, ol, li # Liste von erlaubten CSS-Klassen # eingeschränktes Beispiel! allowedClasses = layout-1, layout-2, layout-3, important # weitere Optionen ... # insbesondere mehrere zusätzliche HTMLparser exitHTMLparser_rte = 1 exitHTMLparser_rte { # ... } exitHTMLparser_db = 1 exitHTMLparser_db { # ... } entryHTMLparser_rte = 1 entryHTMLparser_rte { # ... } entryHTMLparser_db = 1 entryHTMLparser_db { # ... } } } }
Links
Wenn Inhalte mit einem RTE bearbeitet werden, werden diese jeweils beim Bearbeiten und Speichern durch eine sogenannte Transformation verarbeitet. Dabei wird beispielsweise aus einem ein , aus einem
ein Zeilenumbruch usw. Diese Transformation wird zunächst über den Hauptschlüssel proc gesteuert. Über einen sogenannten Modus werden dabei gleich eine ganze Reihe von Optionen gesteuert. Dieser Modus wird bereits im $TCA vorgegeben und lässt sich über die Eigenschaft overruleMode übersteuern. Wenn Sie nicht genau wissen, was diese Einstellung bewirkt, sollten Sie sicherstellen, dass der Transformationsmodus css_transform in $TCA bzw. overruleMode verwendet wird.
Über proc.allowedTags legen Sie eine Liste von HTML-Tags fest, die in einem Feld zur Verwendung zugelassen sind. Über proc.allowedClasses legen Sie eine Liste von CSSKlassen fest, die in einem Feld zur Verwendung zugelassen sind. Neben einigen weiteren Optionen zum Feintuning dieser Transformation können Sie den Inhalt jeweils noch mal durch eine von vier verschiedenen, individuell konfigurierten HTMLparser-Konfigurationen verarbeiten lassen. Abbildung 4-5 veranschaulicht diese Abläufe noch einmal.
Max. Linie
entryHTMLparser_db Dieser HTMLparser wird optional zusätzlich auf dem Weg vom RTE in die Datenbank (Speichern) vor der Standardtransformation aufgerufen.
146 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Abbildung 4-5: Die vier optionalen, RTE-unabhängigen HTMLparser-Konfigurationen Lizensiert für Markus Mueller
exitHTMLparser_db Dieser HTMLparser wird optional zusätzlich auf dem Weg vom RTE in die Datenbank (Speichern) nach der Standardtransformation aufgerufen. entryHTMLparser_rte Dieser HTMLparser wird optional zusätzlich auf dem Weg von der Datenbank zum RTE (Bearbeiten) vor der Standardtransformation aufgerufen. exitHTMLparser_rte Dieser HTMLparser wird optional zusätzlich auf dem Weg von der Datenbank zum RTE (Bearbeiten) nach der Standardtransformation aufgerufen. Ein sehr nützliches zusätzliches Feature von htmlArea ist die Option RTE. default.enableWordClean = 1. Mit dieser Einstellung wird Inhalt beim Copyand-Paste direkt von unnötigem Ballast aus Fremdanwendungen befreit. Auch hierbei handelt es sich um ein HTMLparser-Objekt, das auf Wunsch entsprechend detailliert konfiguriert werden kann.
Max. Linie
Das Frontend-Rendering Sie dürfen nicht vergessen, dass die Ausgabe der Inhalte im Frontend durch Ihr TypoScript-Setup gesteuert wird. Auch hierbei werden die Daten aus der Datenbank zum Teil nochmals aufbereitet. So verwendet TYPO3 typischerweise datenbankseitig die Auszeichnung zur Auszeichnung von Links, die im Frontend (der Website) in ein entsprechendes HTML-konformes -Tag umgewandelt wird (siehe dazu auch die Rezepte 9.6, 9.7, 10.5 und 10.7). Teilweise liegt die Lösung eines vermeintlichen RTE-Problems auch in der Anpassung des TypoScript-Setups.
4.8 Den interaktiven Texteditor RTE konfigurieren | 147 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Liste der htmlArea-RTE-Plugins
Links
Zur Übersicht hier noch mal eine Liste der in htmlArea zur Verfügung stehenden Plugins und deren Einsatzgebiet. TableOperations Über das TableOperations-Plugin erhalten Sie eine Symbolleiste bzw. ein Kontextmenü innerhalb von Tabellen, mit denen das Bearbeiten von Tabellen innerhalb eines Fließtextfelds sehr komfortabel möglich ist. Hier die Liste der damit in Zusammenhang stehenden Optionen für showButtons: table, toggleborders, tableproperties, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, columninsertbefore, columninsertafter, columndelete, columnsplit, cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge. Achtung, einige zusätzliche Optionen in den jeweiligen Dialogen werden möglicherweise über eine der folgenden Eigenschaften deaktiviert: disableAlignmentFieldsetInTableOperations, disableSpacingFieldsetInTableOperations, disableColorFieldsetInTableOperations, disableLayoutFieldsetInTableOperations, disableBordersFieldsetInTableOperations.
Lizensiert für Markus Mueller
SpellChecker Hiermit können Sie eine Rechtschreibprüfung für die Inhalte durchführen. Hier die damit in Zusammenhang stehende Option für showButtons: spellcheck. ContextMenu Stellt bei einem rechten Mausklick innerhalb des Texts ein Kontextmenü zur Verfügung. SelectColor Stellt ein Pop-up zur Auswahl einer Farbe aus einer Farbpalette in den entsprechenden Dialogen bereit. Hier die Liste der damit in Zusammenhang stehenden Optionen für showButtons: textcolor, bgcolor. TYPO3Browsers Dieses Plugin bindet im Dateiauswahl- und im Link-Dialogfeld die TYPO3-spezifischen Elementbrowser ein. Hier die Liste der damit in Zusammenhang stehenden Optionen für showButtons: link, image. InsertSmiley Stellt ein Symbol zum Einfügen eines Smileys bereit. Hier die damit in Zusammenhang stehende Option für showButtons: emoticon. FindReplace Ein einfaches Suchen/Ersetzen-Werkzeug für den RTE. Hier die damit in Zusammenhang stehende Option für showButtons: findreplace.
Max. Linie
RemoveFormat Über dieses Plugin können die Formatierungen im Text manuell gesäubert werden. Hier die damit in Zusammenhang stehende Option für showButtons: removeformat.
148 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
CharacterMap Von diesem Plugin wird ein Symbol zum Einfügen von Sonderzeichen zur Verfügung gestellt. Hier die damit in Zusammenhang stehende Option für showButtons: insertcharacter. QuickTag Mit dem QuickTag-Plugin ist es möglich einen Text zu markieren und anschließend eine HTML-Auszeichnung auf diese Markierung aus einer Auswahlliste anzuwenden. Hier die damit in Zusammenhang stehende Option für showButtons: inserttag. DynamicCSS Das DynamicCSS-Plugin stellt die in der Lösung detailliert beschriebene Möglichkeit zur Auszeichnung mit CSS-Klassen für Absatz-(Block-)Auszeichnungen zur Verfügung. Hier die Liste der damit in Zusammenhang stehenden Optionen für showButtons: blockstylelabel, blockstyle. InlineCSS Das InlineCSS-Plugin stellt die in der Lösung detailliert beschriebene Möglichkeit zur Auszeichnung mit CSS-Klassen für Textbereiche zur Verfügung. Hier die Liste der damit in Zusammenhang stehenden Optionen für showButtons: textstylelabel, textstyle.
Lizensiert für Markus Mueller
UserElements Dieses Plugin ermöglicht es, über das entsprechende Symbol einen Dialog zum Einfügen von benutzerdefinierten Elementen aufzurufen. Nützlich für häufig verwendete Textbausteine oder individuelle Tags. Hier die damit in Zusammenhang stehende Option für showButtons: user. Acronym Dieses Plugin hilft Ihnen bei der Auszeichnung von Akronymen. Hier die damit in Zusammenhang stehende Option für showButtons: acronym.
Rechtschreibprüfung Ab Version 0.7.6 unterstützt der Editor auch eine integrierte Rechtschreibprüfung. Wenn Sie diese nutzen möchten, benötigen Sie die sogenannten Aspell-Bibliotheken auf dem Server. Außerdem muss die Extension sr_static_info installiert sein, und PHP darf nicht im sogenannten safe_mode laufen. Wenn diese Voraussetzungen erfüllt sind, das Plugin aktiviert und spellcheck in showButtons bzw. RTEkeyList gesetzt ist, können Sie die Texte einer Rechtschreibprüfung unterziehen. Dabei ist es zunächst nicht möglich, unbekannte Wörter in den Wortschatz aufzunehmen. Mit den zwei folgenden TSconfig-Angaben aktivieren Sie Wörterbücher, in die Sie dann auch eigene Einträge aufnehmen können. Schalten Sie dazu zuerst diese Funktion per Seiten-TSconfig frei: RTE.default.enablePersonalDicts = 1
Max. Linie
Max. Linie 4.8 Den interaktiven Texteditor RTE konfigurieren | 149 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Dann können Sie per Benutzer-TSconfig den Zugriff auf die Wörterbücher pro Benutzer oder Benutzergruppe freischalten:
Links
options.enablePersonalDicts = 1
Siehe auch Der Editor wird ständig weiterentwickelt und verfügt noch über einige weitere Optionen. Sie sollten daher auch die vollständige Dokumentation von htmlArea zu Rate ziehen, die Sie unter http://typo3.org/documentation/document-library/extension-manuals/rtehtmlarea/ current/ finden. Für alle Belange rund um die verschiedenen RTEs steht eine eigene Mailingliste/Newsgroup typo3.projects.rte zur Verfügung. Wie Sie darauf zugreifen können, wird in Rezept 20.6 beschrieben. Schauen Sie auch in den Abschnitt »RTE API« des Dokuments TYPO3 Core APIs unter http://typo3.org/documentation/document-library/core-documentation/doc_core_api/current/. Informationen rund um das GNU-Projekt Aspell, eine Open Source-Rechtschreibprüfung, finden Sie unter http://aspell.sourceforge.net/. In Rezept 15.2 erfahren Sie, wie Sie die Grundeigenschaften der Extension über den Erweiterungs-Manager anpassen. Rezept 17.14 zeigt Ihnen, wie Sie Ihre eigenen Extensions mit solchen Optionen ausrüsten. Lizensiert für Markus Mueller
4.9
Mehrsprachige Inhalte mit TYPO3 einpflegen
Problem Sie möchten mehrsprachige Inhalte auf Ihrer Website ausgeben und entsprechend im Backend einpflegen und bearbeiten oder den bestehenden Inhalt nach und nach übersetzen.
Lösung Aktivieren Sie die gewünschten Sprachen, in denen Sie Ihre Inhalte verwalten möchten, im TYPO3-Backend und legen Sie anschließend mit dem Datensatz Alternative Seiten Sprache Übersetzungen Ihrer vorhandenen Seiten an. Danach können Sie den Inhalt dieser Seiten in die jeweilige Sprache übersetzen.
Max. Linie
Um zusätzliche Sprachen zu aktivieren, wechseln Sie in das Modul Liste und wählen die Wurzelseite mit der ID 0 (dazu benötigen Sie administrative Rechte). Legen Sie dort einen neuen Datensatz vom Typ Website Sprache an. Diesen Datensatz füllen Sie mit den entsprechenden Sprachinformationen. Geben Sie unter Sprache die Bezeichnung der Sprache ein (etwa Englisch, wenn Sie Ihre Inhalte ins Englische übersetzen möchten). Dieser Wert erscheint dann später im Backend in den Auswahlfeldern, mit denen Sie die Sprache für die Übersetzung festlegen. Die beiden anderen Felder dienen dazu, den
150 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Sprachwert mit technischen Hintergrundinformationen zu verknüpfen, auf die Sie später bei Bedarf zurückgreifen können. Für den eigentlichen Übersetzungsablauf spielen diese Angaben jedoch keine Rolle. Um die Backend-Oberfläche mehrsprachig anzuzeigen, müssen Sie das entsprechende Sprachpaket installieren und die jeweilige Sprache im Benutzerprofil aktivieren. Die dazu nötigen Schritte werden ausführlich in Rezept 15.10 behandelt.
Lizensiert für Markus Mueller
Nachdem Sie den Datensatz für die Sprache gespeichert haben, legen Sie im ersten Schritt für jede Seite, deren Inhalt Sie übersetzen möchten, eine Übersetzung an. Erst danach können Sie auch den Seiteninhalt übersetzen. Aktivieren Sie dazu das Modul Seite und wechseln Sie auf eine Seite, deren Inhalt Sie übersetzen möchten. Wählen Sie dann über die Auswahlliste in der rechten oberen Ecke den Eintrag Sprachen. Daraufhin wird der aktuelle Seiteninhalt in einer angepassten Spaltenansicht dargestellt. Außerdem erscheint ein weiteres Auswahlmenü Neue Übersetzung dieser Seite anlegen, in dem Sie die Sprache auswählen können. Danach initiiert TYPO3 den Übersetzungsprozess, in dem automatisch die entsprechende Eingabemaske geöffnet wird, mit der Sie eine Übersetzung der aktuellen Seite anlegen können. Geben Sie in diese Eingabemaske die Seiteneigenschaften für die jeweilige Sprache ein. Sämtliche Felder, die Sie in dieser Eingabemaske nicht sehen, werden von der ursprünglichen Seite automatisch übernommen. TYPO3 überlagert dann später beim Auslesen der Seiteninformation je nach Sprache die Angaben der ursprünglichen Seite mit den übersetzten Inhalten. Um Ihnen die Übersetzung der Seiteninformationen zu erleichtern, zeigt Ihnen TYPO3 unterhalb der Eingabefelder standardmäßig die Werte der ursprünglichen Seiteneigenschaften an. Nachdem Sie Ihre Änderungen kontrolliert und gespeichert haben, können Sie den Datensatz schließen. Danach leitet TYPO3 Sie automatisch zurück zur Spaltenansicht, die sich durch den Übersetzungsprozess wie folgt geändert hat: Zum einen werden die Inhalte nun in zwei Spalten dargestellt. Dabei enthält jede Spalte den Inhalt der jeweiligen Sprache. In der Spalte Standard sehen Sie den ursprünglichen Seiteninhalt. In der rechten Spalte erscheint der übersetzte Inhalt. Unter dem Spaltentitel finden Sie den Seitentitel der übersetzten Seite. Zum anderen sehen Sie in der rechten oberen Ecke ein neues Auswahlmenü, mit dem Sie zwischen den einzelnen Sprachen hinund herschalten können. Damit wechseln Sie in die Ansicht, die Sie vom regulären Seitenmodul her kennen – nur dass der Inhalt dann ausschließlich in der gewählten Sprache erscheint. Liegen in der gewählten Sprache noch keine übersetzten Inhalte vor, hat die Auswahl auch noch keine Auswirkung.
Max. Linie
Um den Übersetzungsprozess weiter zu erleichtern, können Sie über den Button StandardInhalte kopieren sämtliche Inhalte aus der Originalsprache übernehmen und für die Übersetzung markieren. In Klammern steht die Anzahl der Datensätze, die davon betroffen sein werden. So können Sie Inhalte sehr schnell von einer Sprache zur anderen übernehmen
4.9 Mehrsprachige Inhalte mit TYPO3 einpflegen | 151 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
und mit dem Übersetzen beginnen. Ähnlich wie bei den Seiteneigenschaften werden Ihnen auch hier die Inhalte des ursprünglichen Datensatzes angezeigt. Diese Übersetzungshilfe wird nur angezeigt, wenn Sie in der Auswahlliste Originalübersetzung den Originaldatensatz gewählt haben. Dieses Feld wird automatisch mit dem entsprechenden Wert vorbelegt, wenn Sie Inhalte von einer anderen Sprache übernehmen. Lassen Sie diese Angabe leer, werden die Übersetzungsinformationen ausgeblendet.
Links
Um diese übersetzten Inhalte nun auf der Website anzuzeigen, müssen Sie noch weitere Schritte unternehmen: Zum einen müssen Sie Ihr TypoScript-Template so einstellen, dass die Sprache von TYPO3 bei der Inhaltsausgabe überhaupt berücksichtigt wird. Das Rezept 9.4 beschäftigt sich ausführlich mit diesen Einstellungen. Außerdem sollten Sie auf Ihrer Website eine Funktion bereitstellen, mit der Ihre Website-Besucher in die gewünschte Sprache wechseln können. Dazu erhalten Sie in Rezept 12.8 Beispiele und nützliche Anregungen.
Diskussion
Lizensiert für Markus Mueller
Alternativ zu dem Modul Seite können Sie die Inhalte auch über das Modul Liste verwalten. Das ist vor allem dann sehr hilfreich, wenn Sie zahlreiche Inhalte bearbeiten oder sich schnell einen Überblick über die vorhandenen Übersetzungen verschaffen möchten. Aber auch zum Anlegen von neuen Übersetzungen bietet dieses Modul sehr effektive Bearbeitungsmöglichkeiten. Wenn Sie im Listenmodul mit Übersetzungen arbeiten möchten, müssen Sie die Option Lokalisierungsansicht aktivieren. Diese finden Sie am Ende der Liste. Nachdem TYPO3 die Listenansicht aktualisiert hat, stehen Ihnen über die zwei zusätzlichen Spalten Lokalisierung und Lokalisieren weitere Bearbeitungsmöglichkeiten zur Verfügung. Die Spalte Lokalisierung zeigt die Sprache des Datensatzes anhand der entsprechenden Flaggengrafik und der Sprachbezeichnung, wohingegen in der Spalte Lokalisieren die Datensätze mit einem Klick auf die Flaggengrafik direkt übersetzt werden können. TYPO3 öffnet danach die entsprechende Eingabemaske für die Übersetzung. Im Feld Sprache ist die gewünschte Sprache automatisch vorausgewählt. Außerdem stellt TYPO3 über das Feld Originalübersetzung eine Verknüpfung zum ursprünglichen Datensatz her. Beachten Sie, dass diese Spalten auch nur dann mit den Übersetzungsdaten angezeigt werden, wenn die jeweilige Seite bereits übersetzt wurde. Sollte das noch nicht der Fall sein, können Sie dies nachholen, indem Sie einen neuen Datensatz vom Typ Alternative Seiten Sprache erstellen und entsprechend ausfüllen. Zusätzlich können Sie über das Modul Info die vorhandenen Übersetzungen im Seitenbaum kontrollieren, ändern, oder Sie können neue anlegen. Wechseln Sie dazu in das Infomodul und wählen Sie dort in der Auswahlliste den Eintrag Lokalisierungs-Übersicht aus.
Max. Linie
In dieser Übersicht werden alle Seiten, die schon übersetzt wurden, farbig markiert. Die Farbe spielt dabei eine wichtige Rolle: Wird der Hintergrund grün eingefärbt, ist die Seite
152 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
ordnungsgemäß übersetzt und auf der Webseite sichtbar. Ein roter Hintergrund signalisiert, dass die Seite in der jeweiligen Sprache nicht vorhanden ist und der Besucher eine Fehlermeldung erhalten würde, sobald er die Seite in der entsprechenden Sprache aufruft. Grau hinterlegte Zellen signalisieren, dass es für diese Seite noch keine Übersetzung gibt. Der Besucher bekommt in diesem Fall standardmäßig immer den Inhalt der Standardsprache angezeigt. Zusätzlich können Sie in der Übersetzungsübersicht auch komfortabel mehrere Seiten gleichzeitig übersetzen. Wählen Sie dazu in der Spalte der gewünschten Sprache mithilfe der Kontrollkästchen die Seiten aus, die Sie übersetzen möchten. Klicken Sie anschließend im Tabellenkopf auf das Symbol Erstelle neue Übersetzungen. Daraufhin erscheint eine Eingabemaske, mit der Sie die Seitentitel und die entsprechende Sprache festlegen können. Detailanpassungen können Sie anschließend über die Bearbeitungssymbole vornehmen. Diese Bearbeitungssymbole haben folgende Bedeutung: Bearbeite Seiteninformationen der Standardsprache Öffnet die Seiteneigenschaften der gewünschten Seite. Bei der Standardseite öffnen Sie die Basisinformationen der Seite, bei der Übersetzung den jeweiligen Datensatz Alternative Seiten Sprache.
Lizensiert für Markus Mueller
Bearbeite Seite Öffnet die jeweilige Seite im Modul Seite. Dadurch können Sie die einzelnen Inhaltselemente direkt bearbeiten, verschieben und übersetzen. Seite anzeigen Mit dem Lupensymbol öffnen Sie die Seite in der jeweiligen Sprache. Der Sprachparameter wird dabei automatisch übermittelt. Wenn Sie TYPO3 wie in Rezept 9.4 beschrieben vorbereitet haben, werden die Inhalte in der entsprechenden Sprache ausgegeben. Die Zahl am rechten Rand verdeutlicht die übersetzten Inhaltselemente, die in dieser Sprache vorliegen.
Siehe auch Die Ausgabe mehrsprachiger Inhalte können Sie über zusätzliche Optionen in den Seiteneigenschaften und Systemeinstellungen gezielt steuern. In Rezept 9.4 werden diese Optionen ausführlich erklärt. Es gibt auch die Möglichkeit, für jede Sprache einen eigenen Seitenbaum zu erstellen. Das ist vor allem dann sinnvoll, wenn die andere Sprache eine völlig andere Seitenstruktur hat als die Originalsprache. Mehr über dieses Konzept finden Sie auf der Website http://typo3.org/documentation/tips-tricks/multi-language-sites-in-typo3/.
Max. Linie
Max. Linie 4.9 Mehrsprachige Inhalte mit TYPO3 einpflegen | 153 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
4.10 Sich in einem Workspace zurechtfinden
Links
Problem Ihnen ist der Begriff Workspace bzw. Arbeitsumgebung noch unklar, und Sie möchten sich über die grundlegenden Funktionen und möglichen Unterschiede zum normalen TYPO3-Backend informieren.
Lösung Arbeiten Sie wie gewohnt im TYPO3-Backend. Den Unterschied zur normalen (Live-)Umgebung werden Sie sehen, sobald Sie Inhalte bearbeitet haben und Ihre Überarbeitung speichern. TYPO3 ändert dann zum einen den Hintergrund der Seite im Seitenbaum, auf der Sie gerade arbeiten, zum Anderen wird das Inhaltselement in der Liste und der Seitenansicht ebenfalls farbig hinterlegt. Durch diese Kennzeichnung können Sie geänderte Inhalte sehr schnell erkennen (die Änderung im Seitenbaum wird erst dann deutlich, wenn Sie im Seitenbaum eine andere Seite auswählen oder den Seitenbaum neu laden). Lizensiert für Markus Mueller
Wenn Sie die Seite mit der Änderung im Frontend betrachten, erhalten Sie eine Gegenüberstellung der Inhalte mit der Live-Seite. So können Sie Ihre Inhalte prüfen und die Änderungen begutachten. Um eine Übersicht all Ihrer Änderungen zu sehen, wechseln in das Modul Workspace. Dort erhalten Sie eine ausführliche Übersicht Ihrer Änderungen sowie die Möglichkeit, diese zur Veröffentlichung vorzuschlagen. Je nachdem, wie der Workspace eingerichtet ist, können Sie die Inhalte nun über die Pfeile nach oben in der Spalte Stufe zur Veröffentlichung vorschlagen. Nach einem Klick werden Sie um eine kurze Nachricht gebeten. Geben Sie eine knappe Zusammenfassung Ihrer Änderungen an. Die nächsthöhere Prüfinstanz erhält nach dem Bestätigen dieser Aktion eine Benachrichtigung und kann die Veröffentlichung dann abschließen oder ablehnen.
Diskussion Sinn und Zweck eines Workspace ist es, dass mehrere Benutzer bei der Inhaltserstellung zusammen an den Entwürfen arbeiten können. Sobald das finale Ergebnis abgestimmt wurde, kann der Inhalt dann auf der Webseite veröffentlicht werden. Der Workflow ist in dem Moment abgeschlossen. Besonders wichtig ist dieser Prozess bei Inhalten, die durch ein sogenanntes Vier-Augen-Prinzip vor der Veröffentlichung auf mögliche Fehler geprüft werden oder bestimmte Qualitätsmerkmale aufweisen müssen.
Max. Linie
Workspaces erlauben ein Arbeiten in einer Umgebung, die jede Änderung an den Inhalten automatisch protokolliert und als Versionierungsschritt markiert. Bereits nach der Instal-
154 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
lation von TYPO3 sind standardmäßig zwei Workspaces eingerichtet: der Live-Workspace und der Entwurfs-Workspace. Der Live-Workspace entspricht immer dem aktuellsten Stand der Website. Alle Inhalte im Live-Workspace können direkt auf den Webseiten ausgegeben werden, die auch Ihre Besucher sehen. Im Entwurfs-Workspace hingegen können Sie vor dem Veröffentlichen der Inhalte eine Kontrollinstanz einfügen. Jedoch können die Eigenschaften des Entwurfs-Workspace nicht angepasst werden, daher empfehlen wir, einen eigenen Workspace anzulegen. Der Funktionsumfang eines Workspace hängt dabei stark davon ab, wie der Administrator diesen eingerichtet hat und welche Rechte Sie in diesem Workspace haben (Rezept 3.11 geht näher auf die Rechtevergabe ein). So finden Sie, je nachdem, ob mehrere Workspaces für Sie freigeschaltet sind, in der rechten oberen Ecke eine Auswahlliste mit den verfügbaren Workspaces. Der aktive Eintrag ist immer der aktuell ausgewählten Workspace. Workspaces wird in der Liste immer eine Zahl vorangestellt. Nachdem Sie den Workspace gewählt haben, lädt sich das Backend neu, und Sie befinden sich im Workspace. Wenn Sie nur auf einen Workspace Zugriff haben, ist dieser sofort nach Ihrer Anmeldung im Backend aktiv, und es erscheint keine Auswahlliste.
Lizensiert für Markus Mueller
Sobald Sie in einem Workspace das Modul Seite aktivieren, sehen Sie oberhalb des Seitenbaums den Workspace-Titel. Beim Betrachten der Inhalte im Frontend erscheint ein Hinweis, der Ihnen sagt, dass Sie sich in einem Workspace befinden. Die dargestellten Inhalte sind also noch nicht öffentlich. Je mehr Sie in einem Workspace arbeiten, desto mehr Veröffentlichungen müssen Sie auch durchführen. Sie können Ihre Änderungen direkt über die Vorschauansicht im Frontend oder über das Modul Arbeitsumgebung zum Review einreichen. Hierfür stehen Ihnen je nach Zugriffsrechten folgende Schaltflächen zur Verfügung: Mit dem Pfeil nach unten können Sie Änderungen zurücknehmen. TYPO3 fordert Sie nach dem Klick zu einer Begründung auf, damit Ihre Änderung auch für andere nachvollziehbar bleibt. Über diese Schaltfläche geben Sie das Element zum Reviewer weiter und leiten den nächsten Schritt im Workflow ein. Über diese Schaltfläche gibt der Reviewer das Element zum Veröffentlichen weiter und leitet den nächsten und letzten Schritt im Workflow ein. Hiermit wird Ihre Änderung aus dem Workspace entfernt.
Max. Linie
Max. Linie 4.10 Sich in einem Workspace zurechtfinden | 155 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Über den Bearbeitungsstift können Sie direkt weitere Änderungen an dem Datensatz vornehmen
Links
Protokoll zeigen ermöglicht Ihnen einen Einblick in die bisherigen Änderungen des Datensatzes. Die Funktion Veröffentlichen stellt den Datensatz direkt im Live-Workspace zur Verfügung. Nach dem Klick sind die überarbeiteten Inhalte auf der Webseite sichtbar. Die Funktion Austauschen wechselt den bestehenden Datensatz im Live-Workspace mit dem überarbeiteten Datensatz aus. Nach dem Klick sind die überarbeiteten Inhalte auf der Webseite sichtbar. Ein erneuter Klick stellt wieder den ursprünglichen Zustand her. In der rechten Spalte Lebenszyklus sehen Sie, wie oft der Datensatz schon veröffentlicht wurde. Lizensiert für Markus Mueller
Mit der Zeit wird es jedoch lästig, die immer wiederkehrenden Arbeitsschritte für jeden Datensatz zu wiederholen. TYPO3 unterstützt Sie bei der Durchführung mehrerer Aktionen im Workspace-Modul. Dort können Sie mehrere Einträge auswählen und für die gewählten Einträge Aktionen durchführen. Wechseln Sie dazu in das Modul Arbeitsumgebung und wählen Sie mit den Kontrollkästchen am rechten Tabellenrand die Einträge aus, die Sie verarbeiten möchten. Legen Sie anschließend über die Auswahlliste am Tabellenkopf die Aktion fest, die TYPO3 durchführen soll. Mit den markierten Elementen können Sie diese Aktionen durchführen: Publish/Veröffentlichen Veröffentlicht die Datensätze. Über diese Funktion wird die Seite inklusive aller Inhalte im Live-Workspace veröffentlicht. Swap/Austauschen Wechselt die Datensätze aus. Im Prinzip stellt die Swap-Funktion eine erweiterte Publish-Funktion dar. Durch die Swap-Funktion werden die bestehenden Inhalte ausgetauscht. Nach einem erneuten Aufruf der Swap-Funktion werden die ursprünglichen Inhalte wieder dargestellt. Besonders nützlich ist diese Funktion daher bei temporären Änderungen der Website, die zu einem bestimmten Zeitpunkt wieder rückgängig gemacht werden sollen. Stage: x Ausgewählte Elemente auf die gewünschte Ebene heben.
Max. Linie
Flush (Delete) Ausgewählte Elemente löschen. Inhalte werden tatsächlich in der Datenbank gelöscht und nicht nur aus der Liste entfernt.
156 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Noch schneller können Sie Inhalte freischalten oder austauschen, indem Sie auf die jeweilige Schaltfläche über der Übersicht klicken. Nach der Bestätigung der Sicherheitsabfrage werden alle Änderungen veröffentlicht. Prüfen Sie vor dem Klicken auf diese Schaltflächen, ob die Inhalte auch wirklich veröffentlicht werden dürfen. Somit stehen Ihnen umfangreiche Möglichkeiten zur Verfügung, Ihre Änderungen im Workspace vorzunehmen und zu verwalten.
Siehe auch Rezept 4.11 geht näher auf die Rechtevergabe und die Einstellungen eines Workspace ein. Weitere Informationen über Workspaces finden Sie im Dokument Inside TYPO3 (http://typo3.org/documentation/document-library/core-documentation/doc_core_inside/).
4.11 Die Veröffentlichung von Inhalten über einen Workflow kontrollieren Problem Lizensiert für Markus Mueller
Sie möchten kontrollieren, welche Inhalte auf der Website erscheinen. Hierzu möchten Sie zwischen der Inhaltseingabe zum Beispiel durch Redakteure und der Veröffentlichung eine Kontrolle einbauen, die vor der Veröffentlichung die Inhalte prüft und anschließend freigibt.
Lösung Nutzen Sie die Workspace-Funktionen von TYPO3 und richten Sie für die Redakteure bzw. Redaktionsgruppen eine eigene Arbeitsumgebung ein, um die dortigen Änderungen zu verfolgen. Diese Checkliste soll Ihnen helfen, die dafür nötigen Schritte zu meistern: 1. Stellen Sie sicher, dass Sie als Administrator am Backend angemeldet sind: Sie können die hier beschriebenen Schritte nur durchführen, wenn Sie dafür die nötigen Rechte haben. 2. Eine Benutzergruppe erstellen:
Max. Linie
Nennen Sie die Gruppe Redaktion. Benutzer dieser Gruppe müssen Seiten und Seiteninhalte bearbeiten dürfen sowie mindestens Zugriff auf die Module Web, Web > Seite, Benutzerwerkzeuge und Benutzerwerkzeuge>Arbeitsumgebungen haben. Wählen Sie daher unter dem Reiter Zugriffsliste die entsprechenden Werte in den Auswahllisten unter Module und Tabellen (ändern). Schalten Sie außerdem im Feld Seitentypen mindestens den Seitentyp Standard frei, damit neue Seiten angelegt werden können.
4.11 Die Veröffentlichung von Inhalten über einen Workflow kontrollieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 157
Max. Linie
3. Rechte für Benutzergruppen auf Seitenbaum definieren:
Links
Setzen Sie über das Modul Zugriff die korrekten Zugriffsrechte. Die Benutzergruppe muss mindestens Seiten sehen und Inhalte bearbeiten dürfen. 4. Mindestens zwei Nutzer erstellen, wenn noch nicht vorhanden: Anhand dieser Benutzer werden Sie den Workflow testen. Hierbei haben sich Benutzernamen bewährt, die eine Hierarchie erkennen lassen, zum Beispiel Redakteur und Chefredakteur. Dadurch können Sie später die einzelnen Schritte leichter nachvollziehen und komfortabler testen. 5. Benutzergruppe zuweisen: Weisen Sie den Benutzern die Gruppe Redaktion zu. Achten Sie darauf, dass Sie die beiden Kontrollkästchen unterhalb von Freigaben aus Gruppen aktivieren. Nur so können alle Datenbankfreigaben und damit die Zugriffsmöglichkeiten auf die Seiten von der Benutzergruppe übernommen werden. 6. Zugriff auf andere Arbeitsumgebungen einschränken:
Lizensiert für Markus Mueller
Bei jedem Nutzer unter Freigaben und Arbeitsumgebungen müssen die Optionen Live bearbeiten (Online) und Entwurf bearbeiten (Offline) deaktiviert werden. Dieser Schritt ist wichtig, um die Arbeitsschritte der Benutzer auf den neuen Workspace zu beschränken. Wenn Sie diese Optionen aktiviert lassen, können die Benutzer die Inhalte auch direkt – ohne den Workflow-Prozess – bearbeiten. Die Benutzer erhalten später dann eine Auswahlliste, in der sie die gewünschte Arbeitsumgebung aktivieren können. Falls Sie mehrere Arbeitsumgebungen zur Verfügung stellen, sollten Sie dann beim Testen darauf achten, dass die richtige ausgewählt ist. 7. Workspace über das Modul Liste anlegen und bearbeiten: Wechseln Sie dazu in das Wurzelverzeichnis und legen Sie einen neuen Datensatz vom Typ Arbeitsumgebung an. 8. Workspace einrichten: In den nächsten Schritten werden die Zugriffsrechte der einzelnen Benutzer über die Workspace-Einstellungen vorgenommen. Die Zugriffsrechte auf Workspaces lassen sich nicht über Benutzergruppen definieren. Vergeben Sie einen Titel sowie eine Beschreibung für den Workspace. Diese Angaben erscheinen dann in der Listenansicht und helfen Ihnen, bei mehreren Workspaces den Überblick zu bewahren. Zusätzlich erscheint der Titel inklusive ID oberhalb des Seitenbaums im jeweiligen Workspace. 9. Benutzerrechte im Workspace zuweisen:
Max. Linie
Im Bereich Users können Sie einzelne Benutzer sowie Benutzergruppen angeben, die Zugriff auf den Workspace haben. Wenn Sie Benutzergruppen angeben, erhalten alle Benutzer dieser Gruppe automatisch Zugriff auf den Workspace. In unserem Beispiel fügen Sie den Benutzer Redakteur – mit weniger Rechten – in das Feld Mitglieder ein. Diese Benutzer dürfen keine Inhalte veröffentlichen. Fügen Sie in das Feld Redakteure die Benutzer ein, die Inhalte veröffentlichen dürfen, in unserem Beispiel den Benutzer Chefredakteur.
158 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
10. Datenbank-Mount im Workspace festlegen: Hiermit bestimmen Sie, welche Seiten die Benutzer der Arbeitsumgebung sehen dürfen. Die Zugriffsrechte auf den Seitenbaum müssen mit den zuvor festgelegten Zugriffsrechten im Live-Seitenbaum übereinstimmen. Es ist über diese Auswahl nicht möglich, Seiten freizuschalten, die vom Benutzer nicht bearbeitet werden dürfen. Stellen Sie daher sicher, dass die Rechte passen, denn hier lauert die größte Fehlerquelle. 11. Optional: Verzeichnisfreigaben einbinden: Wenn Sie möchten, dass Dateien mit Datensätzen verknüpft werden können, aktivieren Sie unter Verzeichnisfreigaben den gewünschten Eintrag. Auch hier müssen die Verzeichnisfreigaben mit den Einstellungen in der Benutzergruppe übereinstimmen. Der Benutzer kann im Modul Dateiliste keine Aktionen durchführen. 12. Speichern und testen Sie die Einstellungen mit den ausgewählten Benutzern:
Lizensiert für Markus Mueller
Wechseln Sie anschließend über die Benutzerverwaltung in die jeweilige Benutzerrolle, um den Workflow zu testen. Klicken Sie hierzu im Modul Benutzerverwaltung auf das rot hinterlegte Symbol SU. Sie wechseln damit temporär in die gewünschte Benutzeransicht, können diese aber über den Button Verlassen wieder schließen und in Ihre vorherige Administratoransicht zurückkehren. So können Sie die Benutzerrechte schnell testen, ohne sich jedes Mal neu anmelden zu müssen (Rezept 3.11 geht detaillierter auf diese Schritte ein). Hier hat es sich bewährt, drei unabhängige Browser zu verwenden und sich in jedem mit einem unabhängigen Backend-Benutzer anzumelden. So können Sie intuitiv die einzelnen Arbeitsschritte im Backend nachvollziehen. Wichtig ist hierbei, dass Sie weder Tabs noch neue Fenster verwenden, sondern voneinander unabhängige Browserinstanzen. Die Browser müssen unabhängig voneinander laufen, da TYPO3 die Benutzer-Sessions ansonsten nicht auseinanderhält. Melden Sie sich in jedem Browser mit einem unterschiedlichen Benutzer an und spielen Sie die Inhaltsverwaltung wie in Rezept 4.10 beschrieben durch.
Wenn Sie die Einstellungen erfolgreich getestet haben, können Sie weitere Benutzer hinzufügen oder anstelle einzelner Benutzer auch Benutzergruppen verwenden, was die Verwaltung vieler Benutzer erleichtert. Die beiden Benutzer können nun abhängig voneinander Inhalte veröffentlichen. Gleichzeitig haben Sie durch die automatische Versionierung der Inhalte die größtmögliche Transparenz, was die Aktivitäten und Änderungen der Redakteure betrifft. Die Benutzer können den neu angelegten Workspace umgehend nutzen und die Inhalte in dem festgelegten Seitenbaum anpassen. Die Veröffentlichung der Inhalte liegt jedoch ganz in der Hand der festgelegten Workspace-Redakteure.
Max. Linie
Max. Linie 4.11 Die Veröffentlichung von Inhalten über einen Workflow kontrollieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 159
Diskussion
Links
Eine Arbeitsumgebung erlaubt es unterschiedlichen Benutzern, im Prozess der Inhaltserstellung zusammen an Entwürfen arbeiten zu können. Jedoch kann dieser Prozess durch einen Workflow auch unnötig behindert werden. Bevor Sie Workspaces einsetzen, sollten Sie daher genau prüfen, ob Ihre Umgebung durch einen Workflow entlastet werden kann und ob ein Workflow überhaupt sinnvoll ist. Um einen Workflow zu nutzen, benötigen Sie mindestens zwei Backend-Benutzer, die unabhängig voneinander Inhalte eingeben sollen, bzw. zwei Benutzergruppen, deren Benutzer unabhängig voneinander Inhalte eingeben können. Nur wenn Sie mehrere Benutzergruppen haben, die unterschiedliche Hierarchien und daher auch Bearbeitungsrechte besitzen, ist die Implementierung eines Workflows sinnvoll. Ebenso ist ein Workflow nur bei größeren, (örtlich) verteilten Gruppen sinnvoll, deren Kommunikation zeitversetzt und nicht direkt erfolgen kann. Es ist zum Beispiel sinnlos, ein kompliziertes Workflow-Konstrukt zu errichten, wenn die Redakteure in einem Raum sitzen und sich auch direkt absprechen können. Erfahrungsgemäß lohnt sich der Aufwand, der mit dem gezeigten Workflow-Modell einhergeht, nicht, der Workspace wird von den Benutzern meist nicht genutzt. Lizensiert für Markus Mueller
Die Bereiche Benutzerverwaltung und Rechtevergabe sind sehr vielschichtig. Wir zeigen die Verwendung des Workflows an einem rudimentären Beispiel, wie es in der Praxis häufig vorkommt. Eventuell müssen Sie die hier gezeigten Einstellungen über mehrere Benutzergruppen verteilen. Es ist durchaus möglich, dass Sie die Benutzerrechte feiner gliedern möchten. Das Rezept gibt Ihnen das nötige Grundwissen an die Hand. Wenn Sie eine weitere Freigabeebene benötigen, können Sie den oben skizzierten Prozess auch um eine Hierarchiestufe erweitern. Richten Sie hierzu einen weiteren Benutzer der Gruppe Redaktion ein und legen Sie diesen Benutzer als Besitzer der Arbeitsumgebung fest, indem Sie ihn in das entsprechende Feld im Bereich Users einfügen. Wechseln Sie anschließend in den Bereich Other und aktivieren Sie dort die Option Only workspace owner can publish. Dadurch werden die Veröffentlichungsrechte von Redakteuren deaktiviert, sodass diese Benutzer nur noch Inhalte für die Veröffentlichung vorschlagen können. Die Veröffentlichung obliegt dann dem Besitzer der Arbeitsumgebung. Wenn ein Workflow eingerichtet ist und der Prozess im Redaktionsteam nahtlos integriert ist, können Änderungen verfolgt werden, indem man sich zum Beispiel per E-Mail über Änderungen informieren lässt. Sie haben dadurch eine größtmögliche Transparenz bei den Aktivitäten im Workspace und halten die Änderungen im Blick.
Max. Linie
Wählen Sie dazu in den Benachrichtigungseinstellungen aus, wie Sie bzw. die Redakteure des Workspace benachrichtigt werden möchten. Standardmäßig werden die Benutzer bei Änderungen nicht benachrichtigt. Stellen Sie die Option E-Mail-Benachrichtigung bei Phasenänderung auf Notify all users on any change, um eine Benachrichtigung bei jeder Änderung zu aktivieren. Wenn Sie nur bei wesentlichen Änderungen benachrichtigen möchten, wählen Sie die Option Notify users on next stage only.
160 | Kapitel 4: Inhalte eingeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Sie können die Menge an Benachrichtigungs-E-Mails mit der Option Stage change notification by email bestimmen. Wir empfehlen Ihnen, die Option auf Notify users on next stage only zu stellen. Sie erhalten nur dann Meldungen, wenn ein Redakteur Inhalte veröffentlichen will (oder die Veröffentlichung abgelehnt wurde und so weiter). Die Option Notify all users on any change sendet die Benachrichtigungen bei jeder Änderung, also auch, wenn der Benutzer ein Inhaltselement ändert. Möchten Sie als Workspace-Besitzer die Bearbeitung der Inhalte im Workspace verbieten, können Sie den Workspace mit der Option Bearbeitung einfrieren sperren. Dies ist dann sinnvoll, wenn Sie den aktuellen Stand der Inhalte im Workspace so festhalten möchten, ohne den Workspace ganz zu löschen bzw. für die Benutzer auszublenden. Beachten Sie, dass eine Versionierung der Seite nicht mehr möglich ist, wenn Inhaltselemente auf dieser Seite bearbeitet wurden.
Siehe auch Eine weitere Dokumentation zu Workspaces und den einzelnen Funktionen des Moduls finden Sie auf der TYPO3-Website, wenn Sie nach dem Begriff doc_v4_workspace suchen. Lizensiert für Markus Mueller
Max. Linie
Max. Linie 4.11 Die Veröffentlichung von Inhalten über einen Workflow kontrollieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 161
Lizensiert für Markus Mueller
First
Kapitel 5
KAPITEL 5
Inhalte verwalten
5.0
Einführung
Lizensiert für Markus Mueller
Erfahrungsgemäß wächst mit zunehmendem Umfang der Website auch der Aufwand, die unterschiedlichen Datensätze zu verwalten. Die Hauptaufgabe im Backend wird dabei in der Regel darin bestehen, Inhalte auf den Webseiten zu bearbeiten, aufzuteilen und sinnvoll zu strukturieren. TYPO3 bietet Ihnen über das Backend komfortable Möglichkeiten, diese Arbeitsvorgänge zu optimieren. In den Rezepten 5.1 und 5.2 erfahren Sie, wie Sie wiederkehrende Aufgaben – vor allem im administrativen Bereich – schnell erledigen und sogar weitestgehend automatisieren können. Für Arbeiten an der Seitenstruktur oder an den Inhalten finden Sie in den Rezepten 5.3, 5.4 und 5.5 Lösungen für die anfallenden Arbeitsschritte. Dabei spielt das Modul Liste – kombiniert mit der sogenannten Zwischenablage – eine entscheidende Rolle. Über das Modul Liste erhalten Sie schnell einen Überblick über die vorhandenen Datensätze, und mit der Zwischenablage können Sie Daten bequem in der Seitenstruktur transportieren. Die Zwischenablage fungiert dabei wie ein TYPO3-eigener Zwischenspeicher, mit dem Inhalte über die Modulgrenze hinweg verschoben oder kopiert werden können. Zu bearbeitende Inhaltselemente können Sie über die Bearbeitungssymbole öffnen. In Rezept 5.6 erfahren Sie, wie Sie diese Bearbeitungsschritte auf mehrere Datensätze anwenden, um möglichst effektiv und Zeit sparend vorzugehen. Ähnlich gehen Sie vor, wenn Sie Datensätze aus Ihrer Website ganz entfernen möchten. Dazu finden Sie in Rezept 5.7 tiefer gehende Hintergrundinformationen. Wenn Sie Dateien oder Ordner über das Modul Dateiliste löschen möchten, finden Sie in Rezept 5.8 die nötigen Hinweise dazu.
Max. Linie
Sollten Sie versehentlich Inhalte gelöscht haben, erfahren Sie in Rezept 5.9, wie Sie diese wiederherstellen können. Zudem können Sie die Inhalte auch lokal sichern oder in andere
| 163 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
TYPO3-Instanzen übertragen, indem Sie die Import- und Exportfunktionen von TYPO3 verwenden. Die Rezepte 5.10 und 5.11 erläutern die grundlegenden Funktionen dieses Moduls.
Links
Bei umfangreichen Inhalten besteht die Möglichkeit, für Frontend-Benutzer eine Suche auf der Website einzurichten. Standardmäßig unterstüzt TYPO3 zwei Suchmethoden. Die Rezepte 5. 12 und 5.13 beleuchten diese beiden Funktionen im Detail. Seit TYPO3-Version 4.1 gibt es mit IRRE ein neuartiges Konzept, verknüpfte Datensätze im Backend anzuzeigen und zu bearbeiten. Einen kurzen Überblick über dieses Konzept des Inline Relational Record Editing gibt Ihnen Rezept 5.14.
5.1
Datensätze effektiv verwalten
Problem Sie möchten Ihre Datensätze effektiver handhaben und wünschen sich einen schnelleren Zugriff auf häufig verwendete Funktionen.
Lösung Lizensiert für Markus Mueller
Aktivieren Sie in der Listenansicht die Option Erweiterte Ansicht. Nun werden die wichtigsten Funktionen des Kontextmenüs in einer erweiterten Optionspalette direkt neben dem jeweiligen Datensatz angezeigt.
Diskussion Mit der Option Erweiterte Ansicht können Sie die am häufigsten gebrauchten Bearbeitungsfunktionen wie Bewegen, Ausblenden und Löschen direkt auswählen. Der Umfang der Bearbeitungsfunktionen orientiert sich dabei stets am jeweiligen Datensatztyp. Beispielsweise beinhaltet die Optionspalette von Seiten zusätzlich die Möglichkeit, Zugriffsrechte für Backend-Benutzer zu vergeben, was bei Inhaltselementen nicht möglich ist. Im Folgenden erhalten Sie eine Auflistung der Funktionen, die bei allen Inhaltselementen vorhanden sind. Dabei werden die Icons der Reihe nach von links nach rechts erläutert. Der kursiv gesetzte Text entspricht dem Titel des Icons: Informationen anzeigen Das Info-Icon erlaubt Ihnen einen schnellen Einblick in den Datensatz, ohne ihn öffnen zu müssen. Wenn Sie auf das Icon klicken, öffnet sich ein Fenster, das die wichtigsten Feldinhalte des Datensatzes übersichtlich auflistet. Das Layout der Infoansicht wird vom TCA der Tabelle bestimmt.
Max. Linie
Änderungsverlauf anzeigen/Rückgängig Mit diesem Icon erhalten Sie eine tabellarische Gegenüberstellung der Änderungen, die seit dem Erstellen des Datensatzes vollzogen wurden, sowie Informationen über
164 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Autor und den Zeitpunkt der Änderung. In Rezept 5.9 erfahren Sie, wie Sie mit dieser Funktion gelöschte Inhalte wiederherstellen oder Änderungen, die ab einem bestimmten Zeitpunkt gemacht wurden, aufsummieren. Versionierung Das Icon V steht für Versionierung. Über dieses Icon haben Sie Zugriff auf die Versionkontrolle des Datensatzes, über die Sie zum Beispiel Unterschiede zwischen zwei Versionen eines Datensatzes sichtbar machen können. Neuer Datensatz nach diesem einfügen bzw. Neue Seite nach dieser Seite anlegen Mit diesem Icon erzeugen Sie einen neuen Datensatz direkt unter dem vorhandenen. In Rezept 4.4 erfahren Sie, wie Sie Werte von vorhergehenden Datensätzen übernehmen und so mitunter viel Zeit sparen. Nach oben verschieben bzw. Nach unten verschieben Mit diesen Icons können Sie einzelne Inhaltselemente direkt verschieben. Diese Funktion ist so nicht im Kontextmenü verfügbar und steht Ihnen nur in der erweiterten Ansicht zur Verfügung. In Kapitel 5 erfahren Sie, wie Sie mehrere Inhaltselemente gleichzeitig verschieben oder sortieren können.
Lizensiert für Markus Mueller
Datensatz verbergen und Datensatz löschen Diese Icons nehmen direkt Einfluss auf die Darstellung der Datensätze im Frontend. Sie können damit den Datensatz direkt aus- oder einblenden oder auch löschen, sodass er im Frontend nicht mehr angezeigt wird. Das Icon Datensatz verbergen zeigt immer den Zustand, den der Datensatz haben wird, wenn Sie auf das Icon klicken. Ein rot durchstrichenes Icon bedeutet, dass der Datensatz ausgeblendet wird, nachdem Sie die Grafik angeklickt haben. Ist das Symbol nicht durchgestrichen, bedeutet dies: Der Datensatz ist momentan ausgeblendet. Mit einem Klick wäre er wieder sichtbar. Zusätzlich zu den allgemeinen Optionen, die bei jedem Datensatz angezeigt werden, bietet die Funktionsleiste bei Seiten folgende zusätzliche Möglichkeiten: Zugriffsrechte für Seite einstellen Mit diesem Icon wechseln Sie in das Modul Zugriff. Dort legen Sie fest, welche Backend-Benutzer und -Benutzergruppen auf die Seite zugreifen dürfen. Bewege diese Seite hinter die derzeit übergeordnete Seite (einwärts) Bewege diese Seite als Unterseite in die derzeit vorhergehende Seite (auswärts) Mit diesen Icons kann eine Seite direkt in der Seitenhierarchie ein- oder ausgerückt werden. Ganze Seitenbäume können so neu erzeugt, verschoben oder eingerückt werden.
Siehe auch
Max. Linie
In Rezept 4.2 erfahren Sie, wie Sie Seiteninhalte schnell eingeben. In den Rezepten 4.2, 5.6 und 5.7 finden Sie Tipps dazu, wie Sie mehrere Datensätze gleichzeitig bearbeiten, verschieben oder löschen können.
5.1 Datensätze effektiv verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 165
Max. Linie
5.2
Wiederkehrende Arbeiten beschleunigen
Links
Problem Sie möchten oft benötigte Aktionen im Backend weitestgehend automatisieren oder vereinfachen.
Lösung Verwenden Sie sogenannte Befehle, mit denen Sie Arbeitsschritte zusammenfassen und Routineaufgaben leichter abarbeiten können. Installieren Sie dazu die Extension User> Task Center, Actions (sys_action). Diese Extension legt eine neue Datenbanktabelle an, in der die Befehle gespeichert werden, und bindet die entsprechenden Eingabemasken in das Backend ein. Neue Befehle erstellen Sie dann über das Modul Liste in der Wurzelseite Ihrer TYPO3-Installation. Legen Sie dort ein neues Inhaltselement vom Typ Befehl an. Sämtliche Befehle finden Sie nach dem Speichern im Modul Aufgaben im Bereich Befehle. Von dort aus können Sie diese dann direkt per Mausklick aufrufen.
Lizensiert für Markus Mueller
Beachten Sie, dass ausschließlich Benutzer vom Status Administrator Befehle anlegen können – diese können jedoch Befehle auch für andere Backend-Gruppen freischalten, sodass diese Befehle von jedem Benutzer dieser Gruppe auch über das Modul Aufgaben verwendet werden können. Wenn Sie selbst keine Befehle anlegen dürfen und einen Befehl vermissen, sollten Sie sich mit dem Administrator in Verbindung setzen.
Diskussion Die Befehle können ganz unterschiedliche Einsatzgebiete haben. Beispielsweise können Sie mit wenigen Mausklicks Backend-Benutzer erzeugen oder eine bestimmte Seite mit Inhalt füllen. Dabei sind die Befehle stets identisch aufgebaut. In der Wurzelseite legen Sie einen Datensatz Befehl an, der über die Eingabefelder konfiguriert wird. Dieser Datensatz wird dann in der Datenbank gespeichert und in das Modul Aufgaben integriert. Wird der Befehl aufgerufen, analysiert TYPO3 dessen Einstellungen und ruft intern die entsprechenden Module auf, die dann wiederum die erforderlichen weiteren Funktionalitäten bereitstellen. Wenn Sie Befehle erstellen, sollten Sie stets einen aussagekräftigen Titel und eine Beschreibung vergeben. Diese Angaben erscheinen später im Modul Aufgaben und sind erfahrungsgemäß sehr hilfreich, um Befehle eindeutig zu unterscheiden. Zusätzlich können Sie mit dem Auswahlfeld Assign action to groups die Backend-Benutzergruppen bestimmen, die später Zugriff auf diesen Befehl haben. Wenn Sie die Auswahlliste leer lassen, haben nur Administratoren Zugriff auf den Befehl.
Max. Linie
Über die Auswahlliste Typ können Sie aus folgenden Befehlstypen wählen:
166 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Create Backend User Legen Sie mit einem Mausklick einen neuen Backend-Benutzer an. Als Vorlage für den neuen Benutzer dient ein bereits angelegter Benutzer (der sogenannte TemplateBenutzer). Sämtliche Einstellungen (außer den Werten für Name, Benutzername, Passwort und E-Mail-Adresse) werden beim Anlegen eines neuen Benutzers automatisch von diesem Benutzer übernommen. Verwenden Sie diesen Befehlstyp, wenn Sie häufig Backend-Benutzer anlegen möchten oder sich diese Aufgabe mit einem anderen Backend-Benutzer teilen möchten, der selbst über keine administrativen Rechte verfügt. Wir empfehlen Ihnen, diesen Template-Benutzer ganz zu deaktivieren, um eine mögliche Anmeldung mit dessen Zugangsdaten auszuschließen. Die neu generierten Backend-Benutzer werden selbstverständlich umgehend aktiviert, wenn Sie diese über den Template-Benutzer anlegen. SQL-query Definieren Sie eigene Datenbankabfragen, die Sie dann über das Modul Aufgaben per Mausklick aufrufen können. Verwenden Sie diesen Befehlstyp, um eigene Listenansichten zu erzeugen (in Rezept 7.2 erfahren Sie mehr über diese Anwendungsmöglichkeiten).
Lizensiert für Markus Mueller
Record list Listen Sie die Inhaltselemente innerhalb einer bestimmten Seite auf. Sie gelangen dadurch automatisch in die Listenansicht dieser Seite. Mit der Auswahlliste List only table begrenzen Sie die Anzeige der Datensätze auf bestimmte Tabellen. Verwenden Sie diesen Typ, wenn Sie sich schnell einen Überblick über die vorhandenen Datensätze in einer Seite verschaffen möchten. Edit records Legen Sie über die Auswahlliste Records to edit bestimmte Datensätze fest, die über diesen Befehl aufgelistet und per Mausklick geöffnet werden können. Verwenden Sie diesen Typ, wenn Sie häufig an bestimmten Datensätzen arbeiten müssen (in Rezept 7.1 finden Sie weitere Anregungen dazu, wie Sie häufig verwendete Datensätze schnell erreichen). New Record Erzeugen Sie einen neuen Datensatz innerhalb einer vordefinierten Seite. Sie können festlegen, in welcher Seite der Datensatz erstellt wird und welchen Typ er hat. Verwenden Sie diesen Befehl, wenn Sie die Erzeugung von bestimmten Datensätzen vereinfachen möchten. Achten Sie darauf, dass Sie in der Auswahlliste Create records in table einen Datensatztyp angegeben haben, da der Befehl sonst nicht durchgeführt werden kann.
Max. Linie
Wenn Sie über den Befehl Datensätze auflisten, bearbeiten oder neu anlegen möchten und diesen für andere Benutzergruppen freischalten, müssen Sie auch sicherstellen, dass die gewählte Benutzergruppe die nötigen Rechte hat, diese Datensätze aufzulisten oder zu bearbeiten. Kontrollieren Sie hierfür die aktivierten Tabellen in der Auswahlliste Tables
5.2 Wiederkehrende Arbeiten beschleunigen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 167
Max. Linie
(modify) (bzw. Tables (list), wenn Sie Datensätze nur auflisten möchten). Diese Auswahlliste finden Sie in den Einstellungen der Backend-Benutzergruppe. Achten Sie darauf, dass dort das Kontrollkästchen Include Access Lists aktiv ist.
Links
Siehe auch In Rezept 7.2 erfahren Sie mehr über den Befehlstyp SQL-query, mit dem Sie – ähnlich dem Modul Dokumente – die aktuellsten Datensätze in der Datenbank ermitteln.
5.3
Datensätze verschieben oder kopieren
Problem Sie möchten bestimmte Seiteninhalte auf mehr als einer Seite anzeigen lassen, etwa um wiederkehrende Seitenelemente in bestimmte Seiten einfügen.
Lösung Lizensiert für Markus Mueller
Wählen Sie das Modul Liste und wechseln Sie in die Seite, in der das gewünschte Inhaltselement liegt, das Sie kopieren möchten. Aktivieren Sie am Seitenende der Listenansicht die Option Zwischenablage anzeigen und wählen Sie dort Zwischenablage Nr.1. Legen Sie nun die gewünschten Datensätze in die Zwischenablage, indem Sie über die Kontrollkästchen die Datensätze auswählen und in der Bearbeitungsspalte auf das Symbol Ausgewählte Datensätze auf die Zwischenablage transferieren klicken. Aktivieren Sie abschließend die Option Objekte kopieren statt zu verschieben, sodass das Icon, das Sie in Abbildung 5-1 sehen, in der linken Ecke orange gefärbt erscheint.
Abbildung 5-1: Wird diese Grafik orange hervorgehoben, werden die Inhalte kopiert
Max. Linie
Die Inhalte liegen nun in der Zwischenablage und können bequem an eine andere Stelle im Seitenbaum kopiert werden. Wechseln Sie dazu über den Seitenbaum in die gewünschte Seite, in der Sie den Inhalt aus der Zwischenablage einfügen möchten. Dort erscheint jetzt ein Icon . Ist auf der Seite schon Inhalt vorhanden, können Sie den Inhalt auch mit diesem Icon gezielt hinter diese Datensätze setzen. Sind Unterseiten vorhanden, ist es mit diesem Icon möglich, den Inhalt auch direkt in diese Seiten zu legen. Die Inhalte werden dadurch direkt in die jeweilige Seite eingefügt und angezeigt.
168 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Diskussion Wenn Sie lediglich ein einzelnes Inhaltselement oder eine Seite kopieren möchten, können Sie alternativ dazu auch den Kopieren-Befehl aus dem Kontextmenü oder den Verschiebe-Assistenten verwenden. Sie sparen sich dadurch die oben genannten Schritte und sind womöglich schneller am Ziel als mit der Zwischenablage. Jedoch können Sie damit nur jeweils einen Datensatz verarbeiten. Um Inhalte mit dem einfachen Kopieren-Befehl zu verarbeiten, klicken Sie auf das Symbol des Inhaltselements und wählen die Option Kopieren. Der Datensatz wird dadurch automatisch in die Zwischenablage Normal gelegt und kann dann umgehend wieder an der gewünschten Stelle eingefügt werden, wenn Sie auf das Icon einer Seite klicken und die Option Einfügen in auswählen. Möchten Sie Inhalte mit dem Verschiebe-Assistenten kopieren, wechseln Sie dazu in den Listenmodus und wählen anschließend die Seite, von der Sie das Inhaltselement kopieren möchten. Den Verschiebe-Assistenten erreichen Sie über mehrere Wege: Klicken Sie auf das Icon des gewünschten Datensatzes und wählen Sie die Option Weitere Einstellungen im Kontextmenü. In der nun folgenden Auswahl klicken Sie dann auf die Option Element verschieben. Alternativ dazu erreichen Sie diese Funktion auch direkt über die sogenannte Erweiterte Ansicht. Bitte lesen Sie dazu mehr in Rezept 5.1.
Lizensiert für Markus Mueller
Nachdem Sie die Option Element verschieben gewählt haben, erscheint der VerschiebeAssistent. Aktivieren Sie dort die Option Objekte kopieren statt zu verschieben und wählen Sie mit den grauen Pfeilen eine neue Position im Seitenbaum. Sollten Sie die richtige Position nicht sehen, klicken Sie auf den gewünschten Seitentitel. Sie setzen damit den neuen Ausgangspunkt für den Verschiebe-Assistenten. Beachten Sie, dass der Verschiebe-Assistent nicht funktioniert, wenn Sie bei einer Seite die Option Seitenbaum stoppen aktiviert haben. Die gewünschten Seiten erscheinen dann nicht wie zuvor beschrieben in der Auswahl. Um Inhaltselemente unterhalb eines gestoppten Seitenbaums zu kopieren, können Sie die eingangs beschriebene Methode verwenden. Klicken Sie dann auf das rote Pluszeichen. Damit wählen Sie die Ausgangsseite als temporären Startpunkt und können die Zwischenablage wie gewohnt verwenden.
Beachten Sie außerdem, dass der Verschiebe-Assistent nicht für alle Datensätze zur Verfügung steht. Nutzen Sie dann die anfangs beschriebene Methode über die Zwischenablage.
Max. Linie
Zahlreiche Kopien eines Datensatzes können Flexibilität bedeuten, aber auch schnell unübersichtlich werden. TYPO3 bietet Ihnen mehrere Möglichkeiten, wiederkehrende Inhalte bequem zu verwalten, ohne dass Sie jedes Mal die Inhalte kopieren müssten. Besonders bei umfangreichen Websites kann der Verwaltungsaufwand dadurch stark reduziert werden, denn die Änderungen am ursprünglichen Inhalt werden umgehend an allen verknüpften Stellen sichtbar.
5.3 Datensätze verschieben oder kopieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 169
Max. Linie
Sie können dabei punktuell auf Ihren Seiten Stellen definieren, die Inhalte anderer Bereiche anzeigen sollen oder gar den ganzen Inhalt einer Seite mit dem Inhalt einer anderen Seite austauschen.
Links
Mit dem Inhaltselement Datensatz einfügen können Sie für einen bestimmten Inhaltsbereich festlegen, welcher Inhalt an der gewünschten Stelle angezeigt werden soll. Mit diesem Inhaltselement legen Sie eine Referenz eines Datensatzes an, in denen dann TYPO3 den Originalinhalt anzeigt. So können Sie zum Beispiel bestimmte Inhalte zentral verwalten und Änderungen am ursprünglichen Datensatz umgehend an unterschiedlichen Stellen durchführen. Legen Sie dazu ein neues Inhaltselement vom Typ Datensatz einfügen an und wählen Sie über das Feld Objekte die gewünschten Seiteninhalte. Diese werden nach dem Speichern an der gewünschten Stelle ausgegeben. Über das Feld Name können Sie einen Namen für das Inhaltselement vergeben. Dieser Name wird nicht im Frontend ausgegeben und dient nur der Übersichtlichkeit im Backend.
Lizensiert für Markus Mueller
Eine andere Möglichkeit, Inhalte zentral zu verwalten, besteht mit der Option Inhalt dieser Seiten anzeigen, die Sie in den Seiteneigenschaften finden. Mit dieser Option können Sie den gesamten Inhalt einer bestimmten Seite auf einer anderen Seite auslesen. Legen Sie dazu eine neue Seite an oder wählen Sie eine bestehende Seite in Ihrem Seitenbaum aus und bearbeiten Sie die Seiteneigenschaften. Wählen Sie dort den Reiter Optionen. Im unteren Bereich des Formulars finden Sie das Auswahlfeld Inhalt dieser Seite anzeigen. Mit diesem Auswahlfeld können Sie nun eine Seite festlegen, die den Inhalt für die aktuelle Seite liefert. Sämtlicher Inhalt der aktuellen Seite wird dadurch von der ausgewählten Seite überschrieben. Wenn Sie in Ihrer TYPO3-Installation mehrere Domains verwalten und Inhalte zwischen diesen Domains austauschen möchten, müssen Sie dies explizit freischalten. Standardmäßig können Inhalte von anderen Domains nicht mit den oben genannten Funktionen ausgetauscht werden. Fügen Sie folgenden TypoScript-Code in das Setup-Feld Ihres TypoScript-Templates ein, um diese Option freizuschalten: config { content_from_pid_allowOutsideDomain = 1 }
Beachten Sie, dass die Einstellung Inhalt dieser Seite anzeigen mitunter sehr verwirrend sein kann. Falls Ihre Änderungen auf der Seite nicht direkt sichtbar werden oder Sie sich wundern, warum die Inhalte auch nach dem Leeren des Seitencaches nicht erscheinen, kann es daran liegen, dass die Inhalte der Seite von einer ganz anderen Seite geholt werden.
Siehe auch
Max. Linie
In Rezept 13.1 erfahren Sie, wie Sie mit TypoScript Inhalte fest in Ihrer Seite verankern und Änderungen zentral steuern können. Mehr Informationen zu den unterschiedlichen Seitentypen finden Sie in Rezept 7.8.
170 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
5.4
Seiteninhalt auf mehrere Seiten verteilen
Problem Sie möchten mehrere Datensätze gleichzeitig verschieben, beispielsweise um Inhalte von einer Seite auf mehrere Seiten zu verteilen.
Lösung Aktivieren Sie am Seitenende der Listenansicht die Option Zwischenablage anzeigen und wählen Sie dort Zwischenablage Nr.1. Daraufhin ändert sich erneut die Listenansicht, und es erscheint in jeder Zeile zusätzlich zu den Ansichts-, Bearbeitungs- und Verschiebesymbolen ein Kontrollkästchen. Wählen Sie nun über diese Kontrollkästchen die gewünschten Datensätze aus, die Sie in die Zwischenablage verschieben möchten. Abschließend klicken Sie in der Bearbeitungsspalte auf das Symbol Ausgewählte Datensätze in die Zwischenablage transferieren . Beachten Sie dabei, dass Sie immer nur Datensätze einer Tabelle gleichzeitig auf die Zwischenablage verschieben können. Um mehrere Datensätze unterschiedlicher Tabellen in der Zwischenablage abzulegen, wiederholen Sie diesen Vorgang für jede Tabelle. Lizensiert für Markus Mueller
Wählen Sie danach eine weitere Zwischenablage und wiederholen Sie den Vorgang, bis Sie alle Inhalte in die Zwischenablagen verteilt haben. Achten Sie abschließend darauf, dass Sie die Option Elemente verschieben deaktiviert haben. Nachdem Sie alle gewünschten Datensätze in die Zwischenablage übertragen haben, wechseln Sie auf die Seite, in der Sie Ihre Datensätze platzieren möchten. Auf der neuen Seite erscheint nun dieses Icon . Ist auf der Seite schon Inhalt gleichen Typs vorhanden, können Sie den Inhalt auch mit diesem Icon gezielt hinter diese Datensätze setzen. Sind Unterseiten vorhanden, legen Sie den Inhalt direkt in diese Seiten . Wiederholen Sie auch hier den Schritt für jede Zwischenablage, bis Ihre Inhalte wie gewünscht verteilt sind. Sollten Ihnen die Zwischenablagen für Ihr Vorhaben ausgehen, lesen Sie in Rezept 5.5 nach, wie Sie die Anzahl der Zwischenablagen erhöhen.
Diskussion Wenn Sie alle Datensätze einer Tabelle gleichzeitig verschieben möchten, verwenden Sie die Option Alles/nichts markieren. Dadurch markieren Sie automatisch alle Datensätze einer Tabelle. Sollten Sie einmal vergessen haben, an welcher Stelle Sie den Datensatz in die Zwischenablage gelegt haben, genügt ein Klick auf den Titel oder das Icon des Datensatzes. Sie gelangen damit automatisch an die ursprüngliche Position des Datensatzes. TYPO3
Max. Linie
Max. Linie 5.4 Seiteninhalt auf mehrere Seiten verteilen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 171
merkt sich, welcher der Datensätze sich momentan in der Zwischenablage befindet, und markiert sie entsprechend in der Listenansicht. Gerade wenn Sie zahlreiche Datensätze aus unterschiedlichen Seiten in der Zwischenablage gespeichert haben, hilft diese Funktion sehr, die Übersicht zu bewahren. Um Inhalte aus der Zwischenablage zu entfernen, deaktivieren Sie das entsprechende Kontrollkästchen in der Liste und klicken erneut auf den Befehl Ausgewählte Datensätze auf die Zwischenablage transferieren oder auf das kleine x-Symbol in der Liste neben dem Datensatz. Um alle Einträge auf der aktuellen Zwischenablage gleichzeitig zu löschen, klicken Sie auf Löschen rechts oben in der Zwischenablage.
Links
Beachten Sie, dass die Optionen Ausschneiden, Kopieren und Einfügen im Kontextmenü als Zwischenspeicher immer die Ebene Normal verwenden. Wenn Sie also Inhalte von einer der Ebenen einfügen möchten, müssen Sie die Seite auswählen, in die Sie die Inhalte legen möchten, und dort die zuvor beschriebenen Schritte ausführen. Sollten Sie die Zwischenablage einmal aus Versehen deaktivieren, achten Sie beim erneuten Aktivieren darauf, dass sie automatisch auf die Ebene Normal zurückgesetzt wird und Sie Ihre gewünschte Ebene sowie den Kopiermodus womöglich erneut auswählen müssen. Lizensiert für Markus Mueller
Siehe auch Rezept 5.7 beschreibt, wie Sie mehrere Datensätze gleichzeitig löschen. Benötigen Sie mehr als fünf Ebenen, erklärt Ihnen Rezept 5.5, wie Sie weitere hinzufügen können.
5.5
Die Zwischenablage erweitern
Problem Sie möchten zusätzliche Ebenen in der Zwischenablage aktivieren, um so noch mehr Inhalte übersichtlich in der Zwischenablage zu gruppieren und auch umfangreiche Inhalte komfortabler zu verwalten.
Lösung Erweitern Sie die Ebenen in der Zwischenablage. Geben Sie dazu folgenden Code in Ihr Benutzer-TSconfig ein: options { clipboardNumberPads = 5 }
Max. Linie
Sie können so bis zu 20 Ebenen in der Zwischenablage anlegen.
172 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Diskussion Der Inhalt der Zwischenablage wird in der aktuellen Session gespeichert. Diese Session wird standardmäßig beim Abmelden gelöscht, sodass mit der Abmeldung auch der Inhalt aus der Zwischenablage entfernt wird. Mit folgender TSconfig-Einstellung halten Sie die Inhalte in der Zwischenablage, auch wenn die Session durch den Abmeldevorgang gelöscht wurde: options { saveClipboard = 1 }
Siehe auch In Rezept 5.4 erfahren Sie, wie Sie mit der Zwischenablage komfortabel lange Seiten aufteilen.
5.6
Mehrere Datensätze gleichzeitig bearbeiten
Problem Lizensiert für Markus Mueller
Sie möchten an mehreren Datensätzen gleichzeitig arbeiten, beispielsweise um Inhalte von einem Datensatz in den anderen zu kopieren, Werte zu vergleichen oder Änderungen in mehreren Datensätzen gleichzeitig zu speichern.
Lösung Wählen Sie im Modul Seite die Option Spalten im Auswahlmenü und klicken Sie auf das Bearbeitungssymbol Diese Spalte bearbeiten in der Spaltenüberschrift. Daraufhin öffnen sich, wie in Abbildung 5-2 zu sehen, alle Datensätze der gewählten Spalte.
Abbildung 5-2: Über dieses Icon öffnen Sie sämtliche Datensätze der jeweiligen Spalte
Max. Linie
Wenn der gewünschte Datensatz nicht angezeigt wird, wechseln Sie in das Modul Liste und klicken anschließend auf den Tabellentitel, um die Tabelle in der Einzelansicht zu öffnen. Aktivieren Sie anschließend die Option Zwischenablage anzeigen am Seitenfuß. Wählen Sie dann in der Zwischenablage die Ebene Zwischenablage Nr.1 und klicken Sie, wie in Abbildung 5-3 gezeigt, auf das Bearbeitungssymbol im Kopf der Spalte mit den Kontrollkästchen. Sämtliche aufgelisteten Datensätze der jeweiligen Tabelle öffnen sich dann in der Bearbeitungsansicht.
5.6 Mehrere Datensätze gleichzeitig bearbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 173
Max. Linie
Links Abbildung 5-3: Dieses Icon öffnet die aufgelisteten Datensätze
Diskussion Mit den oben genannten Bearbeitungsmöglichkeiten öffnen Sie alle Datensätze, die in der jeweiligen Ansicht sichtbar sind. Gerade bei umfangreichen Inhalten kann dies zu langen Ladezeiten und unübersichtlichen Eingabeformularen führen. Sie können TYPO3 auch so einrichten, dass nur eine bestimmte Anzahl von Datensätzen geöffnet wird, wenn Sie das Bearbeitungssymbol eines Datensatzes anklicken. Damit legen Sie fest, wie viele Datensätze sich öffnen, wenn Sie in der jeweiligen Spalte auf das Bearbeitungssymbol eines Datensatzes klicken. Standardmäßig wird nur ein Datensatz geöffnet, mit dieser Einstellung können Sie aber bis zu zehn aufeinander folgende Datensätze gleichzeitig bearbeiten. Geben Sie dazu folgenden TSconfig-Code in das Feld TSconfig der übergeordneten Seite ein:
Lizensiert für Markus Mueller
mod.web_layout { editFieldsAtATime = 5 }
Achten Sie darauf, dass Sie hierbei auf das Bearbeitungssymbol eines Datensatzes klicken und nicht – wie anfangs beschrieben – auf das Bearbeitungssymbol für die gesamte Spalte. Der Unterschied zur Option Diese Spalte bearbeiten liegt darin, dass Sie mit der oben genannten Einstellung Einfluss darauf haben, wie viele Datensätze sich ab dem gewählten Datensatz öffnen. Gerade bei zahlreichen Datensätzen ist dies von großem Vorteil.
Wenn Sie nur bestimmte Datensätze bearbeiten möchten, wechseln Sie in das Modul Liste. Klicken Sie anschließend auf den Tabellentitel, um die Einzelansicht der Tabelle zu öffnen. Aktivieren Sie nun die Option Zwischenablage anzeigen am Seitenfuß und dann in der Zwischenablage die Ebene Zwischenablage Nr.1. Daraufhin ändert sich die Listenansicht, und es erscheinen in jeder Zeile eines Datensatzes am rechten Rand Kontrollkästchen. Zusätzlich werden nun auch Ansichts-, Bearbeitungsund Verschiebesymbole angezeigt, mit denen Sie die einzelnen Datensätze bearbeiten könnten. Die Zwischenablage dient in diesem Fall nur dazu, die Kontrollkästchen zu aktivieren, und wird nicht weiter benötigt. In Rezept 5.4 erfahren Sie mehr über die Zwischenablage. Wählen Sie über die Kontrollkästchen die Datensätze aus, die Sie bearbeiten möchten. Klicken Sie dann auf das Bearbeitungssymbol im Kopf der Spalte mit den Kontrollkästchen. Dadurch öffenen sich die gewählten Datensätze in der Bearbeitungsansicht.
Max. Linie
Beachten Sie, dass Sie so nur die Datensätze aus einer Tabelle gleichzeitig bearbeiten können. Beispielsweise ist eine gleichzeitige Bearbeitung von Seiten und Seiteninhalten
174 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
nicht möglich. In dem Fall müssen Sie den oben beschriebenen Weg für jede Tabelle einzeln durchführen. Wenn Sie Datensätze unterschiedlicher Tabellen oder Seiten bearbeiten möchten, gehen Sie wie folgt vor: Bearbeiten Sie den ersten Datensatz. Scrollen Sie an das Seitenende und klicken Sie dort auf das Symbol In neuem Fenster öffnen . Die Eingabemaske des aktuellen Datensatzes öffnet sich dann in einem neuen Pop-up-Fenster. Achten Sie darauf, dass Sie Ihren Browser wie in Rezept 3.1 eingerichtet haben und kein Pop-up-Blocker aktiv ist bzw. Pop-ups von der aktuellen Domain erlaubt sind. Wechseln Sie dann wieder zurück in das Hauptfenster. Wählen Sie dort den anderen Datensatz aus und klicken Sie auch hier auf das Icon, sodass die Bearbeitungsmaske dieses Datensatzes ebenso in einem neuen Fenster geöffnet wird. Bringen Sie nun die beiden Fenster in den Vordergrund und platzieren Sie sie nebeneinander. So können Sie die Inhalte direkt vergleichen und bearbeiten. Um die Bearbeitung abzuschließen, klicken Sie auf das Icon Speichern und schließen. Die neuen Inhalte werden nun in die Datenbank übernommen, und das Fenster wird geschlossen.
Siehe auch Lizensiert für Markus Mueller
In Rezept 5.7 erfahren Sie, wie Sie mit der Zwischenablage mehrere Datensätze gleichzeitig löschen.
5.7
Einen oder mehrere Datensätze löschen
Problem Sie möchten nicht benötigte Inhalte von der Seite löschen oder veraltete Datensätze entfernen, um die Übersichtlichkeit zu erhöhen.
Lösung TYPO3 bietet Ihnen über die beiden Module Seite und Liste mehrere Möglichkeiten zum Löschen von Inhalten. Über das Modul Seite können Sie Inhalte sehr intuitiv löschen, da der Seiteninhalt je nach Inhaltsspalte und Position angezeigt wird. Im Modul Liste können Sie hingegen sehr effektiv löschen, da die Inhalte übersichtlich untereinander aufgelistet werden.
Max. Linie
Um Inhalte über das Modul Seite zu löschen, wählen Sie zuerst das entsprechende Modul und danach die Seite aus, aus der Sie Inhalte löschen möchten. Klicken Sie dann in der Kopfzeile des jeweiligen Inhaltselements auf das Papierkorbsymbol und bestätigen Sie die anschließende Sicherheitsfrage (alternativ dazu erreichen Sie den Befehl zum Löschen auch über das Kontextmenü, indem Sie auf das Symbol des Inhaltselements klicken).
5.7 Einen oder mehrere Datensätze löschen | 175 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Oft werden nicht mehr benötigte Inhaltselemente ausgeblendet, um sie bei Bedarf wieder anzuzeigen. Standardmäßig sind diese versteckten Inhalte im Modul Seite jedoch ausgeblendet. Achten Sie beim Arbeiten im Modul Seite darauf, dass Sie am Ende der Seite die Option Zeige verborgene Inhalte an aktiviert haben. Eine weitere Besonderheit des Seitenmoduls ist es, dass Datensätze von eigenen Extensions dort standardmäßig nicht angezeigt werden. Um eigene Datensätze zu löschen, müssen Sie daher in das Listenmodul wechseln.
Links
Über das Modul Liste löschen Sie Datensätze über das Kontextmenü, das Sie mit einem Mausklick auf das Symbol des jeweiligen Datensatzes aufrufen. Zusätzlich können Sie diese Löschfunktion noch schneller aufrufen, indem Sie die Bearbeitungsleiste einblenden. Aktivieren Sie dazu die Option Erweiterte Ansicht, die Sie am Seitenende finden. Daraufhin erscheint das Papierkorb-Icon in jeder Zeile, und Sie können den Löschbefehl direkt aufrufen.
Lizensiert für Markus Mueller
Um mehrere Datensätze gleichzeitig zu löschen, richten Sie sich die Zwischenablage wie in Rezept 5.4 beschrieben ein. Wählen Sie die erste Zwischenablage unterhalb der Ebene Normal. Daraufhin wird die Listenansicht neu geladen. Wählen Sie dann über die Kontrollkästchen die gewünschten Datensätze aus. Mit dem Schalter Alles/nichts markieren wählen Sie mit einem Klick sämtliche Kontrollkästchen der jeweiligen Tabelle aus, was vor allem bei umfangreichen Datenbeständen sehr vorteilhaft ist. Klicken Sie dann das in Abbildung 5-4 gezeigte Löschen-Symbol in der rechten Bearbeitungsspalte an und bestätigen Sie abschließend den Löschvorgang.
Abbildung 5-4: Mit diesem Icon löschen Sie mehrere ausgewählte Datensätze
Standardmäßig werden in der Übersicht nur 30 Datensätze angezeigt. Um die Auswahlmöglichkeit zu erweitern, bietet sich die Detailansicht der Tabelle an. Dort können Sie 50 Datensätze gleichzeitig auswählen (in Rezept 7.6 erfahren Sie, wie Sie die Anzahl der Elemente im Listenmodul erhöhen können). Beachten Sie, dass Sie über diese Option nur Datensätze einer Tabelle gleichzeitig löschen können, sodass Sie den Löschvorgang für jede Tabelle entsprechend oft wiederholen müssen. Wenn Sie Seiten löschen, werden auch sämtliche Seiteninhalte gelöscht. Seiten mit Unterseiten können Sie aus Sicherheitsgründen nur dann löschen, wenn Sie die Option Rekursives Löschen(!) in den Benutzereinstellungen aktivieren. Wechseln Sie dazu in das Modul Einstellungen. Dort finden Sie in dem Bereich Erweiterte Funktionen die Option Rekursives Löschen(!). Aktivieren Sie dieses Feld und speichern Sie die Daten über den Button Konfiguration sichern.
Max. Linie
Max. Linie 176 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Das Ausrufezeichen im Titel der Option symbolisiert, dass Sie diese Option nicht leichtfertig aktivieren sollten. Wir empfehlen Ihnen sogar ausdrücklich, diese standardmäßig per Benutzer-TSconfig-Anweisung für alle Benutzer zu deaktivieren. Um diese Einstellung vorzunehmen, benötigen Sie Administratorrechte. Wechseln Sie dazu in das Modul Liste und wählen Sie die Wurzelseite des Seitenbaums aus. Dort finden Sie unterhalb von Backend Benutzer sämtliche Backend-Benutzer. Bearbeiten Sie die gewünschten Benutzer und geben Sie folgenden TSconfig-Code in das Feld TSconfig ein: setup.override { recursiveDelete = 0 }
Alternativ dazu können Sie diesen Code auch in das Feld TSconfig einer Backend Benutzergruppe schreiben. Die Option wird dann für alle Mitglieder dieser Gruppe standardmäßig deaktiviert. Es sei nochmals betont, dass Sie diese Option nur mit äußerster Vorsicht aktivieren sollten. Eine weitere Möglichkeit zum Entfernen von Inhalten besteht darin, in den Seitenbaum eine Seite vom Typ Papierkorb zu integrieren. Wenn Sie nun Datensätze aus dem regulären Seitenbaum entfernen möchten, brauchen Sie diese Inhalte lediglich in den Papierkorb zu verschieben. Sie sind dann nicht mehr von außen erreichbar, können jedoch jederzeit wieder verwendet oder hergestellt werden. Lizensiert für Markus Mueller
Diskussion Wenn Sie im TYPO3-Backend Daten löschen, werden diese vorerst nicht direkt aus der Datenbank entfernt, sondern lediglich als gelöscht markiert, sodass sie im Backend nicht mehr auftauchen. Damit ist sichergestellt, dass die Daten zu jedem Zeitpunkt wiederhergestellt werden können. Diese Einstellung dient der Sicherheit Ihrer Daten, denn wenn diese direkt aus der Datenbank entfernt werden, lassen sie sich nicht mehr herstellen. Manchmal ist es jedoch sinnvoll, Inhalte über die Lösch-Funktion direkt aus der Datenbank zu entfernen, beispielsweise wenn Sie sensible Daten verwalten, die nach dem Löschen auch umgehend aus der Datenbank entfernt werden müssen, um sie vor möglichen Zugriffen zu schützen. Ändern Sie dazu das TCA der jeweiligen Tabelle, indem Sie im ctrl-Bereich der Eigenschaft delete einen leeren Wert zuweisen. Anhand des Werts delete ermittelt TYPO3 das Feld, mit dem der Datensatz als gelöscht markiert wird. Wenn Sie diesen Wert leer lassen, nimmt TYPO3 an, dass es kein Feld gibt, mit dem der Datensatz als gelöscht markiert wird, und führt den Löschvorgang direkt aus. Um beispielsweise Seiteninhalte sofort zu löschen, geben Sie folgenden Code in die Datei ext_tables.php ein: $TCA['tt_content']['ctrl']['delete'] = '';
Max. Linie
Vermeiden Sie es unter allen Umständen, Datensätze direkt über eigene SQL-Befehle in der Datenbank zu löschen. TYPO3 erzeugt beispielsweise für Übersetzungen und zur Versionierung – besonders in Verwendung mit Workspaces – Relationen, die über das Backend nicht direkt nachzuvollziehen sind und ein sehr tiefes Verständnis für die internen Abläufe
5.7 Einen oder mehrere Datensätze löschen | 177 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
von TYPO3 erfordern. Sie müssten dann in Ihren SQL-Befehlen darauf achten, dass Sie Datensätze auch löschen, und laufen dadurch Gefahr, Ihre Datenbank mit inkonsistenten Daten zu füllen, die unnötig Speicherplatz kosten und nachhaltig Ihre Datenarchitektur zerstören können. Löschen Sie Ihre Inhalte daher immer über die Löschfunktionen im TYPO3-Backend. Dort werden Ihre Daten über die sogenannte TYPO3 Core Engine (TCE) verwaltet, die beispielsweise alle Datenbankinteraktionen überwacht und die notwendigen Querverknüpfungen und Tabelleneigenschaften berücksichtigt. Dadurch stellen Sie sicher, dass Ihre Daten stets konsistent bleiben.
Links
Siehe auch Rezept 5.9 beschreibt, wie Sie gelöschte Daten wiederherstellen können, wenn diese versehentlich über die TYPO3-Oberfläche gelöscht wurden. In Rezept 5.10 erfahren Sie, wie Sie Sicherheitskopien Ihrer Inhalte anlegen.
5.8
Dateien oder Ordner verschieben oder löschen
Problem Lizensiert für Markus Mueller
Sie möchten Dateien oder Ordner umstrukturieren oder aus dem Dateisystem entfernen.
Lösung Im Modul Dateiliste verschieben Sie Dateien, indem Sie auf das jeweilige Symbol der Datei klicken und dort den Eintrag Ausschneiden auswählen. Klicken Sie danach auf den gewünschten Zielordner und wählen Sie im Kontextmenü des Ordners den Eintrag Einfügen in. Nachdem Sie die Aktion im darauf folgenden Dialog bestätigt haben, wird die Datei in den gewünschten Ordner verschoben. Möchten Sie die Datei löschen, wählen Sie anstatt Ausschneiden die Option Löschen. Falls Sie eine Fehlermeldung erhalten, die Ihnen sagt, dass diese Aktion nicht erlaubt ist, sollten Sie überprüfen, ob in Ihrem Backend-Benutzerprofil unterhalb von Fileoperation permissions die Option Files: Upload,Copy,Move,Delete,Rename,New,Edit aktiv ist. Um Backend-Benutzerprofile zu bearbeiten, benötigen Sie administrative Rechte. Mit folgenden Schritten kontrollieren Sie die Einstellung: Wechseln Sie in das Modul Liste und wählen Sie die Wurzelseite Ihrer TYPO3-Installation aus. Öffnen Sie dann in der Tabelle Backend Benutzer das Benutzerprofil und überprüfen Sie im Bereich Fileoperation permissions die Auswahl (beachten Sie, dass Sie diese Änderung über das Eingabeformular des Backend-Benutzers tätigen und die Optionen nicht in den Benutzereinstellungen suchen).
Max. Linie
Ganze Ordner verschieben Sie folgendermaßen: Klicken Sie auf das jeweilige Symbol des Ordners und halten Sie die Maustaste gedrückt. Ziehen Sie es dann auf das Symbol eines
178 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
anderen Ordners. Lassen Sie die Maustaste los. Daraufhin erscheint ein Kontextmenü, in dem Sie wählen können, wohin Sie den Ordner verschieben möchten. Nachdem Sie diese Auswahl getroffen haben, wird der Ordner verschoben. Wenn Sie ganze Ordner verschieben oder entfernen möchten, sollten Sie darauf achten, dass Sie in Ihrem Benutzerprofil auch die Option Directory: Move, Delete,Rename,New aktivieren, da diese Option standardmäßig deaktiviert ist.
Diskussion Die anfangs beschriebenen Methoden erlauben das schnelle Verschieben von ganzen Ordnern und den darin enthaltenen Dateien. Im Folgenden erfahren Sie, wie Sie die Ordner und Dateien auf eine bestimmte Auswahl begrenzen und schnell verschieben können. Um diese Bearbeitungsaktionen auf mehreren Dateien und Ordner anzuwenden, aktivieren Sie, wie in Abbildung 5-5 gezeigt, die Option Zwischenablage anzeigen.
Lizensiert für Markus Mueller
Abbildung 5-5: Mit dieser Option aktivieren Sie die Zwischenablage im Dateimodul
Wählen Sie anschließend eine freie Zwischenablage unterhalb der Ebene Normal, etwa Zwischenablage Nr.1. Dort können Sie nun die gewünschten Dateien und Ordner ablegen. In jeder Zeile der Dateiliste erscheinen nun Kontrollkästchen, mit denen Sie Dateien auswählen können. Mit dem Icon Alles/nichts markieren aktivieren Sie alle sichtbaren Kontrollkästchen. Mit dem Button Ausgewählte Dateien auf die Zwischenablage transferieren legen Sie diese Auswahl dann in die ausgewählte Zwischenablage. Danach erscheint hinter den Kontrollkästchen eine weitere Grafik. Indem Sie diese anklicken, verschieben Sie den Inhalt der aktiven Zwischenablage direkt in einen Unterordner. Wenn Sie den Inhalt der Zwischenablage in einen übergeordneten Ordner legen möchten, gehen Sie wie folgt vor: Wechseln Sie über den Ordnerbaum in den gewünschten Ordner und klicken Sie auf das in Abbildung 5-6 gezeigte Icon.
Abbildung 5-6: Über dieses Symbol fügen Sie den Inhalt einer Zwischenablage in den aktuellen Ordner ein
Max. Linie
Um mehrere Dateien gleichzeitig zu löschen, wählen Sie die jeweiligen Elemente über die Kontrollkästchen aus und klicken anschließend, wie in Abbildung 5-7 gezeigt, auf das
5.8 Dateien oder Ordner verschieben oder löschen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 179
Max. Linie
Symbol Markierte löschen. Nachdem Sie diese Aktion bestätigt haben, werden die Elemente gelöscht.
Links
Abbildung 5-7: Mit diesem Symbol löschen Sie die ausgewählten Elemente
Möchten Sie in den Löschaktionen auch Unterordner berücksichtigen, sollten Sie die Option Directory: Delete recursively (rm -Rf) in Ihrem Benutzerprofil aktivieren. Die Anmerkung rm -Rf verdeutlicht die Auswirkung dieser Option anhand des entsprechenden Unix-Befehls. Ist diese Option aktiviert, können ganze Ordnerstrukturen auf einmal entfernt und Daten unwiederbringlich gelöscht werden. Sie sollten diese Option daher nur mit äußerster Vorsicht aktivieren und sich darüber bewusst sein, welche Auswirkungen diese haben kann.
Lizensiert für Markus Mueller
Als Schutz vor ungewolltem Löschen sollten Sie einen Ordner vom Typ Recycler anlegen. In diesem Ordner sammelt TYPO3 automatisch alle gelöschten Dateien und Ordner, sodass diese – etwa nach einem versehentlichen Löschvorgang – leicht wiederhergestellt werden können. Gerade bei umfangreichen Datenbeständen kann sich dieser Ordner jedoch schnell mit Daten füllen und muss daher in regelmäßigen Abständen geleert werden. Um diesen Ordner anzulegen, erstellen Sie über das Kontextmenü einen neuen Ordner und geben diesem den Namen _recycler_. Anhand dieses Titels wandelt TYPO3 den Ordner automatisch in den gewünschten Recycler um, der sich durch ein spezielles Icon von den anderen Ordnern unterscheidet.
Siehe auch In Rezept 5.5 erfahren Sie, wie Sie die Anzahl der Zwischenablagen für jeden Benutzer individuell erweitern können. Details zum Befehl rm finden Sie auf http://de.wikipedia.org/ wiki/Rm_(Unix).
5.9
Gelöschte Inhalte wiederherstellen
Problem Sie haben beim Arbeiten im Backend versehentlich Seiten oder deren Inhalte gelöscht, die Sie wiederherstellen möchten.
Max. Linie
Lösung Machen Sie die Aktion über das Verlaufsprotokoll rückgängig.
180 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Wenn Sie beim Bearbeiten eines Datensatzes versehentlich gespeichert haben und dadurch Inhalte gelöscht oder überschrieben wurden, können Sie den letzten Bearbeitungsschritt über das Symbol Letzte Änderung zurücknehmen in der Funktionspalette rückgängig machen. Dieses Symbol finden Sie ganz rechts in der Bearbeitungsmaske eines Datensatzes. Beachten Sie, dass TYPO3 nur Änderungen speichert, wenn Sie das Inhaltselement abspeichern. Die Änderungen werden also nur durch Speichern übernommen. Bemerken Sie also während Ihrer Arbeit an dem Datensatz, dass Sie Inhalte aus Versehen gelöscht haben, schließen Sie den Datensatz und öffnen ihn erneut. Ihre vorherigen Änderungen werden dadurch wieder zurückgesetzt. Zusätzlich dazu zeichnet TYPO3 ein ausführliches Verlaufsprotokoll auf, in dem TYPO3 standardmäßig die Änderungen der letzten 20 Arbeitsschritte innerhalb des letzten Monats speichert. Dieses ausführliche Verlaufsprotokoll erreichen Sie am schnellsten über das Kontextmenü der Seite, in der Sie den Löschvorgang durchgeführt haben. Wählen Sie dort die Option Erstellungsverlauf/Rückgängig machen.
Lizensiert für Markus Mueller
Wenn Ihnen das Kontextmenü nicht zur Verfügung steht, wechseln Sie in das Modul Liste und wählen die Seite aus, in der Sie die Inhalte oder Unterseiten gelöscht haben. Aktivieren Sie am Seitenende die Option Erweiterte Ansicht und klicken Sie anschließend auf das Icon Änderungsverlauf anzeigen/ Rückgängig (in Rezept 5.1 erfahren Sie mehr über die restlichen Icons und deren Funktionen).
Daraufhin sehen Sie in einer tabellarischen Gegenüberstellung die Änderungen, die seit dem Erstellen des Datensatzes vollzogen wurden, sowie Informationen über den Autor und den Zeitpunkt der Änderung. So gehen Sie dann weiter vor: • Stellen Sie zunächst sicher, dass Sie für die Option Einträge anzeigen eine ausreichende Anzahl angegeben haben. • Stellen Sie außerdem sicher, dass die Optionen Zeige Unterelemente und Zeige eingefügte/gelöschte Datensätze aktiv sind. • Suchen Sie in der Spalte Unterschiede den Wert löschen und kontrollieren Sie über die Spalte Tabelle:Uid, ob dies der gewünschte Datensatz ist. • Klicken Sie nun auf das linke Icon Rückgängig machen (Vorschau), um das Verlaufsprotokoll dieses Datensatzes aufzurufen. Danach widerrufen Sie mit einem Klick auf das Icon Alle gezeigten Änderungen rückgängig machen die Löschaktion. Der Datensatz wird danach wieder in der ursprünglichen Version angezeigt.
Diskussion
Max. Linie
Wenn Sie im TYPO3-Backend Daten löschen, werden diese standardmäßig nicht direkt aus der Datenbank entfernt, sondern lediglich als gelöscht markiert und dadurch im Backend ausgeblendet. Vermeintlich gelöschte Daten können daher zu jedem Zeitpunkt
5.9 Gelöschte Inhalte wiederherstellen | 181 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
wiederhergestellt werden. Im Backend tauchen diese Datensätze jedoch nicht mehr auf. Zudem speichert TYPO3 standardmäßig für Seiten und Seiteninhalte ein Änderungsprotokoll, anhand dessen Sie Änderungen auch für einzelne Felder verfolgen können.
Links
TYPO3 speichert die letzten 20 Arbeitsschritte in dem Verlaufsprotokoll. Der älteste Eintrag ist dabei maximal einen Monat alt. Diese Standardeinstellungen können Sie über TSconfig-Angaben für jede Seite individuell anpassen. Da diese Einstellungen in den Seiteneigenschaften gespeichert werden, wirken sie sich automatisch auf alle Unterseiten und deren Inhalte aus. Um das Verlaufsprotokoll beispielsweise für einen Seitenbaum auf 30 Einträge zu erhöhen, öffnen Sie die Seiteneigenschaften der ersten Seite und geben in das Feld TSconfig folgenden Code ein: TCEMAIN { default.history.keepEntries = 30 }
Zusätzlich können Sie das Verlaufsprotokoll auch für einzelne Tabellen einstellen, indem Sie den Code nach folgendem Muster erweitern: TCEMAIN { default.history.keepEntries = 30 table.tabellen_name.history.keepEntries = 20 } Lizensiert für Markus Mueller
Um beispielsweise das Verlaufsprotokoll für Seiten und Seiteninhalte anzupassen, ändern Sie den Tabellennamen einmal für Seiten in pages und für Seiteninhalte in tt_content. Der entsprechende TSconfig-Code sieht dann folgendermaßen aus: TCEMAIN { default.history.keepEntries = 10 table.pages.history.keepEntries = 20 table.tt_content.history.keepEntries = 30 }
Eine Übersicht der gebräuchlichsten Tabellennamen finden Sie in Rezept 4.6 (beachten Sie, dass nicht alle Tabellen ein Verlaufsprotokoll besitzen). Achten Sie auch darauf, dass die zuvor genannten Einstellungen immer abhängig davon sind, wie alt die Protokolldaten sein dürfen. Standardmäßig dürfen die Einträge höchstens 30 Tage alt sein. Diese Einstellung können Sie über folgenden TSconfig-Code anpassen: TCEMAIN { history.maxAgeDays = 7 }
Max. Linie
Geben Sie hier eine 0 an, werden die Protokolldaten für ein Jahr bereitgestellt. Beachten Sie, dass die Protokolldaten zusätzlich zu den vorhandenen Datensätzen in der Datenbank gespeichert werden und dadurch natürlich auch deren Größe entsprechend stark zunimmt. Kalkulieren Sie diesen Zuwachs daher in Ihren Speicherplatz mit ein, bevor Sie diese Einstellungen ändern. Gerade bei umfangreichen Inhalten können dadurch sehr große Datenmengen entstehen, daher sollten Sie die Einstellungen nicht leichtfertig erhöhen.
182 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Trotz der Möglichkeit, die Daten über das Verlaufsprotokoll wiederherstellen zu können, ist dieser Vorgang auf Dauer doch recht mühsam und zeitaufwendig. Eine ganz andere Art, Inhalte zurückzuholen, ist, das Löschen von Datensätzen erst gar nicht zu erlauben und diese stattdessen auszublenden. Zusätzlich gibt es die Möglichkeit, die Löschoptionen in der Aktionsleiste über folgendes Benutzer-TSconfig auszublenden: options { disableDelete = 1 }
Damit blenden Sie die Funktion Datensatz löschen in der Aktionspalette aus. Abbildung 5-8 verdeutlicht die Auswirkungen dieser TSconfig-Einstellungen: Zu sehen ist die Aktionspalette vor und nach dem Ausblenden der Funktion.
Abbildung 5-8: Die Löschoption können Sie über das Benutzer-TSconfig ausblenden
Möchten Sie das Löschen nur bei bestimmten Tabellen erlauben, erreichen Sie das mit folgendem Code: Lizensiert für Markus Mueller
options { disableDelete = 1 disableDelete.tabellen_name = 0 }
Um die Option Löschen aus dem Kontextmenü zu entfernen, fügen Sie unterhalb des oben genannten Codes noch folgende Zeilen ein: options.contextMenu { pageTree.disableItems = delete pageList.disableItems = delete }
Eine andere Möglichkeit, das Löschen von Datensätzen zu unterbinden, steht Ihnen auch über die Seitenrechte zur Verfügung. Wechseln Sie dazu in das Modul Zugriff und wählen Sie in der Auswahlliste in der rechten oberen Ecke die Option Rechte. Wählen Sie nun über den Seitenbaum die Seite aus, deren Rechte Sie bearbeiten möchten. Wollen Sie die Zugriffsrechte der Unterseiten ebenfalls ändern, können Sie über die Auswahlliste Tiefe die Ebenen einstellen, auf die Ihre Aktion angewendet wird. Der Seitenbaum zeigt Ihnen stets die Seiten, deren Rechte Sie nun im Folgenden einstellen können.
Max. Linie
Klicken Sie jetzt auf das Bearbeitungssymbol Bearbeite Rechte der obersten Seite, um die Rechte anzupassen. Wählen Sie über die Auswahllisten Besitzer und Gruppe die jeweiligen Backend-Benutzer bzw. -Benutzergruppen, die Zugriff auf diese Seite haben dürfen. Mit den einzelnen Kontrollkästchen unterhalb von Rechte geben Sie dann die jeweiligen Zugriffsrechte an. Mit den Kontrollkästchen im Bereich Alle können Sie getrennt von der oberen Auswahl die Zugriffsrechte für sämtliche Backend-Benutzer einstellen.
5.9 Gelöschte Inhalte wiederherstellen | 183 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
In der Praxis hat sich auch eine Seite vom Seitentyp Papierkorb bewährt. Diese Seite wird allgemein sichtbar in den Seitenbaum integriert, sodass sämtliche Datensätze hierhin verschoben werden können, die im regulären Seitenbaum nicht mehr benötigt werden. Datensätze, die in diesem Papierkorb liegen, sind von außen für Website-Besucher nicht mehr erreichbar, können jedoch jederzeit problemlos wiederhergestellt werden, indem sie zurück in den Seitenbaum geschoben werden.
Links
Beachten Sie, dass TYPO3 in dem Fall nicht zwischen verschieben und löschen unterscheidet, da das Verschieben in den Papierkorb einem Löschen in der ursprünglichen Seite gleichkommt. Das bedeutet, dass ein Backend-Benutzer für die jeweilige Seite das Recht Bearbeite Inhalt benötigt, um Seiteninhalte in den Papierkorb zu legen, und Lösche Seite, damit er Seiten in den Papierkorb verschieben kann. Wenn mehrere BackendBenutzer in Ihrer TYPO3-Installation arbeiten, sollten Sie die Verwendung des Papierkorbs entsprechend deutlich kommunizieren und die vorhandenen Löschoptionen über die oben genannten Einstellungen weitestgehend ausblenden.
5.10 Inhalte lokal sichern Lizensiert für Markus Mueller
Problem Sie möchten die Inhalte in Ihrer TYPO3-Installation sichern, beispielsweise um regelmäßig eine Sicherheitskopie des Seitenbaums zu erstellen, die Sie bei Bedarf wieder in Ihre TYPO3-Installation einspielen können.
Lösung Verwenden Sie die Import-/Exportfunktion von TYPO3. Damit können Sie ganze Seitenbäume exportieren und als spezielle TYPO3-Datenpakete auf Ihrer Festplatte speichern. Bei Bedarf können Sie diese Dateien dann wieder über die Importfunktion einspielen (die Importfunktion wird in Rezept 5.11 beschrieben) und Inhalte wiederherstellen oder aktualisieren. Um die Exportfunktion aufzurufen, wechseln Sie in das Modul Seite und wählen die Seite bzw. den Startpunkt des Seitenbaums, den Sie exportieren möchten. Klicken Sie dazu auf das Icon der Seite und wählen Sie im Kontextmenü die Option Weitere Einstellungen. Dort finden Sie die Option Exportieren in .t3d. Nach einem Klick darauf öffnet sich im rechten Bearbeitungsbereich die Konfigurationsoberfläche der Exportfunktion. Die Oberfläche des Exportmoduls ist in mehrere Bereiche aufgeteilt. Wichtig für den Export sind vor allem die Bereiche Konfiguration sowie Datei & Voreinstellungen.
Max. Linie
Im Bereich Konfiguration legen Sie allgemeine Einstellungen zum Umfang des Exports fest und bestimmen, aus welchen Datensätzen sich die spätere Exportdatei zusammensetzt, wie tief TYPO3 im Seitenbaum nach welchen Datensätzen sucht und welche Querverbindungen dabei berücksichtigt werden sollen. Wichtig ist hier, dass Sie die Einstellung Ebe-
184 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
nen anpassen. Standardmäßig exportieren Sie nur die gewählte Seite. Mit dieser Option können Sie ganze Seitenbäume exportieren. Wir empfehlen Ihnen, die Option Unendlich zu wählen. Nachdem Sie die Auswahl mit Aktualisieren bestätigt haben, wird TYPO3 den gesamten Seitenbaum unterhalb der gewählten Seite beim Export berücksichtigen. Wechseln Sie jetzt in den Bereich Datei & Voreinstellungen und klicken Sie auf Exportdatei herunterladen. TYPO3 packt die Daten nun in ein spezielles, komprimiertes Format und liefert die fertige Datei an den Browser aus. Speichern Sie diese Datei auf Ihrer lokalen Festplatte.
Diskussion Der Export von Seiten und deren Inhalten ist einer der am häufigsten vorkommenden Anwendungsfälle. Standardmäßig werden sämtliche Datensätze in dem Seitenbaum exportiert. Inhalte mehrerer TYPO3-Instanzen können dadurch einfach und schnell ausgetauscht und aktualisiert werden. Jedoch ist es bei häufigen Exportvorgängen recht mühsam, immer wieder die gleichen Einstellungen vorzunehmen.
Lizensiert für Markus Mueller
Wenn Sie regelmäßig Inhalte sichern möchten, können Sie Ihre Exporteinstellungen als Voreinstellung speichern. Diese Einstellungen laden Sie dann zu einem späteren Zeitpunkt über den Button Laden wieder in das Exportmodul ein (zusätzlich können Sie die Voreinstellung über das Modul Aufgaben aufrufen und dort den Import direkt durchführen). Um die Voreinstellungen abzuspeichern, wechseln Sie in den Bereich Datei & Voreinstellungen und geben unter Ausgabeoptionen einen aussagekräftigen Titel und eine Beschreibung ein. Außerdem können Sie eine Anmerkung anbringen, die zum Beispiel für interne Notizen genutzt werden kann. Geben Sie nun einen Namen für die Voreinstellung ein. Der Name sollte möglichst sprechend sein. In der Praxis hat sich bewährt, hier auch wieder den Titel zu verwenden, den Sie bereits für die Exportvoreinstellungen angegeben haben. Klicken Sie abschließend auf den Button Speichern und bestätigen Sie den Speichervorgang. In der Auswahlliste erscheint nun Ihre neue Voreinstellung. Wenn Sie diese Einstellung nun wählen und laden, werden alle Ihre vorherigen Angaben wiederhergestellt. Diese Daten werden dann auch beim Import in der Vorschau angezeigt. Die Inhalte können dadurch noch einfacher und bequemer ausgetauscht werden. Was aber, wenn Sie nur bestimmte Datensätze austauschen, aktualisieren oder exportieren möchten?
Max. Linie
Hierfür gibt es im Bereich Konfiguration die Auswahlliste Einzuschließende Tabellen, mit der Sie den Export auf einzelne Tabellen begrenzen können. Möchten Sie zum Beispiel nur Seiteninhalte exportieren, wählen Sie den Eintrag tt_content und bestätigen die Auswahl mit dem Button Aktualisieren. In der Vorschau des Seitenbaums sind nun nur noch Seiteninhalte zu finden.
5.10 Inhalte lokal sichern | 185 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Eine weitere – etwas versteckte – Möglichkeit, nur bestimmte Datensätze zu exportieren, bietet die Zwischenablage. Der Export funktioniert standardmäßig über die Relationen zur Seite. Es kann jedoch auch vorkommen, dass Sie nur einzelne Inhaltselemente oder andere Datensätze exportieren möchten. Gehen Sie hierzu folgendermaßen vor: Wechseln Sie in das Modul Liste und fügen Sie ein oder mehrere Datensätze in die Zwischenablage ein (diese Schritte werden ausführlich in Rezept 5.4 beschrieben). Wählen Sie anschließend aus der Auswahlliste die Option Export. Danach öffnet sich die gewohnte Exportoberfläche, auf der Sie wie immer Ihre Einstellungen vornehmen können.
Links
Weiterhin können Sie beeinflussen, wie TYPO3 auf Verknüpfungen zu Dateien oder Extensions eingeht. Standardmäßig werden alle Datensätze, die in dem gewählten Seitenbaum liegen, beim Export berücksichtigt. Wenn Sie jedoch innerhalb dieses Seitenbaums auf Datensätze außerhalb des Seitenbaums verweisen, zum Beispiel indem Sie Links auf Seiten oder TypoScript-Templates außerhalb des Seitenbaums verwenden, werden diese Verknüpfungen beim Export ignoriert und gehen verloren. Sie erhalten dann lediglich den Hinweis, dass die Relationen nicht aufgelöst werden konnten.
Lizensiert für Markus Mueller
Bei einem Import in eine neue, leere TYPO3-Installation könnten die Relationen dann nicht wiederhergestellt werden, oder TYPO3 findet eine andere Seite mit der gleichen ID und stellt dann »falsche« Relationen her, die nicht sinngemäß sind. Wenn Sie jedoch die Querverlinkungen zu anderen Datensätzen berücksichtigen möchten, müssen Sie in der Liste Relationen zu Tabellen einschließen die jeweiligen Tabellen auswählen. TYPO3 löst daraufhin die Relation auf und berücksichtigt auch diese Datensätze beim Export, obwohl Sie sie nicht direkt ausgewählt haben. Dadurch ist sichergestellt, dass beim Import die Relationen aufrechterhalten werden können. Wenn Sie die Struktur in eine neue Struktur importieren möchten, können Sie die Relationen zu den alten Seiten auch ignorieren und den Export so gestalten, dass beim Import eine neue Seite ausgewählt werden kann. Wählen Sie dazu in dem dargestellten Seitenbaum aus der Auswahlliste den Wert Editierbar. Beim Import erscheint dann für diese Relation ein Eingabefeld, in das Sie die neue ID bzw. einen neuen Wert für die Relation eingeben können. Im Bereich Erweiterte Einstellungen können Sie zusätzlich angeben, inwiefern TYPO3 auf Abhängigkeiten zu bestimmten Extensions reagieren soll. Diesen Bereich müssen Sie nur beachten, sofern Sie auf dem Zielsystem bzw. beim Wiedereinspielen der Daten bestimmte Extensions voraussetzen müssen. Wenn Sie hier Extensions festlegen und diese beim Import nicht vorhanden sind, wird TYPO3 Sie auffordern, diese vor dem Import zu installieren. Dadurch wird sichergestellt, dass alle importierten Daten ordnungsgemäß dargestellt werden können.
Max. Linie
Bevor Sie den Export abschließen, sollten Sie einen letzten kontrollierenden Blick auf den Bereich Meldungen werfen. Wenn Sie dort vom Exportmodul Meldungen erhalten, sollten Sie nochmals die Exporteinstellungen kontrollieren. Sind keine Meldungen zu sehen, können Sie nun in den Abschnitt Datei & Voreinstellungen wechseln. Klicken Sie abschließend
186 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
auf den Button Exportdatei downloaden. Der gewünschte Seitenbaum wird dann samt Inhalt in einer komprimierten Datei zum Download angeboten, die Sie auf Ihrer lokalen Festplatte speichern können. Alternativ können Sie die Datei auch auf dem Webserver im Verzeichnis fileadmin speichern. Klicken Sie dazu auf den Button Speichern als. Darauf erfolgt die Meldung Datei gespeichert am oberen linken Seitenrand. Die Datei wird dann mit Ihren Einstellungen und den Informationen über die enthaltenen Datensätze auf Ihrer Festplatte abgelegt.
Siehe auch In Rezept 2.9 erfahren Sie, wie Sie eine vollständige Sicherungskopie der gesamten TYPO3-Installation erstellen und welche Schritte dazu nötig sind. Um diese Funktion nutzen zu können, benötigen Sie die Extension extra_page_cm_options für die zweite Optionspalette sowie die Extension imexp für die eigentliche Importfunktion. Beide Extensions sind standardmäßig in jeder TYPO3-Installation enthalten. Falls eine dieser Extensions noch nicht vorhanden ist, können Sie die Installation über den ErweiterungsManager nachholen – stellen Sie dabei sicher, dass Sie die Option Display shy extensions aktiviert haben. Lizensiert für Markus Mueller
5.11 Inhalte zwischen unterschiedlichen TYPO3Instanzen austauschen Problem Sie möchten Inhalte von einer TYPO3-Installation schnell in eine andere kopieren.
Lösung Verwenden Sie die Import-/Exportfunktion von TYPO3 wie in Rezept 5.10 beschrieben. Die so erzeugte Datei können Sie über dasselbe Modul wieder einspielen. Um die exportierten Inhalte wieder in Ihre TYPO3-Installation zurückzuschreiben, klicken Sie auf die Seite, in die Sie die Daten importieren möchten, und wählen im Kontextmenü die Option Weitere Einstellungen. Klicken Sie dort auf die Option Importieren aus .t3d. Daraufhin öffnet sich im rechten Bearbeitungsbereich die Konfigurationsoberfläche der Importfunktion.
Max. Linie
Wenn Sie die Exportdatei auf Ihrer lokalen Festplatte gespeichert haben, müssen Sie diese nun im ersten Schritt im Bereich Upload auf den Webserver laden. TYPO3 speichert diese Datei dann im Ordner fileadmin. Ansonsten muss sich die Datei schon im Verzeichnis fileadmin befinden. Danach erscheint sie in der Auswahlliste Importdatei aus-
5.11 Inhalte zwischen unterschiedlichen TYPO3-Instanzen austauschen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 187
Max. Linie
wählen. Wählen Sie diese Datei nun aus dieser Auswahlliste aus und klicken Sie anschließend auf Vorschau. Kontrollieren Sie im Abschnitt Meldungen, ob TYPO3 eventuell Fehler gefunden hat. Erst danach sollten Sie den Import durchführen, da die Daten ansonsten möglicherweise unvollständig importiert werden. Wenn Sie zufrieden mit der Vorschau sind, können Sie den Schreibvorgang mit dem Button Import bestätigen. Die importierten Datensätze finden Sie dann unterhalb der anfangs gewählten Seite.
Links
Diskussion Im Gegensatz zum Export gestaltet sich der Import sehr viel einfacher. Jedoch lauern hier auch Stolperfallen, die sich häufig durch Unachtsamkeiten einschleichen. Besonders wichtig ist es, dass Sie den richtigen Startpunkt wählen und die Datei die Inhalte enthält, die Sie wünschen. Gerade wenn Sie häufig Importe durchführen, kann die Übersicht verloren gehen. Wir empfehlen daher, die Dateien eindeutig zu benennen und zu entfernen, wenn sie nicht mehr benötigt werden. Standardmäßig ist das Modul so eingestellt, dass keine bestehenden Datensätze beschädigt werden oder verloren gehen können. Im schlimmsten Fall werden die Relationen zwischen den Datensätzen anhand der vorliegenden IDs neu berechnet, was zu unbrauchbaren Verlinkungen führt. Lizensiert für Markus Mueller
Wesentlich mehr Einfluss auf die bestehenden Inhalte können Sie im Bereich Import mit den Importeinstellungen ausüben. Wenn Sie zum Beispiel die bestehenden Datensätze aktualisieren möchten, aktivieren Sie die Option Datensätze aktualisieren und bestätigen Ihre Auswahl mit dem Button Vorschau. Bevor Sie den Import abschließen, wird Ihnen TYPO3 eine Übersicht der Datensätze ausgeben, die aktualisiert werden können. Somit haben Sie die Möglichkeit, alle Daten vorab zu kontrollieren und die Aktualisierung abzubrechen, falls etwas nicht Ihren Wünschen entspricht. Ähnlich verhält sich die Option ALLE UID-Werte erzwingen. Diese Option führt den Importbefehl ohne Vorschau durch und ersetzt alle bestehenden Datensätze mit dem gleichen ID-Wert durch die neuen Daten. Dies kann auch zu einer Aktualisierung der Datensätze führen, jedoch sollten Sie dann ganz sicher sein, dass auch alle ID-Werte übereinstimmen. Ansonsten würden Sie einen Datenverlust riskieren.
5.12 Eine Suche auf der Website integrieren Problem Sie möchten eine einfache Suche auf Ihrer Webseite integrieren, mit der Ihre Besucher schnell nach Seiteninhalten suchen können.
Max. Linie
Max. Linie 188 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Lösung Legen Sie ein Inhaltselement vom Typ Suche auf Ihre Seite. Ihre Besucher können danach standardmäßig die Seiteneigenschaften Ihrer Website durchsuchen. Die Suche unterstützt die Auswertung mehrerer Suchbegriffe, logische Verknüpfungen mit OR und Ausschlüsse mit dem Begriff NOT. Wenn Sie Ihren Suchbegriff in Anführungszeichen setzen, wird der gesamte Suchbegriff gesucht. Groß- und Kleinschreibung wird ignoriert. Der Suchbegriff TYPO3 OR Kochbuch findet zum Beispiel Seiten mit TYPO3 oder Kochbuch. Der Suchbegriff "TYPO3 Kochbuch" (inklusive Anführungszeichen) würde nur Seiten mit dem Begriff "TYPO3 Kochbuch" finden.
Diskussion Bei der Suche werden standardmäßig die Felder Titel, Untertitel, Schlüsselwörter und Beschreibung aus den Seiteneigenschaften sowie Überschriften aus allen Seiteninhalten berücksichtigt. Wenn der Besucher die Auswahl Suchen in auf Seiteninhalt ändert, werden nur Seiteninhalte, deren Überschrift und die Bildbeschreibung durchsucht. Beachten Sie, dass nur Seiten gefunden werden, auf denen auch Inhaltselemente liegen. Dadurch wird verhindert, dass Suchergebnisse zu leeren Seiten gefunden werden. Lizensiert für Markus Mueller
Um weitere Felder bei der Suche zu berücksichtigen, müssen Sie das TypoScript des Inhaltselements anpassen. Das TypoScript für die Suche ist in zwei Bereiche aufgeteilt. Der erste Teil definiert die Darstellung der Suchergebnisse und die erlaubten Suchfelder. So ist sicherstellt, dass nur freigeschaltete Felder gefunden werden können. Der zweite Teil legt den Umfang des Suchformulars fest und übergibt die zu durchsuchenden Felder an das PHP-Skript, das dann die Suche in der Datenbank durchführt. Durch folgende Angaben im TypoScript-Setup fügen Sie das Feld Inhaltsbeschreibung den erlaubten Feldern hinzu (alle Werte müssen in einer Zeile stehen): tt_content.search.20 { allowedCols = pages.title-subtitle-keywords-description-abstract : tt_content.header-bodytext-imagecaption }
Die Syntax ist dabei an die Tabellenstruktur angelehnt: Der erste Teil gibt den Namen der Tabellen an, zum Beispiel pages. Nach dem Punkt geben Sie die Felder der jeweiligen Tabelle an, die Sie mit einem Bindestrich voneinander trennen. Die anderen Angaben legen die oben erwähnten Felder fest. Um den Suchparameter im Formular zu erweitern, geben Sie folgenden Code in Ihr TypoScript-Setup ein:
Max. Linie
tt_content.search.30 { dataArray { 20.valueArray { 10.value = pages.title-subtitle-keywords-description-abstract: tt_content.header } } }
5.12 Eine Suche auf der Website integrieren | 189 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Selbstverständlich können Sie auch eigene Datenbanktabellen in die Suche integrieren. Geben Sie die nötigen Angaben an den beiden genannten Stellen im TypoScript an, damit diese von der Standardsuche berücksichtigt werden. Nachdem Sie die Änderungen gespeichert haben, werden die Inhalte bei der Suche gefunden.
Links
Lizensiert für Markus Mueller
TYPO3 unterstützt von Hause aus zwei Suchmechanismen. Einmal können Sie über das Inhaltselement Suche eine einfache Suche einbinden. Hier werden mit TYPO3-Bordmitteln die Datenbankinhalte durchsucht und auf der Webseite ausgegeben. Als Alternative können Sie eine Suche integrieren, die zwischen den Inhalten Ihrer Website Relationen herstellt und damit Suchergebnisse auch gegeneinander gewichten kann. Die Suche wird dann meist präziser. Wenn Sie eine solche Suche wünschen, sollten Sie die Indexsuche genauer anschauen. Diese wird in Rezept 5.13 näher erläutert. Die hier gezeigte Suche hat den entscheidenden Vorteil, dass die Inhalte ohne großen Aufwand auf Ihrer Website direkt gefunden werden. Um ein ähnliches Ergebnis bei der Indexsuche zu erzielen, müssen Sie eine weitere Extension aktivieren und konfigurieren. Zudem muss die Seite gecacht sein und zuvor von einem Indexmechanismus in den Suchindex aufgenommen werden, bevor die Inhalte in der Suche gefunden werden können. Im Vergleich zur Indexsuche hat die Standardsuche jedoch auch nur einen sehr begrenzten Funktionsumfang, der bei größeren Websites mit gesteigerten Anforderungen schnell an seine Grenzen stößt. Es werden zum Beispiel keine Gewichtigungen bei den Suchergebnissen vorgenommen, und die Suche ist auf eine Textsuche in den angegebenen Feldern begrenzt. Auch bei der Darstellung der Suchergebnisse ist die Standardsuche umständlich zu erweitern. Prüfen Sie daher vorab, welche Suchmöglichkeit Sie Ihren Besuchern anbieten möchten.
Siehe auch Die Alternative zu der hier gezeigten einfachen Suche wird in Rezept 5.13 näher erläutert.
5.13 Inhalte mit der Indexsuche von TYPO3 suchen und finden Problem Sie möchten Ihren Website-Besuchern die Möglichkeit bieten, die Inhalte Ihrer Website mit einer Suchmaschine zu durchsuchen. Die Suchergebnisse sollen nach Relevanz gewichtet werden und repräsentative Ergebnisse widerspiegeln.
Lösung
Max. Linie
Fügen Sie diese Zeilen in Ihr TypoScript-Setup ein: config { index_enable = 1 }
190 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Wechseln Sie anschließend in den Erweiterungs-Manager und aktivieren Sie dort die Extension mit dem Key indexed_search. Den Hinweis auf die Extension doc_indexed_ search können Sie ignorieren. Die Extension beinhaltet lediglich das Handbuch für die Extension, das Sie auch nachträglich noch installieren können. Nachdem Sie die Extension mit einem Klick auf den Button Update aktiviert haben, ist die Suchmaschine auch schon grundlegend eingerichtet. Besucht ein Benutzer eine gecachte Webseite, speichert TYPO3 im Hintergrund automatisch den Inhalt im Suchindex. Im nächsten Schritt binden Sie eine Suchmaske in Ihre Webseite ein, damit der Suchindex auch von Ihren Besuchern durchsucht werden kann. Wählen Sie dazu eine Seite, auf der Sie die Suche sowie die Suchergebnisse anzeigen lassen möchten, und legen Sie dort ein neues Inhaltselement vom Typ Plugin an. Als Plugin wählen Sie den Eintrag Indexsuche. Nach dem Speichern erscheint ein Suchformular auf der Webseite mit dessen Hilfe der Inhalt Ihrer Website komfortabel nach Suchbegriffen durchsucht werden kann. Achten Sie darauf, dass Sie das Plugin Indexsuche verwenden und nicht das Inhaltselement Suchen. Mit dem Inhaltselement Suchen kann die Indexsuche nicht durchgeführt werden (das Inhaltselement Suchen wird in Rezept 5.12 ausführlich erläutert).
Lizensiert für Markus Mueller
Diskussion Durch die Indexsuche werden zwischen den Inhalten Ihrer Website Relationen herstellt, und es wird ein sogenannter Suchindex erstellt. Anhand dieses Index können dann zum Beispiel bestimmte Suchbegriffe mit vorhandenen Indexeinträgen gegeneinander gewichten werden. Dadurch können die Suchergebnisse präziser auf den Suchbegriff abgestimmt werden, als es mit einer normalen SQL-Suche möglich wäre. Wenn Sie die neu installierte Suche über das Suchformular testen, werden Sie feststellen, dass noch keine Ergebnisse zurückgegeben werden. Dies hat den Hintergrund, dass nur Inhalte in den Suchindex aufgenommen werden, die im TYPO3-Cache liegen. So speichert TYPO3 beispielsweise keine Seiten im Cache, sobald Sie am Backend angemeldet sind. Um die Suche zu testen, müssen Sie sich also entweder am Backend abmelden oder die Seite in einem anderen Browser öffnen, in dem keine Session für einen BackendBenutzer vorliegt. Stoßen Sie die Suche erneut an, sobald Sie mit einem normalen Besucher eine Webseite besucht haben, und verwenden Sie als Suchbegriff ein Wort, dass auf der besuchten Webseite vorkommt. Danach sollten Sie ein Suchergebnis erhalten. Der Suchindex wird nur gefüllt, wenn die jeweilige Seite im TYPO3-Cache abgelegt wird. Möchten Sie also die Indexsuche aktivieren, sollten Sie diese Fehlerquellen vorab ausschließen: 1. Prüfen Sie in den Seiteneigenschaften, ob die gesamte Seite gecacht wird.
Max. Linie
Max. Linie
Stellen Sie sicher, dass das Kontrollkästchen Nicht cachen inaktiv ist.
5.13 Inhalte mit der Indexsuche von TYPO3 suchen und finden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 191
2. Eine weitere häufige Fehlerquelle ist, dass die Seiteneigenschaft Nicht suchen aktiv ist. Diese Option verhindert, dass die Seite in den Suchindex aufgenommen wird. Die Seite wird also nicht gefunden, wenn diese Option aktiv ist.
Links
3. Prüfen Sie dazu über den TypoScript-Object-Browser, ob der Wert config.no_cache auf 1 gesetzt ist. Setzen Sie den Wert auf den Standardwert 0 oder entfernen Sie die Zeile aus dem TypoScript-Code. 4. Durchsuchen Sie danach die Extension-Verzeichnisse fileadmin und typo3conf/ext/ nach dem Begriff no_cache. An den Fundstellen sollten Sie prüfen, ob diese Funktion aufgerufen wird: $GLOBALS['TSFE']->set_no_cache();
Lizensiert für Markus Mueller
Prüfen Sie, weshalb diese Funktion aufgerufen wird, und entfernen Sie diesen Funktionsaufruf. Die Funktion deaktiviert das TYPO3-Caching, bremst dadurch einerseits die allgemeine Performance der Website und verhindert andererseits, dass Seiteninhalte in den Suchindex übernommen werden. Sie sollten daher auf diese Funktion unbedingt verzichten. Nutzen Sie das Syslog bei der Suche nach Stellen, an denen der no_cache-Parameter aufgerufen wird. TYPO3 protokolliert jeden Aufruf des no_cache-Parameters im Syslog (in Rezept 2.11 erfahren Sie, wie Sie das Syslog aktivieren und hierfür nutzen können). Alternativ können Sie auch die Option disableNoCacheParameter im Install-Tool aktivieren oder diese Zeile in die Datei localconf.php einfügen: $TYPO3_CONF_VARS['FE']['disableNoCacheParameter'] = 1;
TYPO3 unterbindet dadurch die Verwendung des no_cache-Parameters, was jedoch auch zu Nebeneffekten bei bereits installierten Extensions führen kann. Sie sollten diese Einstellung daher nur dann aktivieren, wenn Sie Nebeneffekte ausschließen können. Finden Sie solche Stellen im Code, sollten Sie die Ursache dafür unbedingt prüfen. TYPO3 stellt ausgereifte Caching-Lösungen bereit, die bei der Extension-Entwicklung genutzt werden können. Lesen Sie hierzu zuerst die relevanten Rezepte zum Thema Caching in Rezept 11.2, bevor Sie die Suche weiter einrichten. Die Suche wird nur dann verlässlich laufen und repräsentative Ergebnisse zurückgeben, wenn Ihre Webseiten sinnvoll gecacht werden. 5. Zum anderen werden Inhalte, die über ein *_INT-Objekt ausgegeben werden, nicht im Cache abgelegt (wenn Ihnen der Begriff *_INT-Objekt noch fremd ist, sollten Sie das Reztept 11.12 lesen). Nachdem Sie diese Anpassungen vorgenommen haben, sind die Voraussetzungen geschaffen, dass die Inhalte über die Suche durchsucht werden können.
Siehe auch
Max. Linie
Die Suche ist eher auf Komfort und Features ausgelegt und glänzt durch die Integration in TYPO3. Bei Websites mit über 1.000 Seiten zeigen sich jedoch auch die Grenzen der
192 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Indexsuche, vor allem bei der Auswertung der Relationen von Schlüsselwörtern. Die Indexsuche ist nicht auf größere Datenmengen ausgelegt. Es kann dann zu Speicherüberläufen und auch zu Abstürzen des Datenbankservers kommen. Es gibt Ansätze, weitere Suchmaschinen wie Lucene (http://lucene.apache.org/java/docs/) oder Mnogosearch (http:// www.mnogosearch.org/) in TYPO3 zu integrieren. Wenn Sie nach Alternativen Ausschau halten, lohnt sich eine Suche nach diesen beiden Begriffen auf http://typo3.org/extensions/.
5.14 Mit IRRE verknüpfte Datensätze bearbeiten Problem Sie arbeiten mit einem TYPO3-System, auf dem eine Extension installiert ist, die das seit TYPO3-Version 4.1 verfügbare Prinzip des Inline Relational Record Editing – genannt IRRE – verwendet. Dabei erscheinen die Elemente in den Backend-Formularen teilweise in einem völlig neuartigen Layout, und es sind Icons zu sehen, die Ihnen bisher unbekannt waren.
Lizensiert für Markus Mueller
Nun wollen Sie wissen, was diese Icons bedeuten, welche zusätzlichen Möglichkeiten der Bearbeitung im Backend durch IRRE angeboten werden und wie Sie diese komfortabel nutzen können.
Lösung Öffnen Sie eines der neuen Elemente so, wie Sie es gewohnt sind, um es zu bearbeiten. Es erscheint ein auf den ersten Blick vertraut anmutendes Backend-Formular, das bei näherem Hinsehen jedoch einige kleinere Unterschiede aufweist. In Abbildung 5-9 sehen Sie ein solches Formular, bei dem sich die verknüpften Elemente noch im Urzustand der Ansicht, also im zusammengeklappten Zustand, befinden. Je nachdem, wie die Extension vom Autor angelegt wurde, müssen Sie allerdings zunächst in den Listenmodus wechseln, um die einzelnen Einträge in den Tabellen der Hauptelemente, Unterelemente und Verknüpfungen bearbeiten zu können, denn oftmals sind sie in der normalen Seitenansicht nicht sichtbar. Wenn Sie nun auf einen der beiden Titel der Unterelemente klicken, öffnet sich das dazugehörige Formular des verknüpften Elements, und Sie können es bearbeiten. Eine entsprechende aufgeklappte Ansicht des betroffenen Felds Unterelemente finden Sie in Abbildung 5-10. Wenn Sie danach erneut auf den Titel klicken, wird das dazugehörige Formular wieder zusammengefaltet, und Sie können ein anderes Unterelement bearbeiten. Je nach Einstellung der Extension können Sie dabei gleichzeitig mehrere Unterelemente oder nur genau eines im aufgeklappten Zustand betrachten.
Max. Linie
Max. Linie 5.14 Mit IRRE verknüpfte Datensätze bearbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 193
Links
Abbildung 5-9: Ein Hauptelement mit verknüpften Unterelementen im zusammengeklappten Zustand
Lizensiert für Markus Mueller
Abbildung 5-10: Ein Hauptelement mit verknüpften Unterelementen im aufgeklappten Zustand Beachten Sie dabei jedoch, dass sämtliche Änderungen, die Sie in den Unterelementen vornehmen, erst dann gespeichert werden, wenn Sie das dazugehörige Hauptelement speichern.
Max. Linie
Max. Linie 194 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Wenn Sie ein neues Unterelement anlegen wollen, können Sie dies je nach Einstellung der Extension ebenfalls direkt im Formular des dazugehörigen Hauptelements tun. Dazu dient der Link Create new, der mithilfe einer entsprechenden Voreinstellung zusätzlich noch den Tabellentitel der zu erstellenden Datensätze verwenden kann, sodass dort z.B. auch Create new Address stehen könnte. Neben den bekannten Icons Informationen, Neues Element anlegen, Sortieren, Ausblenden und Löschen erscheint je nach Einstellung der Extension ein weiteres Icon, nämlich ein orangefarbenes Symbol aus zwei sich kreuzenden Doppelpfeilen. Dieses Symbol dient zum Verschieben einzelner Unterelemente innerhalb des übergeordneten Elements. Klicken Sie darauf und verschieben Sie das Element mit gehaltener Maustaste an die gewünschte Stelle, wie in Abbildung 5-11 gezeigt.
Lizensiert für Markus Mueller
Abbildung 5-11: Verschieben eines Unterelements mit der Drag-and-Drop-Funktionalität von IRRE Beachten Sie dabei jedoch auch, dass Änderungen in der Reihenfolge der Elemente erst dann gespeichert werden, wenn Sie das dazugehörige Hauptelement speichern.
Diskussion
Max. Linie
Seit TYPO3-Version 4.1 stellt der Kern von TYPO3 eine neue Funktionalität zur Verknüpfung zwischen mehreren Datensätzen zur Verfügung. Neben den bekannten Selectboxen, die es als sogenannte Gruppenfelder auch mit entsprechendem Auswahl-Wizard gibt, tritt nun eine völlig andere Art der Bearbeitung verknüpfter Datensätze auf den Plan. Hauptelemente und deren Unterelemente können jetzt gleichzeitig innerhalb eines einzigen Backend-Formulars editiert werden. Sie sind also gleichsam in Reihe – englisch inline – geschaltet. Die Methode heißt folglich Inline Relational Record Editing oder abgekürzt einfach IRRE.
5.14 Mit IRRE verknüpfte Datensätze bearbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 195
Max. Linie
Eine der Grundregeln, die Sie bei der Arbeit mit IRRE immer beachten müssen, haben wir bereits in der Lösung erwähnt. Jedoch sei auch hier nochmals ausdrücklich darauf hingewiesen:
Links
Beachten Sie immer, dass sämtliche Änderungen, die Sie in den Unterelementen vornehmen, erst dann gespeichert werden, wenn Sie das dazugehörige Hauptelement speichern. Die einzige Ausnahme hiervon wird beim Erzeugen neuer Elemente gemacht, die per Ajax-Call zumindest als leere Elemente bereits in der Datenbank angelegt werden. Änderungen daran werden allerdings auch erst nach dem Speichern des Hauptelements endgültig übernommen.
Eine weitere Eigenart der IRRE-Verknüpfungen ist, dass die Unterelemente sich an verschiedenen Speicherorten befinden können, nachdem Sie ein Element kopiert haben. Es ist dem Autor der Extension überlassen, ob sich Unterelemente beim Kopieren mit ihrem Hauptelement mitbewegen dürfen oder nicht. Dürfen sie sich mitbewegen, befinden sich nach dem Kopiervorgang sowohl das Hauptelement als auch dessen Unterelemente auf der gleichen Seite. Andernfalls befinden sich alle Unterelemente in einem dafür vorgesehenen Ordner. Falls Sie die kopierten Elemente also nicht sofort an der erwarteten Stelle vorfinden, könnte das an einer entsprechend abweichenden Einstellung der Extension liegen. Lizensiert für Markus Mueller
Neben der in der Lösung gezeigten Variante der direkten Erzeugung von Elementen aus dem Formular des Hauptelements heraus gibt es übrigens noch eine zweite Möglichkeit, einem Hauptelement per IRRE Unterelemente zuzuordnen. Während es auf der Seite der Hauptelemente die gezeigten zusätzlichen aufklappbaren Listen von Formularen gibt, in denen sich die Unterelemente befinden, verfügen die Unterelemente nämlich oftmals selbst über ein Feld, in dem man angezeigt bekommt, zu welchem Hauptelement sie gehören. Da es sich bei diesem Feld um eine Selectbox handelt, kann man hier selbstverständlich nicht nur ablesen, welche Hauptelemente auf dieses Element zugreifen, sondern auch quasi rückwärts verknüpfend weitere Hauptelemente hinzufügen. Sie können also für die Erzeugung und spätere Verknüpfung von Elementen verschiedene Personen beauftragen, von denen jeder jeweils eingeschränkte Rechte hat und nur genau eine der beiden Tätigkeiten ausüben darf. Ein Beispiel wäre ein Team von Redakteuren, die Datensätze von Urlaubsorten und dazugehörigen Pauschalreiseangeboten anlegen, diese aber nicht verknüpfen dürfen. Die Verknüpfung von Ort und Angebot mit einem entsprechenden saisonabhängigen Preis wird danach von der Verkaufsabteilung vorgenommen, die wiederum nichts an den Inhalten der verknüpften Elemente ändern darf.
Max. Linie
Damit haben wir auch gleich die dritte Neuerung von IRRE beschrieben, denn es ist nun nicht nur möglich, die beiden verknüpften Elemente im Backend zu bearbeiten, sondern auch den Eintrag in der Verknüpfungstabelle selbst. Diese sogenannten IntermediateTabellen haben eigene Backend-Formulare, in denen z.B. weitere Attribute hinzugefügt
196 | Kapitel 5: Inhalte verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
werden können. Im Fall der Verknüpfung von Urlaubsorten und Angeboten wären das z.B. ein Preis oder ein Zeitraum, in dem das Angebot Gültigkeit haben soll. Insgesamt hat sich der Komfort beim Bearbeiten verknüpfter Elemente mit TYPO3 durch die Einführung von IRRE sicherlich deutlich erhöht. Jedoch sollte man dabei den Faktor Performance nicht außer Acht lassen, denn momentan wird nur die Erzeugung neuer Elemente bei Bedarf per Ajax-Call realisiert. Beim Auslesen der verknüpften Elemente werden nicht nur alle Daten in der Datenbank gelesen, sondern auch alle dazugehörigen Formulare im Backend erzeugt. Sie sind zwar zunächst nicht sichtbar, aber der gesamte HTML-Code und die dazugehörigen Elemente wie Bilder oder Rich Text Editor-Instanzen werden bereits komplett im Formular vorgehalten und nur ein- bzw. ausgeblendet. Solange hier nicht ebenfalls bedarfsgerecht mit Ajax-Calls gearbeitet wird, um die Daten aufgeklappter Formulare nachträglich vom Server zu beziehen, sollten Sie daher möglichst sparsam im Umgang mit IRRE-Elementen sein.
Siehe auch Wenn Sie einfach nur einmal ausprobieren wollen, wie man mit IRRE im Backend arbeiten kann, installieren Sie sich doch einfach die Extension Tutorial for Inline Relational Record Editing IRRE, die Sie unter dem Extension-Key irre_tutorial im TER finden. Lizensiert für Markus Mueller
Wenn Sie wissen wollen, wie Sie nun Ihre eigenen Extensions mithilfe von IRRE komfortabler gestalten können, lesen Sie dazu die Rezepte 17.9 und 17.10.
Max. Linie
Max. Linie 5.14 Mit IRRE verknüpfte Datensätze bearbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 197
Vakat Lizensiert für Markus Mueller
First
Kapitel 6
KAPITEL 6
Das Backend anpassen
6.0
Einführung
Lizensiert für Markus Mueller
Das Backend stellt die zentrale Oberfläche für den Umgang mit den Daten Ihrer Website dar. Über das Backend können Sie Datenbankinhalte und Dateien intuitiv über den Webbrowser verwalten oder Einstellungen an Ihrer TYPO3-Installation vornehmen. Die Oberfläche lässt sich dabei sehr flexibel an eigene Bedürfnisse anpassen. Sie können Eingabefelder ausblenden oder Optionen in Auswahlmenüs umbenennen. Sogar die grundlegende Aufteilung des Frameset lässt sich auf Ihre jeweiligen Arbeitsgewohnheiten einstellen. In Rezept 6.1 erfahren Sie, wie Sie die Standardaufteilung ändern können, um etwa die linke Modulleiste auszublenden und auf dem Bildschirm Platz für die Bearbeitungsformulare zu schaffen. Sämtliche Funktionen, die Sie im Backend verwenden können, werden durch sogenannte Backend-Module zur Verfügung gestellt. Dabei stellt jedes Modul eine funktionale Einheit im Backend dar, die auf eine bestimmte Funktion spezialisiert ist, mit der Sie bestimmte Arbeitsvorgänge erledigen können. Die Module sind wiederum in Hauptmodule gruppiert. Folgende Hauptmodule sind standardmäßig vorhanden: Web Hier verwalten Sie über den Seitenbaum die Datenbankinhalte Ihrer Website. Sie werden erfahrungsgemäß hauptsächlich mit diesen Modulen arbeiten. Datei Hier verwalten Sie über eine Ordnerstruktur Dateien auf dem Dateisystem des Servers. Wenn Sie Dateien in Ihre Website integrieren möchten, können Sie diese hier ablegen. Benutzerwerkzeuge Über diese Module können Benutzereinstellungen, Aufgaben und Workspaces des aktuell angemeldeten Benutzers bearbeitet werden.
Max. Linie
Max. Linie | 199 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Admin-Werkzeuge Hier finden Sie Module für administrative Aufgaben, wie etwa eine Liste aller angemeldeten Benutzer oder den Erweiterungs-Manager, mit dem Sie Erweiterungen installieren können.
Links
Hilfe Hier finden Sie Module, die Ihnen helfen, TYPO3 besser zu verstehen, beispielsweise nützliche Dokumentationen zur Verwendung der Module oder TypoScript. Jedes dieser Hauptmodule können Sie mit einem Klick auf den Titel kompakt darstellen, um nicht benötigte Module auszublenden und wieder ausklappen. Eine ausführliche Funktionsbeschreibung zu den vorhandenen Modulen erhalten Sie über das Modul Über Module im Hauptmodul Hilfe. Eine besondere Bedeutung hat das Hauptmodul Web, denn jedes der untergeordneten Module kann über die TYPO3-eigene Konfigurationssprache TSconfig angepasst werden. Mit TSconfig-Befehlen geben Sie Anweisungen an bestimmte Module im Backend, die diese Einstellungen dann interpretieren und entsprechend umsetzen. Dabei ist TSconfig von der Schreibweise her ähnlich wie TypoScript aufgebaut – mit dem Unterschied, dass Sie mit TypoScript die Inhaltsausgabe im Frontend Ihrer Website beeinflussen und TSconfig dazu verwenden, die Oberfläche und Funktionalität des Backends anzupassen. Lizensiert für Markus Mueller
Beispielsweise können Sie im Seitenmodul per TSconfig-Anweisungen die vorhandenen Inhaltsspalten reduzieren. In Rezept 6.2 erfahren Sie, wie Sie mit wenigen Zeilen TSconfig-Code das Modul Seite anpassen können, etwa wenn Sie weniger als die vier standardmäßig vorhandenen Inhaltsspalten benötigen. Je nach Gestaltungsvorgaben der Website kann es jedoch auch vorkommen, dass Sie eine unterschiedliche Anzahl von Inhaltsspalten benötigen. Bei vielen Projekten werden Sie daher eine andere Spaltenanzahl verwenden wollen. In den Rezepten 6.2, 6.3 und 6.4 erfahren Sie, wie Sie die Inhaltsspalten im Seitenmodul anpassen können. Der TSconfig-Code kann dabei entweder im Feld TSconfig der Seiteneigenschaften oder in den Einstellungen von Backend-Benutzern oder Benutzergruppen liegen. Wenn Sie Änderungen auf bestimmte Seitenbäume anwenden möchten, sollten Sie den Code in die Seiteneigenschaften einbinden. Sollen die Änderungen lediglich einzelne Backend-Benutzer oder -Benutzergruppen betreffen, geben Sie den TSconfig-Code in das Benutzerprofil ein. Der TSconfig-Code, der in den Seiteneigenschaften eingegeben wird, wird auch als Seiten- bzw. Page-TSconfig bezeichnet. TSconfig-Angaben aus dem Benutzer- oder Gruppendatensatz werden als Benutzer-/User-TSconfig bezeichnet.
Max. Linie
Eine Besonderheit von Page-TSconfig ist, dass sämtliche Angaben auf die jeweiligen Unterseiten vererbt werden. Das bedeutet, dass Sie über Page-TSconfig sehr komfortabel auch umfangreiche Seitenbäume anpassen können. Wenn Sie eine TSconfig-Einstellung für eine bestimmte Seite oder einen Seitenbaum wieder deaktivieren möchten, müssen Sie dies in dem Feld TSconfig der jeweiligen Unterseite angeben. Zudem überschreiben die Angaben aus dem User-TSconfig stets die Seiten-TSconfig-Angaben, sodass Sie die TSconfig-Einstellungen für den jeweiligen Seitenbaum für bestimmte Benutzer oder Benutzergruppen
200 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
so auch aufheben oder erweitern können. In den folgenden Rezepten finden Sie bei jedem Codeabschnitt einen Hinweis, der Ihnen sagt, in welches der beiden Felder der jeweilige TSconfig-Code eingegeben werden muss. Durch diese Konfigurationsmöglichkeiten können Sie das Backend sehr flexibel anpassen, zudem sind sehr feine Einstellungsmöglichkeiten auf der Formularebene möglich. So können Sie per Seiten-TSconfig definieren, wie bestimmte Optionen in den Auswahllisten ausgegeben werden oder welche Felder im Modul oder den Eingabeformularen angezeigt werden sollen. Dadurch, dass nur noch die wesentlichen Bearbeitungsmöglichkeiten angeboten werden, wird die Verwendung des Backends erfahrungsgemäß leichter. Die Rezepte 6.5 und 6.6 befassen sich eingehend mit diesen Möglichkeiten. In Rezept 6.7 erfahren Sie, wie Sie bestehende Eingabefelder anpassen können, um beispielsweise ein einzeiliges Eingabefeld in ein mehrzeiliges Textfeld umzuwandeln. Darüber hinaus behandelt das Rezept 6.8, welche Möglichkeiten Sie haben, die Werte in den Feldern zu validieren und so vor dem Speichern in der Datenbank zu überprüfen. Wenn Sie die Position von Formularfeldern anpassen möchten, finden Sie in den Rezepten 6.9 und 6.10 die nötigen Hintergrundinformationen dazu. Rezept 6.9 beschreibt, wie Sie die Position einzelner Eingabefelder anpassen können, etwa um eigene Fomularfelder an einer bestimmten Position einzubinden oder logische Feldgruppen zu bilden.
Lizensiert für Markus Mueller
Bei umfangreichen Formularen können Sie die Felder auch mehrspaltig in einer Zeile anordnen. Das hat den Vorteil, dass die Übersichtlichkeit erhöht wird und das Formular leichter bearbeitet werden kann. In Rezept 6.10 erfahren Sie, wie Formularfelder – auf ähnliche Art und Weise – über mehrere Spalten verteilt werden, beispielsweise um sie nebeneinander zu platzieren. Die Formulare wirken dadurch meist aufgeräumter und sind besser handhabbar.
6.1
Die Seitenaufteilung im Backend beeinflussen
Problem Sie möchten die Aufteilung des Backends beeinflussen, um zum Beispiel mehr Platz für die Inhaltseingabe zu schaffen.
Lösung
Max. Linie
Aktivieren Sie in Ihren Benutzereinstellungen unter Beim Start die Option Schmale Ansicht im Backend verwenden. Diese Ansicht wurde speziell für Benutzer mit kleinen Bildschirmen entwickelt. Die Fensterbereiche Seitenbaum und Bearbeitung werden dadurch nacheinander eingeblendet, was sehr viel Platz spart. Das heißt, Sie wählen zuerst die gewünschte Seite im Seitenbaum und erhalten daraufhin das Bearbeitungsformular in einem eigenen Frame.
6.1 Die Seitenaufteilung im Backend beeinflussen | 201 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Diskussion
Links
TYPO3 wurde für eine Auflösung von 1.024 x 768 Pixeln oder höher ausgelegt. Manche Bildschirme – beispielsweise von Laptops – zeigen dadurch das Backend nur unvollständig an, was die Bedienung erschwert. Um das Arbeiten auf kleinen Bildschirmen angenehmer zu gestalten, können Sie durch folgende Einstellungen gerade nicht benötigte Elemente ausblenden. Blenden Sie den Seitenbaum aus, indem Sie auf den Rahmen zwischen Seitenbaum und Eingabemaske klicken. Daraufhin verschwindet der Seitenbaum, sodass Sie mehr Platz für die Bearbeitung der Inhalte haben und die Eingabeformulare vollständig sehen. Um weiter Platz zu sparen, können Sie die Erklärungen unterhalb der Eingabefelder ausblenden, indem Sie in Ihren Benutzereinstellungen die Option Hilfetexte anzeigen, wenn möglich deaktivieren. Die ausführliche Feldbeschreibung finden Sie weiterhin über die Icons der kontextsensitiven Hilfe, wenn Sie in der Auswahlliste Kontext-sensitive Hilfe die Option Nur Hilfesymbol anzeigen wählen. Wenn Sie auf solch ein Symbol klicken, erhalten Sie eine ausführliche Hilfe mit Beschreibung und weiterführenden Links. Erfahrene Benutzer können diese Icons mit der Option Deaktiviere Inhalt-Kontextmenüs auch ganz ausblenden. Lizensiert für Markus Mueller
Siehe auch In Rezept 7.4 erfahren Sie, wie Sie den Frame für den Seitenbaum verbreitern oder schmaler machen.
6.2
Anzahl der Inhaltsspalten erhöhen
Problem Sie benötigen mehr als vier Inhaltsspalten für die Inhaltseingabe.
Lösung Erweitern Sie den Wertebereich für die Inhaltsspalten, in dem Sie das TCA der Tabelle tt_content über eine Extension anpassen. Der Wertebereich für die Inhaltsspalten wird im TCA der Tabelle tt_content an folgender Stelle festgelegt: $TCA['tt_content']['columns']['colPos']['config']['items'][]
Über eine Extension können Sie diesen Wertebereich erweitern. Geben Sie dazu in der Datei ext_tables.php folgenden Code ein:
Max. Linie
t3lib_div::loadTCA('tt_content'); $TCA['tt_content']['columns']['colPos']['config']['items']['4']['0'] = 'Fünfte Spalte'; $TCA['tt_content']['columns']['colPos']['config']['items']['4']['1'] = 4;
202 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Warum verwenden wir hier als Beschreibung Fünfte Spalte und als Wert die Zahl 4? Der Grund dafür liegt darin, wie PHP Arrays zählt. Der Array-Index beginnt in PHP immer bei 0. Für die fünfte Spalte vergeben wir daher den Wert 4. Die neue Spalte erscheint nun bei jedem Inhaltselement in der Auswahlliste Spalten. Abschließend müssen Sie diese neue Spalte noch im Seitenmodul freischalten. Öffnen Sie dazu die Seiteneigenschaften der Seite, in der Sie die zusätzliche Spalte aktivieren möchten, und fügen Sie den folgenden TSconfig-Code in das Feld TSconfig ein (TYPO3 vererbt diese Einstellung auf sämtliche Unterseiten): mod { SHARED.colPos_list = 1,0,2,3,4 }
Im Backend wird die neue Spalte wie gewünscht auf Position fünf neben der Randspalte angezeigt.
Diskussion
Lizensiert für Markus Mueller
Standardmäßig stellt TYPO3 Ihnen vier Inhaltsspalten zur Verfügung. Die normale Inhaltsspalte ist mit dem Wert 0 definiert, 1 ist der linken Spalte zugeordnet, 2 steht für die rechte Spalte, und 3 bezeichnet die Randspalte. Die Erweiterung der Spalten folgt immer diesem Muster: t3lib_div::loadTCA('tt_content'); $TCA['tt_content']['columns']['colPos']['config']['items']['n']['0'] = 'LLL:EXT:cms/locallang_ttc.php:colPos.I.n'; $TCA['tt_content']['columns']['colPos']['config']['items']['n']['1'] = n;
n steht dabei für eine beliebige Zahl. Sie können auf diese Weise bis zu 999 Spalten anlegen.
Siehe auch In Rezept 6.4 erfahren Sie, wie Sie Inhaltsspalten umbenennen. Wenn Sie deutlich mehr als sechs Inhaltsspalten benötigen, sollten Sie vor dem Erweitern der Inhaltsspalten Ihre Datenstruktur überdenken und einen Blick auf die TemplaVoilà-Extension werfen. Mehr Informationen zu dieser Extension finden Sie unter folgender Adresse: http://typo3.org/ extensions/repository/view/templavoila/.
6.3
Anzahl der Inhaltsspalten verringern
Problem
Max. Linie
Sie möchten die Anzahl der Inhaltsspalten verringern, um die Inhaltseingabe auf die Spalten zu begrenzen, die auf der Website angezeigt werden.
6.3 Anzahl der Inhaltsspalten verringern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 203
Max. Linie
Links
Lösung Wählen Sie die Seite, auf der die Inhaltsspalten verringert werden sollen, und öffnen Sie die Seiteneigenschaften. Geben Sie dann folgenden Code in das Feld TSconfig ein: mod.web_layout { tt_content.colPos_list = 0,2 }
Mit diesen Einstellungen werden nur noch die Inhaltsspalten Normal und Rechts angezeigt.
Diskussion
Lizensiert für Markus Mueller
Durch die oben genannte Angabe wird zwar die Anzeige im Seitenmodul eingeschränkt, im Auswahlfeld der Inhaltselemente kann die Spalte jedoch noch geändert werden. Wenn Inhaltselemente über dieses Feld geändert und abgespeichert werden, können sie im Seitenmodul nicht mehr dargestellt werden, da die entsprechende Spalte ausgeblendet wurde. Um dies zu verhindern, sollten Sie daher zusätzlich den Eintrag für die Inhaltsspalte in der Auswahlliste Spalten entfernen. Fügen Sie dazu zusätzlich zu dem anfangs genannten Code noch die folgenden Zeilen hinzu und geben Sie diesen Code in das Feld TSconfig in den Seiteneigenschaften ein: TCEFORM.tt_content { colPos.removeItems = 1,3 }
Beachten Sie, dass diese Angaben – wie alle TSconfig-Einstellungen – auf die unteren Seiten vererbt werden und somit ganze Seitenbäume beeinflussen können. Falls Sie auf untergeordneten Seiten wieder mehr Inhaltsspalten benötigen, können Sie die Angaben überschreiben. Diese gelten dann wiederum für alle untergeordneten Seiten. Eine Übersicht der vergebenen TSconfig-Einstellungen erhalten Sie über das Modul Info. Wählen Sie dort die Option Seiten-TSconfig, und Sie erhalten daraufhin eine Übersicht aller TSconfig-Optionen, die Sie im Seitenbaum verwenden.
Siehe auch In Rezept 6.4 erfahren Sie, wie Sie Inhaltsspalten umbenennen.
6.4
Inhaltsspalten umbenennen
Problem
Max. Linie
Sie möchten die Inhaltsspalten umbenennen, um deren Verwendung intuitiver zu machen.
204 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lösung Standardmäßig stellt TYPO3 Ihnen vier Inhaltsspalten zur Verfügung. Die normale Inhaltsspalte ist mit dem Wert 0 definiert, 1 ist der linken Spalte zugeordnet, 2 steht für die rechte Spalte und 3 bezeichnet die Randspalte. Um bestehende Spalten umzubenennen, geben Sie Folgendes in Ihr Seiten-TSconfig-Feld ein: TCEFORM.tt_content { colPos.altLabels.0 colPos.altLabels.1 colPos.altLabels.2 colPos.altLabels.3 }
= = = =
Normale Spalte Linke Spalte Rechte Spalte Randspalte
Diskussion
Lizensiert für Markus Mueller
Wenn Sie Backend-Benutzer haben, die mit den oben genannten deutschen Bezeichnungen wenig anfangen können, ist es ebenfalls möglich, mehrsprachige Labels zu erzeugen. Verwenden Sie dazu die von TYPO3 zur Verfügung gestellten Möglichkeiten, das Backend mehrsprachig zu gestalten. TYPO3 erkennt die Spracheinstellungen des angemeldeten Backend-Benutzers und zeigt in den Feldern die entsprechenden Sprachwerte an. Im TSconfig-Feld setzen Sie lediglich einen Wert ein, der auf den entsprechenden Wert in der Sprachdatei zeigt. Dieser Zeiger ist immer nach folgendem Muster aufgebaut: LLL:EXT:extension_key/locallang.xml:zeiger = Sprachwert
Mit LLL: legen Sie fest, dass Sie einen dynamischen Sprachwert lesen möchten. EXT: bedeutet, dass Sie den Extension-Ordner der Extension anwählen. Das ist standardmäßig der Ordner typo3conf/ext/. Danach folgt der Extension-Key und der Name der Sprachdatei. Mit dem Wert nach dem Doppelpunkt zeigen Sie auf den Sprachwert in der Sprachdatei. Da die Sprachwerte aus dem TCA der Tabelle tt_content geändert werden, sollten Sie die Datei demgemäß locallang_tca.xml nennen. XML-Dateien werden von TYPO3 automatisch als Sprachdateien erkannt, wenn sie mit locallang beginnen. (In Rezept 17.7 erfahren Sie mehr über den Aufbau dieser Sprachdateien und wie Sie eigene Sprachwerte hinzufügen können.) Zusätzlich gibt es spezielle Extensions, mit denen andere Programmierer oder Community-Mitglieder weitere Übersetzungen in diese Dateien einpflegen können. In Rezept 20.4 erfahren Sie mehr darüber, wie Übersetzungen dieser Dateien standardkonform erstellt und verwaltet werden.
Max. Linie
Auf diese Sprachwerte greifen Sie nun über das Seiten-TSconfig zu. Dabei erkennt TYPO3 anhand der Spracheinstellungen des Backend-Benutzers die Sprache und liest die entsprechenden Sprachwerte aus der Datei. Für den Fall, dass einer der Sprachwerte nicht in der gewünschten Sprache vorhanden ist, greift TYPO3 auf den Default-Wert zurück. Mit folgendem Seiten-TSconfig-Code weisen Sie die Sprachwerte den beiden ersten Listeneinträgen zu:
6.4 Inhaltsspalten umbenennen | 205 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
TCEFORM.tt_content { colPos.altLabels.0 = LLL:EXT:extension_key/locallang_tca.xml:colPos.I.0 colPos.altLabels.1 = LLL:EXT:extension_key/locallang_tca.xml:colPos.I.1 }
Links
Wenn Sie, wie in Rezept 6.2 beschrieben, eigene Inhaltsspalten erzeugt haben, sollten Sie diese auch mehrsprachig auslegen. Geben Sie dazu folgenden Code in die Datei ext_tables. php ein: $TCA['tt_content']['columns']['colPos']['config']['items']['4']['0'] = 'LLL:EXT:extension_key/locallang_tca.xml:colPos.I.4';
Siehe auch In Rezept 6.2 erfahren Sie, wie Sie die Anzahl der Inhaltsspalten erhöhen können. Dagegen erläutert Rezept 6.3 die nötigen Schritte, um die Anzahl der Inhaltsspalten zu verringern. Mehr über die Entwicklung von Extensions erfahren Sie in Kapitel 16; dort wird auch der Umgang mit dem TCA genauer erläutert.
6.5
Auswahllisten optimieren
Lizensiert für Markus Mueller
Problem Sie möchten in Auswahllisten die Auswahlmöglichkeiten in Backend-Eingabefeldern begrenzen, neue Optionen hinzufügen oder bestehende Einträge umbenennen.
Lösung Passen Sie die Auswahllisten über die TCEFORM-Funktionen removeItems, addItems oder altLabels an. Jede dieser Funktionen muss eindeutig einem Feld zugewiesen werden. Dazu benötigen Sie den Tabellen- und den Feldnamen. Anhand dieser beiden Werte formulieren Sie dann den eigentlichen TSconfig-Befehl, den Sie in das Feld TSconfig einer Seite eingeben. Sämtliche Eingabemasken unterhalb dieser Seite werden dementsprechend angepasst. Mit removeItems blenden Sie einzelne Optionen aus. Der Funktionsaufruf folgt dabei diesem Muster: TCEFORM.tabelle.feld.removeItems = wert
Der Platzhalter wert entspricht dabei dem Wert der Option in der Auswahlliste. Zum Beispiel können Sie damit die Auswahlliste Spalten anpassen, wenn Sie – wie in Rezept 6.3 beschrieben – die Inhaltsspalten im Modul Seite reduziert haben. Mit folgendem TSconfigBefehl blenden Sie die Spalten Links und Rand aus:
Max. Linie
TCEFORM.tt_content { colPos.removeItems = 1,3 }
206 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Möchten Sie das Auswahlfeld erweitern, fügen Sie mit dem Befehl addItems neue Optionen hinzu. Geben Sie dabei mit folgendem TSconfig-Code den Wert und den Titel der neuen Option an: TCEFORM.tabellen_name.feld_name.addItems.feld_wert = feld_titel
Achten Sie darauf, dass der Wert nur einmal in der Auswahlliste vorkommen darf, da TYPO3 die Werte ansonsten nicht eindeutig interpretieren kann. Wenn Sie zum Beispiel einen neuen Überschriftentyp erzeugen möchten, werden Sie das Feld header_layout in der Eingabemaske für die Tabelle tt_content anpassen müssen. Für das folgende Beispiel legen wir eine neue Überschrift mit dem Wert 6 und dem Titel Eigenes Layout an: TCEFORM.tt_content.header_layout.addItems.6 = Eigenes Layout
Nach dem Abspeichern der Seiteneigenschaften wird der neue Überschriftentyp dann wie gewünscht in der Auswahlliste Typ im Bereich Überschrift eingebunden (in Rezept 15.6 erfahren Sie, wie Sie eigene Überschriftentypen auch über eine Extension erzeugen können). Mit altLabels vergeben Sie alternative Beschriftungen für vorhandene Einträge in Auswahllisten. Der Code ist dabei wie bei addItems aufgebaut und unterscheidet sich lediglich im Funktionsaufruf: Lizensiert für Markus Mueller
TCEFORM.tabellen_name.feld_name.altLabels.feld_wert = feld_titel
Über den Feldwert sprechen Sie die jeweilige Option in der Auswahlliste an, deren Titel Sie abändern möchten. Der Wert feld_titel ersetzt den entsprechenden Titel der Option. Mit folgendem TSconfig-Code ändern Sie beispielsweise die Bezeichnung für die Überschrift 1 von Layout 1 auf die eigene Bezeichnung Seitenüberschrift: TCEFORM.tt_content { header_layout.altLabels.1 = Seitenüberschrift }
Um Ihre eigenen Beschriftungen mehrsprachig anzulegen, sollten Sie die Lokalisierungsmechanismen von TYPO3 nutzen. Ersetzen Sie dazu den Wert Seitenüberschrift durch einen dynamischen Zeiger auf einen Sprachwert in einer speziellen Sprachdatei, in die Sie die jeweiligen Sprachwerte auslagern. Diese Sprachdatei stellen Sie über eine eigene Extension zur Verfügung. TYPO3 ermittelt dann automatisch anhand der jeweiligen Einstellungen des Backend-Benutzers den richtigen Sprachwert oder greift auf den Standardwert zurück, wenn keine passende Übersetzung vorhanden ist. Diese Zeiger sind dabei stets nach folgendem Muster aufgebaut: TCEFORM.tt_content { header_layout.altLabels.1 = LLL:EXT:extension_key/locallang.xml:zeiger }
Max. Linie
Max. Linie 6.5 Auswahllisten optimieren | 207 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Links
Diskussion Die oben genannten Einstellungen haben Auswirkungen auf sämtliche Formulare, in denen das Feld vorkommt. Was aber, wenn Sie das Feld nur in bestimmten Datensätzen anpassen möchten? Mit folgendem TCEFORM-Code legen Sie fest, in welchen Inhaltselementen Ihre Anpassung umgesetzt wird. Als Befehl können Sie alle drei anfangs genannten Möglichkeiten verwenden: TCEFORM.tabelle.feld.types.inhaltselement.funktion = wert
So können Sie im Inhaltselement Tabelle die Einträge im Layoutfeld anders benennen als im Inhaltselement Aufzählung: TCEFORM.tt_content { layout.types.table.altLabels.0 = Layout Tabelle layout.types.bullets.altLabels.0 = Layout Aufzählung }
Als Inhaltselemente stehen Ihnen die Werte aus der Tabelle 6-1 zur Verfügung: Tabelle 6-1: Die verschiedenen Inhaltselemente
Lizensiert für Markus Mueller
Max. Linie
Inhaltselement
Beschreibung
header
Überschrift
text
Text
textpic
Text mit Bild
image
Bild
bullets
Aufzählung
table
Tabelle
uploads
Dateiverweise
multimedia
Multimedia
mailform
Formular
search
Suchen
login
Anmeldung
menu
Menü/Sitemap
shortcut
Datensatz einfügen
list
Plugin einfügen
script
Skript
div
Trenner
html
HTML-Code
Die Auswahlmöglichkeiten für Seitentypen, Inhaltselemente, Plugins oder Sprachen können Sie auch über die Benutzereinstellungen begrenzen. Diese Einstellungen legen Sie dabei individuell für jede Benutzergruppe fest. Gehen Sie dazu wie folgt vor:
208 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Legen Sie eine Benutzergruppe an und aktivieren Sie dort unter Zugriffsliste das Kontrollkästchen Zugriffslisten mit einschließen. Speichern Sie den Datensatz, falls die Eingabemaske nicht automatisch neu geladen wird. Danach erscheinen weitere Auswahlfelder, mit denen Sie die Rechte dieser Gruppe sehr fein festlegen können. Mit den Einträgen im Bereich Seitentypen bestimmen Sie den Umfang der Auswahlmöglichkeiten der unterschiedlichen Seitentypen in der Eingabemaske der Seiteneigenschaften. Alle aktivierten Seitentypen dürfen von den Benutzern verwendet werden. Im Bereich Erlaubte Ausschlussfelder legen Sie fest, welche Einträge oder Optionen ausgeblendet werden. Wenn Sie im Abschnitt Seiteninhalt: Typ die jeweiligen Kontrollkästchen aktivieren, werden die entsprechenden Optionen im Feld Typ der Inhaltselemente deaktiviert. Mit den Kontrollkästchen im Abschnitt Seiteninhalt: Erweiterung legen Sie fest, welche Extensions auf den Seiten verwendet werden dürfen. Im Bereich Auf Sprachen einschränken bestimmen Sie, welche Sprache die Benutzer bearbeiten dürfen.
Siehe auch In Rezept 6.2 erfahren Sie, wie Sie neue Inhaltsspalten im Backend integrieren.
Lizensiert für Markus Mueller
6.6
Eingabefelder und Bearbeitungsmöglichkeiten reduzieren
Problem Sie möchten im Backend Eingabefelder oder Optionen ausblenden, um die Oberfläche auf die nötigsten Formularfelder zu begrenzen.
Lösung Steuern Sie die Darstellung der Formulare per Seiten-TSconfig über die entsprechenden TCEFORM-Einstellungen. Mithilfe dieser Einstellungen beeinflussen Sie die TYPO3Formular-Rendering-Engine und können dadurch sehr fein bestimmen, welche Felder TYPO3 in den Backend-Formularen darstellt und welche ausgeblendet werden. TCEFORM-Einstellungen legen Sie im TSconfig-Feld einer Seite ab, sodass sie – wie alle Seiten-TSconfig-Angaben – auch auf ganze Seitenbäume angewendet werden können. So können Sie Eingabemasken für einzelne Seiten oder Seitenbäume anpassen. Um Eingabefelder auszublenden, geben Sie den Code stets nach folgendem Muster ein: TCEFORM.tabellen_name.feld_name.disabled = 1
Max. Linie
Max. Linie 6.6 Eingabefelder und Bearbeitungsmöglichkeiten reduzieren | 209 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Der Tabellenname steht für die Tabelle, deren Bearbeitungsmaske Sie ändern möchten. Häufig verwendete Tabellennamen sind tt_content für Seiteninhalte und pages für Seiten. Der Feldname bezieht sich direkt auf das Tabellenfeld. Dieses wird mit dem Befehl disabled vollständig ausgeblendet und für die Bearbeitung gesperrt. Wenn Sie das Feld jedoch bei bestimmten Typen wieder einblenden möchten, können Sie den TSconfigCode mit folgender Zeile ergänzen (in der Diskussion von Rezept 6.5 finden Sie eine Übersicht der vorhandenen Formulartypen für Inhaltselemente):
Links
TCEFORM.tabellen_name.feld_name.types.formulartyp.disabled = 1
Beispielsweise blenden Sie mit folgendem Code das Feld Überschrift bei allen Seiteninhalten aus: TCEFORM.tt_content.header.disabled = 1
Um das Feld beim Inhaltstyp Überschrift wieder anzuzeigen, ergänzen Sie den Code um folgende Zeile: TCEFORM.tt_content.header.types.header.disabled = 0
Diskussion Lizensiert für Markus Mueller
Falls Sie die notwendigen Angaben für den Tabellen- oder Feldnamen nicht auswendig kennen, bietet Ihnen TYPO3 mit dem Modul Konfiguration eine komfortable Möglichkeit, die Struktur sämtlicher in TYPO3 registrierten Tabellen einzusehen. Wechseln Sie dazu in das Modul Konfiguration und wählen Sie in der Auswahlliste Menü den Eintrag $TCA (tables.php). TYPO3 zeigt Ihnen daraufhin die Namen der vorhandenen Tabellen. Mithilfe der Plus- und Minussymbole können Sie die Detailinformationen der Tabellen aus- und einklappen. Öffnen Sie dann für die gewünschte Tabelle den Bereich columns. Sie erhalten daraufhin für die jeweilige Tabelle eine Liste aller Spalten, die Sie über den eingangs genannten TCEFORM-Befehl ausblenden können. Notieren Sie sich den Tabellen- und den Feldnamen und formulieren Sie gemäß dem oben genannten Muster Ihre TCEFORM-Angabe. Wenn mehrere Personen an der Website arbeiten, sollten Sie darauf achten, dass alle Einstellungen sofort nach dem Speichern in Kraft treten. Ändern Sie die Oberfläche mit den oben genannten Angaben, sollten Sie dies vorher ankündigen, um Verwirrung zu vermeiden.
Siehe auch In Rezept 16.11 erfahren Sie, welche Bedeutung die Formulartypen haben. Die Diskussion von Rezept 4.6 zeigt einen Überblick über die möglichen Seitentypen, falls Sie die Eingabeformulare von Seiten anpassen möchten.
Max. Linie
Max. Linie 210 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
6.7
Eingabefelder anpassen
Problem Sie möchten Felder von Eingabeformularen anpassen, beispielsweise um einzeilige Eingabefelder in mehrzeilige Textfelder umzuwandeln.
Lösung Ändern Sie die Eigenschaften des jeweiligen Eingabefelds über eine Extension. Ermitteln Sie dazu zuerst die aktuelle Feldkonfiguration über das Modul Konfiguration. Wählen Sie dort in der Auswahlliste Menü den Eintrag $TCA (tables.php). TYPO3 zeigt Ihnen daraufhin die Namen aller vorhandenen Tabellen, deren Eingabefelder Sie anpassen können. Mithilfe der Plus- und Minuszeichen klappen Sie die weiteren Informationen zu diesen Tabellen aus oder ein. Öffnen Sie dann für die gewünschte Tabelle den Unterbereich columns. In diesem Bereich erhalten Sie eine Liste aller verfügbaren Eingabefelder. Erweitern Sie anschließend das Feld und dessen Unterbereich config. Hier können Sie nun die eigentlichen Feldeigenschaften einsehen. Lizensiert für Markus Mueller
Klicken Sie im nächsten Schritt auf den gewünschten Parameter in den eckigen Klammern. Daraufhin erscheint am Seitenanfang ein Eingabefeld, in dem der aktuelle Wert dieses Parameters angezeigt wird. Geben Sie diesen Wert nun in die Datei ext_tables.php Ihrer Extension ein und ändern Sie den Wert nach Ihren Wünschen. Laden Sie dazu das TCA der Tabelle und passen Sie über die geänderte Wertzuweisung die Eigenschaften des Felds an. Achten Sie darauf, dass Sie vor der Änderung das TCA der jeweiligen Tabelle in das Skript mit einbinden, um sicherzustellen, dass Sie die Angaben im TCA der Tabelle anpassen können. Dies erfolgt über den Funktionsaufruf t3lib_div:: loadTCA('tabellen_name'). Ansonsten kann es passieren, dass das TCA zum aktuellen Zeitpunkt noch nicht verfügbar ist und Ihre Anpassungen nicht übernommen werden. Mit dem Funktionsaufruf fügen Sie sämtliche TCA-Informationen an der aktuellen Position ein, sodass Sie darauf zugreifen können. Ändern Sie abschließend die Darstellung des Felds, indem Sie den Schlüsselwert type durch form_type ersetzen. Mit diesem Schlüsselwert weisen Sie TYPO3 an, das Feld im Backend lediglich anders darzustellen und ansonsten weiterhin passend zum ursprünglichen Feldtyp zu validieren und zu verarbeiten. Der Schlüsselwert form_type hat also nur Auswirkungen auf die Darstellung des Felds. Der Schlüsselwert type definiert hingegen die grundlegenden Feldeigenschaften. Der vollständige PHP-Code sollte am Ende nach folgendem Muster aufgebaut sein:
Max. Linie
t3lib_div::loadTCA('tabellen_name'); $TCA['tabellen_name']['columns']['feld_name']['config']['form_type'] = 'wert';
6.7 Eingabefelder anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 211
Der Wert von type kann sich – je nachdem, welche Eigenschaft Sie anpassen möchten – von dem gezeigten Beispiel unterscheiden.
Links
Wir empfehlen Ihnen, diese Änderungen über eine Extension vorzunehmen, mit der Sie das TCA der gewünschten Tabelle anpassen (in Rezept 16.2 erfahren Sie, wie Sie eine Extension erstellen). Die Änderungen am TCA nehmen Sie über die Datei ext_tables.php vor, die Sie in dem jeweiligen Extension-Ordner finden (sollte die Datei nicht vorhanden sein, können Sie diese auch per Hand erstellen). In dieser Datei laden Sie zuerst das TCA der Tabelle und passen dann die Feldeigenschaften im Bereich config an.
Diskussion Zur Verdeutlichung wird im folgenden Beispiel das Feld Überschrift im Inhaltselement Text vom Typ input auf text umgestellt – dadurch werden mehrzeilige Texte möglich. Ermitteln Sie dazu zuerst nach der oben beschriebenen Methode den gewünschten Wert für das Feld Überschrift und ändern Sie dann über die Angaben in der Datei ext_tables. php die Werte.
Lizensiert für Markus Mueller
TYPO3 speichert die Überschriften der Inhaltselemente standardmäßig im Feld header der Tabelle tt_content. Ermitteln Sie also im Modul Konfiguration in der Tabelle tt_content über die Einstellungen für das Feld header den Wert type. Dieser ist durch folgende TCAAngabe standardmäßig auf input gesetzt: $TCA['tt_content']['columns']['header']['config']['type'] = 'input';
Geben Sie diesen Code nun in die Datei ext_tables.php ein und ändern Sie den Wert input auf den Wert text. Zudem ändern Sie den Schlüsselwert type auf form_type, um die Änderung des Typs auf die Felddarstellung im Backend zu begrenzen: t3lib_div::loadTCA('tt_content'); $TCA['tt_content']['columns']['header']['config']['form_type'] = 'text';
Sie könnten die Darstellung auch direkt über den Schlüsselwert type anpassen, jedoch kann es dadurch zu Nebeneffekten mit Validierungsfunktionen in TYPO3 kommen, da Sie dadurch direkt in die Feldkonfiguration eingreifen. Der Schlüsselwert form_type wirkt sich hingegen nur auf die Felddarstellung im Backend aus und wird bei allen anderen Prozessen ignoriert. Mit form_type erreichen Sie also eine sauberere Trennung von Feldlogik und Felddarstellung und machen Ihre Änderung automatisch transparenter bzw. auch für andere Entwickler nachvollziehbarer. Beachten Sie, dass der Spaltentyp in der Tabelle tt_content für die Überschrift vom Typ tinytext ist. Das bedeutet, dass maximal 256 Zeichen als Überschrift gespeichert werden
Max. Linie
können. Vermeiden Sie daher die Eingabe von längeren Inhalten, da diese nicht in der Datenbank gespeichert werden können, oder erweitern Sie den Spaltentyp in der Datenbank auf einen passenden Typ, zum Beispiel text.
212 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Mit den oben genannten Anpassungen können Sie zahlreiche Feldkonfigurationen der vorhandenen Felder anpassen. Für jeden Feldtyp gibt es diverse Einstellungsmöglichkeiten. Eine vollständige Liste der jeweiligen Parameter finden Sie in der offiziellen Dokumentation unter dem Link http://typo3.org/documentation/document-library/core-documentation/ doc_core_api/current/view/4/2/. Beachten Sie bei Änderungen dieser Art immer auch die jeweiligen Feldeinstellungen in der Datenbank. Auch wenn Sie im TCA einen größeren Feldwert erlauben, können Sie diesen nicht in der Datenbank abspeichern, wenn das entsprechende Feld in der Datenbank nicht korrekt konfiguriert ist. Zudem würde TYPO3 beim Speichern eine Meldung darüber ausgeben, dass der Wert nicht vollständig gespeichert werden konnte. Kontrollieren Sie daher vor diesen Anpassungen die jeweiligen Feldeigenschaften und ändern Sie sie entsprechend ab.
Siehe auch
Lizensiert für Markus Mueller
In Rezept 2.5 erfahren Sie mehr über die einzelnen Tabellen, deren Eingabefelder Sie anpassen können. Die Grundlagen der Extension-Erstellung werden in Rezept 16.2 erläutert. In Rezept 16.3 erhalten Sie Einblick in die Integration eigener Datenbankfelder in bestehende Tabellen. Dort erfahren Sie auch, wie Sie die jeweiligen Feldeigenschaften bequem über den Extension-Kickstarter festlegen können.
6.8
Die Auswertung von Eingabefeldern anpassen
Problem Sie möchten in Ihren Eingabefeldern nur bestimmte Inhalte speichern und vor dem Speichern der Inhalte in der Datenbank sicherstellen, dass die Daten in einer gültigen Form vorliegen.
Lösung Verwenden Sie die entsprechende eval-Funktion für das gewünschte Eingabefeld. Registrieren Sie diese eval-Funktionen in den Feldeigenschaften.
Max. Linie
Beispielsweise können Sie so Pflichtfelder bestimmen oder die Eingabe per JavaScript verarbeiten, etwa um in einem Eingabefeld führende Leerzeichen zu entfernen. Diese Kontrollmechanismen definieren Sie in den Feldeigenschaften, sodass sie bei der Formularerzeugung automatisch von TYPO3 eingebunden werden. Sämtliche Kontrollmechanismen geben Sie in der Eigenschaft eval an (eval ist die Abkürzung für evaluation = Auswertung).
6.8 Die Auswertung von Eingabefeldern anpassen | 213 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links Beachten Sie, dass diese Eingaberegeln nur von einzeiligen Eingabefeldern unterstützt werden.
Ändern Sie die Eigenschaften des jeweiligen Eingabefelds über eine Extension (falls Sie im Umgang mit Extensions noch nicht geübt sind, erhalten Sie in Rezept 16.2 das nötige Hintergrundwissen). Ermitteln Sie dazu zuerst die aktuellen Feldeigenschaften über das Modul Konfiguration, denn es kann sein, dass das gewünschte Feld schon über solche Kontrollfunktionen verfügt. Diese können Sie weiterhin nutzen bzw. erweitern. Andernfalls finden Sie so auch schnell die richtige Stelle, über die Sie die neuen Kontrollfunktionen registrieren und das Feld um eine solche Eigenschaft erweitern können.
Lizensiert für Markus Mueller
Wählen Sie im Modul Konfiguration in der Auswahlliste Menü am Seitenanfang den Eintrag $TCA (tables.php). TYPO3 zeigt Ihnen daraufhin die Namen aller vorhandenen Tabellen, deren Eingabefelder Sie anpassen können. Mithilfe der Plus- und Minussymbole klappen Sie die weiteren Informationen zu diesen Tabellen aus oder ein. Öffnen Sie dann für die gewünschte Tabelle den Unterbereich columns. In diesem Bereich erhalten Sie eine Liste aller verfügbaren Eingabefelder. Erweitern Sie anschließend das Feld und dessen Unterbereich config. Hier können Sie nun die eigentlichen Feldeigenschaften einsehen. Wenn Sie dort den Wert eval sehen, klicken Sie darauf. Sie erhalten dadurch die aktuellen Überprüfungsfunktionen der Felder, die Sie erweitern können. Ansonsten klicken Sie auf den Wert config, um die Feldeigenschaften manuell zu erweitern. Daraufhin erscheint am Seitenanfang ein Eingabefeld, in dem der aktuelle Wert dieses Parameters angezeigt wird. Geben Sie ihn nun in die Datei ext_tables.php Ihrer Extension ein und ändern Sie den Wert nach Ihren Wünschen, sodass der Code nach folgendem Muster aufgebaut sein sollte: $TCA['tabellen_name']['columns']['feld_name']['config']['eval'] = 'eval_funktion';
Fügen Sie anschließend über dieser Zeile noch folgenden Funktionsaufruf hinzu: t3lib_div::loadTCA('tabellen_name');
Dort laden Sie anschließend das TCA der Tabelle und passen über die geänderten Wertzuweisungen die Eigenschaften des Felds an. Achten Sie darauf, dass Sie vor der Änderung das TCA der jeweiligen Tabelle in das Skript mit einbinden, um sicherzustellen, dass Sie die Angaben im TCA der Tabelle anpassen können. Dies erfolgt über den Funktionsaufruf t3lib_div::loadTCA('tabellen_name'). Ansonsten kann es passieren, dass das TCA zum aktuellen Zeitpunkt noch nicht verfügbar ist und dadurch Ihre Anpassungen nicht übernommen werden können. Der vollständige PHP-Code sollte am Ende nach folgendem Muster aufgebaut sein: t3lib_div::loadTCA('tabellen_name'); $TCA['tabellen_name']['columns']['feld_name']['config']['eval'] = 'eval_funktion';
Max. Linie
Wenn Sie den config-Bereich manuell erweitern müssen, sollten Sie besonders darauf achten, dass der Schlüsselwert ['eval'] vorhanden ist.
214 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Sie können dabei auch mehrere eval-Funktionen auf ein Eingabefeld anwenden. Trennen Sie diese einfach durch Kommata voneinander. Mit folgendem PHP-Code bestimmen Sie zum Beispiel, dass die vorhandenen Leerzeichen am Anfang und Ende der Zeichenkette automatisch entfernt werden und das Feld Überschrift als Pflichtfeld gekennzeichnet wird: $TCA['tt_content']['columns']['header']['config']['eval'] = 'trim,required';
Folgende eval-Funktionen stehen Ihnen standardmäßig zur Verfügung:
Allgemein required
Das Feld wird zu einem Pflichtfeld. Ist es leer, kann das Formular nicht abgespeichert werden. unique
Das Feld muss einen eindeutigen Wert speichern, der noch nicht in Datensätzen dieser Tabelle auf der aktuellen Seite vorkommen darf. Auf anderen Seiten darf der gleiche Wert jedoch vorkommen. uniqueInPid
Das Feld muss einen eindeutigen Wert speichern, der noch nicht in Datensätzen dieser Tabelle innerhalb des aktuellen Seitenbaums vorkommen darf. Lizensiert für Markus Mueller
Datum und Uhrzeit date
Der Wert wird zu einem Datum umgewandelt und als Unix-Zeitstempel abgespeichert. datetime
Der Wert wird zu einem Datum inklusive Uhrzeitangabe umgewandelt und als UnixZeitstempel abgespeichert. time
Der Wert wird zu einer Uhrzeit umgewandelt. Die Uhrzeit wird in Sekunden in der Datenbank abgespeichert. timesec
Der Wert wird zu einer Uhrzeit inklusive zwei Stellen für Sekunden umgewandelt und in Sekunden in der Datenbank abgespeichert. year
Der Wert wird zu einer Jahreszahl umgewandelt. Diese Jahrezahl kann zwischen 1970 und 2038 liegen. Für andere Jahreszahlen sollten Sie die eval-Funktion int verwenden und die maximale Zeichenlänge auf vier Stellen begrenzen.
Max. Linie
In jedem Datumsfeld können Sie mit folgenden Zeichen den jeweils aktuellen Zeitwert ermitteln: d steht für day und setzt automatisch den aktuellen Zeitstempel ein (alternativ dazu können Sie t für today oder n für now verwenden).
6.8 Die Auswertung von Eingabefeldern anpassen | 215 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Wenn Sie ein +1 in das Datumsfeld eingeben, wird der Wert entsprechend erhöht. Analog dazu setzen Sie mit -1 einen Wert je nach Feld um einen Tag oder eine Stunde zurück.
Links
Zeichenketten filtern alpha
Erlaubt nur Zeichen von a bis z sowie deren Großbuchstaben. num
Erlaubt nur Zahlen von 0 bis 9. alphanum
Erlaubt nur Zeichen von a bis z sowie deren Großbuchstaben und Zahlen von 0 bis 9, jedoch keine Sonderzeichen. alphanum_x
Erlaubt nur Zeichen von a bis z sowie deren Großbuchstaben und Zahlen von 0 bis 9 und die Sonderzeichen _ und - . is_in
Erlaubt nur eine vordefinierte Zeichenkette, die Sie mit is_in in den Feldeigenschaften registrieren können. Eine Erklärung zu dieser Funktion finden Sie im Abschnitt »Weitere Feldeigenschaften« weiter unten. Lizensiert für Markus Mueller
trim
Entfernt analog zur gleichnamigen PHP-Funktion die führenden und abschließenden Leerzeichen aus der Zeichenkette. nospace
Entfernt sämtliche Leerzeichen aus der Zeichenkette.
Zeichenketten verarbeiten int
Wandelt die Eingabe in einen ganzzahligen Zahlenwert um. double2
Wandelt den Wert in eine Gleitkommazahl mit zwei Stellen um. password
Wandelt den Wert in eine verschlüsselte Zeichenkette um, wenn das Feld verlassen wird. Der Text wird danach nur noch durch Sternchen * verschlüsselt angezeigt, sodass er nicht mehr im Klartext lesbar ist. md5
Wandelt den Wert in einen MD5-Hash um. upper
Wandelt den Wert in Großbuchstaben um.
Max. Linie
lower
Wandelt den Wert in Kleinbuchstaben um.
216 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Weitere Feldeigenschaften Zusätzlich gibt es neben eval noch weitere Feldeigenschaften, die mit den oben genannten eval-Funktionen zusammenspielen oder diese ergänzen: max
Legt die maximale Anzahl der Zeichen fest, die in dem Feld eingegeben werden dürfen (die Angabe entspricht dabei dem Wert maxlength, den Sie in HTML für die maximale Zeichenlänge bei Eingabefeldern verwenden können). is_in
Hiermit legen Sie die Zeichen fest, die in dem Feld ausschließlich vorkommen dürfen. Die eigentliche Überprüfung legen Sie mit der eval-Funktion is_in fest. $TCA['tabellen_name']['columns']['feld_name']['config']['eval'] = 'is_in'; $TCA['tabellen_name']['columns']['feld_name']['config']['is_in'] = 'TYPO3';
Somit werden nur die Zeichen T, Y, P, O und 3 nach der Eingabe übernommen. range
Lizensiert für Markus Mueller
Überprüft nach dem Speichern die eingegebenen Zahlenwerte auf einen Minimalund Maximalwert (beide Angaben können unabhängig voneinander angegeben werden): lower legt den Minimalwert fest, upper den Maximalwert (verwechseln Sie diese Einstellungen nicht mit den oben genannten eval-Funktionen lower und upper, mit denen Sie die Zeichenkette in Klein- bzw.Großbuchstaben umwandeln können). Mit folgendem Code können Sie beispielsweise Jahreszahlen von 1906 bis 2050 erlauben: $TCA['tabellen_name']['columns']['feld_name']['config']['max'] = '4'; $TCA['tabellen_name']['columns']['feld_name']['config']['eval'] = 'int'; $TCA['tabellen_name']['columns']['feld_name']['config']['range'] = array( 'lower' => 1906, 'upper' => 2050 );
Diskussion
Max. Linie
Zusätzlich zu den vorhandenen Überprüfungsfunktionen können Sie auch eigene Funktionen definieren und in die Formularverarbeitung einbinden. Dabei stehen Ihnen zwei Möglichkeiten zur Verfügung: Zum einen können Sie das Feld mit einer eigenen JavaScriptFunktion bearbeiten und so vor dem Versenden auf seine Gültigkeit hin überprüfen. Zum anderen können Sie den Feldinhalt auch nach dem Versenden des Formulars mit einer eigenen PHP-Funktion überprüfen. Als Grundlage für diese individuelle Verarbeitungsmöglichkeit dient in beiden Fällen eine PHP-Klasse, in der Sie die jeweiligen Funktionen implementieren. Anschließend registrieren Sie diese PHP-Klasse über eine sogenannte ScriptClass-Variable. Dadurch kann Ihre Klasse von TYPO3 bei der Verarbeitung der Backend-Formulare berücksichtigt werden. Abschließend geben Sie den Namen der PHPKlasse als eval-Funktion in den Feldeigenschaften an, sodass die entsprechenden Funktionen bei der Darstellung des Formulars auch berücksichtigt werden.
6.8 Die Auswertung von Eingabefeldern anpassen | 217 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Erstellen Sie dazu nun im ersten Schritt eine neue PHP-Datei im Extension-Verzeichnis und speichern Sie diese unter dem Namen class.tx_extensionkey_evalfunc1.php ab. Der Dateiname setzt sich aus dem Extension-Key (ohne Unterstriche) und der Funktionsbeschreibung zusammen. Zusätzlich erhält jede Datei am Ende einen Zähler, wodurch es später leichter wird, weitere eval-Funktionen einzurichten.
Links
In dieser Datei definieren Sie nun die folgende Klasse samt der Methode, die später den Feldinhalt per JavaScript analysiert: class tx_extensionkey_evalfunc1 { function returnFieldJS() { return ' return value; '; } }
Achten Sie darauf, dass der Klassenname mit dem Präfix tx_ beginnt. Ansonsten werden die Methoden der Klasse nicht bei der Überprüfung berücksichtigt.
Lizensiert für Markus Mueller
Beachten Sie hierbei, dass Sie über die PHP-Funktion JavaScript zurückgeben. Die Schreibweise sieht daher vielleicht auf den ersten Blick etwas ungewohnt aus. Mit dem folgenden Code würden Sie zum Beispiel den aktuellen Benutzernamen an den aktuellen Feldwert anhängen, wenn der Benutzer die Eingabe beendet und in das nächste Feld wechselt: class tx_extensionkey_evalfunc1 { function returnFieldJS() { $username = $GLOBALS['BE_USER']->user['username']; return ' return value + " ('. $username .')"; '; } }
Um die Werte nach dem Absenden serverseitig zu überprüfen, fügen Sie noch folgende Methode in die bestehende Klasse ein: ... function evaluateFieldValue($value, $is_in, $set) { return $value; } ...
Achten Sie darauf, dass Sie die notwendigen Parameter angeben, um eine reibungslose Verarbeitung zu ermöglichen. Die Parameter haben folgende Bedeutung: $value
Max. Linie
Übergibt den eigentlichen Feldwert, den Sie weiter analysieren können. Diesen Wert müssen Sie unbedingt wieder über return zurückgeben.
218 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts $is_in
Ein optionaler Parameter, der diejenigen Zeichen enthält, die in dem Wert vorkommen müssen, falls die eval-Funktion is_in angewandt wird. Damit können Sie beispielsweise den Wert nach bestimmten Textmustern untersuchen. $set
Wenn dieser Wert gesetzt ist, darf der Wert geändert werden. Ansonsten sollte er nur durchgereicht werden. Selbstverständlich können Sie beide Funktionen auch gleichzeitig verwenden, sodass in der Datei am Ende folgender PHP-Code vorhanden ist: class tx_extensionkey_evalfunc1 { function returnFieldJS() { return ' return value; '; } function evaluateFieldValue($value, $is_in, $set) { return $value; } } Lizensiert für Markus Mueller
Speichern Sie diese Datei nun ab und wechseln Sie anschließend in die Datei ext_localconf. php. Dort registrieren Sie die eben erstellte Klasse über die folgende Variablenzuweisung in der TYPO3-Klasse, die für die Formularerzeugung im Backend verantwortlich ist. Diese Zuweisung ist dabei stets nach folgendem Muster aufgebaut: $TYPO3_CONF_VARS['SC_OPTIONS']['tce']['formevals']['eval_funktion'] = pfad_zur_phpdatei;
Die eval-Funktion entspricht dabei dem Namen Ihrer PHP-Klasse. Für das oben genannte Beispiel würden Sie also diese Zeile einfügen: $TYPO3_CONF_VARS['SC_OPTIONS']['tce']['formevals']['tx_extensionkey_evalfunc1'] = 'EXT:extension_key/class.tx_extensionkey_evalfunc1.php';
Abschließend können Sie Ihre eigene eval-Funktion des Felds nach folgendem Muster anwenden: $TCA['tt_content']['columns']['feld_name']['config']['eval'] = 'tx_extensionkey_evalfunc1';
Dadurch lassen sich Überprüfungsroutinen einbinden, mit denen Sie auf sehr flexible Art und Weise die Eingabemöglichkeiten kontrollieren können.
Max. Linie
Max. Linie 6.8 Die Auswertung von Eingabefeldern anpassen | 219 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
6.9
Die Anordnung von Eingabefeldern ändern
Links
Problem Sie möchten die Position von Eingabefeldern anpassen, beispielsweise um eigene Felder an bestimmte Positionen im Formular zu verschieben.
Lösung Ändern Sie die Anordnung der Feldnamen im Wert showitem des jeweiligen Formulartyps. Die Formulartypen werden im TCA-Abschnitt types der entsprechenden Tabelle gespeichert. Wir empfehlen Ihnen, diese Änderungen über eine neue Extension vorzunehmen, mit der Sie das TCA der gewünschten Tabelle anpassen (in Rezept 16.2 erfahren Sie, wie Sie eine Extension erstellen). Die Änderungen am TCA nehmen Sie über die Datei ext_tables.php vor, die sich in dem Extension-Ordner befinden muss. Dort laden Sie zuerst das TCA der Tabelle und passen dann die Feldanordnung im Bereich showitem für den jeweiligen Formulartyp an. Lizensiert für Markus Mueller
Ermitteln Sie dazu zuerst die Feldtypen und deren Felder. Wechseln Sie in das Modul Konfiguration und wählen Sie in der Auswahlliste Menü den Eintrag $TCA (tables.php). Daraufhin erscheinen die Namen der im TCA registrierten Tabellen. Mithilfe der Plusund Minuszeichen können Sie die Detailinformationen dieser Tabellen aus- und einklappen. Öffnen Sie dann für die gewünschte Tabelle den Bereich types. Sie erhalten eine Liste aller verfügbaren Formulartypen, die Sie anpassen können (der Standardtyp ist immer 0). Öffnen Sie anschließend den gewünschten Typ und klicken Sie auf dessen Eigenschaft showitem. Daraufhin erscheint am Seitenanfang ein Eingabefeld, in dem der aktuelle Inhalt von showitem angezeigt wird. Übernehmen Sie diesen Wert in die Datei ext_tables.php Ihrer Extension und ändern Sie die Anordnung der Feldnamen. Dieser Wert ist dabei stets nach folgendem Muster aufgebaut: $TCA['tabellen_name']['types']['0']['showitem'] = 'feld1,feld2,...';
Das Eingabefeld feld2 würde in der Eingabemaske unterhalb von feld1 angezeigt werden. Um das Feld feld1 nun vor feld2 zu setzen, setzen Sie den Wert feld2 einfach vor den Wert feld1. Jeder Eintrag in showitem kann über vier zusätzliche Werte verfügen, mit denen das Feld individuell angepasst werden kann. Achten Sie beim Ändern der Position darauf, dass Sie die zusätzlichen Feldparameter nicht durcheinander bringen. Diese sind direkt mit dem Feldnamen verknüpft und dürfen sich durch die Verschiebung der Felder nicht ändern. Diese Parameter sind wie folgt aufgeteilt:
Max. Linie
..., wert_1; wert_2; wert_3; wert_4; wert_5, ...
220 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Der erste Wert wert_1 steht für den Feldnamen. Mit wert_2 vergeben Sie alternative Feldbeschriftungen. Die Angabe in wert_3 steht für eine Paletten-ID. Damit können Sie Feldgruppen aus palettes verknüpfen und in der zweiten Optionspalette unterhalb des Felds anzeigen. Spezielle Einstellungen für Textfelder speichern Sie in wert_4. So können Sie beispielsweise interaktive Eingabefelder (RTE) anpassen oder das Verhalten für Zeilenumbrüche festlegen. Mit wert_5 legen Sie Darstellungsoptionen des Felds fest (weitere Informationen zu diesen Parametern finden Sie in der Diskussion von Rezept 6.10). Geben Sie abschließend noch oberhalb der soeben erstellten Zeile den Funktionsaufruf t3lib_div::loadTCA() ein, um das TCA der jeweiligen Tabelle in Ihr PHP-Skript zu importieren. Erst dadurch werden Änderungen am TCA einer anderen Tabelle möglich. Der Code sollte nun nach folgendem Muster aufgebaut sein: t3lib_div::loadTCA('tabellen_name'); $TCA['tabellen_name']['types']['0']['showitem'] = 'feldnamen ...';
In diesem Beispiel wird der Feldtyp 0 vorausgesetzt. Manche Datensätze besitzen je nach Typ unterschiedliche Formularkonfigurationen (in Rezept 19.4 erfahren Sie mehr über den Zusammenhang von types und Eingabeformularen). Lizensiert für Markus Mueller
Max. Linie
Diskussion Mit den anfangs beschriebenen Schritten können Sie die Position von bestehenden Formularfeldern bequem anpassen. Was aber, wenn Sie eigene Felder in bestehende Formulare integrieren möchten? Um eigene Felder in die Formulare zu integrieren, gehen Sie wie folgt vor: Erstellen Sie eine Extension, mit der Sie eine bestehende Tabelle erweitern (als Grundlage dient dabei Rezept 16.3). Nachdem Sie diese Extension erstellt und installiert haben, öffnen Sie die Datei ext_tables.php. Dort finden Sie folgende Vorgaben, die vom Kickstarter eingefügt wurden: In der Variablen $tempColumns werden sämtliche Einstellungen der hinzugefügten Felder gespeichert. Über den Funktionsaufruf addTCAcolumns wird das bestehende TCA der gewünschten Tabelle erweitert. Die Funktion addToAllTCAtypes integriert Ihre neu erstellten Felder letztendlich in die bestehenden Formulartypen der Tabelle, indem sie an die vorhandenen Feldern angehängt werden. Der vom ExtensionKickstarter erzeugte Code ist dabei nach folgendem Muster aufgebaut: $tempColumns = array( 'feld_name' => array( 'exclude' => 1, 'label' => 'Titel', 'config' => array( 'type' => 'input', 'size' => '30', ) ), );
6.9 Die Anordnung von Eingabefeldern ändern | 221 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
t3lib_div::loadTCA('tabellen_name'); t3lib_extMgm::addTCAcolumns('tabellen_name', $tempColumns, 1); t3lib_extMgm::addToAllTCAtypes('tabellen_name','feld_name;;;;1-1-1');
Links
Um die Feldposition Ihrer Felder nun individuell zu bestimmen, fügen Sie dem Funktionsaufruf addToAllTCAtypes noch zwei weitere Parameter hinzu. Mit dem ersten Parameter können Sie den Formulartyp festlegen, in dem Ihr Feld ausschließlich eingefügt werden soll. Wenn der Wert leer ist, wird das Feld in jeden Feldtyp eingefügt (was standardmäßig auch der Fall ist). Mit dem zweiten Parameter können Sie über eine spezielle Syntax einen Feldnamen angeben, vor dem das Feld eingefügt wird. Der gesamte Funktionsaufruf ist dabei nach dem folgenden Muster aufgebaut (die Parameter sind diesmal der Übersichtlichkeit halber untereinander angeordnet, und die neuen Parameter werden hervorgehoben): t3lib_extMgm::addToAllTCAtypes ( 'tabellen_name', 'feld_name;;;;1-1-1', formular_typ, feld_position );
Hierbei würde das Feld feld_name vor das Feld feld_position gesetzt werden. Lizensiert für Markus Mueller
Wenn Ihnen die Verwendung dieser Funktion zu unflexibel erscheint, können Sie die Position der Felder auch leicht per Hand anpassen. Folgendes Beispiel soll diesen Vorgang verdeutlichen: Fügen Sie der Eingabemaske für Frontend-Benutzer das Feld Vorname hinzu. Dabei soll das neue Feld vor das bestehende Feld Name gesetzt werden. Öffnen Sie dazu die Datei ext_tables.php. Dort finden Sie den eingangs beschriebenen Code, der vom Kickstarter erzeugt wurde. Das Feld Vorname wird dadurch am Ende des Eingabeformulars angefügt. Beachten Sie, dass wir hier zum besseren Verständnis den Feldnamen vorname verwenden. Wenn Sie eine Tabelle über den Kickstarter erstellen, wird dieser Feldname durch den Extension-Key und das Präfix tx_ erzeugt und daher anders lauten: $tempColumns = array( 'vorname' => array( 'exclude' => 1, 'label' => 'Vorname', 'config' => array( 'type' => 'input', 'size' => '30', ) ), ); t3lib_div::loadTCA('fe_users'); t3lib_extMgm::addTCAcolumns('fe_users', $tempColumns, 1); t3lib_extMgm::addToAllTCAtypes('fe_users','vorname;;;;1-1-1');
Max. Linie
Im nächsten Schritt kommentieren Sie den Funktionsaufruf addToAllTCAtypes aus und nehmen die Anpassung im Bereich showitem manuell vor, indem Sie – wie anfangs in der
222 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lösung beschrieben – die aktuelle Feldanordnung über das Modul Konfiguration ermitteln und anpassen (der Übersichtlichkeit halber werden die Feldwerte hier untereinander gesetzt):
Lizensiert für Markus Mueller
$tempColumns = array( 'vorname' => array( 'exclude' => 1, 'label' => 'Vorname', 'config' => array( 'type' => 'input', 'size' => '30', ) ), ); t3lib_div::loadTCA('fe_users'); t3lib_extMgm::addTCAcolumns('fe_users', $tempColumns, 1); // t3lib_extMgm::addToAllTCAtypes('fe_users','vorname;;;;1-1-1'); $TCA['fe_users']['types']['0']['showitem'] = ' username;;;;2-2-2, password, usergroup, lockToDomain, --div--, vorname;;;;1-1-1, name;;2;;3-3-3, address, zip, city, country, telephone, fax, email, www, image;;;;4-4-4, --div--, TSconfig;;;;5-5-5 ';
Wenn Sie das Eingabeformular öffnen, werden Sie feststellen, dass das Feld nun zwar direkt in das Formular integriert ist, aber noch durch einen Abstand vom Eingabefeld Name getrennt erscheint. Dieser Abstand wird durch den fünften Parameter 3-3-3 beim Feld name erzeugt. Entfernen Sie nun diese Angabe beim Feld name und setzen Sie sie in die Feldkonfiguration des Felds vorname ein, sodass Sie anschließend diese Feldkonfiguration haben: $TCA['fe_users']['types']['0']['showitem'] = ' username;;;;2-2-2, password, usergroup, lockToDomain,
Max. Linie
Max. Linie 6.9 Die Anordnung von Eingabefeldern ändern | 223 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
--div--, vorname;;;;3-3-3, name;;2;;, address, zip, city, country, telephone, fax, email, www, image;;;;4-4-4, --div--, TSconfig;;;;5-5-5
Links
';
Das Feld Vorname wird nun wie gewünscht über dem Eingabefeld Name angezeigt. Nach diesem Muster können Sie jedes Eingabeformular nach Ihren Wünschen gestalten. Beachten Sie, dass für ein voll funktionsfähiges Beispiel noch weitere Schritte notwendig sind. Beispielsweise sollten Sie die Feldbeschreibung mit Sprachmarkern erzeugen und in der Datenbank das entsprechende Feld zur Verfügung stellen.
Lizensiert für Markus Mueller
Es kann vorkommen, dass mehrere Extensions die Feldanordnung ein und desselben Formulars anpassen. Achten Sie daher bei Anpassungen dieser Art darauf, dass Ihre Angaben nicht durch eine andere Extension überschrieben werden oder Sie die Einstellungen anderer Extensions mit den hier beschriebenen Änderungen überschreiben. Wenn Sie eine solche Anpassung durchgeführt haben, müssen Sie bei jeder nachfolgenden Installation einer weiteren Extension prüfen, ob diese möglicherweise zusätzliche Felder bereitstellt. Hierbei kann es dann je nach Ladereihenfolge zu unerwünschten Ergebnissen kommen. Dies können Sie nur vermeiden, indem Sie sicherstellen, dass Ihre Extension jeweils als letzte geladen wird. Um die Feldeinstellungen aller Extensions zu berücksichtigen, müssen Sie deren Anpassungen im Bereich showitem per Hand zusammenführen, da die Änderungen der anderen Extensions ansonsten nicht übernommen werden.
Siehe auch
Max. Linie
In Rezept 1.5 erfahren Sie mehr über die weiteren Optionen des Moduls Konfiguration. Manche Datensätze besitzen unterschiedliche Formulartypen, mit denen je nach Datentyp unterschiedliche Felder angezeigt werden können, in Rezept 19.4 erhalten Sie einen tieferen Einblick in die Zusammenhänge von Types und Eingabeformularen. Um eine bestehende Tabelle zu erweitern, sollten Sie eine Extension anlegen. Die nötigen Schritte dazu werden in Rezept 16.3 erklärt. Wenn Sie die Anordnung von Feldern der zweiten Optionspalette anpassen möchten, nehmen Sie die Anpassungen im Bereich palettes vor. In Rezept 6.10 erfahren Sie, wie Sie die Anordnung von Feldern der zweiten Optionspalette ändern können.
224 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
6.10 Eingabeformulare mehrspaltig darstellen Problem Sie möchten Formularfelder in Spalten anordnen, um Eingabeformulare intuitiver und effektiver zu gestalten.
Lösung Legen Sie die Felder in der zweiten Optionspalette ab. Darin werden Eingabefelder standardmäßig in Spalten aufgeteilt. Ändern Sie dazu im TCA der jeweiligen Tabelle die Abschnitte types und palettes nach folgendem Muster: ... 'types' => array( '0' => array( 'showitem' => 'feld_00,feld_01,feld_02' ) ), ... Lizensiert für Markus Mueller
Max. Linie
zu ... 'types' => array( '0' => array( 'showitem' => '--palette--;;1', 'canNotCollapse' => '1' ) ), 'palettes' => array( '1' => array( 'showitem' => 'feld_00,feld_01,feld_02', 'canNotCollapse' => '1' ), ...
Zuerst legen Sie innerhalb des Abschnitts types über ein numerisches Array die einzelnen Formulartypen für Ihr Eingabeformular fest. Standardmäßig verwendet TYPO3 den Typ 0. Für jeden Typ können Sie über den Wert showitem die einzelnen Feldnamen angeben, die Sie über die columns erstellt haben. In Rezept 19.4 erfahren Sie weitere Details zu unterschiedlichen Formulartypen und wie Sie diese in der Praxis nutzen können. Die Reihenfolge der Feldnamen bestimmt, wie die Felder nachher angeordnet werden. TYPO3 arbeitet die Feldnamen dabei linear von vorne nach hinten ab und zeigt die Felder standardmäßig untereinander. Mit dem Wert --palette-- bietet Ihnen TYPO3 die Möglichkeit, Felder in der zweiten Optionspalette abzulegen. Darin werden die Felder standardmäßig nebeneinander angeordnet. Verschieben Sie dazu die Feldnamen in das
6.10 Eingabeformulare mehrspaltig darstellen | 225 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Array palettes und verknüpfen Sie den Wert --palette-- über die Paletten-ID mit den entsprechenden Feldern. Die Paletten-ID wird über den dritten Parameter angegeben. Mehr zu den Parametern erfahren Sie in der anschließenden Diskussion.
Links
Mit der Option canNotCollapse verhindern Sie, dass die Paletten vom Benutzer ausgeblendet werden können. Die Felder werden also unabhängig davon, ob die Option Zweite Optionspalette anzeigen aktiviert ist, immer nebeneinander angezeigt.
Diskussion Jeder Eintrag in showitem kann über vier zusätzliche Werte individuell angepasst werden. Dabei spielt es keine Rolle, ob Sie die Anpassung in types oder palettes vornehmen, denn die Einstellungen betreffen immer das Feld an sich und nicht den Bereich, in dem das Feld angezeigt wird. Die Feldeinstellungen erfolgen über Werte, die durch Semikola voneinander getrennt werden. Der Aufbau dieser Feldeinstellungen entspricht dabei folgendem Muster: ..., wert_1; wert_2; wert_3; wert_4; wert_5, ...
Lizensiert für Markus Mueller
Mit wert_1 legen Sie den Feldnamen des Felds fest, das an der jeweiligen Position angezeigt werden soll. Die möglichen Feldnamen definieren Sie bereits im Bereich columns des jeweiligen TCA. Ist der Feldname ungültig, wird das Feld nicht angezeigt. Alternativ zum Feldnamen können Sie hier auch mit speziellen Platzhaltern neue Paletten anlegen oder Abstände in Ihren Formularen erzeugen. Mit wert_2 vergeben Sie alternative Feldbeschriftungen. Dies ist vor allem für Paletten hilfreich, denn Eingabefelder werden in der Regel schon über die Feldeigenschaften benannt. Jedoch können Sie diesen Wert auch mit dem wert_2 überschreiben und so beispielsweise für unterschiedliche Formulartypen abweichende Feldbeschreibungen anzeigen. Den Titel geben Sie entweder direkt oder über LLL-Marker ein: ...--palette--;LLL:EXT:extension_key/locallang_db.xml:tx_ext_key.feldname;1...
Der Parameter wert_3 steht für eine Paletten-ID. Damit können Sie Feldgruppen aus palettes verknüpfen und in der zweiten Optionspalette unterhalb des Felds bzw. – wie in der Lösung oben beschrieben – innerhalb einer eigenen Palette anzeigen. Spezielle Einstellungen für Textfelder speichern Sie in wert_4. So können Sie beispielsweise interaktive Eingabefelder (RTE) anpassen oder das Verhalten für Zeilenumbrüche festlegen. Auf diese Weise können Textfelder für jeden Formulartyp mit unterschiedlichen Eigenschaften ausgestattet werden. Mit wert_5 legen Sie Darstellungsoptionen für das Feld fest. Dabei werden diese Optionen in drei weitere Bereiche colorschemes, styleschemes und borderschemes eingeteilt. Diese Werte sind technisch gesehen Schlüsselwerte im Array $TBE_STYLES und werden dem Feld nach folgendem Muster zugewiesen: ... ;{colorschemes-id}-{styleschemes-id}-{borderschemes-id}, ...
Max. Linie
Max. Linie 226 | Kapitel 6: Das Backend anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Wenn Sie Felder von der ersten in die zweite Optionspalette verschieben, achten Sie besonders darauf, dass Sie in Ihrem Formular ein Feld nicht mehrmals verwenden und Paletten nur einmal mit einem Feld verknüpfen. Eine häufig vorkommende Fehlerquelle ist, Felder in der ersten und in der zweiten Optionspalette gleichzeitig darzustellen oder eine Palette zweimal einem Feld zuzuweisen. Die Werte werden dann von TYPO3 nicht mehr abgespeichert. Umgehen Sie diese Fehlerquelle, indem Sie die Feldnamen vor dem Speichern auf ihre Eindeutigkeit hin überprüfen. Um Ihr Formular weiter zu unterteilen, können Sie mit folgenden Angaben spezielle Trennelemente einfügen: ... --div--;LLL:EXT:extension_key/locallang_db.xml:tx_ext_key.feldname;;;1-1-1, ...
Durch diese Angaben erzeugen Sie standardmäßig einen horizontalen Abstand zwischen den Eingabefeldern. So können Sie beispielsweise lange Formulare übersichtlicher halten. Beachten Sie, dass Sie dann auf alle Fälle wert_4 angeben müssen, um die Trennung sichtbar zu machen. Fehlt dieser Wert, weist TYPO3 dem Trennelement keinen Rahmen zu, sodass es unsichtbar bleibt.
Lizensiert für Markus Mueller
Besonders interessant bei dem Element --div-- ist das Zusammenspiel mit der Option dividers2tabs, die Sie im ctrl-Abschnitt des TCA angeben können. Haben Sie im ctrlAbschnitt Ihrer Tabelle die Option dividers2tabs aktiviert, erzeugt die Angabe --div-aus den nachfolgenden Feldangaben einen neuen Formularbereich, den Sie über eine spezielle Navigationsleiste auswählen können. Sämtliche Felder, die nach dem Element --div-- angegeben werden, finden Sie dann in dem neuen Formularbereich. Abbildung 6-1 verdeutlicht die Auswirkungen dieser Option. Beachten Sie, dass Sie dann unbedingt wert_2 angeben müssen, um dem Bereich eine Bezeichnung zu geben.
Abbildung 6-1: Durch die Einstellung »dividers2tabs« erzeugen die Trennelemente automatisch neue Formularbereiche
Siehe auch Weitere praktische Anwendungsbeispiele für die Formulartypen erhalten Sie in Rezept 19.4. Dort erfahren Sie, wie Sie unterschiedliche Typen Ihrer Datensätze verwenden.
Max. Linie
Max. Linie 6.10 Eingabeformulare mehrspaltig darstellen | 227 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Vakat Lizensiert für Markus Mueller
First
Kapitel 7an
KAPITEL 7
Die Übersicht im Backend erhöhen
7.0
Einführung
Mit zunehmender Datenmenge wird es immer wichtiger, die Inhalte zu kontrollieren. Das trifft sowohl auf Redakteure als auch auf Administratoren zu. In diesem Kapitel erfahren Sie, mit welchen Tools Sie im TYPO3-Backend schnell einen Überblick über bestehende Inhalte bekommen und Ihre Arbeitswege verkürzen können. Lizensiert für Markus Mueller
In den Rezepten 7.1 und 7.2 erfahren Sie, wie Sie die Arbeit an Ihren zuletzt geänderten Dokumenten nahtlos weiterführen können, wenn Sie die Arbeit am Backend unterbrochen haben. TYPO3 bietet Ihnen die Möglichkeit, nach dem Login direkt an den entsprechenden Inhalten weiterzuarbeiten. Der Seitenbaum im TYPO3-Backend stellt die essenzielle und zentrale Verwaltungseinheit im Backend dar. Über den Seitenbaum können Sie sämtliche Datenbankinhalte verwalten und bearbeiten. In den Rezepten 7.3 und 7.4 erfahren Sie, wie Sie den Seitenbaum weiter optimieren und an Ihre Arbeitsweisen anpassen können. Eine zentrale Rolle für die Verwaltung umfangreicher Datenmengen stellen die Module Liste und Info dar. Über das Modul Liste erhalten Sie eine tabellarische Auflistung aller Seiteninhalte der gewählten Seite. Über die einzelnen Spaltentitel können Sie die Datensätze bequem sortieren und bearbeiten. In den Rezepten 7.5 und 7.6 erfahren Sie, wie Sie diese besonderen Bearbeitungsfunktionen anwenden und so selbst umfangreiche Datenbestände übersichtlich verwalten können. Die Rezepte 7.7 und 7.8 konzentrieren sich darauf, wie Sie die Seiten im Seitenbaum anpassen können. In Rezept 7.7 erfahren Sie, wie Sie Tabelleninhalte im Modul Seite auflisten können. Dies ist beispielsweise dann nützlich, wenn Sie – zusätzlich zu den regulären Seiteninhalten – auch bestimmte Datensätze im Modul Seite anzeigen möchten. Rezept 7.8 verdeutlicht, wie Sie das Icon der Seiten im Seitenbaum anpassen können.
Max. Linie
Max. Linie | 229 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
7.1
Oft verwendete Datensätze schnell erreichen
Links
Problem Sie möchten schnell zu oft benutzten Datensätzen oder Stellen in Ihrem Seitenbaum springen.
Lösung Legen Sie für die gewünschten Stellen sogenannte Verweise an, mit denen Sie direkt zur jeweiligen Ansicht im TYPO3-Backend springen können. Um einen Verweis (im Folgenden »Shortcut« genannt, wie im TSconfig-Code) anzulegen, klicken Sie auf das Symbol Einen Verweis auf diese Seite erzeugen?, das Sie in der rechten oberen Ecke unterhalb der Funktionsleiste finden. Nachdem Sie diese Aktion bestätigt haben, erscheint in der Funktionsleiste unterhalb des Shortcut-Icons ein neuer Eintrag. Klicken Sie auf das ShortcutIcon in der Funktionsleiste, öffnet sich die Shortcut-Liste. Mit einem weiteren Klick auf den Shortcut gelangen Sie zur gewünschten Ansicht.
Lizensiert für Markus Mueller
Diskussion Shortcuts bieten eine sehr komfortable Möglichkeit, schnell zu bestimmten Ansichten oder Datensätzen zu springen. Jedes Icon repräsentiert dabei das entsprechende Modul, in dem der Shortcut angelegt wurde. Wenn Sie zum Beispiel einen Verweis auf eine Listenansicht speichern, wird der Shortcut mit dem Symbol des Listenmoduls dargestellt. So wird schnell sichtbar, in welchem Kontext Sie sich nach dem Klicken befinden. Ebenso wird der Titel der aktuellen Ansicht als Titel übernommen. Im Shortcut-Panel der Funktionsleiste können Sie Ihre Shortcuts nachträglich verwalten, etwa um ihnen einen eindeutigen Titel zu geben. Diese Angaben erscheint dann später im Titeltext des jeweiligen Icons. Zusätzlich können Sie die Shortcuts in bestimmte Funktionsbereiche gruppieren oder wieder aus dem Shortcut-Frame entfernen. Um den Bearbeitungsmodus zu starten, wählen Sie den gewünschten Shortcut aus und klicken auf den kleinen Stift. Nun erscheint ein Bearbeitungsformular, mit dessen Hilfe Sie die Eigenschaften für den gewählten Shortcut speichern können. In dem Eingabefeld vergeben Sie den Shortcut-Titel. Im Auswahlfeld finden Sie die Liste der vorhandenen Gruppen. Wenn Sie eine Gruppe wählen, wird der Shortcut nach dem Speichern in die jeweilige Gruppe einsortiert, was besonders bei vielen Shortcuts die Übersicht sehr erhöht.
Max. Linie
Wenn Sie als Administrator angemeldet sind, werden Sie zwei unterschiedliche Gruppierungsmöglichkeiten feststellen: Einmal können Sie lokale Gruppen verwenden, mit denen Sie für sich selbst die vorhandenen Shortcuts strukturieren können. Zusätzlich stehen Ihnen noch sogenannte globale Gruppen zur Verfügung, denen in der Auswahlliste die Bezeichnung Global: vorangestellt ist. Im Gegensatz zu den normalen Gruppen können Sie
230 | Kapitel 7: Die Übersicht im Backend erhöhen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
diese globalen Gruppen auch anderen Benutzern zur Verfügung stellen, etwa um diesen vordefinierte Shortcuts zu wichtigen Stellen oder Datensätzen zur Verfügung zu stellen. Um diese globalen Gruppen anderen Benutzern freizuschalten, gehen Sie wie folgt vor: Legen Sie einen oder mehrere Shortcuts über die Bearbeiten-Funktion in einer globalen Gruppe ab und speichern Sie die Auswahl mit dem entsprechenden Symbol. Geben Sie danach den TSconfig-Code nach folgendem Muster in das entsprechende Feld TSconfig der gewünschten Benutzergruppe oder des Benutzers ein, um die Shortcut-Gruppe freizuschalten: options.shortcutGroups { gruppen_id=1 }
Jede der fünf vorhandenen Gruppen können Sie mit dem Wert 1 aktivieren. Wenn Sie diesen Wert leer lassen, werden Shortcuts dieser Gruppe standardmäßig angezeigt. Ist der Wert auf 0 gesetzt, wird die Shortcut-Gruppe ausgeblendet. Achten Sie daher darauf, die Gruppen explizit auszublenden, wenn Sie nicht möchten, dass sie angezeigt werden. Den Gruppen sind dabei standardmäßig folgende Zahlenwerte zugeordnet:
Lizensiert für Markus Mueller
1 2 3 4 5
Seiten Datensätze Dateien Werkzeuge Verschiedenes
Wenn Sie zum Beispiel die Gruppe Global: Seiten für andere Benutzer freischalten möchten, legen Sie den Shortcut über das Auswahlfeld in der Gruppe ab, speichern diese Auswahl und geben danach folgenden Code in das TSconfig-Feld der gewünschten Benutzergruppe oder des Benutzers ein, um diese Gruppe öffentlich zu schalten: options.shortcutGroups { 1=1 }
Die Shortcuts dieser Gruppe erscheinen daraufhin automatisch im unteren Bildschirmbereich und können direkt von den Benutzern verwendet werden. Um die Zuordnung dieser Gruppen an eigene Bedürfnisse anzupassen, können Sie diese Gruppe auch über folgende Syntax umbenennen: options.shortcutGroups { 1=1 2=Eigene Gruppe 3=0 4= 5= }
Max. Linie
Die Shortcuts der Gruppe 1, 2, 4 und 5 werden dadurch automatisch aktiviert und den Benutzern zur Verfügung gestellt, falls Shortcuts darin abgelegt wurden. Die Gruppe 2 hat den Titel Eigene Gruppe. Die Gruppe 3 wird ausgeblendet.
7.1 Oft verwendete Datensätze schnell erreichen | 231 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Alternativ können Sie Shortcuts auch in der Gruppe Global: Alle ablegen. Die Shortcuts dieser Gruppe sind dann für sämtliche Benutzer sichtbar, sofern der Seitenbereich angezeigt wird. Den Bereich schalten Sie mit folgendem TSconfig-Code frei:
Links
options { shortcutFrame = 1 }
Achten Sie darauf, dass Sie diese Option für die gewünschten Benutzer aktiviert haben, da diese ansonsten die freigeschalteten Verweise nicht sehen können. Eine andere Möglichkeit, schnell an bestimmte Datensätze zu gelangen, stellt das Suchfeld in der rechten oberen Ecke dar. Dieses erscheint, wenn Sie auf die Lupe klicken. Möchten Sie direkt zu einer Seite springen, genügt es, wenn Sie dort die Seiten-ID eingeben. Für Datensätze anderer Tabellen müssen Sie den Tabellennamen voranstellen. Verwenden Sie dazu folgende Syntax: tabellen_name:datensatz_id
Lizensiert für Markus Mueller
Die Datensatz-ID ermitteln Sie, indem Sie mit der Maus über das jeweilige Icon des Datensatzes fahren. Nach kurzer Zeit erscheint der Titel der Grafik, in dem die ID des Datensatzes angezeigt wird (in Rezept 7.3 erfahren Sie weitere Möglichkeiten, die SeitenID zu ermitteln). In der Praxis hat es sich als sehr hilfreich erwiesen, die Seiten-IDs direkt im Seitenbaum anzuzeigen. Dadurch können sie sehr zügig ermittelt werden. Geben Sie dazu folgenden Code in das Feld TSconfig des Benutzers oder der Benutzergruppe ein: options { pageTree.showPageIdWithTitle = 1 }
Zusätzlich können Sie mit den folgenden Optionen einstellen, wie sich die Sprünge auf den Seitenbaum auswirken. Standardmäßig wird der restliche Seitenbaum geschlossen, und nur die Zielseite erhält den Fokus. Mit der Option shortcut_onEditId_dontSetPageTree unterbinden Sie jegliche Reaktion des Seitenbaums, wenn eine Seiten-ID angesprungen werden soll. Genau das Gegenteil erreichen Sie, wenn Sie die Option shortcut_ onEditId_keepExistingExpanded aktivieren. Der Seitenbaum bleibt dann stets ausgeklappt, und es öffnen sich nach Eingabe einer neuen Seiten-ID entsprechend weitere Seitenbäume. options { # die Zielseite erhält den Fokus - der Seitenbaum bleibt unverändert shortcut_onEditId_dontSetPageTree = 0 # die Zielseite erhält den Fokus - andere Seitenbäume werden NICHT eingeklappt # dabei sollte shortcut_onEditId_dontSetPageTree = 0 sein shortcut_onEditId_keepExistingExpanded = 1 }
Max. Linie
Auf diese Weise können Sie auch in sehr umfangreichen Seitenbäumen sehr schnell zum gewünschten Datensatz gelangen.
232 | Kapitel 7: Die Übersicht im Backend erhöhen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
7.2
Zuletzt bearbeitete Datensätze anzeigen
Problem Sie möchten direkt zu Ihren zuletzt bearbeiteten Datensätzen springen, beispielsweise um einen begonnenen Bearbeitungsvorgang abzuschließen.
Lösung Wechseln Sie in das Modul Dokumente. Sind noch Datensätze aus Ihrer vorangegangenen Sitzung geöffnet, wird automatisch die Bearbeitungsmaske des aktuellsten Datensatzes geöffnet. Über die Auswahlliste Geöffnete Dokumente wechseln Sie zu anderen Datensätzen, sofern diese vorhanden sind.
Diskussion
Lizensiert für Markus Mueller
Max. Linie
TYPO3 speichert für jeden Benutzer die geöffneten Datensätze, bis diese wieder geschlossen werden. Ist ein Datensatz geöffnet, wird er für die anderen Backend-Benutzer mit einem entsprechenden Hinweis versehen. Öffnet ein anderer Benutzer einen bereits geöffneten Datensatz, erhält dieser nochmals einen deutlichen Hinweis darauf, dass momentan an dem Datensatz gearbeitet wird. Wenn dieser Warnhinweis ignoriert wird, gehen beim Speichern möglicherweise Änderungen verloren. Über das oben genannte Modul Dokumente erhalten Sie einen guten Überblick über Ihre zuletzt bearbeiteten Dokumente – was aber, wenn Sie sehen möchten, welche Datensätze insgesamt neu erstellt oder bearbeitet wurden? Um zu sehen, welche neuen Datensätze von allen Benutzern in die Datenbank eingepflegt wurden, können Sie sich die sogenannten Befehle zu Nutze machen, mit denen Sie zum Beispiel sehr bequem häufig benötigte Datenbankabfragen durchführen können (wenn Sie zuvor noch nicht mit Befehlen gearbeitet haben, sollten Sie Rezept 5.2 lesen, um an Hintergrundwissen zu gelangen). Im Folgenden erstellen Sie eine solche Abfrage, mit der die aktuellsten Seiten ermittelt werden. Installieren Sie dazu die Extension User>Task Center, Actions (sys_action). Diese Extension legt eine neue Datenbanktabelle an, in der die Befehle gespeichert werden, und bindet die entsprechenden Eingabemasken in das Backend ein. Neue Befehle erstellen Sie dann über das Modul Liste in der Wurzelseite (mit der ID 0) Ihrer TYPO3-Installation (beachten Sie, dass Sie dazu Administratorrechte benötigen). Legen Sie dort ein neues Inhaltselement vom Typ Befehl an und wählen Sie in der Auswahlliste Typ den Wert SQL-query. Geben Sie der Aktion anschließend einen aussagekräftigen Titel, beispielsweise Neue Seiten anzeigen. Im Feld Beschreibung können Sie zusätzliche Hinweise zur Benutzung des Befehls geben und beschreiben, welche Funktionen dieser Befehl durchführt. Diese Beschreibung erscheint später unterhalb des Befehlstitels.
7.2 Zuletzt bearbeitete Datensätze anzeigen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 233
Max. Linie
Links Wenn Sie möchten, dass auch andere Backend-Benutzer Zugriff auf diesen Befehl haben, können Sie über das Feld Assign action to groups eine oder mehrere Backend-Benutzergruppen angeben, die so ebenfalls Zugriff auf diesen Befehl haben. Der Befehl erscheint dann automatisch bei allen Benutzern dieser Gruppe im Bereich Aufgaben. Ansonsten haben nur Sie Zugriff. Wir empfehlen Ihnen, Befehle zunächst selbst ausgiebig zu testen und sie erst dann für die Benutzergruppen freizuschalten.
Nachdem Sie den Befehl abgespeichert haben, erscheint er im Modul Aufgaben automatisch im Bereich Befehle, in dem später sämtliche Befehle gesammelt werden. Von dort aus können Sie jeden einzelnen Befehl komfortabel per Mausklick aufrufen. Da die Konfiguration dieses Befehls noch nicht abgeschlossen ist, wechseln Sie nun in das Modul DBÜberprüfung. Dort erzeugen Sie über einen Abfrage-Assistenten die nötige Datenbankabfrage, mit der Sie die aktuellen Datensätze ermitteln. Abschließend verknüpfen Sie diese Abfrage mit dem zuvor erstellten Befehl. Um den Abfrage-Assistenten zu erreichen, wählen Sie im Feld links oben die Option Full search. Danach erscheinen zwei weitere Auswahllisten. Stellen Sie in der mittleren die Option Advanced query ein. Ganz rechts sollten Sie Select records aktiviert haben.
Lizensiert für Markus Mueller
Die Eingabemaske wechselt dann in das Abfragemodul, mit dem Sie die Tabellen durchsuchen können. Legen Sie in Select a table die Tabelle Seite fest. Um später ein aussagekräftiges Ergebnis zu erhalten, sollten Sie im Feld Select fields mindestens die Felder uid und title auswählen (fehlerhafte Eingaben können Sie über das Eingabefeld wieder entfernen). Diese Angaben werden später beim Aufruf des Befehls als Spalten in einer Liste angezeigt. Unter Make Query wählen Sie nun den Eintrag [FIELD: uid]. Damit setzen Sie die Abfrage auf das Feld uid in der Tabelle pages (die Tabelle pages speichert standardmäßig alle Seiten, die Sie im TYPO3-Backend anlegen). Im nächsten Feld legen Sie den Vergleichsoperator fest. Wählen Sie hier is greater than. Im dritten Feld geben Sie eine 0 ein. Das Kontrollkästchen dazwischen können Sie ignorieren. Es dient lediglich dazu, den Vergleichsoperator umzukehren, was in der gewünschten Anwendung nicht sinnvoll ist. Um die neuen Suchkriterien zu aktivieren, klicken Sie danach auf das Icon Update. Die restlichen Felder können Sie leer lassen. Für die richtige Sortierung der Liste wählen Sie in der Auswahlliste Order By den Eintrag tstamp. Dadurch werden die Inhalte nach der letzten Aktualisierung sortiert. Aktivieren Sie außerdem die Option Descending. Dadurch stellen Sie sicher, dass der aktuellste Eintrag immer oben angezeigt wird. Um die Liste überschaubarer zu halten, können Sie das Limit noch auf 20 setzen. Aktualisieren Sie die Abfrage anschließend erneut über das Update-Icon, sodass am Ende im Feld SQL Query folgende SQL-Anweisung ausgegeben werden sollte:
Max. Linie
SELECT uid,title FROM pages WHERE pages.uid > 0 AND NOT pages.deleted ORDER BY tstamp DESC LIMIT 20
234 | Kapitel 7: Die Übersicht im Backend erhöhen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Im nächsten Schritt wird diese Abfrage mit dem anfangs erstellten Befehl verknüpft. Wählen Sie dazu im oberen Formularbereich Load/Save Query den Eintrag des zuvor erstellten Befehls Neue Inhalte unterhalb der Markierung __Save to Action:__ aus und bestätigen Sie diese Auswahl mit dem Button Save. Nachdem TYPO3 Ihnen diesen Schritt mit Query OK and saved. bestätigt hat, wechseln Sie in das Modul Aufgaben und klappen dort den Bereich Befehle auf, indem Sie auf die entsprechende Schaltfläche klicken. Möchten Sie nun abschließend auf den Titel des Befehls klicken, wird dieser ausgeführt und die entsprechende Liste im rechten Seitenbereich angezeigt. Wenn Sie diesen Befehl nun auch anderen Backend-Benutzern zur Verfügung stellen, wechseln Sie zurück in den Befehlsdatensatz und weisen über das Feld Assign action to groups die gewünschten Backend-Benutzergruppen zu.
Siehe auch Dieses Rezept zeigt nur eine Funktion von vielen, die Sie mit Befehlen vereinfachen können. In Rezept 5.2 erfahren Sie, wie Sie Befehle auch für andere Arbeitsschritte verwenden können. Über diese Kombination aus Befehl und SQL-Abfrage können Sie auch sehr leicht andere Tabellen abfragen, die im TCA registriert sind. Eine Übersicht der häufigsten Tabellen erhalten Sie in Rezept 2.5. Lizensiert für Markus Mueller
7.3
Seiten-IDs ermitteln
Problem Sie möchten die Seiten-ID erfahren, um sie zum Beispiel für interne Verlinkungen zu verwenden.
Lösung Bewegen Sie Ihren Mauszeiger im Seitenbaum über ein Seitensymbol. Daraufhin erscheint als Information die Seiten-ID. Falls Sie im Seiten-Header einen Alias vergeben haben, wird dieser neben der ID angezeigt. Auf diese Weise erfahren Sie auch den aktuellen Status der Seite, beispielsweise ob sie momentan sichtbar oder versteckt ist, wann sie angezeigt oder ausgeblendet wird und welche Benutzergruppe darauf zugreifen darf.
Max. Linie
Zusätzlich gibt es je nach Seitentyp noch spezielle Informationen: Beim Seitentyp Verweis werden Verknüpfungsmodus und Seitentitel der verlinkten Seite sichtbar. Analog dazu wird beim Seitentyp Externe URL der entsprechende externe Link dargestellt. Bewegen Sie den Mauszeiger über das Icon des Seitentyps Mount Seite, erhalten Sie den Pfad zur gemounteten Seite.
7.3 Seiten-IDs ermitteln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 235
Max. Linie
Diskussion
Links
Wenn Sie mehrere Seiten gleichzeitig kontrollieren möchten oder Ihnen die oben genannte Vorgehensweise auf Dauer zu mühsam ist, können Sie sich die Seiteneigenschaften auch über das Modul Info anzeigen lassen. Wählen Sie dazu die gewünschte Startseite und aktivieren Sie danach das Modul Info. Anschließend aktivieren Sie in der rechten Auswahlliste die Option Seitenbaum-Übersicht. Dadurch erscheinen zwei neue Auswahllisten am Listenkopf, über die Sie Einfluss auf die Art und den Umfang der Informationen nehmen können. Mit der ersten Auswahlliste bestimmen Sie, wie tief Sie in den Seitenbaum tauchen möchten. Wenn Sie nur wenige Seiten vergleichen möchten, wählen Sie eine entsprechend kleine Anzahl von Ebenen. Beachten Sie, dass sich eine zu große Ebenenanzahl negativ auf die Geschwindigkeit beim Seitenaufbau auswirkt, da alle Seiten – unabhängig von der Option Seitenbaum stoppen – angezeigt werden und so mitunter sehr lange Seitenbäume entstehen (mit der Option Seitenbaum stoppen können Sie über die Seiteneigenschaften festlegen, dass die Unterseiten der aktuellen Seite nicht im Seitenbaum erscheinen).
Lizensiert für Markus Mueller
Mit der zweiten Auswahlliste bestimmen Sie, welche Felder in der Übersicht angezeigt werden. Die Auswahl Basiseinstellungen gewährt einen Einblick in die oben beschriebenen Seiteneigenschaften, wie Seiten-ID, Alias, Start- und Stoppzeiten, Zugriff, Ziel, URL und Verweis zur Seite. Die Auswahl Cache und Alter zeigt die Werte, die festlegen, wie die Seite von TYPO3 im Frontend behandelt wird. Beispielsweise bekommen Sie die Cache-Einstellungen jeder Seite aufgelistet. Damit können Sie schnell kontrollieren, ob Sie die Seiten optimal cachen, und eventuell Performanceverbesserungen einführen. Mit der Auswahl Datensatz-Übersicht erhalten Sie eine zusammenfassende Liste aller vorhandenen Datensätze. Diese Darstellung ist dann sehr hilfreich, wenn Sie sich schnell einen Überblick über die aktuelle Anzahl der vorhandenen Datensätze verschaffen möchten. Über die Bearbeitungssymbole können Sie die gewünschten Datensätze direkt aus dem Infomodul heraus ändern. Dabei können Sie entweder die Bearbeitung auf einzelne Felder beschränken oder einzelne Datensätze komplett ändern. Zusätzlich zu den oben beschriebenen Möglichkeiten können Sie die Seiten-ID auch direkt im Seitenbaum anzeigen. Geben Sie dazu folgenden Code im Feld TSconfig Ihres Backend-Benutzers ein: options.pageTree { showPageIdWithTitle = 1 }
Max. Linie
Die Seiten-ID erscheint dann permanent im Seitenbaum links neben dem Seitentitel. Dadurch kann es passieren, dass manche Seitentitel rechts abgeschnitten werden. Mit folgendem TSconfig-Code verbreitern Sie den Frame auf die gewünschten Pixel:
236 | Kapitel 7: Die Übersicht im Backend erhöhen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
setup.default { frameWidth = 400 }
Wünschen Sie eine variable Breite für den Seitenbaum, kombinieren Sie den oben genannten Wert mit folgender Angabe: setup.default { resizeFrame = 1 }
Der Seitenbaum-Frame kann dadurch individuell verbreitert werden, indem Sie den Rand mit der Maus auf die gewünschte Breite ziehen. Beachten Sie, dass der Frame immer auf die Standardbreite zurückgesetzt wird, wenn Sie Datensätze kopieren oder verschieben.
7.4
Längere Seitentitel im Seitenbaum ermöglichen
Problem Sie möchten im Seitenbaum auch längere Titel vollständig anzeigen lassen. Lizensiert für Markus Mueller
Lösung Geben Sie folgenden Code in Ihr Benutzer-TSconfig-Feld ein: setup.override { titleLen = 128 }
Mit dieser Anweisung legen Sie die Titellänge von 128 Zeichen fest, unabhängig davon, welchen Wert der Benutzer in seinen Einstellungen festlegt. Wenn Sie diesen Code in das TSconfig-Feld der Benutzergruppe schreiben, erhalten alle Benutzer dieser Gruppe diese Vorgabe. Der Wert sollte 255 Zeichen nicht überschreiten, da das entsprechende Datenbankfeld maximal 255 Zeichen speichern kann. Sollten Sie mehr als 255 Zeichen benötigen, müssen Sie die Datenbanktabelle entsprechend bearbeiten, indem Sie den Feldtyp auf MEDIUMTEXT bzw. TEXT setzen. Jedoch sollten Sie diesen Vorgang gründlich überlegen, weil dadurch die Größe der Datenbank unnötig aufgebläht wird und das Ganze nur in Sonderfällen sinnvoll ist.
Diskussion Um Ihnen mehr Übersicht im Seitenbaum zu ermöglichen, können Sie mit folgendem Code zusätzlich die Frame-Breite des Seitenbaums vergrößern:
Max. Linie
setup.default { navFrameWidth = 400 }
7.4 Längere Seitentitel im Seitenbaum ermöglichen | 237 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Der Standardwert beträgt 245 Pixel.
Links
Wünschen Sie eine variable Breite, sollten Sie den oben genannten Wert hiermit kombinieren: setup.default { resizeFrame = 1 }
Mit diesen Angaben erhalten Sie einen 400 Pixel breiten Frame für den Seitenbaum, den Sie noch je nach Belieben vergrößern können: setup.default { navFrameWidth = 400 resizeFrame = 1 }
Beachten Sie, dass der Seitenbaum immer auf die Standardbreite gesetzt wird, wenn Sie Datensätze kopieren oder verschieben.
7.5
Tabelleninhalte nur bei Bedarf anzeigen
Lizensiert für Markus Mueller
Problem Sie möchten auch bei zahlreichen Datensätzen die Übersicht behalten, beispielsweise wenn in einer Seite mehrere Hundert unterschiedliche Datensätze gesammelt werden.
Lösung Unterbinden Sie mit folgendem Seiten-TSconfig die ausführliche Darstellung der Datenbankinhalte. mod.web_list { listOnlyInSingleTableView = 1 }
Sie erhalten daraufhin im Listenmodul nur noch eine kompakte Übersicht der vorhandenen Tabellen. Mit einem Klick auf den Tabellentitel oder auf das Icon Nur diese Tabelle anzeigen öffnet sich die Tabelle in der Einzelansicht, und der Tabelleninhalt wird aufgelistet.
Diskussion Diese Einstellungen können auch im Benutzer-TSconfig gespeichert werden. Achten Sie darauf, dass Sie diese Einstellungen nicht beim eigenen Admin-Account verwenden:
Max. Linie
Max. Linie 238 | Kapitel 7: Die Übersicht im Backend erhöhen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
mod.web_list { listOnlyInSingleTableView = 1 disableSingleTableView = 1 }
Dadurch würden Sie sich als Administrator selbst von der Dateneingabe ausschließen. Der Grund: Nach dem Schließen der gespeicherten Benutzereinstellungen werden alle Inhaltselemente – auch Ihr eigenes Benutzerprofil – ausgeblendet, und Sie haben keine Möglichkeit mehr, diese über das Backend zu ändern. Wenn Sie experimentierfreudig sind und diese Einstellungen trotz aller Warnungen getätigt haben, hilft folgender Weg, um die Dateneingabe wieder »freizuschalten«: Legen Sie mit dem Link Neuen Datensatz anlegen einen neuen Admin-Benutzer an, der nicht diese Einstellungen im Benutzer-TSconfig hat. Loggen Sie sich dann mit diesem Account ein und löschen Sie die oben genannten TSconfig-Einstellungen.
Lizensiert für Markus Mueller
Wenn Sie keine Datensätze mehr direkt anlegen können, hilft nur noch der Weg über das Install-Tool. Dort können Sie einen neuen Admin-Benutzer anlegen. Wechseln Sie dazu in das Modul Installation und wählen Sie den Abschnitt Database Analyzer. Dort finden Sie am Seitenende die Option Create »admin« user. Der neue Administrator-Account wird damit umgehend erstellt. Beachten Sie bei der Vergabe der Zugangsdaten, dass dieser zusätzliche Benutzer ein Sicherheitsrisiko darstellen kann. Wählen Sie daher die Zugangsdaten entsprechend sorgfältig und löschen Sie ihn, nachdem Sie Ihren ursprünglichen Account wiederhergestellt haben. Alternativ zu dem anfangs gezeigten Beispiel können Sie die Datensätze einer Tabelle auch vollständig ausblenden, indem Sie die Tabelle von der Anzeige im Listenmodul ausschließen. Geben Sie dazu folgenden TSconfig-Code in das TSconfig-Feld der Seite, des Backend-Benutzers oder der Benutzergruppe ein: mod.web_list { hideTables = tabellen_name }
Ersetzen Sie anschließend den Platzhalter tabellen_name mit dem entsprechenden Tabellennamen (eine Tabellenübersicht finden Sie in Rezept 2.5). Mehrere Tabellennamen trennen Sie durch ein Komma voneinander.
Siehe auch Rezept 7.7 behandelt die übersichtliche Darstellung von Inhaltselementen im Seitenmodul und wie Sie dort Inhalte sinnvoll verknüpft darstellen können.
Max. Linie
Max. Linie 7.5 Tabelleninhalte nur bei Bedarf anzeigen | 239 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
7.6
Anzahl der Datensätze im Listenmodus erhöhen
Links
Problem Sie möchten die Anzahl der aufgelisteten Datensätze von 20 auf 100 oder mehr erhöhen.
Lösung Erstellen Sie nach den Vorgaben von Rezept 16.2 eine Extension und öffnen Sie anschließend die Datei ext_tables.php im Extension-Verzeichnis. Fügen Sie dort folgenden Code ein, um für die Tabelle tt_content die maximale Anzahl der Datensätze anzupassen: t3lib_div::loadTCA('tt_content'); $TCA['tt_content']['interface']['maxDBListItems'] = '100'; $TCA['tt_content']['interface']['maxSingleDBListItems'] = '300';
Sie ermöglichen damit eine längere Liste sowohl in der Übersicht als auch in der Detailansicht der Tabelle.
Diskussion Lizensiert für Markus Mueller
Selbstverständlich können Sie so auch andere Tabellen anpassen. Geben Sie dazu den Code nach folgendem Muster in die Datei ext_tables.php ein: t3lib_div::loadTCA('tabellen_name'); $TCA['tabellen_name']['interface']['maxDBListItems'] = '100'; $TCA['tabellen_name']['interface']['maxSingleDBListItems'] = '300';
Passen Sie nun den Namen der Tabelle an und speichern Sie die Datei (in Rezept 2.5 finden Sie eine Übersicht der vorhandenen Tabellen). Danach erweitern Sie die Listenansicht der Tabelle entsprechend den Angaben. In der normalen Listenansicht werden nun 100 Datensätze auf einmal angezeigt. Wenn Sie dort auf den Tabellentitel klicken, gelangen Sie in die sogenannte Detailansicht der Tabelle, in der nun 300 Einträge aufgelistet werden. Wenn Sie momentan an einer eigenen Extension arbeiten, sollten Sie die Werte direkt im Abschnitt interface der Tabelle ändern. In der Datei ext_tables.php sollte der Code dann folgendermaßen aussehen: $TCA['tabellen_name'] = Array ( ... 'interface' => Array ( 'maxDBListItems' => '100', 'maxSingleDBListItems' => '300', ) ...
Max. Linie
Sollten Ihnen die oben genannten Begriffe noch fremd sein, finden Sie in Rezept 16.3 die nötigen Hintergrundinformationen.
240 | Kapitel 7: Die Übersicht im Backend erhöhen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Als kleine Unterstützung für den Umgang mit den langen Listen können Sie folgenden Code in Ihr Benutzer-TSconfig eingeben, mit dem Sie festlegen, dass jede zweite Zeile in der Liste farbig hervorgehoben wird: mod.web_list { alternateBgColors = 1 }
Dadurch fällt es leichter, den Zeilenverlauf nachzuvollziehen.
Siehe auch In den Rezepten 16.2 und 16.3 erfahren Sie mehr über die Einstellungsmöglichkeiten von Datenbanktabellen in TYPO3.
7.7
Eigene Datensätze im Seitenmodul anzeigen
Problem Lizensiert für Markus Mueller
Sie möchten im Seitenmodul – zusätzlich zu den Seiteninhalten – die Datensätze von eigenen Extensions auflisten, etwa um deren Bearbeitung über das Modul Seite vorzunehmen.
Lösung Binden Sie Ihre eigene Tabelle über eine Extension im Seitenmodul ein, indem Sie den gewünschten Tabellennamen und die Felder, die angezeigt werden sollen, über eine spezielle Extension-Variable in der Extension cms registrieren. Erstellen Sie dazu – wie in Rezept 16.2 beschrieben – eine Extension und bearbeiten Sie anschließend die Datei ext_ localconf.php im jeweiligen Extension-Ordner. Geben Sie dort nun folgenden PHP-Code ein: $table = 'tabellen_name'; $TYPO3_CONF_VARS['EXTCONF']['cms']['db_layout']['addTables'][$table][0] = array( 'fList' => 'feld1;feld2,feld3', 'icon' => TRUE );
Max. Linie
Damit registrieren Sie Ihre Tabelle für die Darstellung im Modul Seite und geben gleichzeitig die Felder sowie deren Position in der Liste an. Ersetzen Sie dann tabellen_name durch den gewünschten Tabellennamen und geben Sie im Parameter fList (field-Liste) die gewünschten Spaltennamen an, die in der Ansicht erscheinen sollen. Diese Werte können Sie mit zwei unterschiedlichen Trennzeichen gliedern: Werden die Spaltennamen durch Kommata getrennt, bilden sie für jeden Wert eine eigenständige Spalte. Der Feldtitel erscheint dabei automatisch als Spaltenüberschrift. Wenn Sie mehrere Werte innerhalb einer Spalte darstellen möchten, sollten Sie das Semikolon als Trennzeichen
7.7 Eigene Datensätze im Seitenmodul anzeigen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 241
Max. Linie
verwenden. Die Werte erscheinen daraufhin untereinander. feld1 wird in dem Beispiel also mit feld2 in einer Spalte angezeigt. feld3 erscheint rechts davon in einer neuen Spalte. Mit dem Wert icon legen Sie fest, ob das Icon des Datensatzes in der Liste am linken Rand erscheint. Über dieses Icon ist es dann möglich, das Kontextmenü aufzurufen und weitere Bearbeitungsoptionen durchzuführen. Wenn Sie nur die Bearbeitung der Datensätze erlauben möchten, sollten Sie diesen Wert auf FALSE setzen.
Links
Mit folgender Anweisung erscheinen zum Beispiel Benutzername und Passwort von Frontend-Benutzern untereinander in einer gemeinsamen Spalte. Die restlichen Daten werden separat davon in eigenen Spalten angezeigt: $table = 'fe_users'; $TYPO3_CONF_VARS['EXTCONF']['cms']['db_layout']['addTables'][$table][0] = array( 'fList' => 'username;password,name,email,telephone,address,zip,city', 'icon' => TRUE );
Aus Platzgründen haben wir das Feld usergroup entfernt. Die Standardeinstellung für die Tabelle fe_users ist username,password,usergroup,name,email,telephone,address,zip,city.
Diskussion Lizensiert für Markus Mueller
Durch die Darstellung der Datensätze im Seitenmodul können Sie Ihre Datensätze übersichtlich unterhalb des regulären Seiteninhalts auflisten. Gerade bei umfangreichen Listen ist damit ein sehr intuitives Arbeiten möglich, da bestimmte Felder über die Trennung mithilfe von Semikola auch logisch gegliedert in einer Spalte dargestellt werden können. Dabei werden sämtliche Felder im Klartext ausgelesen. Dies kann bei Dateifeldern, in denen Sie Bilder speichern, jedoch auch hinderlich sein, denn ein Bildname ist meist nicht so aussagekräftig wie das jeweilige Bild selbst. Was aber, wenn Sie Bilder direkt in der Liste als Vorschaubild anzeigen möchten? Für diesen Fall bietet Ihnen TYPO3 die Möglichkeit, in den Tabelleneigenschaften das jeweilige Feld als sogenanntes Thumbnail-Feld zu definieren. Der Inhalt dieses Felds wird dann anhand des Dateinamens in ein Vorschaubild umgewandelt und kann automatisch per Mausklick vergrößert werden.
Max. Linie
Um dieses Feld für eine Tabelle einzurichten, gehen Sie wie folgt vor: Falls noch kein Dateifeld vorhanden ist, sollten Sie im ersten Schritt ein Dateifeld vom Typ group in Ihrer Datenbanktabelle anlegen (wenn Sie noch nicht wissen, wie Sie diese Felder hinzufügen, sollten Sie vorher unbedingt Rezept 16.3 lesen). Legen Sie in diesem Feld anschließend das gewünschte Bild ab. Öffnen Sie nun die Datei ext_tables.php und registrieren Sie dieses Feld im Bereich ctrl des TCA der Tabelle mit der Option thumbnail als Bildspalte. Anschließend binden Sie das Feld – wie anfangs gezeigt – im Seitenmodul ein, um die Datensätze auch dort aufzulisten. Achten Sie darauf, dass Sie das Feld für das Vorschaubild – durch ein Komma von den anderen Feldnamen getrennt – in eine eigene Spalte legen.
242 | Kapitel 7: Die Übersicht im Backend erhöhen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Am Beispiel der Frontend-Benutzer richten Sie dieses Feld wie folgt ein: Als Erstes sollten Sie dem Frontend-Benutzer ein Bild zuweisen, das Sie später in der Liste anzeigen möchten. Wechseln Sie anschließend in die Datei ext_tables.php und geben Sie dort folgenden PHP-Code ein, um das Feld image im TCA der Tabelle fe_users als Thumbnail-Feld zu registrieren. Damit wird die Voraussetzung geschaffen, dass das Feld image später in der Listenansicht als Vorschaubild verwendet werden kann: t3lib_div::loadTCA('fe_users'); $TCA['fe_users']['ctrl']['thumbnail'] = 'image';
Öffnen Sie anschließend die Datei ext_localconf.php im gleichen Extension-Ordner und geben Sie dort den Code ein, mit dem Sie die Spaltenaufteilung im Modul Seite anpassen: $table = 'fe_users'; $TYPO3_CONF_VARS['EXTCONF']['cms']['db_layout']['addTables'][$table][0] = array(array( 'fList' => 'username;password,name,email,telephone,address,zip,city,image', 'icon' => TRUE );
Lizensiert für Markus Mueller
Wechseln Sie nun in das Modul Seite und wählen Sie den Ordner aus, in dem die Frontend-Benutzer gespeichert werden. Das Bild des Frontend-Benutzers wird dann – sofern vorhanden – automatisch angezeigt. Wenn Sie mehrere Bilder in einem Dateifeld speichern, werden diese in der Spalte der Reihe nach untereinander aufgelistet. Dadurch, dass die Bilddaten nun passend zum jeweiligen Frontend-Benutzer dargestellt werden, können Sie sich schnell einen Überblick über die vorhandenen Benutzer verschaffen.
7.8
Eigene Seiten-Icons anzeigen
Problem Sie möchten eigene Grafiken für Seiten oder SysOrdner anzeigen lassen, beispielsweise um im Backend bestimmte Bereiche Ihrer Website über die Seitensymbole speziell zu kennzeichnen.
Lösung Passen Sie im Array $PAGE_TYPES den Wert icon an und überschreiben Sie den Standardwert mit der Pfadangabe zu einer eigenen Grafikdatei. Die Seitengrafik muss eine Breite von 18 Pixeln und eine Höhe von 16 Pixeln haben und im PNG- oder GIF-Format vorliegen.
Max. Linie
Wir empfehlen Ihnen, diese Anpassung über eine eigene Extension vorzunehmen. Wenn Ihnen diese Vorgehensweise noch ungewohnt erscheint, sollten Sie zuerst die Einleitung von Kapitel 16 lesen, um die nötige Grundlage für dieses Rezept zu haben. Danach wird es Ihnen leichter fallen, die hier beschriebenen Vorgänge nachzuvollziehen.
7.8 Eigene Seiten-Icons anzeigen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 243
Max. Linie
In dem Extension-Ordner legen Sie anschließend den Unterordner res an. Dort speichern Sie die Grafik ab, die Sie später als Seiten-Icon verwenden möchten. Anschließend passen Sie in der Datei ext_tables.php das Array $PAGES_TYPES für den gewünschten Seitentyp an. Zuerst wird über einen Funktionsaufruf der Pfad zur Extension ermittelt. Dies ist wichtig, damit die Grafikdatei richtig eingebunden werden kann. Danach ändern Sie die Eigenschaft für den gewünschten Seitentyp. Fügen Sie dazu folgenden Code in die Datei ext_tables.php ein:
Links
$ext_path = t3lib_extMgm::extRelPath($_EXTKEY); $PAGES_TYPES['seiten_typ'] = array( 'icon' => $ext_path .'res/seiten_icon', );
Ersetzen Sie die hervorgehobenen Werte seiten_typ und seiten_icon mit Ihren Werten. Standardmäßig stehen Ihnen in TYPO3 folgende Seitentypen zur Verfügung:
Lizensiert für Markus Mueller
1
Standard
3
Link zu externer URL
4
Verweis
6
Backend-Benutzer Bereich
7
Einstiegspunkt
199
Visuelles Trennzeichen für Menü
254
SysOrdner
255
Papierkorb
Wenn Sie einen eigenen Seitentyp erstellt haben, können Sie natürlich auch diesen als Seitentyp verwenden und das Icon anpassen.
Diskussion Wenn Sie den Status der Seite ändern, etwa indem Sie sie auf Versteckt setzen, werden Sie feststellen, dass Ihr Icon möglicherweise nicht mehr angezeigt wird. Das hat den Hintergrund, dass TYPO3 für jeden Zustand der Seite eine eigene Grafik verwendet, die Sie zusätzlich zu der Standardgrafik in dem Ordner res/ anlegen müssen. Liegt das Icon nicht in dem entsprechenden Zustand vor, verwendet TYPO3 ein Standard-Icon. Die folgende Liste zeigt die wichtigsten Zustände der Seiten-Icons: pages__h.gif
Die Seite ist versteckt. pages__hp.gif
Die Seite und deren Unterseiten sind versteckt.
Max. Linie
pages__htf.gif
Die Seite ist versteckt und besitzt zeitliche Sichtbarkeitseinstellungen.
244 | Kapitel 7: Die Übersicht im Backend erhöhen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts pages__htfp.gif
Die Seite und deren Unterseiten sind versteckt und besitzen zeitliche Sichtbarkeitseinstellungen. pages__htfu.gif
Die Seite ist versteckt, besitzt zeitliche Sichtbarkeitseinstellungen und ist nur für bestimmte Frontend-Benutzer sichtbar. pages__htfup.gif
Die Seite und deren Unterseiten sind versteckt, besitzen zeitliche Sichtbarkeitseinstellungen und sind nur für bestimmte Frontend-Benutzer sichtbar. pages__hu.gif
Die Seite ist versteckt und nur für bestimmte Frontend-Benutzer sichtbar. pages__hup.gif
Die Seite und deren Unterseiten sind versteckt und nur für bestimmte FrontendBenutzer sichtbar. pages__tf.gif
Die Seite besitzt zeitliche Sichtbarkeitseinstellungen. pages__tfp.gif
Die Seite und deren Unterseiten besitzen zeitliche Sichtbarkeitseinstellungen. Lizensiert für Markus Mueller
pages__tfu.gif
Die Seite besitzt zeitliche Sichtbarkeitseinstellungen und ist nur für bestimmte Frontend-Benutzer sichtbar. pages__tfup.gif
Die Seite und deren Unterseiten besitzen zeitliche Sichtbarkeitseinstellungen und sind nur für bestimmte Frontend-Benutzer sichtbar. pages__u.gif
Die Seite ist nur für bestimmte Frontend-Benutzer sichtbar. pages__up.gif
Die Seite und deren Unterseiten sind nur für bestimmte Frontend-Benutzer sichtbar. pages__x.gif
Der Status kann über kein anderes Icon dargestellt werden. Dieses Icon sollten Sie zur Sicherheit immer anlegen.
Max. Linie
Die Umwandlung der Icons kann mit TYPO3 auch automatisch erfolgen. TYPO3 überlagert dann die Standardgrafik mit der entsprechenden Statusgrafik. Sie brauchen also lediglich die Grundgrafik anzugeben, und TYPO3 erstellt die restlichen Icons bei Bedarf automatisch. Um diese Funktion zu verwenden, ist es jedoch notwendig, dass Sie bestimmte Grafikpakete auf Ihrem Server installiert haben, die diese Grafikfunktionen zur Verfügung stellen. Um dies zu testen, wechseln Sie in das Install-Tool und wählen den Menüpunkt All Configuration. Suchen Sie dort nach dem Wert noIconProc und lesen
7.8 Eigene Seiten-Icons anzeigen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 245
Max. Linie
Sie die entsprechenden Anmerkungen. Wenn die nötigen Softwarepakete auf Ihrem Server vorhanden sind, können Sie das Kontrollkästchen aktivieren. Alternativ dazu können Sie diese Funktion auch freischalten, indem Sie folgenden Wert direkt in die Datei localconf.php eingeben:
Links
$TYPO3_CONF_VARS['GFX']['noIconProc']= 0;
Siehe auch In der Diskussion von Rezept 4.6 erhalten Sie nützliche Hintergrundinformationen zu Seitentypen: wie Sie diese erstellen und mit den jeweiligen Seiteneigenschaften aus diesem Rezept verknüpfen. In der Einleitung von Kapitel 16 erfahren Sie mehr über den Aufbau einer Extension und welche Bedeutung die Ordnerstruktur für die Verwendung von Extensions hat. In Rezept 19.4 erfahren Sie, wie Sie bei Datensätzen je nach Typ unterschiedliche Icons anzeigen lassen können.
Lizensiert für Markus Mueller
Max. Linie
Max. Linie 246 | Kapitel 7: Die Übersicht im Backend erhöhen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
First
Kapitel 8
KAPITEL 8
TypoScript verstehen und verwalten
8.0
Einführung
Die Grundfunktionalität eines datenbankbasierten Frameworks besteht in der Regel darin, Inhalte in eine Datenbank einzupflegen und diese dann – in welcher Form auch immer – für verschiedene Betrachter und Medien aufbereitet wieder auszugeben. Lizensiert für Markus Mueller
Eines haben dabei sämtliche verschiedenen Systeme gemeinsam: Eine bestimmte Anzahl von Funktionen wird in geringfügig abgewandelter Form ständig wiederholt. Datenbankabfragen liefern eine definierte Anzahl von Inhaltselementen, die wiederum in ein vordefiniertes Set von Vorlagen (sogenannten Templates) eingebaut werden müssen, bevor sie für die endgültige Ausgabe zusammengesetzt werden. Die Tatsache, dass diese Funktionen sich prinzipiell sehr ähnlich sind, legt nahe, hierfür eine vereinfachte Schreibweise einzuführen – eine Art Stenografie für Programmfunktionen. Diese sollte auf der einen Seite die Möglichkeit bieten, die Funktionen selbst aufzurufen, auf der anderen Seite sollten eventuell nötige Parameter, Inhalte und ähnliche Dinge an eben diese Funktionen übergeben werden können. Außerdem wäre es äußerst komfortabel, die übergebenen Funktionen und Parameter gegebenenfalls noch intern mithilfe weiterer eigener Funktionen modifizieren zu können. Da TYPO3 auf PHP basiert, bietet es sich an, hierfür ein multidimensionales Array zu definieren, das für die einzelnen Funktionen eigene Arrays zur Verfügung stellt. In diesen Arrays würden wiederum deren Parameter und/oder Unterfunktionen mit weiteren Parametern übergeben. Das Ergebnis wäre ein umfangreiches Super-Array, mit dessen Hilfe die Ausgabe des Systems bis ins kleinste Detail gesteuert werden kann. Die Tiefe der Struktur wäre theoretisch unendlich. Praktisch betrachtet, würden dennoch Grenzen durch die jeweils verwendete Hardware und deren maximale Performance gesetzt. Nichts anderes ist TypoScript!
Max. Linie
Max. Linie | 247 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Links Es handelt sich nicht um eine Programmiersprache im eigentlichen Sinn, obwohl der Name die Vermutung nahe legen würde, sondern um eben solch ein Array, das nach Meinung vieler begeisterter Nutzer die eigentliche Innovation bei der Entwicklung von TYPO3 darstellt. Die Syntax von TypoScript ist dabei denkbar einfach und weitgehend angelehnt an JavaScript. Einem Objekt wird mithilfe von Operatoren ein Wert zugewiesen. Zusätzliche Eigenschaften werden dabei in einem Objektpfad ebenfalls über Operatoren mit Werten versehen. Die einzelnen Teile des Objektpfads werden dabei mithilfe von Punkten getrennt. Hier ein Beispiel: meinObjekt = OBJECT meinObjekt = Wert1 meinObjekt.meineEigenschaft = Wert2 meinObjekt.meineEigenschaft.ersteEigenschaft = Wert3 meinObjekt.meineEigenschaft.zweiteEigenschaft = Wert4
Lizensiert für Markus Mueller
Die Zuweisung eines Werts, der ausschließlich aus Großbuchstaben besteht, ist in der Regel den echten Toplevel-, Content- und Menu-Objekten vorbehalten. Sie könnten zwar rein theoretisch gesehen auch andere Werte nur in Großbuchstaben notieren, jedoch sollten Sie zur besseren Unterscheidung darauf verzichten. Eigenschaften im Objektpfad werden bis auf wenige Ausnahmen immer in camelCase-Notation angegeben. Bei eigenen TypoScriptAnweisungen, die Sie z.B. in Extensions verwenden, sollten Sie diese Regeln ebenfalls befolgen.
Als Operatoren kommen die Zeichen =, < und > sowie zum Zusammenfassen die runden Klammern ( ) zum Einsatz. Sobald ein Operator oder eine Klammer in einer Zeile auftaucht, erkennt der TypoScript-Parser alles vor diesem Zeichen als Objektpfad und alles danach bzw. innerhalb der Klammern als Wert. Geschweifte Klammern { } hingegen werden nicht als eigentliche Operatoren verwendet. Sie dienen dazu, den TypoScriptCode zu strukturieren und einem Objekt mehrere Eigenschaften gleichzeitig zuzuweisen. Erlaubt sind also auch solche Konstrukte: meinParameter = class=meineKlasse meinObjekt.meineEigenschaft = Wert1| } } } }
In Ihrem Haupttemplate brauchen Sie zur Ausgabe Ihrer Metanavigation nur noch eine Zeile: Lizensiert für Markus Mueller
marks.METANAVI < temp.metaNavi
oder subparts.METANAVI < temp.metaNavi
Wenn Sie auch die anderen Objekte für die Inhaltsdarstellung auf diese Art gestalten, reduziert sich der Umfang des Haupttemplates haupttemplate auf wenige Zeilen: page = PAGE page { 10 = TEMPLATE 10 { template = FILE template.file = fileadmin/main.html workOnSubpart = DOKUMENT subparts { METANAVI < temp.metaNavi BREADCRUMB < temp.breadcrumbNavi MAINNAVI < temp.mainNavi INHALT < styles.content.get } } }
Diese Unterteilung in funktionsbezogene Untertemplates erleichtert auch die Teamarbeit, da Arbeitsbereiche klar definiert und Überschneidungen vermieden werden können.
Max. Linie
Ihre Objekte zur Inhaltsdarstellung in den Untertemplates sollten Sie immer als COA-Setzkastenelemente anlegen – auch wenn das anfangs unnötig erscheint. So können Sie flexibel
256 | Kapitel 8: TypoScript verstehen und verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts auf Änderungswünsche reagieren und problemlos Elemente vor oder nach den bestehenden Inhaltsobjekten einfügen, ohne die Struktur des Haupttemplates oder der Designvorlage verändern zu müssen. Möchten Sie vor der Metanavigation noch ein Bild einfügen, erweitern Sie das COA-Element für die Metanavigation einfach folgendermaßen: temp.metaNavi = COA temp.metaNavi { 5 = TEXT 5 { value = } 10 = HMENU 10 {... } } }
An diesem Beispiel wird auch deutlich, warum Sie bei der Nummerierung der Objekte innerhalb eines COA immer mindestens mit 10er-Schritten arbeiten sollten: Das nachträgliche Einfügen von weiteren Objekten ist so leicht möglich. Weitere Vorteile des COASetzkastenelements werden in Rezept 11.1 erläutert. Lizensiert für Markus Mueller
Damit die in den Untertemplates definierten Objekte im Haupttemplate verfügbar sind, müssen Sie die Untertemplates mithilfe des Dialogfelds Include mit dem Haupttemplate verknüpfen. Die Verknüpfungen mit den Untertemplates lassen sich im Modul Templates mit der Option Template Analyzer übersichtlich darstellen, wie in Abbildung 8-3 zu sehen. (Lesen Sie hierzu auch Rezept 8.3.)
Abbildung 8-3: Der Template-Analyzer verdeutlicht die Template-Hierarchie
Max. Linie
Damit Sie nicht nur eine, sondern beliebig viele Websites mit diesem Template-Satz betreiben können, legen Sie außerhalb der Seitenbäume für Ihre Websites einen SysOrdner mit dem Namen templates an. In diesem Ordner legen Sie das Haupttemplate und die verschiedenen funktionsbezogenen Templates an.
8.2 TypoScript-Templates sinnvoll aufteilen | 257 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links In die Startseiten der Seitenbäume mit Ihren Website-Inhalten legen Sie ein Shortcut-Template. Dieses Shortcut-Template bindet wiederum über das Dialogfeld Include basis template das Haupttemplate aus dem SysOrdner templates ein. Achten Sie darauf, dass in Ihren Shortcut-Templates nur das Häkchen bei Rootline gesetzt ist, nicht jedoch bei Clear Constants/Setup. Mit Rootline definieren Sie, wie in Rezept 12.2 beschrieben, den Startpunkt Ihrer Website. Die grundlegende TypoScript-Konfiguration erfolgt jedoch im Haupttemplate und soll an alle Seiten unterhalb von Start weitergereicht werden. Deshalb sollten Sie an dieser Stelle die Weitergabe der TypoScript-Konfiguration aus dem Haupttemplate nicht mit den Clear-Kontrollkästchen im Shortcut-Template unterbrechen. In Abbildung 8-4 sehen Sie die Einstellungen im Shortcut-Template auf einen Blick.
Lizensiert für Markus Mueller
Abbildung 8-4: Das Template mit den Site-spezifischen Einstellungen
Max. Linie
Um auch mit einem einheitlichen Template-Satz die eventuell notwendigen Anpassungen wie Einstiegspunkte für Menüs, Sprache, Titel der Website, CSS-Datei, Ordner mit NewsDatensätzen usw. für die einzelnen Websites vornehmen zu können, definieren Sie diese Site-spezifischen Einstellungen im Shortcut-Template. So können Sie z.B. mit der Konstanten metaNavi_id den Einstiegspunkt für die Metanavigation der einzelnen Websites festlegen, denn in der Konfiguration für das Menüobjekt temp.metaNavi wurde die special. value-Eigenschaft mit dem Platzhalter {$metaNavi_id} belegt, der nun durch den Wert ersetzt wird, den Sie im Shortcut-Template definieren. Auch Websites in verschiedenen Sprachen können Sie mithilfe der Einstellungen im Shortcut-Template mit demselben Template-Satz betreiben. Sie brauchen nur die config-Optionen für die Spracheinstellungen in das SETUP-Feld einzufügen. Selbst dynamisch generierte Grafiken z.B. für den Absende-Button eines Formulars sind kein Problem: temp.Suchbutton = COA temp.Suchbutton {
258 | Kapitel 8: TypoScript verstehen und verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts 10 = IMG_RESOURCE 10 { file = GIFBUILDER file { XY = 100,20 backColor = #CCCCCC 5 = IMAGE 5.file = fileadmin/img/global/rohling_suchebutton.gif 15 = TEXT 15 { text = {$labelSuchbutton} offset = 15,13 niceText = 0 fontSize= 11 fontFile = fileadmin/fonts/ARIALUNI.TTF fontColor = #000000 } } } }
Damit haben Sie alle Werkzeuge zur Hand, um auch große, mehrsprachige Webauftritte effizient und wartungsarm realisieren zu können. Lizensiert für Markus Mueller
Siehe auch Zu Templates und TypoScript finden Sie weitere Informationen unter http://typo3.org/ documentation/document-library/doc_tut_frontend/. In Rezept 8.7 erfahren Sie, wie Sie TypoScript-Constants (Konstanten) verwenden. Im Rahmen von Rezept 8.8 wird gezeigt, wie Sie die hier verwendeten Extension-Templates anlegen können.
8.3
Den TypoScript-Object-Browser und den Template-Analyzer nutzen
Problem Sie möchten eine bestimmte TypoScript-Eigenschaft ändern bzw. neu hinzufügen, das gesamte Ergebnis der von Ihnen geschriebenen und verwendeten TypoScript-Templates prüfen oder herausfinden, in welchem Template ein bestimmter Wert gesetzt wird.
Lösung
Max. Linie
TYPO3 stellt Ihnen mit dem TypoScript-Object-Browser und dem Template-Analyzer zwei sehr wichtige Werkzeuge zur Verfügung, um Ihr TypoScript zu analysieren und zu prüfen. Beide Tools sind im Funktionsmenü des Moduls Web/Template zu finden.
8.3 Den TypoScript-Object-Browser und den Template-Analyzer nutzen | 259 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links Der TypoScript-Object-Browser Gute TypoScript-Entwickler teilen ihr TypoScript, wie auch in Rezept 8.2 beschrieben, in mehrere verschiedene Templates auf. Ebenso kann in Seitenbäumen über ExtensionTemplates zusätzliches TypoScript verwendet oder über Conditions auf das TypoScript Einfluss genommen werden (siehe Rezept 8.8). Sie benötigen damit aber unbedingt eine Möglichkeit herauszufinden, welches TypoScript TYPO3 denn nun bei der Darstellung einer Seite tatsächlich verwendet, um gezielt Einfluss darauf nehmen zu können. All das, und noch ein bisschen mehr, bietet Ihnen der TypoScript-Object-Browser. Der TypoScript-Object-Browser (TSOB) ist immer das wichtigste Werkzeug, um die von Ihnen durchgeführten Änderungen am TypoScript auf das gewünschte Ergebnis hin zu überprüfen.
Zunächst sollten Sie sich noch mal vor Augen führen, dass das resultierende TypoScript für jede Seite unterschiedlich sein kann. Aus diesem Grund arbeiten sowohl der TSOB als auch der Template-Analyzer seitenbezogen. Rufen Sie also zunächst über das Modul Web/Template den TSOB auf und wählen Sie eine Seite im Seitenbaum aus, deren TypoScript Sie prüfen möchten. Lizensiert für Markus Mueller
Der TSOB zeigt Ihnen daraufhin den gesamten berechneten TypoScript-Baum dieser Seite. Im Auswahlfeld Browse legen Sie fest, ob Sie den TypoScript-Setup- oder den TypoScript-Constants-Baum bearbeiten möchten. In beiden Fällen können Sie einzelne Äste durch einen Klick auf die Plus- und Minussymbole auf- und zuklappen, um eine bessere Übersicht zu behalten. Prüfen Sie so, ob das TypoScript wie von Ihnen vorgesehen verarbeitet wird und Ihren Wünschen entspricht. Der TSOB prüft des Weiteren, ob in Ihrem Template entsprechend korrespondierende öffnende und schließende Klammern vorhanden sind oder ob grobe Verstöße gegen die TypoScript-Syntax festgestellt wurden. Solche Fehler werden gegebenenfalls unter der Überschrift Errors and warnings inklusive eines Hinweises auf die Zeilennummer der Zeile, in der der Fehler festgestellt wurde, gelistet und sollten unbedingt behoben werden. Da das TypoScript nicht nur von der Seite, sondern auch von bestimmten Bedingungen (siehe Rezept 8.8), abhängig sein kann, können Sie solche Bedingungen auch mit dem TSOB simulieren. Dazu finden Sie in der unteren Hälfte der Ausgabe des TSOB eine Liste mit allen verwendeten Conditions. Aktivieren Sie jeweils einfach das Kontrollkästchen vor den Conditions, deren Ergebnis Sie prüfen möchten, und aktivieren Sie diese Einstellung durch einen Klick auf den Button Set conditions.
Max. Linie
Der TSOB ist somit die wichtigste Anlaufstelle, um Ihr TypoScript zu überprüfen und zu analysieren. Leider ist er aufgrund der ungewöhnlichen und komplexen Natur von TypoScript derzeit nicht in der Lage, eine echte Syntaxprüfung Ihres TypoScript-Codes durchzuführen.
260 | Kapitel 8: TypoScript verstehen und verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Sofern für Ihre TYPO3-Version verfügbar, sollten Sie unbedingt die Conditions [compatVersion = 3.9] und [compatVersion = 4.2.0] im TSOB aktivieren. Ansonsten zeigt Ihnen der TSOB das TypoScript, wie es von älteren TYPO3Versionen verwendet wurde. Dementsprechend sollten Sie natürlich auch den Update-Wizard im Install-Tool genutzt haben, um die Kompatibilitätseinstellungen auf Version 4.x zu setzen, ansonsten lassen Sie die Condition einfach deaktiviert. Für TYPO3-Versionen vor 4.0 brauchen Sie das selbstverständlich nicht zu berücksichtigen. Das Rezept 2.3 geht näher auf die Verwendung dieses sogenannten Kompatibilitätsmodus ein.
Der Template-Analyzer Während Ihnen der TSOB in Form einer Baumstruktur Einsicht in das resultierende TypoScript gibt, hilft Ihnen der Template-Analyzer dabei herauszufinden, welche einzelnen Templates eingebunden sind. Der Template-Analyzer stellt die eingebunden Templates in der Reihenfolge der Bearbeitung von oben nach unten dar. Templates, die aufgrund von Abhängigkeiten eingebunden sind, werden dabei jeweils leicht eingerückt. Sie können nun Einsicht in jedes dieser Templates nehmen, indem Sie einfach auf den Titel klicken. (Sie erinnern sich? Es gibt einen Grund, jedem Template einen sinnvollen Namen zu geben.) Lizensiert für Markus Mueller
Insbesondere im Zusammenhang mit Fehlermeldungen im TSOB oder den weiter unten besprochenen Tooltipps möchten Sie eine bestimmte Zeilennummer in Ihrem TemplateSetup finden. Aktivieren Sie dazu einfach das Kontrollkästchen Linenumbers im TemplateAnalyzer, daraufhin wird in den angezeigten Templates (auf den Titel klicken) jeder Zeile eine Zeilennummer vorangestellt. Diese Nummern beziehen sich nicht auf die einzelnen Templates, sondern immer auf das gesamte Template-Setup aus allen eingebundenen Templates. Sie müssen die Templates einfach in der Reihenfolge von oben nach unten auswählen, wenn Sie möglicherweise eine größere Zeilennummer suchen.
Diskussion Bei der Änderung von TypoScript-Werten schleichen sich sehr leicht kleine Fipptehler ein. Ein Weg, dieses zu vermeiden, besteht darin, ganz einfach im TypoScript-Object-Browser den entsprechenden Objektpfad in der Baumstruktur zu nutzen, um eine Änderung durchzuführen. Dazu klicken Sie in dem Baum auf das gewünschte TypoScript-Objekt. Daraufhin öffnet sich eine spezielle Bearbeitungsmaske für dieses Objekt, die Sie in Abbildung 8-5 sehen.
Max. Linie
Sie müssen sicherstellen, dass Sie sich im Seitenbaum auf einer Seite befinden, auf der ein aktives TypoScript-Template abgelegt ist. Ansonsten bekommen Sie die Fehlermeldung You cannot edit properties and values, if there's no current template. Das ist insofern leicht nachvollziehbar, als TYPO3 dann keine Möglichkeit hat, den Wert in einem Template abzuspeichern.
8.3 Den TypoScript-Object-Browser und den Template-Analyzer nutzen | 261 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links
Abbildung 8-5: Die Bearbeitungsmaske eines TypoScript-Objekts im TypoScript-Object-Browser
Lizensiert für Markus Mueller
In der Bearbeitungsansicht des TSOB, die Sie durch einen Klick auf einen Objektpfad aufrufen, können Sie den Wert eines Objekts ändern, eine neue Eigenschaft/ein neues Objekt hinzufügen oder das Objekt löschen: Ändern eines Werts Im ersten Eingabefeld EDIT OBJECT/PROPERTY VALUE wird zunächst automatisch der derzeit gültige Wert übernommen. Sie können hier im Rahmen der TypoScript-Referenz einen anderen gültigen Wert eintragen und durch einen Klick auf den Button Update übernehmen. Hinzufügen einer Eigenschaft/eines Objekts Sie können unter ADD OBJECT PROPERTY eine zusätzliche Eigenschaft für das ausgewählte Objekt vergeben. In der zweiten Zeile sollten Sie dann auch gleich den entsprechenden Wert eintragen. Ein Klick auf den Button ADD übernimmt die Änderung in Ihr Template. Löschen/Zurücksetzen eines Objekts Wenn das Objekt aus dem TypoScript-Baum entfernt werden soll, können Sie unter CLEAR OBJECT einfach das Kontrollkästchen aktivieren und die Änderung mit einem Klick auf den Button Clear übernehmen. Es wird dann eine Anweisung der Art tt_content.stdWrap.innerWrap.cObject >
erzeugt.
Max. Linie
Ein weiteres nützliches Feature im TSOB ist die Möglichkeit herauszufinden, in welchem Template und in welcher Zeile eine bestimmte Eigenschaft definiert wird. Bewegen Sie dazu Ihren Mauszeiger im TSOB auf ein bestimmtes TypoScript-Objekt und halten Sie
262 | Kapitel 8: TypoScript verstehen und verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts dort einen Moment an. Dadurch erscheint ein kleiner Tooltipp, der Ihnen anzeigt, anhand welches Templates und welcher Zeile der Wert festgelegt wurde. Der Tooltipp lautet beispielsweise: Defined in: "parseFunc.LinkList", 2446
Die Arbeitsweise, Eigenschaften so zu verändern, hat leider einen gravierenden Nachteil. Solche Änderungen werden immer mit dem kompletten Objektpfad an das Ende eines Template-Datensatzes angefügt. Sie sollten diese Änderungen unbedingt anschließend an die entsprechende Stelle in Ihrem Template-Setup verschieben. Dabei sollten Sie gegebenenfalls auch einen Teil des Objektpfads entfernen, die Einrückung korrigieren und das Objekt/die Eigenschaft in dem entsprechend geklammerten Objekt einfügen. Ansonsten werden Ihre Templates bereits nach kurzer Zeit sehr chaotisch und nur schwer wartbar.
Der erste Teil bezieht sich auf den Titel des Templates (dies ist im Übrigen ein weiterer guter Grund dafür, dass Sie aussagekräftige Titel für Ihre Templates vergeben sollten), durch ein Komma abgetrennt sehen Sie die Zeile, in der der Wert vergeben wurde. Wie Sie die entsprechende Stelle finden, ist der Lösung bei der Beschreibung des TemplateAnalyzers zu entnehmen. Lizensiert für Markus Mueller
Im unteren Bereich des TSOB können Sie die folgenden Optionen aktivieren: Crop lines Diese Option erhöht die Übersicht im TSOB, indem sie dafür sorgt, dass sehr lange Zeilen entsprechend gekürzt werden. Display comments Diese Option blendet die in TypoScript vorhandenen Kommentare ein. Sort alphabetically Mit dieser neuen Option haben Sie die Möglichkeit, Schlüssel, die sich auf einer Ebene befinden, alphabetisch sortiert anzuzeigen. Das kann nützlich sein, um eine bestimmte Eigenschaft schneller zu finden. Constants display In diesem Drop-down können Sie bestimmen, wie die im TypoScript-Setup verwendeten TypoScript-Constants dargestellt werden sollen. Empfehlenswert ist die Einstellung Substituted Constants in green. Somit können Sie im TSOB sehr schnell an einer grünen Einfärbung erkennen, dass ein Wert aus TypoScript-Constants übernommen wurde. Sollten sich auf einer Seite mehrere Template-Datensätze befinden, müssen Sie sowohl im TSOB als auch im Template-Analyzer zunächst anhand eines Auswahlfelds festlegen, welches Template das jeweilige Modul zuerst berücksichtigen soll.
Max. Linie
Max. Linie 8.3 Den TypoScript-Object-Browser und den Template-Analyzer nutzen | 263 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Links Wenn Sie eine Übersicht darüber erhalten möchten, auf welchen Seiten Ihres Baums TypoScript-Templates abgelegt sind, rufen Sie einfach das Modul Web/Template auf und wählen im Seitenbaum die Root-Seite aus. Sie erhalten dann einen Überblick über alle auf Ihrer Site vorhandenen Templates.
In den Bearbeitungsmasken finden Sie an manchen Stellen einen kleinen Button mit der Beschriftung TS. Dieser Button ruft einen minimalistischen internen Editor auf, mit dem Werte bequem direkt aus einer eingebauten TSref übernommen werden können. Auch diese Funktion hilft in der Praxis sehr gut, Tippfehler zu vermeiden. Leider wurden die dazu notwendigen Daten aus dem Release 4.0 entfernt. In der aktuellen Version 4.2 sind sie jedoch in überarbeiteter Form wieder eingeführt worden.
Lizensiert für Markus Mueller
Sie können den dargestellten TypoScript-Baum zur besseren Übersicht auf einen bestimmten Ast einschränken. Klicken Sie dazu auf eine der TypoScript-Eigenschaften, Sie bekommen dann entweder die Bearbeitungsansicht oder die Meldung You cannot edit properties and values, if there's no current template. Sie haben in beiden Fällen die Möglichkeit, über den Link Add key beliebiges.typoScript.object to Object List (OL) den entsprechenden TypoScript-Objektpfad zu einer sogenannten Object List (OL) hinzuzufügen. Von nun an steht Ihnen dieses TypoScript-Objekt im Auswahlfeld OL: der Hauptansicht des TSOB zur Verfügung. Wenn Sie dort ein solches Objekt auswählen, wird der TypoScript-Baum entsprechend reduziert. Über den Link Remove key from OL können Sie den Pfad wieder aus der Object List entfernen. Dazu muss er allerdings zunächst ausgewählt werden.
8.4
Den TypoScript-Debugger nutzen
Problem Die Ausgabe im Frontend entspricht nicht Ihren Erwartungen, und Sie möchten herausfinden, woran das liegt.
Lösung Verwenden Sie den TypoScript-Debugger, um den Aufbau der Seite im Frontend zu verfolgen. Dabei können Sie genau sehen, welche HTML-Ausgabe die einzelnen TypoScriptElemente erzeugen. Der TypoScript-Debugger ist ein Bestandteil des Admin-Panels im Frontend. Um ihn nutzen zu können ist es also wichtig, dass Sie das Admin-Panel korrekt in Ihre Seite einbinden und sich Zugriff darauf verschaffen.
Max. Linie
Zum Einbinden des Admin-Panels in die Frontend-Ausgabe tragen Sie das folgende TypoScript in Ihr Template ein, dabei müssen Sie page gegebenenfalls auf die von Ihnen verwendete Bezeichnung des PAGE-Objekts anpassen:
264 | Kapitel 8: TypoScript verstehen und verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts page = PAGE page { config { admPanel = 1 } }
Notwendige User-TSconfig-Einstellung: admPanel { hide = 0 enable { tsdebug = 1 // alternativ: // all = 1 } }
Lizensiert für Markus Mueller
Diese Einstellung ist für Admins bereits per Default vorgegeben, die Details zu den benutzerbezogenen Einstellungen des Admin-Panels mit User-TSconfig finden Sie in Rezept 4.7. Wenn diese Einstellungen entsprechend vorgenommen sind, öffnen Sie in Ihrem Browser das Frontend. Dort finden Sie nun das Admin-Panel, das Sie zunächst durch einen Klick auf das Plussymbol aufklappen. Den TypoScript-Debugger aktivieren Sie durch einen Klick auf das Plussymbol neben der Bezeichnung TypoScript. Aktivieren Sie alle dort vorhandenen Optionen und laden Sie durch einen Klick auf den Button Aktualisieren die Seite neu. Sie erhalten nun, wie in Abbildung 8-6 zu sehen, einen umfangreichen Einblick in den Ablauf des Rendering-Prozesses. Die Ausgabe des TypoScript-Debuggers erfolgt in einer Tabelle innerhalb des AdminPanels. Die einzelnen Zeilen werden dabei in der chronologischen Folge des RenderingProzesses ausgegeben. Je nach aktivierten Optionen enthalten die Zeilen die folgenden Spalten: TypoScript Key Diese ist die Hauptspalte, in der das Logging erfolgt. Dabei sind hier zunächst viele Systemnachrichten zu finden, die beschreiben, welcher Teil des Rendering-Prozesses abgearbeitet wird. Die Bezeichnung TypoScript Key trägt die Spalte allerdings, weil hier, an einer farblich abgesetzten Darstellung erkenntlich, auch die abgearbeiteten TypoScript-Objektpfade jeweils einen eigenen Eintrag bekommen. Value In der Spalte Value wird die Bezeichnung des zugewiesenen TypoScript-Objekts ausgegeben, sofern dieses vorhanden ist und es sich nicht um eine Systemnachricht handelt.
Max. Linie
Time In dieser Spalte wird der vom ursprünglichen Aufruf bis zu diesem Verarbeitungspunkt benötigte kumulierte Zeitverbrauch in Millisekunden ausgegeben. Beachten Sie, dass bei allen Zeitangaben jeweils die aktivierten Debugging-Optionen und CacheEinstellungen eine Rolle spielen.
8.4 Den TypoScript-Debugger nutzen | 265 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links
Lizensiert für Markus Mueller
Abbildung 8-6: Die Ausgabe des TypoScript-Debuggers im Admin-Panel
Own Zeitbedarf dieses Ausführungsschritts selbst. Sub Kumulierter Zeitbedarf der untergeordneten Bearbeitungprozesse. Total Gesamte Dauer eines Bearbeitungsschritts samt untergeordneter Punkte.
Max. Linie
Details Hier werden gegebenenfalls (sehr nützlich!) Fehlermeldungen bei der Abarbeitung des TypoScripts ausgegeben. Derzeit erfolgt dies beim Versuch, auf Dateien zuzugreifen,
266 | Kapitel 8: TypoScript verstehen und verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts die nicht gefunden werden, oder bei einem ungültigen Ansprechen von PHP-Klassen oder Methoden. Solche Fehlermeldungen werden auch mit einem entsprechenden Icon versehen. Daneben werden hier ebenfalls die für die einzelnen TypoScript-Objekte erzeugten Daten bzw. HTML-Snippets ausgegeben. Damit können Sie sehr leicht erkennen, welches TypoScript-Objekt für das Erzeugen eines bestimmten HTML-Fragments verantwortlich ist.
Diskussion Einige Probleme beim Aufbau der Ausgabe wiegen so schwer, dass keinerlei Ausgabe erzeugt werden kann. In diesem Fall wird auch das Admin-Panel nicht ausgegeben, und damit ist dann leider der TypoScript-Debugger nicht erreichbar. Solche Probleme müssen Sie anhand der Fehlermeldungen anderweitig lösen. Sie können das Admin-Panel auch über das globale config-Objekt aktivieren: config { admPanel = 1 } Lizensiert für Markus Mueller
Innerhalb des TypoScript-Debuggers stehen Ihnen folgende Optionen für die Ausgabe zur Verfügung: Baumdarstellung Diese Option stellt die Darstellung des TypoScript-Renderings auf eine baumartige Struktur um. Damit ist die Darstellung dann sehr ähnlich dem TypoScript-ObjectBrowser. Rendering-Zeiten anzeigen Sie können zusätzlich den Zeitbedarf für jede ausgeführte Aktion ausgeben lassen. Dies ist sehr nützlich, wenn Sie einen Flaschenhals auf Ihrer Website vermuten. So lässt sich dieser relativ schnell ermitteln, ohne dass Sie auf einen PHP-Profiler (ein professionelles Entwicklungswerkzeug zur Codeanalyse) zurückgreifen müssen. Nachrichten anzeigen TYPO3 übergibt beim Rendern Logmeldungen an den TypoScript-Debugger. Dies umfasst reine Warn-, aber auch echte Fehlermeldungen. Diese Option sollten Sie generell aktivieren. Sie bekommen dann sofort mit, wenn eine Datei eingebunden werden soll, die nicht existiert, oder eine Funktion aufgerufen wird, auf die nicht zugegriffen werden kann.
Max. Linie
Verfolge Rendering der Inhalte Hiermit aktivieren Sie, dass die Ergebnisse aller TypoScript-Objekte im PAGE-Objekt, die ja für das Rendern zuständig sind, einzeln ausgegeben werden. Ohne diese Option werden lediglich die Hauptfunktionalitäten des Rendering-Prozesses ausgegeben.
8.4 Den TypoScript-Debugger nutzen | 267 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links Inhalte anzeigen Wenn Sie auch das Ausgabeergebnis, also das HTML-Snippet, das die einzelnen TypoScript-Objekte erzeugen, debuggen wollen, müssen Sie diese Option aktivieren. Rote Marker der Art [page.20] zeigen an, wo eine Ausgabe weiterer Objekte eingebunden wird. Erkläre SELECT Anweisung Mit dieser Option aktivieren Sie die Anzeige der bei der TypoScript-Ausführung durchgeführten Datenbankabfragen. Dabei werden zusätzlich zur eigentlichen Datenbankabfrage einige nützliche Metainformationen zu diesen Abfragen bereitgestellt. Hierzu wird die SQL-Abfrage zusätzlich mit einem vorangestellten explain ausgeführt. So können Sie leicht in Erfahrung bringen, ob die Datenbankabfrage von einem Index Gebrauch macht. Erzwinge TS Rendering Die Option sollte in der Regel aktiviert werden, denn sie erzwingt das Parsen des TypoScript. Ohne die Option zeigt der Debugger möglicherweise das Laden der Seite aus dem Cache.
Lizensiert für Markus Mueller
In Abbildung 8-6 können Sie im Übrigen bei genauer Betrachtung sehr gut erkennen, wie nicht gecachte COA_INT-Elemente gehandhabt werden. Zunächst wird hier ein spezieller Marker ) }
Links
} }
Inline-CSS-Deklarationen Natürlich können Sie über headerData auch Inline-CSS-Deklarationen in den Bereich einbauen. Da Sie hier mit gewöhnlichen cObjects arbeiten, stehen Ihnen dabei alle Möglichkeiten von TypoScript zur Verfügung, um auf Daten zuzugreifen. Dies ist insbesondere sinnvoll, wenn Sie Ihr CSS dynamisch erzeugen wollen. Das folgende Beispiel verwendet die levelmedia-Eigenschaft, um ein in den Seiteneigenschaften hinterlegtes Bild als Hintergrundbild in eine CSS-Deklaration für das -Tag einzubinden:
Lizensiert für Markus Mueller
page = PAGE page { headerData { 90 = COA 90 { wrap = <style type="text/css"> 20 < lib.stylesheet.default } } }
Die Eigenschaft headerData kann ein beliebiges cObject-Array aufnehmen. Hier wird ein COA-Element verwendet, weil dieses über die Eigenschaft wrap verfügt, die genutzt wird, um ein entsprechendes <style>-Tag um den Inhalt der Datei zu wrappen. Als einziges Objekt innerhalb von COA wird eine Kopie des TypoScript-Objekts lib.stylesheet. default verwendet, das die CSS-Vorlage einliest und den Platzhalter dynamisch ersetzt.
Diskussion Lizensiert für Markus Mueller
Der Ansatz in der Lösung war, die dynamisch aus der Vorlage erzeugte CSS-Datei als Inline-CSS-Deklaration in den Kopf der Ausgabe einzubauen. Eine alternative Lösung ist es, die Datei als eigenständiges PAGE-Objekt von TYPO3 ausgeben zu lassen. Tragen Sie dazu den folgenden TypoScript-Setup-Code in Ihr Template ein: ################################## # dynCSS als PAGE-Objekt anlegen (type=31) dynCSS = PAGE dynCSS { typeNum = 31 config { disableAllHeaderCode = 1 additionalHeaders = Content-type: text/css admPanel = 0 } # dynamische CSS-Vorlage aus der Bibliothek laden 20 < lib.stylesheet.default }
Zur Definition eines Ausgabeformats verwenden Sie das PAGE-Objekt dynCSS. Die typeNum-Eigenschaft des PAGE-Objekts dient dabei der Unterscheidung der verschiedenen
Max. Linie
PAGE-Objekte bzw. Ausgabeformate. Hier definieren Sie das PAGE-Objekt mit dem Namen dynCSS und der Eigenschaft typeNum = 31. Ein Aufruf der URL http://www.example. com/index.php&type=31 aktiviert also das dynCSS-PAGE-Objekt. Damit sind Sie nun in der Lage, von TYPO3 ein dynamisch generiertes Stylesheet (eine CSS-Datei) als Ausgabe erzeugen zu lassen.
9.3 CSS-Stylesheets dynamisch aus Vorlagen erzeugen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 309
Max. Linie
Damit die Datei nicht mit dem content-type text/html ausgeliefert wird, mit dem die Ausgabe vom Webserver typischerweise als Standard im HTTP-Protokoll-Header ausgezeichnet wird, stellen Sie den content-type mithilfe von config.additionalHeaders auf text/css um. Mit der Option disableAllHeaderCode = 1 unterdrücken Sie alle Tags wie z.B. oder , die TYPO3 ansonsten automatisch in das Ausgabeformat einfügen würde. Weiterhin deaktivieren Sie hier das Admin-Panel, dessen HTML-Code in einer CSS-Datei keinen Sinn macht.
Links
Das Stylesheet kann so über folgenden HTML-Code in beliebige Webseiten eingebunden werden: # das EDITPANEL in ein COA verpacken, # damit es mit stdWrap.if eingeschränkt werden kann lib.editPanel.tt_content = COA lib.editPanel.tt_content { 10 < tt_content.stdWrap.editPanel 10 = EDITPANEL if { isInList.field = CType value = list negate = 1 } } tt_content.stdWrap.editPanel > tt_content.stdWrap.postCObject =< lib.editPanel.tt_content
9.5 Das Frontend-Editing optimieren | 321 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Im Beispiel wird zunächst der Bleistift bei der Ausgabe aller Plugins entfernt. Etwas trickreicher gestaltet sich die Einschränkung der Bearbeitungsleiste. Diese wird durch tt_content.stdWrap.editPanel nämlich für jedes Inhaltselement erzeugt. Eine Einschränkung auf ein bestimmtes Inhaltselement ist hier nicht möglich. Natürlich könnte man diese stdWrap-Eigenschaft auch für die einzelnen Einträge unter tt_content.text usw. erzeugen, das wäre jedoch relativ aufwendig. Stattdessen wird in dem Codebeispiel zunächst ein eigenes COA-Objekt angelegt, das über stdWrap.if den Typ des Inhaltselements auswertet. Als cObject wird in Schlüssel 10 des COA ein EDITPANELObjekt verwendet. Damit auf den Standardwert zurückgegriffen werden kann, wird dieses zunächst als Kopie von tt_content.stdWrap.editPanel erzeugt. Da es sich dabei aber um eine stdWrap-Eigenschaft ohne Deklaration als Objekt EDITPANEL handelt, muss in der nächsten Zeile die Konfiguration noch entsprechend als 10 = EDITPANEL deklariert werden. Abschließend wird der standardmäßige Objektpfad tt_content.stdWrap.editPanel > gelöscht und eine Referenz auf das COA als postCObject eingefügt. Voilà.
Links
Sie müssen natürlich darauf achten, ob Sie möglicherweise weitere TypoScriptSchnipsel verwenden, die bereits tt_content.stdWrap.postCObject nutzen. Lizensiert für Markus Mueller
Siehe auch Die allgemeine Benutzung des TypoScript-Objectbrowsers wird in Rezept 8.3 erklärt.
9.6
URL-Parameter an Menüs und Links übergeben
Problem Sie möchten bestimmte, einmal übergebene URL-Parameter, wie z. B. die gewählte Sprache, automatisch in alle von TYPO3 erzeugte Links übernehmen. Damit wollen Sie verhindern, dass ein solcher Parameter bei einem Seitenwechsel verloren geht.
Lösung Legen Sie mithilfe von config.linkVars fest, welche URL-Parameter von TYPO3 in allen erzeugten Links beibehalten werden sollen.
Max. Linie
Im CONFIG-Objekt können Sie über die Eigenschaft .linkVars eine Liste von URLParametern festlegen, die von TYPO3 automatisch in alle erzeugten Links übernommen werden, sofern sie Bestandteil der aufrufenden URL sind. Dieses Verfahren wird auch als »Durchschleifen« bezeichnet. Damit wird erreicht, dass ein solcher Parameter auch bei folgenden Seitenaufrufen übergeben wird.
322 | Kapitel 9: Die Seitenausgabe steuern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Da das CONFIG-Objekt sowohl auf globaler Ebene als auch innerhalb eines PAGEObjekts zur Verfügung steht, können Sie diese Konfiguration gezielt für einzelne Ausgabeobjekte oder global festlegen. Das folgende TypoScript-Setup sorgt dafür, dass die Parameter L und print global für jedes PAGE-Objekt beibehalten werden: config { # Angabe mehrerer Parameter durch Kommata getrennt linkVars = L,print }
Diskussion Alternativ können Sie dies natürlich auch, wie im folgenden TypoScript-Codebeispiel zu sehen, auf ein bestimmtes PAGE-Objekt beschränken: page=PAGE page { config { linkVars=L,print } }
Lizensiert für Markus Mueller
Bei der Verwendung der Eigenschaft .linkVars müssen Sie das Cache-Verhalten beachten. Idealerweise sollten Sie für die entsprechenden Variablen auch eine Condition verwenden, damit die verschiedenen Parameter auch im TYPO3-Cache berücksichtigt werden. Ansonsten wird die Seite beim ersten Aufruf mit der entsprechenden Ausgabe im Cache abgelegt, und ein geänderter Parameter wird in folgenden Aufrufen nicht mehr bei der Erzeugung von Links berücksichtigt, es sei denn, Sie verwenden den in Rezept 10.7 beschriebenen typolink-Parameter useCacheHash = 1. Dieser steht jedoch nicht immer und überall zur Verfügung.
Wir empfehlen Ihnen, wegen der Cache-Problematik auch immer eine entsprechende Condition für die Parameter zu verwenden. Das Ergebnis sieht dann wie folgt aus: page=PAGE page { config { linkVars=L } } [globalVar=GP:L=1] # diese Condition sorgt dafür, dass ein eigener Cache-Eintrag erzeugt wird [end]
Max. Linie
In der Praxis entsteht bei der Verwendung von linkVars teilweise das Problem, dass dabei Parameter in der URL doppelt vorkommen. Insbesondere passiert dies in einem automatisch erzeugten Sprachmenü oder wenn Sie die Eigenschaft typolink zusammen mit additionalParams verwenden. Dies ist nur ein kleiner Schönheitsfehler und nicht weiter schlimm, da vom Server automatisch der letzte angegebene Wert übernommen wird.
9.6 URL-Parameter an Menüs und Links übergeben | 323 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Dennoch gibt es eine einfache Möglichkeit, diese Doppelungen zu vermeiden, verwenden Sie dazu einfach zusätzlich uniqueLinkVars:
Links
config { linkVars = L,print uniqueLinkVars = 1 }
9.7
Links wie statische HTML-Dateien darstellen
Problem Sie möchten die von TYPO3 erzeugten Links so ändern, dass sie wie der Aufruf einer statischen HTML-Seite aussehen. Damit wollen Sie Ihre Website für Besucher und Suchmaschinen attraktiver gestalten.
Lösung Um das gewünschte Ziel zu erreichen, sind zwei Dinge notwendig: Lizensiert für Markus Mueller
• Sie müssen TYPO3 dazu bringen, die Links in entsprechender Form zu erzeugen. Das ist, wie Sie gleich sehen werden, mit wenigen Zeilen TypoScript zu bewerkstelligen. • Sie müssen auf Ihrem Webserver einen kleinen Trick verwenden. TYPO3 erzeugt ja nun Links zu Dateien, die es auf dem Webserver nicht wirklich gibt. Der ApacheWebserver bietet Ihnen aber die Möglichkeit, angeforderte URLs umzuschreiben, sodass eine solche Anfrage in der Realität doch bei dem entsprechenden TYPO3Skript index.php landet. Doch dazu gleich mehr. Zunächst sollten Sie TYPO3 dazu bringen, die Links in anderer Form zu erzeugen. Dazu rufen Sie das Install-Tool auf und aktivieren die Option [FE][simulateStaticDocuments]. Alternativ verwenden Sie einfach das folgende TypoScript: config { simulateStaticDocuments = 1 simulateStaticDocuments_noTypeIfNoTitle = 1 }
TYPO3 erzeugt damit Links in der Form id.html oder alias.html, wenn Sie einen Alias vergeben haben. Nun müssen Sie dafür Sorge tragen, dass diese URLs auf dem Webserver auch entsprechend verarbeitet werden. Sonst bekommen Besucher eine Fehlermeldung, die ihnen sagt, dass die Seite nicht gefunden wurde. Dazu greift man auf die Funktionen des Moduls mod_rewrite des Apache-Webservers zurück. TYPO3 bringt dazu bereits alles Nötige mit.
Max. Linie
Im Hauptverzeichnis Ihrer TYPO3-Installation finden Sie die Datei _.htaccess. Diese ist bereits entsprechend optimiert und vorbereitet. Sie müssen sie lediglich kopieren und im gleichen Hauptverzeichnis als .htaccess ablegen.
324 | Kapitel 9: Die Seitenausgabe steuern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Beachten Sie, dass diese .htaccess-Datei eine möglichst allgemein gültige Konfiguration bereitstellt. Diese führt in der Regel bereits zu einer korrekten Funktion, in Einzelfällen sind allerdings Anpassungen an spezifische Serverumgebungen erforderlich. In der _.htaccess-Datei finden Sie dazu einige Hinweise und Kommentare, die Sie sich bei Problemen durchlesen sollten. Dort finden Sie auch Hinweise dazu, wie Sie die Konfiguration auch alternativ in der Hauptkonfigurationsdatei des Webservers, httpd.conf, vornehmen können. Eine knappe Einführung in die Rewrite-Rules für TYPO3 finden Sie am Ende der Diskussion dieses Rezepts.
Diskussion Die Konfiguration von simulateStatic bietet einige weitere Optionen. So ist es möglich, mit der Eigenschaft config { simulateStaticDocuments_addTitle = 60 }
Lizensiert für Markus Mueller
zusätzlich maximal xy (im Beispiel 60) Zeichen aus dem Seitentitel in die URL aufzunehmen. Auf den ersten Blick mag das sinnvoll sein, weil Sie auch ohne die Vergabe eines Alias eine für Besucher aussagekräftigere URL in der Art Homepage.232.0.html bekommen. Dadurch ist es aber auch in jedem Fall erforderlich, dass der zusätzliche Parameter type zwangsläufig vor der Endung .html eingebunden wird, die Option simulateStaticDocuments_ noTypeIfNoTitle = 1 hat dann zwangsläufig keine Auswirkungen mehr. Die Verwendung des Seitentitels innerhalb der URL bleibt rein informativ und wird von TYPO3 beim Seitenaufruf überhaupt nicht berücksichtigt. Statt simulateStaticDocuments_ addTitle zu verwenden, sollten Sie lieber auf zentralen Seiten in TYPO3 einen aussagekräftigen Eintrag im Feld alias vornehmen. Neben der Seiten-ID und dem type-Parameter sind oft zusätzliche Parameter von Extensions oder zur Sprachauswahl Bestandteil der URL. Diese werden ohne zusätzliche Konfiguration einfach weiterhin entsprechend mit & an die URL angehängt. Mit den folgenden Eigenschaften können Sie darauf Einfluss nehmen: config { simulateStaticDocuments_pEnc=md5 simulateStaticDocuments_pEnc_onlyP = cHash, L, tx_ttnews[backPid], tx_ttnews[tt_news] }
Über die Eigenschaft simulateStaticDocuments_pEnc=md5 sagen Sie TYPO3, dass es für die mit simulateStaticDocuments_pEnc_onlyP gesetzte Liste von URL-Parametern einen Hash (ein Fingerabdruck mehrerer Schlüssel/Wert-Paare) erzeugt und diesen mit in den statischen Link-Parameter aufnimmt. Sie erhalten dann Links in der Art 30+M52087573ab0. html. Sie können über simulateStaticDocuments_pEnc=base64 auch alternativ ein anderes Verfahren zur Einbindung der Parameter in die statische URL verwenden.
Max. Linie
Max. Linie 9.7 Links wie statische HTML-Dateien darstellen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 325
Die Rewrite-Rules
Links
Mithilfe des Apache-Moduls mod_rewrite kann jede angeforderte URL intern auf eine beliebige andere Datei umgeleitet werden. Die Zuordnung wird dabei über einzelne Regeln konfiguriert, die als Rewrite-Rules bezeichnet werden. Rewrite-Rules sind, ähnlich wie TypoScript, sehr komplex und mächtig, als Einstieg in die Thematik zeigen wir Ihnen im Folgenden die wichtigsten relevanten Teile der in der Lösung verwendeten Datei. # Enable URL rewriting RewriteEngine On # Stop rewrite processing if we are in the typo3/ directory RewriteRule ^(typo3|typo3temp|typo3conf|t3lib|tslib|fileadmin|uploads|showpic\.php)/ [L] # Redirect http://mysite/typo3 to http://mysite/typo3/index_re.php # and stop the rewrite processing RewriteRule ^typo3$ typo3/index_re.php [L] # If the file/symlink/directory does not exist => Redirect to index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l # Main URL rewriting. RewriteRule .* index.php [L]
Lizensiert für Markus Mueller
Mit der Zeile RewriteEngine On wird die Verarbeitung zunächst erst mal aktiviert. Die nächste Direktive RewriteRule ^(typo3|typo3temp|typo3conf|t3lib|tslib|fileadmin| uploads|showpic\.php)/ - [L] sorgt dafür, dass eine URL, die in einen dieser Unterordner zeigt, nicht weiter bearbeitet wird. Die nächste Regel RewriteRule ^typo3$ typo3/ index_re.php [L] sorgt dafür, dass ein Aufruf der URL typo3 ohne nachfolgende Zeichen intern an das Skript typo3/index_re.php weitergeleitet wird. Diese bisherigen Regeln filtern also administrative oder sonstige Aufrufe in den TYPO3-eigenen Unterverzeichnisse heraus und verhindern für diese Fälle eine weitere interne Umleitung der aufgerufenen URLs. Der Block mit den RewriteCond-Anweisungen prüft nun noch, ob die aufgerufene URL möglicherweise als Datei, Verzeichnis oder symbolischer Link physikalisch vorhanden ist, und blockiert in diesen Fällen die weitere Manipulation der aufgerufenen URL. Alle URLs, die jetzt noch nicht behandelt wurden, sollten wirklich einem typischen und gewöhnlichen Aufruf des TYPO3-Frontends entsprechen. Diese werden dann über die Zeile RewriteRule .* index.php [L] intern direkt an das entsprechende Skript index.php von TYPO3 weitergeleitet. Dort liest TYPO3 die ursprünglich angeforderte URL ein und ermittelt anhand dessen die entsprechenden Seitenaufrufparameter. Von all dem merkt der Website-Besucher natürlich nichts, die gesamte Verarbeitung erfolgt rein intern zwischen Webserver und TYPO3 bzw. PHP.
Max. Linie
Max. Linie 326 | Kapitel 9: Die Seitenausgabe steuern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Siehe auch Mehr Informationen zu diesem Thema finden Sie unter http://httpd.apache.org/docs/2.0/ mod/mod_rewrite.html (Apache 2.0) und http://httpd.apache.org/docs/1.3/mod/mod_ rewrite.html (Apache 1.3). Ein gänzlich anderes Verfahren, um das gleiche Ziel zu erreichen, steht auch mithilfe der Extension realurl zur Verfügung. Damit ist es möglich, anhand der Seitenstruktur auch Verzeichnispfade in der URL zu simulieren. Die Handhabung dieser Extension ist allerdings komplexer und anspruchsvoller als das hier geschilderte Verfahren simulateStatic.
9.8
Webseiten nur bestimmten Besuchern zeigen
Problem Sie möchten manche Seiten Ihrer Website nur bestimmten Benutzern zeigen, etwa weil die Seiten sensitive Informationen enthalten.
Lösung Lizensiert für Markus Mueller
Nutzen Sie die Benutzer- und Rechteverwaltung von TYPO3, um die Sichtbarkeit von Seiten auf bestimmte Nutzergruppen zu beschränken. Die Authentifizierung basiert auf sogenannten Website-Benutzern (Frontend-Benutzern; FE-Users). Die Anmeldeprozedur wird über die Extension felogin bereitgestellt. Diese Extension unterstüzt sie bei häufigen Anwendungsfällen, die beim Anmeldeprozess auftreten können, zum Beispiel durch eine Passwort vergessen-Funktion. Erstellen Sie zuerst eine neue Seite von Typ SysOrdner als zentralen Speicherort für die Website-Benutzer. Dort werden später alle Benutzer verwaltet, die sich auf der Website anmelden können. Aktivieren Sie danach die Extension feuser über den ErweiterungsManager. Diese Liste soll Ihnen helfen, die nötigen Schritte zu unternehmen: 1. SysOrdner anlegen Legen Sie eine neue Seite vom Typ SysOrdner im Seitenbaum an, in dem Sie die Benutzer und die Benutzergruppen speichern. 2. FE-Gruppe anlegen Legen Sie in diesem SysOrdner einen Datensatz vom Typ Web-Site-Benutzergruppe an. Legen Sie mindestens eine Standardgruppe für Ihre Benutzer an, mit der Sie dann die Seitenzugriffe steuern können.
Max. Linie
Max. Linie 9.8 Webseiten nur bestimmten Besuchern zeigen | 327 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
3. FE-Benutzer zum Testen anlegen
Links
Legen Sie nun einen Beispielbenutzer an und geben Sie diesem einen Benutzernamen und ein Passwort. Weisen Sie dem Benutzer die zuvor erstellte Benutzergruppe zu. Der Gruppenname muss in der linken Spalte stehen. 4. Seite mit besonderen Zugriffseinstellungen anlegen Wechseln Sie nun in die Seiteneigenschaften der Seite, auf die Sie den Zugriff ändern möchten. Wählen Sie im Abschnitt Zugriff die Benutzergruppe aus und speichern Sie die Änderungen. Aktivieren Sie das Kontrollkästchen Inklusive Unterseiten, wenn Sie einen ganzen Seitenbaum nur für bestimmte Besucher freigeben möchten. 5. Extension felogin aktivieren und einrichten Aktivieren Sie die Extension felogin im Erweiterungs-Manager. 6. Anmeldeformular anlegen Legen Sie anschließend auf einer beliebigen Seite ein neues Inhaltselement vom Typ Anmeldung an. Legen Sie als Ausgangspunkt den zuvor erzeugten SysOrdner an, in dem die Benutzerkonten liegen. Speichern Sie den Datensatz und lassen Sie ihn sich im Frontend anzeigen. 7. Anmeldung prüfen Melden Sie sich nun mit den zuvor vergebenen Zugangsdaten des Testbenutzers an. Lizensiert für Markus Mueller
Nach der Anmeldung sollten Sie eine Erfolgsmeldung erhalten. Richten Sie jetzt weitere Website-Benutzer ein, die Zugriff auf die geschützten Seiten erhalten sollen. Dadurch, dass Sie weitere Benutzergruppen anlegen und in den Seiteneigenschaften die Zugriffsrechte entsprechend setzen, können Sie die Zugriffe für Ihre angemeldeten Besucher flexibel steuern. Aus Sicherheitsgründen sollten Sie den Testbenutzer deaktivieren, indem Sie ihn ausblenden oder löschen.
Diskussion Die Benutzer- und Rechteverwaltung von TYPO3 basiert auf Website-Benutzern, die auch Frontend- oder einfach nur FE-Users genannt werden. Alle Benutzerdaten werden von TYPO3 in der Datenbanktabelle fe_users gespeichert. Die Eigenschaften der Gruppen liegen in der Tabelle fe_groups. Die Zugriffsrechte können Sie für Seiten, Inhaltselemente und viele weitere Datensätze festlegen. Um die Zugriffsrechte für eigene Datensätze zu begrenzen, müssen Sie das Feld fe_group in der Tabelle bereitstellen und im TCA als Speicherort für die Zugriffsrechte definieren (die dafür notwendigen Schritte werden in der Diskussion von Rezept 16.3 genauer beleuchtet). Wir werden hier der Einfachheit halber die Einstellungen weiter an Seiten demonstrieren.
Max. Linie
In der oben genannten Lösung haben Sie die Zugriffsrechte einer Seite auf eine Benutzergruppe beschränkt und dafür gesorgt, dass die Seite nur für diese Gruppe sichtbar ist. Was aber, wenn Sie Seiten haben, die alle angemeldeten Benutzer – egal in welcher
328 | Kapitel 9: Die Seitenausgabe steuern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Gruppe sie sind – sehen sollen (etwa eine Seite zum Verwalten des Benutzerprofils oder eine mit einem Abmeldeformular)? Sie können einer Seite mehrere Benutzergruppen zuweisen, indem Sie die Auswahl im Feld Zugriff entsprechend erweitern. Benutzer, die in einer der ausgewählten Gruppen sind, erhalten dann Zugriff auf diese Seite. In dem Fall müssten Sie in der jeweiligen Seite alle verfügbaren Benutzergruppen zuweisen, was sich spätestens dann als sehr unflexibel herausstellt, wenn neue Benutzergruppen hinzukommen. Ein komfortabler Weg ist, in der Seiteneigenschaft die Option Anzeigen, wenn angemeldet zu wählen. Die Seite wird dann bei allen Benutzern sichtbar, die angemeldet sind. Der Anmeldeprozess erfordert an sich keine weiteren Einstellungen. Wenn Sie die oben genannten Schritte durchgeführt haben, haben Sie einen funktionierenden Anmeldemechanismus. Jedoch lohnt es sich zu wissen, welche weiteren Einstellungsmöglichkeiten Sie mit der Extension noch haben, um auf weitere besondere Anforderungen eingehen zu können. Das Plugin kann je nach Anwendungsfall umfangreich konfiguriert werden:
Lizensiert für Markus Mueller
Benutzer nach der Anmeldung auf eine bestimmte Seite leiten Öffnen Sie die Plugin-Einstellungen und aktivieren Sie den Reiter Redirect Options. Fügen Sie dort in das Auswahlfeld Nach erfolgreichem Login auf folgende Seite weiterleiten über den Auswahlassistenten die gewünschte Seite ein, auf die der Benutzer nach der Anmeldung weitergeleitet werden soll. Mit den weiteren Auswahllisten können Sie bestimmen, auf welcher Seite der Benutzer nach der Abmeldung landet und auf welche Seite im Fehlerfall geleitet wird. Aktivieren Sie anschließend im Feld Redirect Mode die drei Modi after Login, after Logout und after Login Error. Erst dadurch werden die gewünschten Redirects aktiviert. Weiterhin können Sie die Umleitung pro Benutzer, in der Benutzergruppe oder direkt in den Plugin- bzw. TypoScript-Einstellungen festlegen. Mit jeder dieser Einstellungen legen Sie eine Seiten-ID fest, auf die der Benutzer dann nach erfolgtem Login weitergeleitet wird. Stellen Sie sicher, dass der Benutzer auch Zugriff auf diese Seite hat. Sie können keine Seite angeben, die erst nach der Anmeldung sichtbar wird. Mehrere unabhängige Benutzerkonten nutzen Gerade bei größeren Websites bzw. TYPO3-Installationen, die mehr als eine Website verwalten, kann es vorkommen, dass Sie voneinander unabhängige Benutzerkonten benötigen, beispielsweise wenn sich dieselben Benutzer für mehrere Services auf der Website anmelden müssen, die nichts miteinander zu tun haben.
Max. Linie
Legen Sie dann für jeden Speicherort einen eigenen SysOrdner an. Jeden dieser Ordner geben Sie anschließend in den jeweiligen Anmeldemasken als Ausgangspunkt ein. Das Anmeldeformular berücksichtigt dann nur noch Benutzer, die direkt in diesem Ordner liegen. Wenn Sie die Benutzer in weitere Unterordner gegliedert haben, können Sie mit dem Auswahlfeld Rekursiv die Tiefe bestimmen, in der nach Benutzerkonten gesucht werden soll.
9.8 Webseiten nur bestimmten Besuchern zeigen | 329 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Darstellung des Formulars anpassen Sollte Ihnen die Darstellung des Formulars nicht gefallen oder das Markup des Formulars zu Nebeneffekten mit Ihrem bestehenden Seiten-Template führen, können Sie das HTML-Template leicht anpassen, indem Sie ein eigenes Template definieren. Kopieren Sie dafür das von der Extension mitgeliederte Template in ein passendes Verzeichnis unterhalb von fileadmin/, ändern Sie den Pfad per TypoScript auf die neue Datei, ändern Sie das HTML-Template nach Ihren Wünschen und leeren Sie abschließend den Seiten-Cache. Das HTML-Template wird dann in der geänderten Fassung dargestellt. Achten Sie darauf, dass Sie keine funktionalen Marker und Werte ändern, da dadurch die Funktionalität des Formulars beeinflusst werden kann.
Links
Lizensiert für Markus Mueller
Die Option »Eingeloggt bleiben« aktivieren Um diese Option zu nutzen, sind weitere Einstellungen an TYPO3 nötig. Öffnen Sie das Install-Tool und suchen Sie dort im Bereich All Configuration nach den Werten [lifetime] und [permalogin]. In das Feld lifetime geben Sie die Sekunden ein, nach denen die Benutzer-Session ablaufen soll. Standardmäßig läuft die Benutzer-Session nach dem Schließen des Browsers ab. Genauer: Nach dem Schließen des Browsers wird das Session-Cookie entfernt. Mit dem Wert lifetime geben Sie eine längere Lebenszeit für das Cookie an, zum Beispiel 3600*24*7, um das Cookie eine Woche lang gültig zu halten. In das Feld permalogin geben Sie den Wert 1 ein. Dadurch können Sie die Option bei Bedarf über die Plugin-Einstellungen der Extension felogin aktivieren. Der von TYPO3 vorgegebene Standardwert 2 bewirkt, dass die Cookies immer so lange gültig bleiben, wie Sie es in dem Feld lifetime festgelegt haben. Wenn Sie keinen Wert in lifetime angegeben haben, werden die Cookies ebenfalls beim Schließen des Browsers gelöscht. Wir empfehlen Ihnen, den Wert auf 1 zu setzen, damit Sie den Login-Mechanismus flexibel über die Plugin-Einstellungen festlegen zu können. Alternativ können Sie diese Optionen auch direkt in die Datei localconf.php eingeben: $TYPO3_CONF_VARS['FE']['lifetime'] = '3600*24*7'; $TYPO3_CONF_VARS['FE']['permalogin'] = '1';
Nach dem Speichern der neuen Einstellungen erscheint das Kontrollkästchen im Anmeldeformular, und Sie können die neue Funktionalität testen. Durch die sehr umfangreichen Konfigurationsmöglichkeiten der Extension können Sie die Anmeldung für Ihre Website sehr komfortabel auf Ihre Bedürfnisse anpassen.
Siehe auch
Max. Linie
Rezept 12.2 geht darauf ein, wie Sie Links zu geschützten Bereichen ermöglichen und nach dem Klick automatisch auf das Anmeldeformular umleiten, falls der Besucher noch nicht angemeldet ist. Das Handbuch für diese Extension finden Sie im Unterverzeichnis doc/manual.sxw. Dort werden sämtliche Einstellungen beschrieben, die Sie zentral über TypoScript einrichten können. Wie Sie Daten in der aktuellen Benutzer-Session speichern, wird in Rezept 18.5 beschrieben. 330 | Kapitel 9: Die Seitenausgabe steuern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
9.9
Benutzerfreundliche Fehlerseiten integrieren und sinnvoll gestalten
Problem Sie möchten Ihren Website-Besuchern sinnvolle Hilfestellungen anbieten, falls die angeforderte Seite nicht angezeigt werden kann.
Lösung Erstellen Sie im TYPO3-Seitenbaum eine Seite, die angezeigt werden soll, wenn die vom Benutzer gewünschte Seite nicht gefunden wird. Diese Seite sollten Sie mit der Option Im Menü verstecken ausblenden. Damit stellen Sie sicher, dass die Seite in keinem Menü der Website erscheint. Notieren Sie sich die ID dieser Seite. Legen Sie dann auf dieser Seite ein Inhaltselement vom Typ Text an und geben Sie einen Text ein, den der Benutzer im Fehlerfall sehen soll. Es hat sich bewährt, dem Besucher auch weitere Inhaltselemente, wie etwa eine Sitemap oder ein Suchformular, zur Verfügung zu stellen. Lizensiert für Markus Mueller
Wechseln Sie danach in das Install-Tool, wählen Sie den Bereich All Configuration und suchen Sie dort nach dem Begriff pageNotFound_handling. Geben Sie in das Feld den Wert /index.php?id=seiten_id ein und ersetzen Sie den hervorgehobenen Wert mit der ID der Seite, die Sie eben angelegt haben. Speichern Sie abschließend Ihre Einstellungen. Alternativ können Sie diese Zeile direkt in die Datei localconf.php einfügen: $TYPO3_CONF_VARS['FE']['pageNotFound_handling'] = '/index.php?id=seiten_id';
Rufen Sie nun eine ungültige Seite im Frontend auf. TYPO3 sollte Sie dann auf die neu angelegte Fehlerseite umleiten und gleichzeitig einen 404-Status an den Browser zurückliefern.
Diskussion Wird eine Webseite aufgerufen, die von TYPO3 nicht ausgegeben werden kann, leitet TYPO3 den Besucher standardmäßig auf die nächsthöher gelegene Seite weiter. Der Benutzer erhält somit keine Fehlermeldung und bleibt weitestgehend im Kontext der Website.
Max. Linie
Wenn Sie eine Fehlermeldung ausgeben möchten, müssen Sie dies – wie in der Lösung geschildert – explizit aktivieren. TYPO3 bietet Ihnen mit der Option pageNotFound_ handling die Möglichkeit, vollständig Einfluss auf das Fehlerverhalten zu nehmen und den Prozess nach eigenen Wünschen zu modifizieren. Die Option erwartet dabei immer eine Zeichenkette, die je nach Einsatzgebiet nach einem bestimmten Muster aufgebaut sein muss:
9.9 Benutzerfreundliche Fehlerseiten integrieren und sinnvoll gestalten | 331 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Eine TYPO3-Fehlermeldung ausgeben Wenn Sie die Option auf true setzen, erhalten Sie eine normale TYPO3-Fehlerseite:
Links
$TYPO3_CONF_VARS['FE']['pageNotFound_handling'] = true;
Dieses Verhalten ist wenig benutzerfreundlich und wird von uns daher nicht empfohlen. Auf eine interne Seite umleiten Wie bereits in der Lösung dargestellt, können Sie bei einem Fehlerfall auf eine bestehende Seite im Seitenbaum weiterleiten: $TYPO3_CONF_VARS['FE']['pageNotFound_handling'] = '/index.php?id=seiten_id';
Wichtig ist, dass Sie hierbei den Slash am Anfang setzen, da TYPO3 ansonsten die URL nicht eindeutig auflösen kann. Selbstverständlich können Sie hier auch den Seiten-Alias oder einen RealURL-Pfad angeben: $TYPO3_CONF_VARS['FE']['pageNotFound_handling'] = '/alias.html';
Mehr zu diesen Möglichkeiten erfahren Sie in Rezept 9.7. Auf eine andere Domain umleiten Beginnt der Wert mit dem Präfix REDIRECT:, wird TYPO3 den Besucher auf die angegebene Website umleiten. Lizensiert für Markus Mueller
$TYPO3_CONF_VARS['FE']['pageNotFound_handling'] = ' REDIRECT:http://www.example.com ';
Beachten Sie, dass TYPO3 in diesem Fall keinen 404-Status sendet, sondern einen 302-Status, der dem Browser signalisiert, dass der Request auf eine neue Adresse umgeleitet wurde. Es ist nicht möglich, zwei Statusmeldungen zu senden (zum Beispiel einmal 404 für die nicht gefundene Seite und danach 302 für die Umleitung). Diese kleine Änderung bei der Handhabung von Fehlerseiten kann zum Beispiel Auswirkungen darauf haben, wie Suchmaschinen mit nicht gefundenen Seiten umgehen. Normalerweise werden Seiten, deren Aufruf einen 404-Status erzeugen, aus dem Suchindex entfernt, sobald der Suchmaschinenroboter die Adresse aufruft. Bei einem 302-Status wird die Adresse jedoch weiterhin im Index vorgehalten. Überlegen Sie daher vor dem Einsatz dieser Option, ob Sie solch ein Verhalten wünschen. Eine statische HTML-Datei auslesen Beginnt der Wert mit READFILE:, wird TYPO3 die Datei auslesen und deren Inhalt ausgeben. In der Datei können Sie diese Marker nutzen, um dynamische Werte im Template zu positionieren: ###CURRENT_URL### wird mit der Umgebungsvariablen REQUEST_URI ersetzt, der Marker ###REASON### mit dem Grund für die Fehlermeldung.
Max. Linie
$TYPO3_CONF_VARS['FE']['pageNotFound_handling'] = ' READFILE:fileadmin/errors/404.html ';
332 | Kapitel 9: Die Seitenausgabe steuern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Das Fehlerverhalten über eine eigene Logik implementieren Beginnt der Wert mit dem Präfix >>USER_FUNCTION: stdWrap, int /stdWrap, path /stdWrap oder sonstige Kombinationen gefolgt von der Bezeichnung stdWrap, bedeutet dies, dass Sie für dieses Element oder diesen Parameter den vollen Umfang des Baukastens nutzen können. Ist für dieses Element keinerlei stdWrap-Funktionalität vorgesehen, können Sie sich damit behelfen, einen COA-Setzkasten zu verwenden, in den Sie das Element einbetten. So können Sie zumindest einen Teil der stdWrap-Funktionen verwenden, um z.B. Bedingungen abzufragen oder das Element mit Wraps zu verpacken. Und denken Sie dabei immer daran: stdWrap ist kein Wrap, sondern der TYPO3-interne Werkzeugkoffer – Wraps sind nur einige der darin enthaltenen Werkzeuge!
10.1 Daten auslesen Problem
Max. Linie
Sie wollen bestimmten TypoScript-Elementen dynamische Werte zuweisen. Diese sollen beispielsweise direkt aus der Datenbank oder aus bestimmten Dateiordnern ausgelesen oder aber aus anderen TypoScript-Elementen zusammengesetzt werden.
10.1 Daten auslesen | 337 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Lösung
Links
Verwenden Sie die entsprechenden Funktionen aus dem stdWrap-Baukasten. cObject Übergibt den kompletten Inhalt eines TypoScript-Elements an das übergeordnete Element oder den übergeordneten Parameter. current Übergibt den aktuellen Inhalt eines Elements an ein anderes Element oder einen Parameter. field Liefert Werte eines bestimmten Felds in der Datenbank. filelist Liest den Inhalt eines Dateiordners aus und übergibt eine sortierte Liste von Dateinamen. lang Legt für mehrsprachige Elemente die korrekte Übersetzung fest.
Lizensiert für Markus Mueller
listNum oder preIfEmptyListNum Liefern den Wert einer bestimmten Position in einer Serie von Werten, die durch Trennzeichen voneinander separiert sind. numRows Zählt die ausgewählten Datensätze einer Datenbankabfrage. setContentToCurrent Übergibt den Inhalt von TypoScript-Elementen an current. setCurrent Ermöglicht die manuelle Zuweisung von Werten für current. stdWrap Nutzt einen rekursiven Aufruf der Funktionsliste, um eine bestimmte Reihenfolge der stdWrap-Funktionen zu erzwingen.
Diskussion cObject Diese Funktion weist einem Element oder einem Parameter den kompletten Inhalt eines TypoScript-Elements zu.
Max. Linie
temp.meinText = TEXT temp.meinText { outerWrap.cObject = COA outerWrap.cObject { 10 = TEXT 10.wrap =
10.field = imageorient
338 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
20 = TEXT 20.value = |
} }
Hier erzeugen wir z.B. den outerWrap eines TEXT-Elements durch Verwendung eines COA. Dabei wird innerhalb des COA mithilfe eines weiteren TEXT-Elements das Feld imageorient ausgelesen und per Wrap im class-Parameter eines p-Tags an das Präfix align angehängt. Ein zusätzliches TEXT-Element liefert das Trennzeichen für den Wrap und das schließende p-Tag. Ein Ergebnis für diesen outerWrap wäre beispielsweise die Bildausrichtung im Text links ohne Umfließen:
|
Die Möglichkeiten für das dynamische Erzeugen von Wraps sind mithilfe der Funktion cObject quasi unbegrenzt. Aber auch andere Parameter lassen sich mit cObject äußerst variabel gestalten.
Lizensiert für Markus Mueller
Max. Linie
temp.meinText = TEXT temp.meinText { value = Default Text override.cObject = TEXT override.cObject { field = title } }
In diesem TEXT-Element wird zunächst ein Default-Wert für den Text gesetzt. Danach wird der Parameter override per cObject ebenfalls mit einem TEXT-Element belegt. Dieses liest den Wert des Felds title aus. Gleichzeitig wird festgelegt, dass der Default-Text nur dann ersetzt werden soll, wenn sich wirklich Inhalt in diesem Feld befindet. Die Funktion override überschreibt nämlich nur dann, wenn ihr eigenes Ergebnis nicht leer ist. temp.meinInhalt = CONTENT temp.meinInhalt { table = tt_content select { pidInList.cObject = HMENU pidInList.cObject { entryLevel = 0 1 = TMENU 1 { NO { doNotLinkIt = 1 stdWrap.field = uid allWrap = |*| |, |*| | } } } } }
10.1 Daten auslesen | 339 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
In diesem CONTENT-Element wird der Parameter pidInList, in dem sich üblicherweise eine Liste mit kommaseparierten Zahlen befindet, per cObject ebenfalls mit einem HMENU-Element belegt. Die Liste der Zahlen bezieht sich nämlich auf die IDs der für die Auswahl der Content-Elemente zulässigen Seiten, und genau diese lassen sich hervorragend mithilfe eines Menüs zusammentragen.
Links
Sie können selbstverständlich auch alle anderen cObjects verwenden. Lesen Sie hierzu auch Rezept 14.1, das sich mit dem intelligenten Einsatz von TypoScript-Elementen als Hilfsmittel für ausgefeilte TypoScript-Konstrukte beschäftigt.
current Mit diesem Schalter übergeben Sie den aktuellen Inhalt an ein Element oder einen Parameter. Aktuell bedeutet in diesem Fall, dass eine weitere stdWrap-Funktion diesen Inhalt vorher dynamisch erzeugt hat. current kommt daher vor allem im Zusammenhang mit split zum Einsatz.
Lizensiert für Markus Mueller
temp.meine Schleife = TEXT temp.meine Schleife { field = image split { token = , cObjNum = 1|*|2|*|3 1 = TEXT 1.current = 1 1.wrap = <span >|
2 = TEXT 2.current = 1 2.wrap = <span >|
3 = TEXT 3.current = 1 3.wrap = <span >|
} }
Die Funktion split durchläuft hier in einer Schleife eine kommaseparierte Liste von Bilddateien. Sie liefert dabei als aktuellen Inhalt immer genau einen Dateinamen aus der Liste zurück. Dieser wird mithilfe von current in eins von drei verschiedenen zu erzeugenden Elementen eingebaut und bekommt dort per span-Tag eine Klasse sowie eine Zeilenschaltung zugewiesen. Weitere Beispiele finden Sie weiter unten in diesem Rezept unter setContentToCurrent und setCurrent sowie in Rezept 10.4 unter split.
field
Max. Linie
Diese Funktion liefert den Wert eines Felds aus der Datenbank zurück. Sie bezieht sich dabei auf $cObj->data[field], was zur Folge hat, dass die dabei angesprochene Tabelle der Datenbank situationsbezogen variiert.
340 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Während dieses Beispiel page = PAGE page { 10 = TEXT 10.field = feldname }
das Feld feldname aus der Tabelle pages ausliest, würde dieses hier page = PAGE page { 10 = CONTENT 10 { table = tt_content renderObj = TEXT renderObj.field = feldname } }
das Feld gleichen Namens jedoch aus der Tabelle tt_content zurückliefern.
Lizensiert für Markus Mueller
Bei Verwendung von vordefinierten TypoScript-Templates wie CSS-styled-content ist es nicht immer so klar ersichtlich wie in unserem Beispiel, aus welcher Tabelle die Felder in der jeweiligen Situation bezogen werden. Daher kommt es häufig zu Missverständnissen. Schauen Sie daher lieber einmal öfter in den TypoScript-Object-Browser, um sich einen Überblick zu verschaffen. Um sicherzugehen, dass die richtige Kombination aus Tabelle und Feld angesprochen wird, können Sie auf die getText-Methode der Funktion data zurückgreifen. Weitere Informationen hierzu finden Sie im folgenden Rezept 10.2. Wenn Sie sich vorher genau ansehen wollen, welche Inhalte sich in $cObj-> data befinden, sollten Sie gemäß Rezept 10.8 mit der stdWrap-Funktion debugData arbeiten oder den Typ debug:data aus Rezept 10.2 nutzen.
filelist Mit dieser Funktion erstellen Sie eine Liste von Dateien aus einem bestimmten Verzeichnis. Sie wird über insgesamt fünf Parameter gesteuert, die Sie mit einem | als Trennzeichen separieren können. • Pfad • Erweiterung: kommaseparierte Liste erlaubter Endungen • Sortierung: einer der Werte name, size, ext oder date • Umgekehrt sortieren: aktiviert mit r • Volle Pfadanzeige: aktiviert mit true
Max. Linie
Max. Linie 10.1 Daten auslesen | 341 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Links Damit die Funktion ein Ergebnis zurückliefern kann, müssen Sie config. lockFilePath auf den ersten Teil des gewünschten Pfads setzen.
Das Ergebnis ist eine kommaseparierte Liste von Dateinamen, die Sie beispielsweise über split mit Zeilenumbrüchen versehen können: config.lockFilePath = fileadmin page = PAGE page.5 = TEXT page.5 { filelist = fileadmin/ | gif,css | name | r | split { token = , cObjNum = 1 1.current = 1 1.wrap =
} }
Lizensiert für Markus Mueller
Sie können diese Liste aber auch direkt verwenden und einen Teil davon mithilfe von listNum auslesen. Im folgenden Beispiel wird immer die zuletzt hochgeladene Bilddatei als Grafik importiert und auf der Seite dargestellt. config.lockFilePath = fileadmin page = PAGE page.5 = IMAGE page.5 { file { import { filelist = fileadmin/bilddaten/ | gif,jpg,tif | date || true listNum = 0 } width = 600 height = 400 } }
Die Funktion filelist verfügt ihrerseits über stdWrap-Eigenschaften, was Ihnen die Möglichkeit gibt, die Parameter z.B. über cObject mithilfe eines COA zu erzeugen oder Abfragen einzubauen, um die Anzeige der Liste bestimmten Bedingungen zu unterwerfen.
Max. Linie
filelist { cObject = COA cObject { 10 = TEXT 10.field = importpfad 20 = TEXT 20.value = | gif,jpg,tif | date || true } fieldRequired = importpfad }
342 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts lang Diese Funktion dient bei mehrsprachigen Seiten der Ausgabe von Inhalten in der jeweiligen Sprache. Sie bezieht sich dabei auf den Parameter config.language. Daher muss der jeweilige Parameter für die einzelnen Sprachen in der Schreibweise exakt den dort verwendeten Bezeichnungen entsprechen. Lautet die Abkürzung z.B. en, müssen Sie die entsprechende Sprachversion auch mit lang.en ansteuern. Auf diese Weise können Sie auch fest vorgegebenen Texten, die direkt über TypoScript zugewiesen werden, die korrekte Übersetzung mitgeben. config.language = de config.sys_language_uid = 0 [globalVar = GP:L=0] config.language = de config.sys_language_uid = 0 [globalVar = GP:L=1] config.language = en config.sys_language_uid = 1 [globalVar = GP:L=2] config.language = fr config.sys_language_uid = 2 [global] Lizensiert für Markus Mueller
page = PAGE page.10 = TEXT page.10 { value = Dies ist ein Text auf Deutsch. lang { en = This is a text in English. fr = Cela est un texte en français. } }
Weitere Rezepte zum Thema mehrsprachige Ausgabe finden Sie in Kapitel 9. Dort werden auch der URL-Parameter L und die Einstellung der sys_language_uid näher erläutert.
listNum, preIfEmptyListNum Mit diesen beiden Funktionen können Sie beliebige Zeichenketten anhand eines Trennzeichens zerlegen und eine Position innerhalb dieser Zeichenkette festlegen, deren Wert ausgegeben werden soll.
Max. Linie
Wie der Name preIfEmptyListNum bereits vermuten lässt, wird diese Variante vor der Funktion ifEmpty abgearbeitet. Damit stellen Sie sicher, dass bei einer leeren Position innerhalb der Zeichenkette dennoch ifEmpty ausgeführt und ein Ersatzinhalt geliefert wird. ifEmpty würde nämlich nur das Vorhandensein der Zeichenkette selbst überprüfen, nicht aber den Inhalt der einzelnen Positionen. Ansonsten verhält sich die Funktion preIfEmptyListNum exakt wie listNum, daher werden wir in den Beispielen nur auf listNum eingehen.
10.1 Daten auslesen | 343 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Wenn Sie keine weiteren Angaben machen, wird als Default ein Komma als Trennzeichen angenommen. Der Wert hinter dem Gleichheitszeichen bestimmt die Position in der Liste. Für das erste Beispiel nehmen wir an, Sie hätten die Zeichenkette A,B,C,D,E,F in einem Feld namens listenfeld gespeichert. Hier können Sie als Test für die Funktion preIfEmptyListNum stattdessen mit A,B,,D,,F arbeiten.
Links
10 = TEXT 10 { field = listenfeld listNum = 3 }
Die Ausgabe dieses Beispiels käme von Position 3 der Kette. Es wäre also der Buchstabe C oder im Fall von preIfEmptyListNum stattdessen eine leere Ausgabe. Falls Sie mit einem anderen Trennzeichen arbeiten möchten, können Sie dies mithilfe des Unterparameters splitChar bestimmen. Dabei können Sie einzelne Buchstaben, ganze Zeichenketten oder Zahlen eingeben. Eine Zahl wird als Charactercode interpretiert. Die Einstellung listNum.splitChar = 10 würde also chr(10) als Trennzeichen betrachten, was einer Zeilenschaltung entspricht. Buchstaben oder Zeichenketten werden wie notiert abgefragt. Lizensiert für Markus Mueller
Nehmen wir an, die Liste hätte den String # SPLIT # als Trennzeichen. Der Inhalt des Felds wäre also A# SPLIT #B# SPLIT #C# SPLIT #D# SPLIT #E# SPLIT #F, eine entsprechende Abfrage sähe dann so aus: 10 = TEXT 10 { field = listenfeld listNum = 3 listNum.splitChar = # SPLIT # }
Der Ausgabewert wäre auch hier der Buchstabe C. Im Feld caption des Inhaltselements Text mit Bild wird beispielsweise mit Zeilenschaltungen gearbeitet, um einzelne Bildunterschriften voneinander zu trennen. Dafür müssten Sie folgenden Code verwenden 10 = TEXT 10 { field = caption listNum = 2 listNum.splitChar = 10 }
Damit würden Sie die zweite Zeile des Felds als Bildunterschrift einsetzen.
Max. Linie
Zusätzlich zu dieser Grundfunktionalität können Sie sowohl mit berechneten Werten als auch mit weiteren stdWrap-Funktionen arbeiten, um die Positionsangabe zu modifizieren. Für Berechnungen stehen Ihnen dabei die Option last sowie die üblichen Rechenoperationen zur Verfügung. Mit last wird immer die Position des letzten Elements der Kette ausgegeben. Mit diesem Code würden Sie also z.B. auf die vorletzte Bildunterschrift zugreifen: 344 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
10 = TEXT 10 { field = caption listNum = last-1 listNum.splitChar = 10 }
Und mit diesem Code auf eine Bildunterschrift, die sich an der Position befindet, die dem Register IMAGE_NUM entspricht. 10 = TEXT 10 { field = caption listNum.data = register:IMAGE_NUM listNum.splitChar = 10 }
In diesem Register befindet sich ein Zähler, der dafür sorgt, dass bestimmte Inhalte und Parameter zugeordnet werden können. Beispielsweise können Sie eine Bildunterschrift jeweils einem Bild zuweisen, das gerade gerendert wird. Bedingt durch die geänderte Reihenfolge der Funktionsaufrufe, funktioniert dieser Code nur mit TYPO3 4.+. In früheren Versionen wird caption abgearbeitet, bevor das Register zur Verfügung steht. Lizensiert für Markus Mueller
Max. Linie
Lesen Sie Rezept 11.4, wenn Sie wissen wollen, wie Sie mit internen und selbst definierten Registern arbeiten können.
numRows Diese Funktion entspricht in ihrer Arbeitsweise dem TypoScript-Element CONTENT. Sie können eine Tabelle aus der Datenbank sowie eine select-Konfiguration angeben, die zur Abfrage dieser Tabelle verwendet werden soll. Im Unterschied zu CONTENT wird in diesem Fall jedoch kein wirklicher Inhalt in einem renderObj ausgegeben, sondern ähnlich wie beim mySQL-Kommando COUNT lediglich die Anzahl der ausgewählten Datensätze der jeweiligen Tabelle. Die Funktion wird daher vor allem im Zusammenhang mit if-Abfragen verwendet, um bestimmte Teile des Layouts bei Bedarf ein- oder auszublenden oder zu überschreiben: temp.inhaltVorhanden = TEXT temp.inhaltVorhanden { value = Es gibt Inhalt in der rechten Spalte. if.isTrue.numRows { table = tt_content select { where = colPos = 1 } } }
10.1 Daten auslesen | 345 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Ein Beispiel für diese Anwendung finden Sie in Rezept 11.3. Sie können die Zahl aber auch direkt ausgeben und in einen Kontext einbetten:
Links
temp.wievielElemente = TEXT temp.wievielElemente { numRows { table = tt_content select { where = colPos = 1 } } noTrimWrap = |Es gibt | Elemente in der rechten Spalte.| }
setContentToCurrent Mit diesem Schalter setzen Sie current auf den Inhalt, der vom aufrufenden Element übergeben wurde. current übernimmt dabei die Funktion einer Variablen, die einmal einen Wert erhält und danach beliebig oft weiterverwendet werden kann.
Lizensiert für Markus Mueller
Max. Linie
temp.meinGerahmterInhalt = COA temp.meinGerahmterInhalt { 10 = TEXT 10.value = 20 = TEXT 20.field = doktype 20.wrap = 30 = TEXT 30.value = | stdWrap.setContentToCurrent = 1 stdWrap.cObject = COA stdWrap.cObject { 10 = TEXT 10.field = title 10.required = 1 10.outerWrap.current = 1 20 = TEXT 20.field = abstract 20.required = 1 20.outerWrap.current = 1 } } }
In diesem Beispiel wird ein relativ komplizierter Wrap konstruiert, der dem inneren Rahmen je nach Seitentyp eine andere Klasse zuweist. Das Ergebnis der Zeilen 10 bis 30 wird nun mit setContentToCurrent an ein weiteres COA übergeben und dort mehrfach wiederverwendet. Wenn Sie diesen outerWrap nun sowohl für das Feld title als auch für das Feld abstract ändern möchten, brauchen Sie lediglich die Zeilen 10 bis 30 des ersten COA-Elements zu ändern.
346 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Diese Vorgehensweise ist deutlich performanter als das Kopieren temporärer Elemente mithilfe des data. Hier ein Beispiel, das alle Parameter berücksichtigt:
Lizensiert für Markus Mueller
temp.meinDebugOutput = COA temp.meinDebugOutput { 10 = TEXT 10.data = debug:rootLine 10.wrap = Rootline:
| 20 = TEXT 20.data = debug:fullRootLine 20.wrap = Full Rootline:
| 30 = TEXT 30.data = debug:data 30.wrap = Data:
| }
Weitere Hilfsmittel für das Debuggen von TypoScript finden Sie in Rezept 8.4.
field: Dieser Typ ist identisch mit der stdWrap-Funktion field und liefert den Wert eines Felds aus der Datenbank zurück. Er bezieht sich dabei auf $cObj->data[field], was zur Folge hat, dass die dabei angesprochene Tabelle der Datenbank situationsbezogen variiert. Während dieses Beispiel page = PAGE page { 10 = TEXT 10.data = field:feldname }
das Feld feldname aus der Tabelle pages ausliest, würde dieses hier
Max. Linie
page = PAGE page { 10 = CONTENT
354 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
10 { table = tt_content renderObj = TEXT renderObj.data = field:feldname } }
das Feld gleichen Namens, jedoch aus der Tabelle tt_content, zurückliefern. Bei Verwendung von vordefinierten TypoScript-Templates wie CSS-styled-content ist es nicht immer so klar ersichtlich wie in unserem Beispiel, aus welcher Tabelle die Felder in der jeweiligen Situation bezogen werden. Daher kommt es häufig zu Missverständnissen. Schauen Sie daher lieber einmal öfter in den TypoScript-Object-Browser, um sich einen Überblick zu verschaffen. Um sicherzugehen, dass die richtige Kombination aus Tabelle und Feld angesprochen wird, können Sie auf die getText-Methode DB: der Funktion data zurückgreifen. Weitere Informationen hierzu finden Sie weiter oben in diesem Rezept. Wenn Sie sich vorher genau ansehen wollen, welche Inhalte sich in $cObj-> data befinden, sollten Sie gemäß Rezept 10.8 mit der stdWrap-Funktion debugData arbeiten oder den Typ debug:data weiter oben in diesem Rezept verwenden. Lizensiert für Markus Mueller
fullRootline: Hiermit können Sie Felder aus der Tabelle pages abfragen. Die Besonderheit liegt dabei darin, dass Sie nicht unbedingt auf den Datensatz der aktuellen Seite zugreifen, sondern je nach Konfiguration auf eine beliebige Seite innerhalb der vollen Rootline. Der Wert 0 markiert dabei die eigentliche Rootseite Ihrer Site. Mit negativen Werten greifen Sie auf mögliche Elternseiten oder deren Elternseiten zurück, wobei Sie sich maximal bis zur eigentlichen Seite 0 Ihres Seitenbaums zurückbewegen können. Positive Werte liefern Ergebnisse von Unterseiten der Rootsite oder deren Unterseiten, dabei können Sie sich maximal bis zu der Seite vorarbeiten, auf der sich der Betrachter im Moment befindet. Hierzu eine beispielhafte Seitenstruktur: Seite 0 Seite 1 Seite 2 (Rootseite Ihrer Site) Seite 3 Seite 4 (aktuelle Seite)
Basierend auf dieser Struktur würde fullRootline folgende Ergebnisse liefern: data = fullRootline:0, title
liefert den Titel der Rootseite Ihrer Seite.
Max. Linie
data = fullRootline:-2, title, slide
10.2 Die getText-Funktionen data, dataWrap und insertData verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 355
liefert den Titel von Seite 0.
Links
data = fullRootline:-1, title, slide
liefert den Titel von Seite 1. data = fullRootline:1, title, slide
liefert den Titel von Seite 3. data = fullRootline:2, title, slide
liefert den Titel der aktuellen Seite. Mit der zusätzlichen Option slide sorgen Sie dafür, dass die Rootline bei Abfragen ohne Ergebnis so lange absteigend durchsucht wird, bis ein Ergebnis zurückgeliefert wird oder die Funktion auf Seite 0 angelangt ist. Vorsicht! Die Ergebnisse sind ausschließlich statisch, weil als Basis immer die Rootseite verwendet wird. Der Wert -1 z.B. liefert also immer Ergebnisse der Elternseite Ihrer Rootseite, unabhängig von der momentanen Position des Betrachters im Seitenbaum. Falls Sie die Abfrage relativ zur aktuellen Seite vornehmen wollen, müssen Sie mit den ebenfalls in diesem Rezept beschriebenen Typen levelfield, levelmedia, leveltitle oder leveluid arbeiten. Lizensiert für Markus Mueller
global: Hiermit könnten Sie auf das globale Array $GLOBALS zugreifen und auch Werte aus tieferen Ebenen dieses Arrays ausgeben. Die Verwendung dieser Funktion ist jedoch nicht zu empfehlen, weil in diesem Fall die Werte ungefiltert zurückgegeben werden, was im Zweifelsfall zu Sicherheitslücken führen könnte. Verwenden Sie daher lieber die Parameter GPvar, TSFE oder getIndpEnv, um an bestimmte Werte aus diesem Array zu gelangen.
getenv:, getIndpEnv: Mit diesen beiden Typen können Sie die sogenannten Environment-Variablen abfragen. Diese enthalten z.B. Informationen über den Server, die Domain, den Namen und den Pfad des aufgerufenen Skripts und vieles mehr. Der Unterschied zwischen beiden besteht darin, dass getenv: der PHP-Funktion getenv() entspricht, während getIndpEnv: eine eigene TYPO3-interne Funktion aufruft, die neben den üblichen Informationen spezielle Angaben zu TYPO3-spezifischen Variablen ausgibt. Indp steht als Abkürzung für independent, denn mit getIndpEnv: werden die Variablen unabhängig vom verwendeten System mit Werten versehen. Damit stellen Sie sicher, dass Ihr TypoScript-Code ebenfalls systemunabhängig funktioniert.
Max. Linie
temp.ihrBrowser = TEXT temp.ihrBrowser { data = getIndpEnv:HTTP_USER_AGENT wrap = Sie verwenden: | }
356 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Dies liefert zum Beispiel Angaben zum Browser, mit dem der Besucher Ihre Seite betrachtet. Folgende Variablen stehen Ihnen im Rahmen von getIndpEnv zur Verfügung: HTTP_ACCEPT_LANGUAGE HTTP_HOST HTTP_REFERER HTTP_USER_AGENT PATH_INFO QUERY_STRING REMOTE_ADDR REMOTE_HOST REQUEST_URI SCRIPT_FILENAME SCRIPT_NAME TYPO3_DOCUMENT_ROOT TYPO3_HOST_ONLY TYPO3_REQUEST_DIR TYPO3_REQUEST_HOST
Lizensiert für Markus Mueller
TYPO3_REQUEST_SCRIPT TYPO3_REQUEST_URL TYPO3_SITE_URL Optional können Sie _ARRAY verwenden, um sich die aktuellen Werte aller Variablen anzeigen zu lassen. Damit das Array als Tabelle ausgegeben wird, müssen Sie debugFunc = 2 setzen. (Lesen Sie dazu auch Rezept 10.8.)
GPvar: Dieser Typ kommt immer dann zum Einsatz, wenn es darum geht, GET- oder POSTVariablen auszulesen. Eine GET-Variable wird üblicherweise in der Form &Parameter=Wert oder &ParameterArray[Schlüssel]=Wert an die URL angehängt, wohingegen POST-Variablen beim Versenden von Formularen aus den Formularfeldern ausgelesen und versteckt übermittelt werden. TYPO3 speichert diese Parameter unabhängig von der jeweiligen Methode in einem Array, das Sie mit GPvar: abfragen können.
Max. Linie
POST-Variablen haben dabei Vorrang vor gleichnamigen GET-Variablen, was die Gefahr reduziert, über URL-Parameter unerwünschte Werte untergeschoben zu bekommen. Speziell dann, wenn es um Werte geht, die für Datenbankabfragen verwendet werden sollen, sollten Sie daher eher auf die Methode POST zurückgreifen. Unabhängig davon sollten Sie natürlich sämtliche Werte im Rahmen von Zugriffen auf die Datenbank immer einzeln auf Sicherheitsrisiken überprüfen.
10.2 Die getText-Funktionen data, dataWrap und insertData verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 357
Mit diesem Code können Sie z.B. den Wert des Parameters L, der üblicherweise für die Sprachauswahl verwendet wird, ausgeben:
Links
temp.aktuelleSprache = COA temp.aktuelleSprache { 10 = TEXT 10.value = Default-Sprache 10.if.isFalse.data = GPvar:L 20 = TEXT 20.value = Sprache 1 20.if.value.data = GPvar:L 20.if.equals.value = 1 }
Mit diesem Code zeigen Sie dem Benutzer, der soeben ein Formular abgeschickt hat, was er im Feld mit der ID name eingegeben hat: temp.meinFormularFeld = TEXT temp.meinFormularFeld { data = GPvar:name wrap = Sie haben den Namen | angegeben. }
In diesem Beispiel lesen Sie einen Schlüssel aus einem Array von Parametern aus, wie es zum Beispiel im Zusammenhang mit Extensions und deren Plugins zum Einsatz kommt: Lizensiert für Markus Mueller
temp.meinPlugin = TEXT temp.meinPlugin { data = GPvar:pluginname|key1 }
Selbst wenn Sie die verschiedenen Möglichkeiten für die Erzeugung lesbarer URLs verwenden, können Sie dennoch mit GPvar arbeiten. Die erforderlichen GET-Parameter sind dann zwar in der URL nicht direkt sichtbar, werden aber dennoch in Form eines codierten Strings korrekt übergeben.
level:, levelfield:, levelmedia:, leveltitle:, leveluid: Diese fünf Typen haben eines gemeinsam: Sie lesen Daten aus der Tabelle pages aus, beziehen sich dabei aber nicht notwendigerweise auf die aktuelle Seite, sondern auf irgendeine Seite innerhalb der Rootline oder die Position innerhalb dieser Rootline. Im Gegensatz zum Typ fullRootline: ist die Basis für positive Werte sowie für den Wert 0 die eigentliche Rootseite, während negative Werte von der aktuellen Seite als Basis ausgehen und Sie sich von dort aus rückwärts durch die Rootline bewegen. Negative Werte liefern also in diesem Fall relative Ergebnisse, während die Ergebnisse für alle anderen Werte absolut sind. Hierzu eine Seitenstruktur und zwei verschiedene Zustände als Beispiel:
Max. Linie
Max. Linie 358 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
absolut relativ 0 1 2 3 X
-4 -3 -2 -1 X
absolut relativ 0 1 2 3 4
-5 -4 -3 -2 -1
Seite Ebene Ebene Ebene Ebene Ebene
0 (Root) 1 2 3 (aktuelle Seite) 4
Seite Ebene Ebene Ebene Ebene Ebene
0 (Root) 1 2 3 4 (aktuelle Seite)
In diesem Beispiel können Sie deutlich erkennen, wie sich die negativen Werte bei wechselnder Position der aktuellen Seite mit verändern. Eine weitere Veranschaulichung der Thematik finden Sie in Rezept 12.1.
Lizensiert für Markus Mueller
levelfield: ist die allgemein gültige Funktion für alle verfügbaren Rootline-Felder, während levelmedia: ausschließlich auf das Feld media, leveltitle: ausschließlich auf das Feld title und leveluid: ausschließlich auf das Feld uid zurückgreifen. Alle Varianten bieten zusätzlich die Option slide, mit deren Hilfe die Rootline so lange absteigend durchsucht wird, bis das gewünschte Feld einen Wert zurückliefert oder die Rootseite selbst erreicht ist. levelmedia:, leveltitle: und leveluid: nutzen die gleiche Syntax: levelmedia:[Position], [slide] leveltitle:[Position], [slide] leveluid:[Position], [slide]
So greifen Sie z.B. auf den Titel der Rootseite und gleichzeitig auf die UID der Elternseite zu: temp.levelAbfrage = COA temp.levelAbfrage { 10 = TEXT 10.value = Titel der Rootseite: {leveltitle:0}
10.wrap = 20 = TEXT 20.value = uid der Elternseite: {leveluid:-2}
stdWrap.insertData = 1 }
levelfield: verwendet eine geringfügig abweichende Schreibweise: levelfield:[Position], [feldname], [slide]
So greifen Sie z.B. auf das Feld abstract der Seite zu, die sich zwei Ebenen vor der aktuellen befindet. Sollte dieses leer sein, wird die Rootline durchsucht:
Max. Linie
Max. Linie 10.2 Die getText-Funktionen data, dataWrap und insertData verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 359
temp.levelAbfrage = COA temp.levelAbfrage { 10 = TEXT 10.data = levelfield:-3, abstract, slide 10.wrap =
Abstract der Grosselternseite: |
}
Links
Wenn Sie einfach nur herausfinden wollen, auf welchem Level Sie sich gerade befinden, können Sie dies mithilfe von level tun. Dieser Parameter hat keinerlei zusätzliche Optionen und liefert als Rückgabewert lediglich eine Zahl: temp.levelAbfrage = COA temp.levelAbfrage { 10 = TEXT 10.data = level 10.wrap =
Wir befinden uns auf Level: |
} Um levelfield: nutzen zu können, muss das entsprechende Feld in der Liste der Rootline-Felder verfügbar sein! Für alle Felder außer title und uid müssen Sie daher im Install-Tool unter All Configuration den Eintrag [FE][addRootLineFields] ändern. Lesen Sie dazu gegebenenfalls Rezept 2.6. Lizensiert für Markus Mueller
LLL: Damit können Sie auf standardisierte Übersetzungen verschiedener Ausdrücke zurückgreifen, die sich üblicherweise in den sogenannten locallang-Dateien befinden. Die Schreibweise variiert dabei, je nachdem, woher Sie die Übersetzungen beziehen wollen. Dabei wird in mehrsprachigen Installationen der aktuell gesetzte Wert für config.language ausgewertet und das passende Array in der angegebenen Sprachdatei angesteuert. Mit dieser Schreibweise greifen Sie z.B. auf die Sprachdatei einer Extension zu: 10 = TEXT 10.data = LLL:EXT:meine_extension/pi1/locallang.php:meinAusdruck
Sie können aber auch allgemeine Sprachdateien verwenden, die nicht speziell einer Extension zugewiesen sein müssen. In diesem Fall sieht die Schreibweise anders aus: 10 = TEXT 10.data = LLL:typo3conf/meinelocallang.xml:meinAusdruck
In beiden Fällen muss die Sprachdatei ein entsprechendes Array enthalten, um entweder die korrekte Übersetzung oder, falls diese nicht vorhanden ist, einen passenden DefaultWert zurückzuliefern. Der überwiegende Teil der Sprachdateien liegt dabei in Form eines PHP-Arrays vor.
Max. Linie
Seit Neuestem werden jedoch XML-Arrays bevorzugt, weil diese universeller einsetzbar sind. <meta type="array"> <description>Labels for TypoScript module My Expression Mein Ausdruck Lizensiert für Markus Mueller
In einer auf PHP basierenden Sprachdatei entspricht der Ausdruck dem jeweiligen ArrayKey, während er in der XML-Version über den Index eines Labels zu finden ist. Beachten Sie, dass diese Lösung im Fall eines fehlenden Eintrags in der Sprachdatei zunächst auf einen passenden Default-Wert zurückgreift. Ist dieser ebenfalls nicht vorhanden, gibt es keinerlei Ausgabe. Kombinieren Sie diesen Typ daher gegebenenfalls mit einem Default-Wert im TypoScript. 10 = TEXT 10.value = Ein Default-Ausdruck 10.override.data = LLL:typo3conf/meinelocallang.xml:meinAusdruck
page: Mit diesem Typ können Sie jederzeit auf den Datensatz der aktuellen Seite zugreifen. Das ist vor allem dann nützlich, wenn Sie TypoScript-Funktionen oder -Elemente nutzen, die einen anderen Datensatz im Array $cObj->data enthalten. So können Sie z.B. während der Ausgabe von Inhalten aus tt_content weiterhin Felder der aktuellen Seite berücksichtigen.
Max. Linie
10 = CONTENT 10 { table = tt_content renderObj = COA renderObj { 10 = TEXT 10.dataWrap = Seite {page:uid}, Element {field:uid}
10.2 Die getText-Funktionen data, dataWrap und insertData verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 361
20 = TEXT 20.field = bodytext 20.wrap =
|
Links
} }
In diesem Beispiel wird zweimal auf das Feld uid zugegriffen. Beim ersten Zugriff stammt es jedoch aus dem Datensatz der aktuellen Seite. Erst beim zweiten Zugriff wird die UID des jeweiligen Inhaltselements aus tt_content verwendet, gefolgt vom Inhalt des Felds bodytext.
parameters: Dieser spezielle Typ kommt vor allem im Zusammenhang mit der stdWrap-Funktion parseFunc zum Einsatz. Wenn Sie TypoTags wie z.B. oder auch eigene Definitionen von Tags wie z.B. <meintag> benutzen, können Sie diesen Tags bestimmte Parameter zuweisen, die im Array $cObj->parameters abgelegt werden. Mithilfe dieses Datentyps können Sie die einmal definierten Parameter auslesen und bei Bedarf entsprechend weiterverwenden. Sie bestimmen damit, welche Parameter, die ein Redakteur eingegeben haben könnte, zulässig sind, wobei alle anderen ignoriert werden. Steht im Feld bodytext zum Beispiel folgendes TypoTag: Lizensiert für Markus Mueller
<meintag id="whatever">Linktext
können Sie mit diesem Code dafür sorgen, dass nur der Parameter class ausgewertet wird. Alle anderen Parameter bleiben unberücksichtigt. lib.parseFunc { tags { meinTag = COA meinTag { 10 = TEXT 10.current = 1 10.dataWrap = | } } }
Im Zusammenspiel des TypoTags mit der stdWrap-Funktion typolink kommt dabei eine weitere Option von parameters namens allParams zum Einsatz, die das vollständige Array an typolink übergibt. Hier ein Beispiel aus CSS-styled-content:
Max. Linie
lib.parseFunc { tags { link = TEXT link { current = 1 typolink.parameter.data = parameters : allParams } } }
362 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Damit wird sichergestellt, dass alle eventuell vorhandenen Parameter für die Verarbeitung mit typolink zur Verfügung stehen. Lesen Sie dazu auch Rezept 10.7, das sich ausführlich mit der stdWrap-Funktion typolink beschäftigt.
path: Verwenden Sie diesen Typ, wenn Sie eine Datei in einem bestimmten Pfad direkt einem TypoScript-Element zuweisen wollen. Wie schon beim Typ LLL: können Sie auch hier mit der zusätzlichen Angabe EXT: dafür sorgen, dass der passende Pfad zu einer Extension gefunden wird, unabhängig davon, ob Sie diese lokal oder global installiert haben. 10 = TEMPLATE 10.template.data = path:EXT:meineExtension/templates/defaulttemplate.html
In diesem Beispiel weisen Sie dem Parameter template des TypoScript-Elements TEMPLATE eine Default-Vorlage zu. Wird die Datei an der angegebenen Stelle nicht gefunden, wird ein leerer Wert zurückgegeben, deswegen eignet sich dieser Typ auch gut für reine Abfragen, ob eine Datei existiert.
Lizensiert für Markus Mueller
10 = TEXT 10.value = Es gibt eine Templatedatei 10.if.isTrue.data = path:EXT:meineExtension/templates/defaulttemplate.html
register: TYPO3 verwendet intern verschiedenste Register, um Daten zwischenzuspeichern, die an anderer Stelle abgefragt werden müssen. Neben den vorgefertigten Registern können Sie auch selbst mithilfe des TypoScript-Elements LOAD_REGISTER eigene Register erzeugen. Der Zugriff auf alle Register, auch die selbst definierten, erfolgt dabei mit dem Typ register:. So lesen Sie beispielsweise innerhalb eines Menüs das interne Zählregister count_menuItems aus: 10 = HMENU 10 { 1 = TMENU 1 { NO { before = TEXT before.dataWrap = {register:count_menuItems}. } } }
Dieser Code liefert Ihnen den aktuellen Wert des selbst definierten Registers meinRegister:
Max. Linie
10 = TEXT 10.data = register:meinRegister
10.2 Die getText-Funktionen data, dataWrap und insertData verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 363
Lesen Sie in Rezept 11.4, wie Sie ein solches Register anlegen und mit Daten befüllen können und welche Register TYPO3 Ihnen sonst noch zu bieten hat.
Links
TSFE: In dem multidimensionalen TypoScript Front End Array oder auch TSFE werden sämtliche Parameter verwaltet, die für die Ausgabe von Inhalten mit TYPO3 erforderlich sind. Mit diesem Typ können Sie Werte aus diesem Array ausgeben. Wenn die Werte selbst wiederum als Array definiert sind, können Sie diese mithilfe des Zeichens | weiter in ihre Bestandteile zerlegen. Wenn Sie eine vollständige Liste dieses Arrays erhalten wollen, können Sie innerhalb des PHP-Codes einer Extension die Funktion debug($GLOBALS ['TSFE']); verwenden. Rechnen Sie jedoch je nach Anzahl der installierten Extensions damit, dass die Auflistung dieses Arrays ein wenig Zeit in Anspruch nehmen wird.
Hier finden Sie ein paar gebräuchliche Anwendungsbeispiele:
Lizensiert für Markus Mueller
10 = COA 10 { 10 = TEXT 10.value = Die uid der Seite: {TSFE:id} 20 = TEXT 20.value = Der Wert des no_cache-Parameters: {TSFE:no_cache} 30 = TEXT 30.value = Der type, mit dem die Seite aufgerufen wurde: {TSFE:type} 40 = TEXT 40.value = Der Login-Status des aktuellen Benutzers: {TSFE:loginUser} 50 = TEXT 50.value = Der Username des aktuellen Benutzers: {TSFE:fe_user|user|username} stdWrap.insertData = 1 }
10.3 Bedingungen abfragen Problem Sie wollen Teile Ihres TypoScript-Codes nur unter bestimmten Bedingungen verwenden. Es soll z.B. ein TypoScript-Element nur dann verwendet werden, wenn der Benutzer sich per Login verifiziert hat, oder eine Funktion nur dann ausgeführt werden, wenn die IPAdresse des Benutzers einen bestimmten Wert hat.
Max. Linie
Dabei wollen Sie nicht mit den in Rezept 8.8 beschriebenen Conditions arbeiten. Die erforderlichen Abfragen sollen daher direkt in den Elementen oder Funktionen selbst zum Einsatz kommen und dabei gegebenenfalls mit weiteren stdWrap-Funktionen manipuliert werden.
364 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lösung Verwenden Sie die entsprechenden Funktionen aus dem stdWrap-Baukasten. fieldRequired Überprüft ob ein bestimmtes Feld aus dem aktuellen Datensatz gesetzt ist. if Ermöglicht komplexe Abfragen, die ihrerseits aus Werten oder stdWrap-Funktionen bestehen können. ifEmpty Ersetzt leere Inhalte mit Werten oder weiteren Elementen und Funktionen. override Überschreibt den bisherigen Inhalt mit Werten oder weiteren Elementen und Funktionen. required Sorgt dafür, dass sonstige Funktionen nur ausgeführt werden, wenn der übergebene Wert nicht leer ist.
Diskussion Lizensiert für Markus Mueller
fieldRequired Mithilfe dieser Funktion stellen Sie sicher, dass der entsprechende TypoScript-Code nur dann zum Einsatz kommt, wenn ein bestimmtes Feld des aktuellen Datensatzes gesetzt ist. Dabei muss das in der Abfrage verwendete Feld nicht unbedingt identisch mit dem auszugebenden Feld sein. Sie können also z.B. dafür sorgen, dass eine zweite Überschrift aus dem Feld subheader nur dann ausgegeben wird, wenn auch das Feld header gesetzt ist. 10 = TEXT 10 { fieldRequired = header field = subheader wrap = | }
Sonstige Funktionen des Elements werden nicht ausgeführt, wenn fieldRequired den Wert false zurückliefert. In diesem Beispiel würde also weder das Feld subheader abgefragt noch ein Wrap erzeugt, wenn das Feld header nicht gesetzt ist.
if
Max. Linie
Mit dieser Funktion können Sie komplexe Abfragen konstruieren. Sie können dabei direkt eingegebene Werte, Ergebnisse von Funktionen und Inhalte von Elementen miteinander vergleichen. Als Ergebnis wird dabei entweder true oder false zurückgeliefert. Das Ergebnis false leert automatisch den kompletten Inhalt des aufrufenden Elements.
10.3 Bedingungen abfragen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 365
Max. Linie
Für die verschiedenen Abfragen stehen Ihnen eine Reihe von Unterparametern zur Verfügung, die wir anhand folgender Beispiele erläutern. Für alle vergleichenden Parameter benötigen Sie dabei immer den zusätzlichen Parameter value, der den ersten Vergleichswert liefert.
Links
Verwechseln Sie diesen Parameter nicht mit dem value eines TEXT-Elements. Achten Sie dazu unbedingt auf die Verwendung von value und if.value in den gezeigten Beispielen.
Alle Unterparameter verfügen ihrerseits über stdWrap-Funktionen und können daher auch aus TypoScript-Elementen zusammengesetzt werden. Außerdem können Sie mehrere Unterparameter zu kombinierten Abfragen zusammenfassen. if.isTrue Überprüft, ob der Inhalt eines Elements oder das Ergebnis einer Funktion wahr ist. Wahr meint in diesem Fall nicht leer und nicht 0. 10 = TEXT 10 { value = 1 ist wahr. if.isTrue = 1 } Lizensiert für Markus Mueller
In Kombination mit der Funktion data können Sie zum Beispiel einen URL-Parameter abfragen: 10 = TEXT 10 { value = Druckversion ist aktiviert. if.isTrue.data = GPvar:print }
if.isFalse Überprüft, ob der Inhalt eines Elements oder das Ergebnis einer Funktion unwahr ist. Unwahr meint in diesem Fall leer oder 0. 10 = TEXT 10 { value = 0 ist unwahr. if.isFalse = 0 }
Auch damit können Sie zum Beispiel einen URL-Parameter abfragen: 10 = TEXT 10 { value = Druckversion ist nicht aktiviert. if.isFalse.data = GPvar:print }
Max. Linie
if.isPositive Überprüft, ob der Inhalt eines Elements oder das Ergebnis einer Funktion ein positives Ergebnis hat. Hierbei können Sie mit den üblichen Rechenoperatoren arbeiten.
366 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
10 = TEXT 10 { value = Ergebnis ist positiv. if.isPositive = 0 + 1 }
Damit können Sie zum Beispiel mehrere Konstanten auswerten. Ist eine davon aktiviert, liefert sie den Wert 1, ansonsten den Wert 0: 10 = TEXT 10 { value = Mindestens eine Konstante wurde aktiviert. if.isPositive = {$Konstante1}+{$Konstante2}+{$Konstante3} }
Oder Sie fragen ein Zählregister ab: 10 = TEXT 10 { value = Der Zähler ist größer als 0. if.isPositive.data = register:meinZähler }
Lesen Sie bei Bedarf Rezept 11.4 zum Thema Register bzw. Rezept 8.7, das Konstanten und ihre Verwendung erklärt. Lizensiert für Markus Mueller
if.isGreaterThan Ergibt wahr, wenn der Wert von isGreaterThan größer ist als der von value. 10 = TEXT 10 { value = 2 ist größer als 1. if.value = 1 if.isGreaterThan = 2 }
Lassen Sie sich durch die Reihenfolge nicht beirren oder schreiben Sie zum besseren Verständnis: 10 = TEXT 10 { value = 2 ist größer als 1. if.isGreaterThan = 2 if.value = 1 }
Auch hier können Sie weitere stdWrap-Funktionen nutzen, um die Vergleichswerte zu erzeugen. Das funktioniert für beide Parameter gleichermaßen. 10 = TEXT 10 { value = URL-Parameter1 ist größer als URL-Parameter2. if.isGreaterThan.data = GPvar:parameter1 if.value.data = GPvar:parameter2 }
Max. Linie
Max. Linie 10.3 Bedingungen abfragen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 367
if.isLessThan Ergibt wahr, wenn der Wert isLessThan kleiner ist als der von value.
Links
10 = TEXT 10 { value = 1 ist kleiner als 2. if.value = 2 if.isLessThan = 1 }
Oder schreiben Sie auch hier zum besseren Verständnis: 10 = TEXT 10 { value = 1 ist kleiner als 2. if.isLessThan = 1 if.value = 2 }
Mit zusätzlichen stdWrap-Funktionen können Sie auch hier die Parameter erweitern: 10 = TEXT 10 { value = Die Startzeit des Datensatzes ist kleiner als die Systemzeit. if.isLessThan.field = starttime if.value.data = date:U } Lizensiert für Markus Mueller
if.equals Ergibt wahr, wenn die Werte von equals und value identisch sind. 10 = TEXT 10 { value = 2 ist gleich 2. if.value = 2 if.equals = 2 }
Die Parameter lassen sich ebenfalls mit stdWrap-Funktionen erweitern. 10 = TEXT 10 { value = Das Element ist für das gewählte Layout verfügbar. if.value.data = GPvar:selectedlayout if.equals.field = layout }
if.isInList Ergibt wahr, wenn der Wert von isInList in einer kommaseparierten Liste unter value enthalten ist. In dieser Liste dürfen keinerlei Leerzeichen enthalten sein. Auch hier empfiehlt sich, diese Reihenfolge zu verwenden.
Max. Linie
10 = TEXT 10 { value = 2 ist in der Liste 1,2,3,4,5 enthalten. if.isInList = 2 if.value = 1,2,3,4,5 }
368 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Mit stdWrap-Funktionen erweiterte Parameter sind auch hier möglich: 10 = TEXT 10 { value = Der angegebene Dateiname ist im Feld media enthalten. if.isInList.data = GPvar:download_file if.value.field = media }
if.negate Mit diesem Schalter kehren Sie das Ergebnis einer Abfrage ins Gegenteil um. Aus wahr wird somit unwahr, aus unwahr wiederum wahr. 10 = TEXT 10 { value = Dies ist keine Druckversion. if.isTrue.data = GPvar:print if.negate = 1 }
Das Gegenteil für die einzelnen Unterparameter können Sie dieser Liste entnehmen:
Lizensiert für Markus Mueller
if.isTrue
false
if.isFalse
true
if.isPositive
negativ oder 0
if.isGreaterThan
kleiner oder gleich
if.isLessThan
größer oder gleich
if.equals
ungleich
if.isInList
nicht in der Liste enthalten
if.directReturn Dieser Schalter kann zum einen ganz hilfreich sein, um den Zustand einer Abfrage zu simulieren, zum anderen können Sie ihn in Verbindung mit Konstanten einsetzen, um Teilbereiche Ihres TypoScripts ein- oder auszuschalten. Anstatt eine echte Abfrage vorzunehmen, wird umgehend der Wert des Schalters selbst zurückgegeben. In diesem Beispiel ist das Ergebnis immer unwahr, weil die eigentliche Abfrage nicht stattfindet. 10 = TEXT 10 { value = Dies ist keine Druckversion. if.isTrue.data = GPvar:print if.directReturn = 0 }
In diesem Beispiel ist das Ergebnis immer wahr, weil auch hier die eigentliche Abfrage nicht stattfindet.
Max. Linie
10 = TEXT 10 { value = Dies ist keine Druckversion. if.isTrue.data = GPvar:print if.directReturn = 1 }
10.3 Bedingungen abfragen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 369
Wie wir zu Anfang bereits erwähnt haben, können Sie einzelne Abfrageparameter auch miteinander kombinieren. Diese werden dazu mit einer UND-Verknüpfung verbunden. Die Funktion liefert in diesem Fall nur dann wahr als Ergebnis, wenn alle abgefragten Eigenschaften zutreffen. Beachten Sie dabei jedoch, dass Sie den Parameter value nur einmal definieren können und sich alle Vergleiche auf den darin enthaltenen Wert beziehen. Der Schalter negate kehrt in diesem Fall das Ergebnis der gesamten Verknüpfung um.
Links
In diesem Beispiel wird der Text nur angezeigt, wenn der URL-Parameter print existiert und das Feld pid den Wert 1, 2 oder 3 hat. 10 = TEXT 10 { value = Alle Eigenschaften treffen zu! if.isTrue.data = GPvar:print if.isInList.field = pid if.value = 1,2,3 }
Wenn Sie das Ergebnis dieses Codes mit negate umkehren, muss der Satz anders lauten:
Lizensiert für Markus Mueller
10 = TEXT 10 { value = Mindestens eine Eigenschaft trifft nicht zu! if.isTrue.data = GPvar:print if.isInList.field = pid if.value = 1,2,3 if.negate = 1 }
Der Text würde also angezeigt, wenn entweder der URL-Parameter nicht gesetzt ist oder das Feld pid nicht den Wert 1, 2 oder 3 hat. Wie Sie sehen, ist die Arbeit mit if und die damit verbundene Logik teilweise recht komplex. Sie sollten diese Funktion daher sehr bedacht verwenden.
ifEmpty Falls das Ergebnis einer Funktion oder der Inhalt eines Elements leer ist, wird dieser leere Inhalt mithilfe von ifEmpty durch einen anderen Inhalt ersetzt. Auch der Wert 0 wird hier als leer betrachtet. Sie können in diesen Fällen entweder direkt einen Wert für die Ausgabe zuweisen: 10 = TEXT 10 { field = header ifEmpty = Header ist leer. }
Max. Linie
oder weitere stdWrap-Funktionen nutzen, um einen abweichenden Inhalt zu erzeugen: 10 = TEXT 10 {
370 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
field = header ifEmpty.cObject = TEXT ifEmpty.cObject { value = Header ist leer. wrap = <span >| } }
Beachten Sie bei diesem Beispiel, dass sich der Wrap auf das cObject beziehen muss. Würden Sie ihn dem äußeren TEXT-Element zuweisen, würde die Klasse "warnung" auch dann verwendet, wenn das Feld header nicht leer wäre.
Das spiegelverkehrte Pendant zu ifEmpty ist die Funktion override, mit der Inhalte in jedem Fall überschrieben werden, wenn das Ergebnis von override selbst nicht leer ist.
override Falls das Ergebnis dieser Funktion nicht leer ist, wird der Inhalt der aufrufenden Funktion oder des aufrufenden Elements durch seinen Inhalt ersetzt. Auch der Wert 0 wird hier als leer betrachtet. Sie können in diesen Fällen entweder direkt einen Wert für die Ausgabe zuweisen: Lizensiert für Markus Mueller
10 = TEXT 10 { value = Header ist leer. override = Header ist nicht leer. }
oder weitere stdWrap-Funktionen nutzen, um einen abweichenden Inhalt zu erzeugen: 10 = TEXT 10 { value = <span >Header ist leer. override.cObject = TEXT override.cObject { field = header } }
Das spiegelverkehrte Pendant zu override ist die Funktion ifEmpty, mit der die Ergebnisse von Funktionen oder Inhalte von Elementen ersetzt werden, wenn sie leer sind.
required
Max. Linie
Diese Funktion arbeitet ähnlich wie die weiter vorn in diesem Rezept beschriebene Funktion fieldRequired. Sie überprüft, ob Inhalt vorhanden ist, und schaltet bei leerem Inhalt jede weitere Funktionalität ab. Sie verwendet dazu jedoch nicht nur ein einzelnes Feld, sondern den gesamten Inhalt einer Funktion oder eines Elements. Eine 0 wird hier nicht als leer betrachtet. Da sie keine weiteren Optionen oder Parameter nutzt, wird sie als Schalter mit den Werten 1 oder 0 verwendet.
10.3 Bedingungen abfragen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 371
Max. Linie
Hilfreich ist required vor allem, um zu verhindern, dass bei leerem Inhalt dennoch ein Wrap erzeugt wird. Die Funktion wrap liegt in der stdWrap-Hierarchie nämlich unterhalb von required und wird demzufolge nicht ausgeführt, wenn required false zurückgeben sollte. Speziell in Verbindung mit der Funktion override ist diese Vorgehensweise wichtig, damit Inhalte nicht mit leeren Wraps überschrieben werden.
Links
10 = TEXT 10 { value = <span >Header ist leer. override.cObject = TEXT override.cObject { required = 1 field = header wrap = <span >| } }
In diesem Fall entspräche der Wert von override mindestens dem Wrap, unabhängig davon, ob das Feld header einen Wert zurückgeliefert hat oder nicht. Die ursprüngliche Aussage Header ist leer würde also immer überschrieben. Mithilfe von required wird nun sichergestellt, dass der Wrap nur zum Tragen kommt, wenn das Feld auch gesetzt ist. Lizensiert für Markus Mueller
10.4 Daten verarbeiten und formatieren Problem Sie möchten Inhalte und Ergebnisse der in den Rezepten 10.1, 10.2 und 10.3 verwendeten Funktionen für bestimmte Anwendungsbereiche formatieren. Sie möchten dabei nicht nur Werte berechnen, Datumsangaben oder Dateigrößen erzeugen, sondern auch ganze Textbereiche beschneiden, nach Trennzeichen durchsuchen und separat formatieren, auf eine bestimmte Länge beschneiden und von Whitespace befreien sowie die Ausgabe bestimmter Charactersets berücksichtigen.
Lösung Verwenden Sie die Formatierungsfunktionen aus dem stdWrap-Baukasten. age Liefert das Alter einer Zeitangabe in Minuten, Stunden, Tagen oder Jahren. bytes Formatiert Dateigrößen in KByte, MByte und GByte. case Erzwingt die Groß- oder Kleinschreibung von Texten.
Max. Linie
char Weist bestimmte Character eines Zeichensatzes anhand des Charactercodes zu.
372 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
crop Beschneidet Texte auf eine bestimmte Länge. csConv Passt den verwendeten Zeichensatz dem für die Ausgabe vorgesehenen an. date Erzeugt eine korrekt formatierte Zeitangabe. doubleBrTag, br und brTag Behandeln die Verarbeitung von Zeilenschaltungen im Text. intval Schneidet Nachkommastellen von Zahlenwerten ab. keywords Erzeugt einheitlich kommaseparierte Listen aus verschieden strukturierten Listenfeldern. prioriCalc Berechnet mathematische Terme, die Sie vorher dynamisch erzeugen können. removeBadHTML Entfernt gefährlichen HTML-Code, der möglicherweise von einem Angreifer für XSSAttacken genutzt werden könnte.
Lizensiert für Markus Mueller
split Trennt Textblöcke mithilfe eines Trenn-Strings und formatiert die Einzelteile in einer vorgegebenen Reihenfolge. strftime Sorgt für korrekt formatierte Zeitangaben insbesondere im Zusammenhang mit mehrsprachigen Seiten. stripHtml Entfernt sämtliche Tags aus einem Text. substring Liefert den Teilbereich eines Texts auf Basis numerischer Positionsangaben. trim Entfernt unnötige Leerzeichen und Zeilenschaltungen am Anfang und Ende eines Texts.
Diskussion age
Max. Linie
Wenn Sie diesen Schalter auf 1 setzen, können Sie damit ausgehend von der aktuellen Systemzeit das Alter einer Zeitangabe in Minuten, Stunden, Tagen oder Jahren angeben. Je nach Alter wird die passende Einheit verwendet. Nach 60 Minuten wird in Stunden
10.4 Daten verarbeiten und formatieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 373
Max. Linie
ausgegeben, nach 24 Stunden in Tagen und nach 365 Tagen in Jahren. Die Default-Ausgabe verwendet die Kürzel min, hrs, days und years. Wenn Sie andere Kürzel oder gegebenenfalls ausgeschriebene Bezeichnungen verwenden wollen, müssen Sie statt der 1 die vier gewünschten Strings getrennt durch das |-Symbol angeben. Beachten Sie, dass Sie die erforderlichen Leerzeichen mit angeben müssen. Damit dies auch für den ersten und letzten Wert funktioniert, müssen Sie die Angabe in Anführungszeichen setzen. Diese werden später automatisch entfernt.
Links
temp.meineZeitangabe = TEXT temp.meineZeitangabe { field = tstamp age = " Minuten | Stunden | Tage | Jahre " }
bytes
Lizensiert für Markus Mueller
Über diesen Schalter können Sie einen Zahlenwert in Form von Byte ausgeben. Die Default Ausgabe arbeitet dabei nur mit K für Kilobyte, M für Megabyte und G für Gigabyte ohne weitere Angaben. Für abweichende Suffixe können Sie den Parameter labels setzen. Darin werden jeweils mit einem |-Symbol als Trennzeichen die gewünschten Suffixe aufgelistet. Das Ergebnis ist immer ein Wert mit maximal einer Nachkommastelle gefolgt vom passenden Suffix, wobei z.B. 900000000 noch als 858 M ausgegeben wird, 900000001 jedoch schon als 0.8 G. Beachten Sie, dass Sie gewünschte Leerzeichen mit eingeben müssen. temp.meineByteAusgabe = TEXT temp.meineByteAusgabe { field = dateigroesse bytes = 1 bytes { labels = | KB| MB| GB } }
case Mithilfe von case können Sie die Groß- oder Kleinschreibung eines Strings erzwingen. Zulässige Werte hierfür sind upper für Großschreibung oder lower für Kleinschreibung. Maßgeblich für die Konvertierung ist das unter config.renderCharset festgelegte Characterset. Falls Sie dies nicht explizit angegeben haben, wird entweder der Wert aus TYPO3_CONF_VARS[BE][forceCharset] verwendet oder, falls dieser ebenfalls nicht gesetzt wurde, der Default-Wert ISO-8859-1.
Max. Linie
temp.grossKleinErzwingen = COA temp.grossKleinErzwingen { 10 = TEXT 10.value = Das sind alles grosse Buchstaben.
374 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
10.case = upper 10.wrap = |
20 = TEXT 20.value = Das sind alles kleine Buchstaben. 20.case = lower }
Das Ergebnis dieses Codes sähe folgendermaßen aus: DAS SIND ALLES GROSSE BUCHSTABEN das sind alles kleine buchstaben
char Diese Funktion liefert den zum angegebenen ganzzahligen Charactercode gehörigen Character aus dem aktuellen Characterset. Beachten Sie dabei, dass nicht in jeder Schriftart alle Character zur Verfügung stehen. Verwendung findet die Funktion z.B. innerhalb von split, wo sie bei Bedarf dazu verwendet wird, eine Zeilenschaltung als Trennzeichen zu nutzen. Die Zeilenschaltung entspricht dem Charactercode 10.
Lizensiert für Markus Mueller
temp.meineZeilenschaltung = TEXT temp.meineZeilenschaltung { field = bodytext split { token.char = 10 cObjNum = 1 1.current = 1 1.wrap = | } }
crop Mithilfe dieser Funktion können Sie einen Text auf eine maximale Anzahl von Zeichen begrenzen, um zum Beispiel einen kurzen Anriss in einem Teaser-Menü zu liefern, während der vollständige Text nur nach einem Klick auf den entsprechenden mehr-Link angezeigt wird. Die Anzahl der Zeichen kann dabei sowohl vom Anfang als auch vom Ende des Texts aus berechnet werden. Positive Werte beginnen von links, also vom Anfang des Texts, negative von rechts, also vom Ende des Texts. Zusätzlich können Sie einen End-String definieren, der dem abgeschnittenen Text hinzugefügt wird. Außerdem gibt es noch einen Schalter, der dafür sorgt, dass keine Trennung innerhalb eines Worts stattfindet. Stattdessen wird das betreffende Wort vollständig entfernt. Die Schreibweise für diese drei Parameter sieht folgendermaßen aus: +/- chars | string | boolean
Max. Linie
Mit diesem Code würden Sie also den Text auf 200 Zeichen beginnend am Anfang des Texts beschränken und danach drei Punkte an das Ergebnis anhängen:
10.4 Daten verarbeiten und formatieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 375
Max. Linie
temp.meinKurztext = TEXT temp.meinKurztext { field = bodytext crop = 200 | ... }
Links
Im folgenden Fall würden Sie am Ende des Texts beginnen und ebenfalls drei Punkte hinzufügen. Jedoch findet die Trennung hier nicht in einem Wort statt. Das Ergebnis ist also gegebenenfalls geringfügig kürzer als die angegebenen 200 Zeichen. temp.meinKurztext = TEXT temp.meinKurztext { field = bodytext crop = -200 | ... | 1 }
csConv Mit dieser Funktion teilen Sie TYPO3 mit, welches Characterset dem verwendeten String zugrunde liegt. Dadurch erfolgt eine automatische Konvertierung in das unter config. renderCharset festgelegte Characterset.
Lizensiert für Markus Mueller
Falls Sie dies nicht explizit angegeben haben, wird entweder der Wert aus TYPO3_CONF_VARS[BE][forceCharset] verwendet oder, falls dieser ebenfalls nicht gesetzt wurde, der Default-Wert ISO-8859-1.
Damit stellen Sie sicher, dass eventuell verwendete Sonderzeichen oder spezielle Buchstaben korrekt übertragen werden und bei der Ausgabe im Frontend lesbar sind. temp.meineKonvertierung = TEXT temp.meineKonvertierung { field = textfeld csConv = utf-8 }
Mit diesem Code könnten Sie Daten aus einer UTF-8-kodierten Datenbank ausgeben, obwohl das für die Ausgabe genutzte Characterset z.B. ISO-8859-1 ist.
date Diese Funktion ist identisch mit der gleichnamigen Variante der getText-Funktionen aus Rezept 10.2. Mit ihrer Hilfe formatieren Sie einen Zahlenwert, der üblicherweise in Form von Sekunden übergeben wird, als korrektes Datum. Die komplette Liste der zulässigen Parameter entnehmen Sie bitte Rezept 10.2.
Max. Linie
temp.meinDatum = TEXT temp.meinDatum { field = tstamp date = D, den d. F Y noTrimWrap = |Erzeugt am || }
376 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts doubleBrTag / br / brTag Diese Funktionen dienen der gezielten Verarbeitung von Zeilenschaltungen innerhalb eines Texts, den Sie z.B. aus dem Feld bodytext ausgelesen haben. Da stdWrap eine bestimmte Reihenfolge beim Aufruf der einzelnen Funktionen zugrunde legt, wird doubleBrTag immer vor br oder brTag ausgeführt. Auf diese Weise können Sie zunächst doppelte Zeilenschaltungen mit einem speziellen Code ersetzen, bevor Sie mithilfe der beiden anderen Funktionen die verbliebenen einzelnen Zeilenschaltungen bearbeiten. Im folgenden Beispiel wird ein Text verarbeitet, der aus einem Feld ohne RTE-Eingabemöglichkeiten stammt. Damit Sie auch in diesem Fall mit echten Absätzen, den sogenannten harten Zeilenschaltungen und darin mit einfachen sogenannten weichen Zeilenschaltungen arbeiten können, benötigen Sie zusätzlich die Funktion split, die ebenfalls in diesem Rezept behandelt wird. Für einen echten Absatz verwenden Sie bei der Eingabe eine doppelte Zeilenschaltung. Einzelne Zeilenschaltungen werden als solche beibehalten.
Lizensiert für Markus Mueller
temp.mytext1 = COA temp.mytext1 { 10 = TEXT 10 { field = meintextfeld doubleBrTag = ###ABSATZ### parseFunc < lib.parseFunc } stdWrap { split { token = ###ABSATZ### cObjNum = 1 1.current = 1 1.br = 1 1.wrap =
|
} } }
Zunächst wird hier jede doppelte Zeilenschaltung mithilfe von doubleBrTag durch einen Platzhalter namens ###ABSATZ### ersetzt. Danach wird dieser als Trenn-String für die Funktion split verwendet. So erhalten Sie separate kleine Abschnitte, die wiederum mithilfe von br=1 die weichen Zeilenschaltungen zugewiesen bekommen und danach in p-Tags verpackt werden. Wahlweise können Sie auch folgenden Code verwenden: 1.current = 1 1.brTag =
1.wrap =
|
Max. Linie
intval Mit diesem Schalter stellen Sie sicher, dass bei Zahlenwerten eventuell vorhandene Nachkommastellen abgeschnitten werden: 10.4 Daten verarbeiten und formatieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 377
Max. Linie
temp.meineGanzeZahl = TEXT temp.meineGanzeZahl { value = 1234.567 intval = 1 }
Links
Ergebnis: 1234
keywords Mit diesem Schalter können Sie eine kommaseparierte Liste von Keywords erzeugen. Der ursprünglich übergebene Text wird nach Kommata, Semikola oder Zeilenschaltungen durchsucht. Diese werden als Trenn-String benutzt. Die so erhaltenen Werte werden mithilfe der PHP-Funktion trim von eventuellen Leerzeichen an Anfang und Ende des Strings befreit und danach in die kommaseparierte Liste eingefügt. Diese Funktion lässt sich daher auf sämtliche Varianten von Listenfeldern anwenden und sorgt dafür, dass der ausgegebene String in jedem Fall mit Kommata als Trennzeichen arbeitet.
Lizensiert für Markus Mueller
temp.meineKeywords = TEXT temp.meineKeywords { field = meinlistenfeld keywords = 1 }
prioriCalc Diese Funktion dient dem Berechnen von einfachen Termen. Sie kennt die üblichen Operatoren +-*/%^ und berücksichtigt dabei sowohl Punkt- vor Strichrechnung als auch Klammern. Wenn Sie prioriCalc auf 1 setzen, erhalten Sie einen Double-Wert zurück. Verwenden Sie statt der 1 den String intval, werden Nachkommastellen abgeschnitten. Vorsicht! Unzulässige Berechnungen wie z.B. eine Division durch 0 ergeben keine Fehlermeldung und führen gegebenenfalls zu unerwarteten Ergebnissen. Verwenden Sie daher immer eine zulässige Syntax, auch um sicherzustellen, dass diese Funktion mit möglichen zukünftigen Erweiterungen einwandfrei funktioniert.
Der Term, den Sie mithilfe von prioriCalc berechnen möchten, kann selbstverständlich aus dynamischen Werten zusammengesetzt werden. So können Sie z.B. die Werte verschiedener Felder oder Konstanten zur Berechnung mit prioriCalc heranziehen.
Max. Linie
temp.meinSchalter = CASE temp.meinSchalter { key.cObject = TEXT key.cObject.dataWrap = {field:layout}*{$layoutAktiviert} key.prioriCalc = 1 default = TEXT default.value = Layout wurde deaktiviert oder nicht gewählt.
378 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
1 = TEXT 1.value = Layout wurde aktiviert und Layout 1 ist gewählt. 2 = TEXT 2.value = Layout wurde aktiviert und Layout 2 ist gewählt. 3 = TEXT 3.value = Layout wurde aktiviert und Layout 3 ist gewählt. }
Anstatt der hier verwendeten Blindtexte können Sie beispielsweise verschiedene CSSKlassen für einen div-Container zuweisen, die aber nur berücksichtigt werden, wenn die Konstante layoutAktiviert auf 1 gesetzt wurde.
removeBadHTML Wenn Sie diesen Schalter auf 1 setzen, wird der Text auf möglicherweise gefährlichen HTML-Code hin untersucht. Dieser Code, der z.B. von einem Angreifer für XSS-Attacken genutzt werden könnte, wird automatisch entfernt und der bereinigte Text zurückgeliefert. Aus nahe liegenden Gründen werden wir hier keinerlei Beispiele für solche XSS-Attacken aufführen. Für interessierte Leser gibt es im Internet sicherlich genügend Informationsmaterial zu diesem Thema. Lizensiert für Markus Mueller
split Mithilfe dieser Funktion können Sie ähnlich der PHP-Funktion explode einen Text nach einem bestimmten Trenn-String durchsuchen. Das Ergebnis ist eine Reihe einzelner Textabschnitte, für die Sie separat festlegen können, wie sie verarbeitet werden sollen. Bei einem Vorkommen von x Trenn-Strings erhalten Sie auf diese Weise x + 1 Teilbereiche. Die Zuweisung des Trenn-Strings erfolgt über den Parameter token. Dieser verfügt seinerseits über stdWrap-Eigenschaften, sodass Sie für die Bestimmung des Trenn-Strings sowohl die ebenfalls in diesem Rezept beschriebene Funktion char verwenden können als auch ein Konstrukt aus einem eigenen cObject. temp.meineSplitFunktion = TEXT temp.meineSplitFunktion { field = bodytext split { token.char = 10 } }
Hier wird eine Zeilenschaltung als Trenn-String verwendet, um jede Zeile separat zu formatieren. Die einfachste Ausgabe arbeitet dabei mit genau einem sogenannten cObj und der dazugehörigen cObjNum. Der aktuelle Wert des cObj wird dabei mithilfe von current übergeben:
Max. Linie
Max. Linie
temp.meineSplitFunktion = TEXT temp.meineSplitFunktion { field = bodytext
10.4 Daten verarbeiten und formatieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 379
split { token.char = 10 cObjNum = 1 1.current = 1 1.wrap =
|
}
Links
}
oder temp.meineSplitFunktion = TEXT temp.meineSplitFunktion { field = bodytext split { token.char = 10 cObjNum = 1 1 { 10 = TEXT 10.current = 1 10.wrap =
|
} } }
Lizensiert für Markus Mueller
Max. Linie
Die letzte Schreibweise bietet sich immer dann an, wenn Sie weitere Inhalte vor oder nach dem aktuellen Wert hinzufügen wollen, die sich nicht mit einem einfachen Wrap darstellen lassen. Für jede weitere Möglichkeit fügen Sie einfach ein weiteres cObj und die dazugehörige cObjNum hinzu. cObjNum nutzt dabei das optionSplit-Prinzip, das wir in Rezept 12.4 einge-
hend erläutern. Damit werden beim Durchlaufen der einzelnen Teilbereiche bestimmte Formatierungen in einer genau vorgegebenen Reihenfolge abgearbeitet. Im folgenden Beispiel werden vier Formatierungen verwendet, von denen die erste nur dem ersten und die vierte nur dem letzten Teilbereich zugewiesen wird, während die zweite und dritte abwechselnd für die dazwischen liegenden Teilbereiche verwendet werden. temp.meineSplitFunktion = TEXT temp.meineSplitFunktion { field = bodytext split { token.char = 10 cObjNum = 1|*|2||3|*|4 1.current = 1 1.wrap = | 2.current = 1 2.wrap = | 3.current = 1 3.wrap = | 4.current = 1 4.wrap = | } }
380 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
In Rezept 13.6 zeigen wir Ihnen, wie Sie diese äußerst nützliche Funktion für die positionsabhängige Formatierung von Inhaltselementen verwenden können.
strftime Diese Funktion dient, ähnlich wie die Funktion date weiter oben in diesem Rezept, der Formatierung von Zeit- und Datumsangaben. Sie wird vor allem in Verbindung mit Sprach- und länderspezifischen Einstellungen im Zusammenhang mit config.locale_all verwendet, um sicherzustellen, dass die Formatierung in der landesüblichen Art und Weise stattfindet. Mit dem optionalen Parameter charset können Sie eine Konvertierung vornehmen, um das gleiche Characterset zu erzwingen, das sie über config.renderCharset vorgegeben haben. Falls Sie dies nicht explizit angegeben haben, wird entweder der Wert aus TYPO3_CONF_VARS[BE][forceCharset] verwendet oder, falls dieser ebenfalls nicht gesetzt wurde, der Default-Wert ISO-8859-1.
Lizensiert für Markus Mueller
In der Regel ist dies jedoch nicht nötig, weil das passende Characterset über t3lib_cs automatisch ermittelt wird. config.locale_all = de_DE@euro temp.meineDatumsFormatierung = TEXT temp.meineDatumsFormatierung { field = tstamp strftime = %e:%m%y } [globalVar = GP:L=1] config.locale_all = en_IE@euro temp.meineDatumsFormatierung { strftime = %m:%e:%y } [global]
In diesem Beispiel wird die in Deutschland übliche Schreibweise DD:MM:YY in Verbindung mit dem passenden locale als Default gesetzt. Für den Fall, dass der Benutzer über den Sprachauswahlparameter L die Sprache 1 ausgewählt hat, wird das locale auf Englisch umgeschaltet und die Datumsformatierung in MM:DD:YY geändert.
stripHtml Wenn Sie diesen Schalter auf 1 setzen, werden mithilfe der PHP-Funktion strip_tags sämtliche Tags aus einem Text entfernt. Wenn Sie dennoch Tags ausgeben wollen, um z.B. ein Codebeispiel zu zeigen, müssen Sie die Tags als HTML-Entities encodieren.
Max. Linie
temp.meinBereinigterText = TEXT temp.meinBereinigterText {
10.4 Daten verarbeiten und formatieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 381
value = <em>Ein paar Tags werden entfernt, ein paar andere <em> nicht stripHtml = 1
Links
}
Das Ergebnis dieses Codes wäre der folgende Text ohne umschließende em-Tags: Ein paar Tags werden entfernt, ein paar andere <em>nicht
substring Mithilfe dieses TypoScript-Parameters können Sie zwei durch ein Komma getrennte Positionswerte als zweiten und dritten Parameter an die PHP-Funktion substr übergeben. Der zu durchsuchende String und damit der erste übergebene Parameter ist dabei immer der Inhalt des aufrufenden Elements. Der zweite Parameter bestimmt die Startposition. Positive Werte starten vom Anfang des Texts, negative von dessen Ende. Der dritte Parameter ist optional. Er bestimmt die maximale Länge des verbleibenden Texts. temp.meinTeilText = TEXT temp.meinTeilText { value = Schneiden wir mal was vom Text ab substring = 10 } Lizensiert für Markus Mueller
Ergebnis: wir mal was vom Text ab temp.meinTeilText = TEXT temp.meinTeilText { value = Schneiden wir mal was vom Text ab substring = 10,7 }
Ergebnis: wir mal temp.meinTeilText = TEXT temp.meinTeilText { value = Schneiden wir mal was vom Text ab substring = -11 }
Ergebnis: Schneiden wir mal was Weitere Möglichkeiten der Funktion substr entnehmen Sie bitte dem PHP-Manual.
trim Dieser Schalter ist identisch mit der gleichnamigen PHP-Funktion. Er dient dazu, sogenannten Whitespace, also Zeilenschaltungen oder Leerzeichen, die sich am Anfang oder am Ende eines Strings befinden könnten, zu entfernen.
Max. Linie
temp.meinTrimtest = TEXT temp.meinTrimtest { field = bodytext trim = 1 }
382 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Mit diesem Code können Sie z.B. überschüssige Zeilenschaltungen aus dem Feld bodytext entfernen, die sonst zu unschönen Lücken im Layout führen würden.
10.5 HTML und Text parsen Problem Sie wollen die umfangreichen Textverarbeitungsfunktionen von TYPO3 nutzen, um damit die Art und Weise zu beeinflussen, in der Texte für die Ausgabe aufbereitet werden.
Lösung Verwenden Sie den Original-TypoScript-Code von CSS-styled-content und machen Sie sich anhand von lib.parseFunc sowie lib.parseFunc_RTE mit der Arbeitsweise der ParserFunktionen von TypoScript vertraut.
Lizensiert für Markus Mueller
lib.parseFunc { makelinks = 1 makelinks { http.keep = {$styles.content.links.keep} http.extTarget = {$styles.content.links.extTarget} mailto.keep = path } tags { link = TEXT link { current = 1 typolink { parameter.data = parameters : allParams extTarget = {$styles.content.links.extTarget} target = {$styles.content.links.target} } parseFunc.constants =1 } } allowTags = {$styles.content.links.allowTags} denyTags = * sword = <span >| constants = 1 nonTypoTagStdWrap.HTMLparser = 1 nonTypoTagStdWrap.HTMLparser { keepNonMatchedTags = 1 htmlSpecialChars = 2 } }
Max. Linie
lib.parseFunc_RTE < lib.parseFunc lib.parseFunc_RTE { externalBlocks = table, blockquote, ol,ul
10.5 HTML und Text parsen | 383 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Lizensiert für Markus Mueller
externalBlocks { blockquote { stripNL=1 callRecursive=1 callRecursive.tagStdWrap.HTMLparser = 1 callRecursive.tagStdWrap.HTMLparser { tags.blockquote.overrideAttribs = style="margin-bottom:0;margin-top:0;" } } ol.stripNL=1 ol.stdWrap.parseFunc = < lib.parseFunc ul.stripNL=1 ul.stdWrap.parseFunc = < lib.parseFunc table.stripNL=1 table.stdWrap.HTMLparser = 1 table.stdWrap.HTMLparser { tags.table.fixAttrib.class { default = contenttable always = 1 list = contenttable } keepNonMatchedTags = 1 } table.HTMLtableCells=1 table.HTMLtableCells { default.callRecursive=1 addChr10BetweenParagraphs=1 } } nonTypoTagStdWrap.encapsLines { encapsTagList = div,p,pre,h1,h2,h3,h4,h5,h6 remapTag.DIV = P nonWrappedTag = P innerStdWrap_all.ifBlank = addAttributes.P.class = bodytext addAttributes.P.class.setOnly=blank } nonTypoTagStdWrap.HTMLparser = 1 nonTypoTagStdWrap.HTMLparser { keepNonMatchedTags = 1 htmlSpecialChars = 2 }
Links
}
Diskussion
Max. Linie
TYPO3 bietet Ihnen im Rahmen der stdWrap-Funktion parseFunc einen umfangreichen Werkzeugkasten für die Verarbeitung und Aufbereitung von Texten aller Art. Die Variationsmöglichkeiten sind so vielfältig, dass man damit ein eigenes Buch füllen könnte, daher haben wir uns entschieden, Ihnen am Beispiel der Vorgaben von CSS-styled-content zu erläutern, wie die grundlegenden Funktionen der Textverarbeitung von TYPO3 angewandt werden.
384 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Innerhalb von CSS-styled-content werden dazu zunächst zwei Hauptbereiche definiert, die später durch eine Referenz oder Kopie für die jeweilige parseFunc zur Verfügung gestellt werden. Diese Hauptbereiche finden Sie unter lib.parseFunc sowie lib.parseFunc_RTE. Letzteres basiert auf einer Kopie von lib.parseFunc und erweitert das Setup um weitere komfortable Features für die Verarbeitung von Inhalten aus dem Rich Text Editor RTE. Um diese beiden vordefinierten Bereiche zu verwenden, kopieren Sie sie einfach in den parseFunc-Parameter des jeweiligen Elements. Für normale Textfelder reicht lib.parseFunc aus: meineTextverarbeitung = TEXT meineTextverarbeitung { field = abstract parseFunc < lib.parseFunc }
Für Textfelder, die einen RTE benutzen, sollten Sie lib.parseFunc_RTE verwenden: meineTextverarbeitung = TEXT meineTextverarbeitung { field = bodytext parseFunc < lib.parseFunc_RTE } Lizensiert für Markus Mueller
Doch was geschieht nun innerhalb dieser Funktionen? Beginnen wir dazu mit dem einfacheren Setup von lib.parseFunc. Der dort verwendete Code gliedert sich in vier Hauptbereiche: • makelinks • tags • nonTypoTagStdWrap • weitere Parameter für grundlegende Konfigurationen
lib.parseFunc makelinks Damit wird der Text nach Vorkommen von http:// oder mailto: durchsucht, um daraus echte Link-Tags zu erzeugen. Dazu müssen Sie makelinks zunächst mit makelinks=1 aktivieren. Danach können Sie mithilfe entsprechender Unterparameter bestimmen, wie mit Links zu Webseiten oder E-Mail-Adressen verfahren werden soll.
Max. Linie
Im gezeigten Beispiel wird mit http.keep dafür gesorgt, dass Links zu Webseiten in einer bestimmten Art und Weise formatiert werden. Dieser Parameter wird über eine Konstante befüllt und enthält per Default die Einstellung path. Damit wird sichergestellt, dass nicht nur die Domains, sondern auch ein eventuell vorhandener Pfad in den Link eingebaut werden, während sonstige Link-Parameter entfernt werden. Mit einer weiteren
10.5 HTML und Text parsen | 385 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Konstanten können Sie im Bereich http.extTarget festlegen, in welchem Zielfenster der Link geöffnet werden soll. Für den Parameter mailto wird ebenfalls mithilfe von keep = path ein eventuell vorhandener Pfad beibehalten. Ein Target gibt es hierfür nicht.
Links
tags In diesem Bereich legen Sie fest, wie mit eigenen Tags, den sogenannten Typotags, verfahren wird. Per Default ist hier lediglich das Typotag vordefiniert, Sie können jedoch nach dessen Vorbild beliebig viele eigene Typotags definieren, um den Redakteuren weitere nützliche Formatierungsmöglichkeiten an die Hand zu geben. Weil diese Typotags frei definierbar sind, können Sie dafür sprechende Namen verwenden, die einprägsamer sind als reine HTML-Tags und die hinterlegte Funktionalität klar und deutlich beschreiben. So könnten Sie z.B. mit einem Tag arbeiten anstatt mit dem HTML-Pendant . Im Codebeispiel wird dem Typotag ein TEXT-Element zugewiesen, das per current = 1 den aktuellen Inhalt zwischen den link-Tags erhält. Danach wird mithilfe der stdwrap-Funktion typolink automatisch ein Link aus diesem Inhalt erzeugt. Sollten Sie innerhalb der link-Tags weitere Parameter angegeben haben: 123 _blank roterLink Lizensiert für Markus Mueller
werden diese mit berücksichtigt, indem Sie mithilfe der stdWrap-Funktion data das Parameterregister allParams an typolink übergeben. Lesen Sie hierzu auch Rezept 10.7, das sich ausführlich mit typolink beschäftigt.
Die Sprungziele für externe sowie interne Links werden mithilfe von Konstanten definiert, und abschließend wird per parseFunc.constants = 1 dafür gesorgt, dass eventuell verwendete Marker im Originaltext vor der Verarbeitung mit typolink durch die entsprechenden Top-Level-Konstanten ersetzt werden. Diese müssen Sie vorher explizit definiert haben. constants { LINKTARGET = _top LINKCLASS = redlinks }
Damit würde beispielsweise ein link-Tag mit dieser Schreibweise: 123 ###LINKTARGET### ###LINKCLASS###
automatisch zu folgendem HTML-Code umgebaut: Titel von Seite 123
Max. Linie
nonTypoTagStdWrap Dieser Bereich legt die Formatierung für jeglichen Text außerhalb der eben beschriebenen Typotags fest. Inhalte, die sich innerhalb eines Typotags befinden, bleiben davon
386 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
unberührt. In diesem Fall werden nur ein paar grundlegende Formatierungen vorgenommen, indem die stdWrap-Funktion HTMLparser aktiviert und mit zwei Unterparametern versehen wird. Die Aufgabe von HTMLparser besteht vor allem in der Bereinigung von Texten, die bereits HTML-Code enthalten könnten, um zu verhindern, dass dieser HTML-Code das vorgesehene Layout zerstört. Der Schalter keepNonMatchedTags = 1 sorgt dafür, dass sämtliche HTML-Tags im Text erhalten bleiben, auch wenn dafür keine explizite Verarbeitung im Parser vorgesehen ist. Wenn Sie diesen Schalter nicht setzen, werden sämtliche nicht näher spezifizierten HTML-Tags entfernt. Mithilfe des zweiten Schalters htmlSpecialChars = 2 werden Sonderzeichen durch HTML-Entities ersetzt. Dieser Schalter kennt vier Zustände: –1, 0, 1 und 2. Der Zustand 1 ersetzt sämtliche Sonderzeichen außerhalb von HTML-Tags, Zustand 2 tut dasselbe, lässt dabei aber bereits vorhandene Entities wie z.B. & unberührt, Zustand –1 konvertiert Entities zurück in Sonderzeichen, und Zustand 0 schaltet die Verarbeitung von Sonderzeichen ab.
Lizensiert für Markus Mueller
Weitere Parameter Der Parameter allowTags, der in diesem Fall mithilfe einer Konstanten befüllt wird, legt fest, welche HTML-Tags innerhalb der parseFunc als akzeptabel betrachtet werden. Mit denyTags legen Sie wiederum fest, welche Tags definitiv nicht erlaubt sein sollen. Üblicherweise werden über denyTags = * zunächst alle HTML-Tags ausgeschlossen, um danach mit allowTags eine Liste der zulässigen HTML-Tags zu definieren. Der spezielle Parameter sword dient als Wrap, um innerhalb von Suchergebnissen eine Hervorhebung der gesuchten Wörter zu ermöglichen. Im gezeigten Beispiel wird jedes gesuchte Wort in ein span-Tag verpackt, dem eine spezielle CSS-Klasse zugewiesen wird. Auch innerhalb der allgemeinen parseFunc wird mithilfe des Schalters constants = 1 eine Ersetzung von Markern durch vordefinierte Top-Level-Konstanten veranlasst. Ein Beispiel dazu finden Sie weiter vorn im Bereich tags. Die grundlegende Definition von lib.parseFunc ist damit abgeschlossen.
lib.parseFunc_RTE Mithilfe einer Kopie von lib.parseFunc wird dafür gesorgt, dass deren grundlegende Funktionalität auch für lib.parseFunc_RTE genutzt wird. Jedoch werden hier zwei weitere Hauptbereiche hinzugefügt: • externalBlocks • nonTypoTagStdWrap.encapsLines
Max. Linie
Mithilfe dieser Bereiche wird die Ausgabe korrekt formatierter Inhalte aus dem RTE ermöglicht, die in der Regel nicht nur reine Textblöcke, sondern auch Listen, Tabellen und andere HTML-Tags enthalten kann, die einen eigenen Block in der Ausgabe definieren.
10.5 HTML und Text parsen | 387 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
externalBlocks Mit diesem Parameter definieren Sie zunächst eine Liste von HTML-Tags, die unabhängig vom restlichen Text eine eigene Formatierung erhalten sollen. Im Beispiel sind dies die Tags table, blockquote, ol und ul. Für jeden der aufgelisteten externalBlocks müssen Sie nun einen eigenen Unterparameter erzeugen, der weitere individuelle Formatierungsangaben enthält.
Links
Für das HTML-Tag blockquote werden zunächst mithilfe von stripNL = 1 die Zeilenschaltungen vor und nach dem Block entfernt, um unnötige Lücken im HTML-Code zu vermeiden. Danach wird über den Schalter callRecursive = 1 dafür gesorgt, dass der gesamte Inhalt von blockquote inklusive der umschließenden blockquote-Tags abermals durch die parseFunc geschickt wird. Dabei sorgt der Unterparameter tagStdWrap dafür, dass die blockquote-Tags selbst eine individuelle Verarbeitung erfahren. In diesem Fall wird mit HTMLparser und dessen Funktion overrideAttrib dafür gesorgt, dass jedes blockquote-Tag unabhängig von seinen bisherigen Attributen mit einer style-Angabe versehen wird. Für die HTML-Tags ol und ul wird keine besondere Verarbeitung benötigt. Sie bleiben als solche erhalten, wobei lediglich die umgebenden Zeilenschaltungen mit stripNL = 1 entfernt werden und der Inhalt seinerseits mit lib.parseFunc verarbeitet wird. Lizensiert für Markus Mueller
Es folgt das Setup zur Verarbeitung von table-Tags. Auch hier werden zunächst umgebende Zeilenschaltungen entfernt. Danach wird der Inhalt der Tabelle mithilfe des HTMLparser verarbeitet. Durch die Funktion fixAttrib wird dem table-Tag selbst eine CSSKlasse zugewiesen. Der Schalter always = 1 sorgt dafür, dass dies auch geschieht, wenn das ursprüngliche table-Tag keinerlei CSS-Klasse verwendet. Mit dem Parameter list legen Sie dabei fest, welche Attribute erlaubt sind. Sollte wider Erwarten ein unzulässiges Attribut verwendet werden, wird es durch das erste Attribut in dieser Liste ersetzt. Nicht näher spezifizierte Tags werden wie schon bei der Hauptfunktion erläutert beibehalten, indem der Schalter keepNonMatchedTags = 1 gesetzt wird. Nachdem die Tabelle selbst nun formatiert ist, wird mithilfe des Parameters HTMLtableCells dafür gesorgt, dass der Inhalt jeder einzelnen Tabellenzelle separat formatiert werden kann. In diesem Fall wird über default.callRecursive = 1 der Inhalt jeder Zelle nochmals durch die Hauptfunktion lib.parseFunc_RTE geschickt. Somit ist sichergestellt, dass der Inhalt einer Tabellenzelle genau so formatiert wird wie der restliche Inhalt außerhalb von Tabellen. Auch verschachtelte Tabellen können auf diese Weise verarbeitet werden. Zusätzlich wird über den Schalter addChr10BetweenParagraphs = 1 dafür gesorgt, dass einzelne Textblöcke, die durch p-Tags gekennzeichnet sind, mit einer Zeilenschaltung getrennt werden.
Max. Linie
nonTypoTagStdWrap.encapsLines In diesem Abschnitt wird die Vorgehensweise bei der Verarbeitung einzelner Zeilen festgelegt. Zunächst wird mithilfe von encapsTagList festgestellt, welche HTML-Tags als korrekte Block-Elemente betrachtet werden. In diesem Fall sind es die Elemente div, p, pre und h1 388 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
bis h6. Inhalte, die sich innerhalb dieser Tags befinden, bleiben daher zunächst unberührt. Alle anderen Inhalte werden als unverpackte Zeilen betrachtet und daher über den Parameter nonWrappedTag mit einem HTML-Tag als Wrap versehen. Hier ist es das p-Tag. In der Ausgabe wird also jede einzelne Zeile, die nicht bereits in eines der aufgelisteten Tags verpackt ist, mit einem p-Tag verpackt. Mithilfe des Parameters remapTag wird dafür gesorgt, dass auch die Zeilen, die bereits in div-Tags verpackt sind, stattdessen in p-Tags verpackt werden. Die Funktion innerstdWrap_all.ifBlank ersetzt hier einzelne Leerzeilen mit – und abschließend sorgt addAttributes dafür, dass für sämtliche p-Tags die CSS-Klasse bodytext verwendet wird. Der Schalter setOnly = blank schränkt diese Funktion dahingehend ein, dass nur dann eine Klasse vergeben wird, wenn keinerlei Klasse existiert oder das verwendete Klassenattribut keinen Wert hat.
Lizensiert für Markus Mueller
Wie Sie sehen, ist selbst das verhältnismäßig kurze Setup der Default-Funktionen von CSS-styled-content äußerst komplex in der Anwendung. Dies macht aber gleichzeitig auch die Flexibilität und Effizienz der parseFunc aus. Bei korrekter Anwendung und Erweiterung der verschiedenen Teilbereiche sind Sie damit in der Lage, selbst Inhalte mit proprietärer HTML-Formatierung, wie sie beispielsweise durch das MS-Office-Paket bereitgestellt werden, so umzugestalten, dass diese sich einwandfrei in das vorgesehene HTML-Layout einfügen.
10.6 Inhalte verpacken Problem Wenn Sie die Rezepte 10.1, 10.2, 10.3 und 10.4 gelesen haben, wissen Sie bereits, wie man mit stdWrap Inhalte erzeugen und beeinflussen kann. Nun wollen Sie diese Inhalte für die Ausgabe aufbereiten und mit HTML-Tags oder zusätzlichen Elementen und Abstandhaltern verpacken.
Lösung Nutzen Sie Wraps und weitere Funktionen aus dem stdWrap-Baukasten. (Wenn Sie noch nicht wissen, wie ein Wrap prinzipiell funktioniert, lesen Sie Rezept 8.10.) append, postCObject Hängen TypoScript-Inhaltselemente an den bisherigen Inhalt an. innerWrap, innerWrap2, outerWrap Erzeugen komplexe Wraps mit stdWrap-Funktionalität.
Max. Linie
noTrimWrap Lässt beim Wrap sogenannten Whitespace, z.B. Leerzeichen, zu.
10.6 Inhalte verpacken This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 389
prepend, preCObject Stellen TypoScript-Inhaltselemente vor den bisherigen Inhalt.
Links
space, spaceAfter, spaceBefore Fügen Abstandhalter vor oder nach dem Inhalt ein. wrap, wrap2, wrap3 Erzeugen einfache Wraps ohne weitere Funktionalität.
Diskussion append, postCObject Diese Funktionen bieten zwar keinen wirklich vollständigen Wrap, jedoch ist das Ergebnis vergleichbar mit einer der komplexen Wrap-Funktionen – sie erzeugen damit ein TypoScript-Element, das an den eigentlichen Inhalt angehängt wird. Dabei können Sie auf die gesamte Palette der cObjects zugreifen und nicht nur einzelne Texte oder HTML-Tags, sondern z.B. auch einen kompletten COA-Setzkasten oder ein HMENU verwenden. Weil dieses Ergebnis quasi einem halben Wrap entspricht, haben wir die Funktionen diesem Kapitel zugeordnet. Lizensiert für Markus Mueller
Max. Linie
Beide Funktionen kommen zum Beispiel in Verbindung mit einem HMENU zum Einsatz, wenn es darum geht, neben einem dynamischen Teil auch einen statisch verlinkten Teilbereich zu erzeugen. Im dynamischen Teil befinden sich in unserem Beispiel immer die Unterseiten der aktuellen Seite, während der statische Teil Links auf die Seiten Kontakt, Impressum und AGB mit den UIDs 123, 456 und 789 liefert. temp.meinMenu = HMENU temp.meinMenu { stdWrap.outerWrap = | entryLevel = -1 1 = TMENU 1 { wrap =
NO { allWrap =
| } } stdWrap.append = HMENU stdWrap.append { special = list special.value = 123,456,789 1 = TMENU 1 { wrap =
NO { allWrap =
| } } } }
390 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Sie werden diese Funktionen nur äußerst selten benötigen, wenn Sie unseren Tipp beherzigen und, wo immer es möglich ist, mit einem COA-Setzkasten arbeiten. Neben der besseren Übersicht hätte ein COA den Vorteil, dass Sie ohne weiteren Aufwand auch mehrere zusätzliche Elemente vor und nach den bisherigen anlegen könnten.
Das Pendant zu append und postCObject sind die Funktionen prepend und preCObject, die wir weiter hinten in diesem Kapitel erläutern.
innerWrap, innerWrap2, outerWrap Wie auch für die Funktionen wrap, wrap2 und wrap3 besteht der Unterschied zwischen diesen Funktionen in der Reihenfolge des Funktionsaufrufs. Unabhängig davon, in welcher Reihenfolge Sie die Funktionen in Ihrem TS-Setup eingetragen haben, wird immer erst innerWrap, dann innerWrap2 und zum Schluss outerWrap aufgerufen. Lesen Sie dazu auch Rezept 10.9, das sich mit der Hierarchie von stdWrap-Funktionen befasst.
Lizensiert für Markus Mueller
Bei diesen drei Wrap-Funktionen haben Sie jedoch weitergehende Möglichkeiten, weil sie ihrerseits über stdWrap-Funktionen verfügen. Das bedeutet, dass Sie z.B. mithilfe von Abfragen sicherstellen können, dass ein Wrap nur dann angewendet wird, wenn bestimmte Bedingungen zutreffen. Lesen Sie hierzu Rezept 10.3. In folgendem Beispiel werden zwei verschiedene Wraps verwendet, je nachdem, ob der URL-Parameter print gesetzt ist. temp.meinDynamischerWrap = TEXT temp.meinDynamischerWrap { value = Das ist der Inhalt. innerWrap = | innerWrap.if.isFalse.data = GPvar:print innerWrap2 = | innerWrap2.if.isTrue.data = GPvar:print }
Auch die Konstruktion eines Strings, der als Wrap verwendet werden soll, ist möglich. So können Sie z.B. mithilfe eines COA-Setzkastens den gesamten Wrap dynamisch erzeugen. Hier nutzen wir ein COA, um einem div-Tag eine Klasse zuzuweisen, die sich auf den Wert des Felds text_align bezieht. Beachten Sie dabei, dass der eigentliche TrennString immer als value übergeben werden muss, damit er später von der Wrap-Funktion genutzt werden kann.
Max. Linie
temp.meinDynamischerWrap = TEXT temp.meinDynamischerWrap { value = Das ist der Inhalt. outerWrap.cObject = COA outerWrap.cObject { 10 = TEXT 10.field = text_align 10.wrap =
10.6 Inhalte verpacken This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 391
20 = TEXT 20.value = |
Links
} }
Das Ergebnis des COA wäre in diesem Fall z.B.: |
noTrimWrap Wie in der Beschreibung von wrap, wrap2 und wrap3 sowie in Rezept 8.10 erwähnt, werden bei den verwendeten Strings üblicherweise Leerzeichen und sonstiger sogenannter Whitespace am Anfang und Ende entfernt. Wenn Sie dennoch ein Leerzeichen als erstes oder letztes Zeichen des String verwenden wollten, müssten Sie daher immer mit arbeiten. Dies ist jedoch nicht immer sinnvoll, weil dadurch unnötiger HTMLCode produziert wird, der sich teilweise in unerwünschter Form auf das Layout der Seite auswirkt.
Lizensiert für Markus Mueller
Daher gibt es eine spezielle Wrap-Funktion, die auf das Trimming der Strings verzichtet. Ihr Name ist dementsprechend noTrimWrap. Die Syntax weicht hier von der üblichen Syntax für Wrap-Funktionen ab, weil Sie insgesamt drei |-Symbole verteilen müssen. Zuerst müssen Sie den Beginn des Strings mit einem |-Symbol markieren. Danach folgt der eigentliche Wrap mit Leerzeichen, Whitespace und einem weiteren |-Symbol als Trennzeichen. Die Schlussmarkierung bildet wiederum ein |-Symbol. temp.meinSpezialWrap = TEXT temp.meinSpezialWrap { value = das ist der Inhalt. noTrimWrap = | Das ist der Wrap und | Das ist wieder der Wrap. | }
Das Ergebnis dieses Beispiels lautet: Das ist der Wrap und das ist der Inhalt. Das ist wieder der Wrap.
Beachten Sie, dass Sie das Trennzeichen in diesem Fall nicht selbst bestimmen und stdWrap-Funktionen nicht für die Erzeugung genutzt werden können.
prepend, preCObject Diese Funktionen bieten ebenso wie append und postCObject keinen wirklich vollständigen Wrap, jedoch ist das Ergebnis vergleichbar mit einer der komplexen Wrap-Funktionen – sie erzeugen damit ein TypoScript-Element, das dem eigentlichen Inhalt vorangestellt wird. Dabei können Sie sämtliche cObjects nutzen und nicht nur Texte oder einzelne HTMLTags, sondern z.B. auch einen COA-Setzkasten oder ein ganzes HMENU verwenden. Weil dieses Ergebnis identisch mit einem halben Wrap ist, befinden sich die Funktionen in diesem Kapitel.
Max. Linie
Wie schon im Beispiel für append und postCObject gezeigt, können Sie die Funktionen in Verbindung mit einem HMENU nutzen, wenn es darum geht, neben einem dynamischen
392 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Teil auch eine Überschrift zu erzeugen. Im dynamischen Teil befinden sich in unserem Beispiel immer die Unterseiten der aktuellen Seite, während die Überschrift deren Titel liefert. temp.meinMenu = HMENU temp.meinMenu { stdWrap.outerWrap = | entryLevel = -1 1 = TMENU 1 { wrap =
NO { allWrap =
| } } stdWrap.prepend = TEXT stdWrap.prepend { field = title wrap = | } }
Lizensiert für Markus Mueller
Sie werden diese Funktionen nur äußerst selten benötigen, wenn Sie unseren Tipp beherzigen und, wo immer es möglich ist, mit einem COA-Setzkasten arbeiten. Neben der besseren Übersicht hätte ein COA den Vorteil, dass Sie ohne weiteren Aufwand auch mehrere zusätzliche Elemente vor und nach den bisherigen anlegen könnten.
Das Pendant zu prepend und preCObject stellen die Funktionen append und postCObject dar, die wir weiter vorne in diesem Kapitel behandeln.
space, spaceBefore, spaceAfter Mithilfe dieser Funktionen können Sie zwischen einzelnen Elementen Abstandhalter erzeugen. Dabei liefert space sowohl einen Abstand vor dem Inhalt als auch einen danach, wohingegen die beiden anderen Funktionen den Abstand entweder nur davor oder nur danach platzieren. Sie sollten dazu immer den Unterparameter useDiv = 1 setzen, weil der Abstand ansonsten mit einem clear.gif erzeugt wird. Jedoch ist auch diese Vorgehensweise nicht wirklich sinnvoll, weil Sie weiterhin ein separates Element erzeugen anstatt den Inhalten gemäß den CSS-Spezifikationen mit der Eigenschaft margin die passenden Abstände zuzuweisen. Wir raten daher von der Verwendung dieser Funktionen ab und zeigen Ihnen im folgenden Beispiel, wie Sie mithilfe von innerWrap eine wesentlich elegantere Lösung konstruieren können. Hierbei greifen Sie auf die Felder spaceBefore und spaceAfter zu und verwenden deren Werte direkt innerhalb eines Inline-Styles.
Max. Linie
Max. Linie
temp.meinAbstandshalter = TEXT temp.meinAbstandshalter {
10.6 Inhalte verpacken This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 393
value = Das ist der Inhalt. innerWrap.cObject = COA innerWrap.cObject { 10 = TEXT 10 { dataWrap = } 20 = TEXT 20.value = | } }
Links
}
Lesen Sie Rezept 10.2, um mehr über dataWrap zu erfahren.
wrap, wrap2, wrap3 Diese drei Funktionen stellen die einfachste Form eines Wrap dar. Wie in Rezept 8.10 beschrieben, verpacken sie den Inhalt mit bis zu zwei Strings, von denen einer vor und der andere nach dem Inhalt platziert wird. Als Platzhalter für den Inhalt dient ein |-Symbol.
Lizensiert für Markus Mueller
temp.meineVerpackung = TEXT temp.meineVerpackung { value = Das ist der Inhalt. wrap = | }
Sie müssen dabei nicht immer beide Strings nutzen, und bei Bedarf können Sie mithilfe des Unterparameters splitChar auch ein anderes Trennzeichen verwenden. In unserem Beispiel wird für wrap3 das Doppelkreuz als Trennzeichen verwendet, sodass die beiden |-Symbole nicht ersetzt werden und demzufolge in der Ausgabe erscheinen. Dies ist z.B. dann sehr nützlich, wenn Sie Textelemente auf Ihrer Seite mit senkrechten Strichen optisch voneinander trennen wollen. Als String können Sie nicht nur HTML-Tags verwenden, sondern beliebige Zeichenfolgen. temp.meineVerpackung = TEXT temp.meineVerpackung { value = Das ist der Inhalt. wrap = Container davor | wrap2 = | Container danach wrap3 = | # | wrap3.splitChar = # }
Zu beachten ist dabei lediglich, dass Leerzeichen und sonstiger sogenannter Whitespace vorher abgetrennt werden. Wenn Sie das verhindern wollen, müssen Sie stattdessen mit der Funktion noTrimWrap arbeiten, die wir ebenfalls in diesem Rezept erläutern.
Max. Linie
In unserem Beispiel können Sie auch den Unterschied zwischen wrap, wrap2 und wrap3 erkennen, der in der Reihenfolge des Funktionsaufrufs besteht. Unabhängig davon, in
394 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
welcher Reihenfolge Sie die Funktionen in Ihrem TS-Setup eingetragen haben, wird immer erst wrap, dann wrap2 und zum Schluss wrap3 aufgerufen. Lesen Sie dazu auch Rezept 10.9, das sich mit der Hierarchie von stdWrap-Funktionen befasst.
10.7 Links mit typolink erzeugen Problem Sie wollen in Ihrer Ausgabe die automatische Erzeugung von TYPO3-konformen Links nutzen. Dabei wollen Sie sowohl externe als auch interne Links erzeugen. Bei internen Links soll gleichzeitig noch die Möglichkeit bestehen, einzelne Inhaltselemente einer Seite direkt anzusteuern. Zusätzlich wollen Sie sicherstellen, dass die Übergabe bestimmter Parameter ordnungsgemäß stattfindet und die dabei erzeugten verschiedenen Versionen der Links jeweils eine eigene Seite im Seitencache zugewiesen bekommen.
Lösung Lizensiert für Markus Mueller
Verwenden Sie die stdWrap-Funktion typolink mit ihren vielfältigen Optionen und Parametern. Die einfachste Version eines mit typolink erzeugten Links können Sie mit folgendem Code erreichen: temp.meinLink = TEXT temp.meinLink { value = Link auf Seite 1 typolink.parameter = 1 }
Das Ergebnis wäre dieser HTML-Code: Link auf Seite 1
Selbstverständlich können Sie die Werte für parameter auch mithilfe von stdWrap-Funktionen dynamisch zuweisen: temp.meinLink = TEXT temp.meinLink { value = Link auf eine andere Seite typolink.parameter.field = uid }
typolink.parameter stellt dabei quasi das Rückgrat der typolink-Funktion dar, denn damit
werden die verschiedensten Arten von Links automatisch erzeugt, je nachdem, in welcher Form der zugewiesene Wert notiert wurde.
Max. Linie
Max. Linie 10.7 Links mit typolink erzeugen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 395
Dabei gelten folgende Regeln:
Links
Der notierte Wert wird anhand von Leerzeichen in insgesamt vier Teilbereiche unterteilt: typolink.parameter = Link Target Class Title
Enthält Link ein @-Zeichen, handelt es sich um einen Link auf eine E-Mail-Adresse. Enthält Link einen Punkt und befindet sich dieser vor einem Slash / oder enthält Link einen Doppel-Slash //, handelt es sich um einen externen Link zu einer URL. Enthält Link einen Slash / ohne einen Punkt davor, handelt es sich um eine Dateireferenz auf demselben Server, wobei der Link nur erzeugt wird, wenn diese Datei auch vorhanden ist. Besteht Link aus einem ganzzahligen Wert, handelt es sich um einen Link auf eine Seite mit dieser UID: typolink.parameter = 1
Bei zwei durch ein Komma getrennten ganzzahligen Werten handelt es sich um eine Kombination aus der Seiten-ID mit einem dazugehörigen Seitentyp, z.B. für eine Druckseite: typolink.parameter = 1,98 Lizensiert für Markus Mueller
Wird anstatt eines Kommas das #-Zeichen verwendet, handelt es sich um eine AnkerKombination aus der UID der Seite sowie der UID eines Inhaltselements auf dieser Seite, das direkt angesprungen wird. typolink.parameter = 1#123
Wird die Zahl vor dem #-Zeichen weggelassen, handelt es sich um eine ebensolche AnkerKombination, die aber auf die aktuelle Seite verweist: typolink.parameter = #123
Anstatt eines ganzzahligen Werts zur Identifizierung der Seite kann auch ein Text-String verwendet werden, der den passenden Aliasnamen repräsentiert: typolink.parameter = Alias typolink.parameter = Alias#123
Als Target können echte Targets sowie Zahlenkombinationen wie 123x456 verwendet werden. Letztere öffnen den Link in einem entsprechend dimensionierten Pop-up-Fenster: typolink.parameter = Alias#123 _top typolink.parameter = Alias#123 400x300
Zusätzliche Parameter für Pop-up-Fenster können mithilfe eines Doppelpunkts angehängt werden: typolink.parameter = Alias#123 400x300:resizable=0,location=1
Max. Linie
Class- und Title-Attribute können manuell vergeben werden: typolink.parameter = Alias#123 400x300 meineClass MeinTitel
396 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Falls Sie kein Target oder keine Class verwenden wollen, aber dennoch die dahinter liegenden Teile nutzen möchten, müssen Sie als Wert das Minuszeichen verwenden: typolink.parameter = Alias#123 - - MeinTitel
Mithilfe dieser äußerst intelligenten Erkennungstechnik können Sie nahezu alle denkbaren Kombinationen für interne und externe Links abdecken. Im Folgenden zeigen wir Ihnen, wie Sie mit den weiteren Parametern und Optionen von typolink die Erzeugung von Links weiter verfeinern können.
Diskussion Mit den in der Lösung beschriebenen Varianten können Sie bereits recht komfortabel verschiedene Arten von Links erzeugen. Die Funktion typolink bietet Ihnen jedoch noch weitere Parameter und Optionen, mit deren Hilfe Sie die Ausgabe der Links weitergehend beeinflussen können.
extTarget, target
Lizensiert für Markus Mueller
Mithilfe der Parameter extTarget und target legen Sie zum Beispiel fest, welche Targets für externe und interne Links verwendet werden sollen. Die hier festgelegten Werte werden als Default verwendet, wenn Sie innerhalb von typolink.parameter keine Angaben für target einsetzen. typolink.parameter hat jedoch die höhere Priorität, sodass dort angegebene Targets den Default-Wert überschreiben. Im folgenden Beispiel wird ein Link aus den Feldern linktext und linkurl konstruiert. Das Feld linkurl wird dabei nach den in der Lösung genannten Regeln in einen Link umgesetzt. Je nachdem, ob dieser Link auf eine externe URL oder eine interne Seite verweist, wird das passende Target gesetzt. temp.meinLink = TEXT temp.meinLink { field = linktext typolink { extTarget = _blank target = _top parameter.field = linkurl } }
Um das Target durch den Redakteur bestimmen zu lassen, können Sie ein weiteres Feld linktarget verwenden, das innerhalb von typolink.parameter berücksichtigt wird:
Max. Linie
temp.meinLink = TEXT temp.meinLink { field = linktext typolink { extTarget = _blank target = _top parameter.cObject = COA
10.7 Links mit typolink erzeugen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 397
parameter.cObject { 10 = TEXT 10.field = linkurl 10.noTrimWrap = || | 20 = TEXT 20.field = linktarget 20.fieldRequired = linktarget }
Links
} }
An diesem Beispiel lässt sich auch gut erkennen, wie Sie die einzelnen Teile von typolink.parameter mithilfe eines COA erzeugen können. Wichtig ist dabei der Einsatz von noTrimWrap, um die nötigen Leerzeichen zu erzwingen.
no_cache, useCacheHash Die beiden Schalter no_cache und useCacheHash regeln das Caching-Verhalten der aufgerufenen Seite. Während Sie mit no_cache=1 dafür sorgen, dass der Seitencache über den URL-Parameter &no_cache=1 vollständig abgeschaltet wird, sorgt useCacheHash=1 dafür, dass für jede mögliche Kombination aus Link-Parametern eine eigene Version der Seite in den Cache gelegt wird. Lizensiert für Markus Mueller
Hierzu werden alle URL-Parameter mit Ausnahme von id, type, no_cache, ftu, cHash und MP in einen sogenannten Hash-String umgerechnet, der zusätzlich an die URL angehängt wird. Das Ergebnis von useCacheHash sieht ungefähr so aus: Linktext
Die Verwendung von no_cache als URL-Parameter sollte nur Debug-Zwecken in der Entwicklungsphase dienen. Ein Einsatz in Produktivumgebungen käme in den meisten Fällen einem Performanceverlust von mehreren hundert Prozent gleich, weil für jeden Seitenaufruf der komplette Seiteninhalt neu generiert werden müsste. Außerdem besteht seit TYPO3-Version 4.2 die Möglichkeit, diesen Parameter bereits im Install-Tool ausdrücklich wirkungslos zu schalten.
additionalParams Per additionalParams können Sie weitere URL-Parameter hinzufügen. additionalParams verfügt seinerseits über stdWrap-Funktionen, sodass Sie diese Parameter auch aus Feldern beziehen oder mithilfe von Registern hinzufügen können.
Max. Linie
Wenn Sie mittels config.linkVars festgelegt haben, welche URL-Parameter bei jedem Menüpunkt oder Link automatisch durchgeschleift werden sollen, brauchen Sie diese Parameter nicht extra mit additionalParams hinzuzufügen. Die Funktion dient damit vor allem dazu, davon abweichende URL-Parameter z.B. für eine Druckversion der Seite temporär mit anzuhängen. Sie wird allerdings nur für interne Links berücksichtigt!
398 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
temp.meinLink = TEXT temp.meinLink { fieldRequired = printlink value = Druckversion typolink { target = _top parameter.data = TSFE:id additionalParams = &print=1 } }
addQueryString Mithilfe des Schalters addQueryString=1 können Sie sämtliche beim Aufruf der Seite verwendeten URL-Parameter unabhängig von den Einstellungen in config.linkVars an die URL des Links anhängen. Unter Umständen können bei Verwendung dieses Schalters verschiedene Parameter doppelt in der URL auftauchen. Das ist im Prinzip kein Problem, weil dabei nur das letzte Vorkommen berücksichtigt wird. Sie können dieses Verhalten jedoch abschalten, indem Sie config.uniqueLinkVars=1 verwenden. Lizensiert für Markus Mueller
wrap, ATagBeforeWrap Die Funktion wrap verpackt den Link z.B. mit einem div- oder span-Tag. Sie verhält sich absolut identisch mit den bereits in Rezept 10.6 beschriebenen Funktionen. Wenn Sie zusätzlich den Schalter ATagBeforeWrap=1 setzen, wird der Linktext zunächst mit dem Wrap versehen und erst dann in a-Tags eingebettet. temp.meinLink = TEXT temp.meinLink { fieldRequired = printlink value = Druckversion typolink { target = _top parameter.data = TSFE:id additionalParams = &print=1 wrap = <span >| ATagBeforeWrap = 1 } }
JSwindow_params Mit dem String JSwindow_params können Sie bestimmte Werte für Pop-up-fenster vordefinieren, damit Sie diese nicht explizit unter typolink.parameter mit angeben müssen. Das ist vor allem dann nützlich, wenn die Angaben zur Erzeugung der Links in Backend-Formularen gemacht werden, weil Sie damit die Redakteure dahingehend entlasten können,
Max. Linie
Max. Linie 10.7 Links mit typolink erzeugen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 399
dass diese nur noch die Größe des Fensters angeben müssen. Sämtliche Werte werden dabei in eine kommaseparierte Liste eingetragen, die folgendermaßen aussieht:
Links
JSwindow_params = status=1,menubar=1,scrollbars=1,resizable=1,location=1,directories=1,toolbar=1
Für jede unerwünschte Option müssen Sie statt der 1 eine 0 verwenden.
returnLast Falls Sie den Text nicht direkt in a-Tags verpacken möchten, sondern z.B. nur die reine URL oder nur das Target des erzeugten Links zur Weiterverarbeitung an anderer Stelle benötigen, können Sie den Parameter returnLast verwenden. Zulässige Werte hierfür sind url oder target.
section
Lizensiert für Markus Mueller
Um bei der Erzeugung von Links als Sprungziel einen bestimmten Anker der aufgerufenen Seite zu erzwingen, können Sie den Parameter section nutzen. Dies ist immer dann nützlich, wenn Sie die Inhalte der Seite in Bereiche unterteilt haben, die zum Beispiel mithilfe eines Access-Keys angesteuert werden können. Gerade für Seiten, die nach den Regeln der BITV zugänglich gemacht wurden, werden solche Anker häufig verwendet, damit ein Screenreader nicht jedes-Mal den Seitenkopf und sämtliche Menüs vorliest, sondern gleich den relevanten Inhalt. Befindet sich der Benutzer nun auf der aktuellen Seite z.B. in einem solchen Bereich, der mit dem Anker gekennzeichnet ist, wäre es durchaus komfortabel, wenn er beim Aufruf einer neuen Seite über einen Link automatisch in den gleichen Bereich geführt würde. Dies erreichen Sie mit folgendem Code. temp.meinLink = TEXT temp.meinLink { field = linktext typolink { target = _top parameter.field = linkurl section = inhalt } }
Der erzeugte Link sähe in diesem Fall z.B. so aus: Linktext
Max. Linie
Aus Gründen der Konformität mit den Regeln des W3C für validen HTMLCode werden sämtliche Links zu Ankern, die nur aus einer Zahl bestehen, mit dem Präfix c versehen. Der Sprung erfolgt also nicht zum Anker 123#456, sondern zum Anker 123#c456. Beachten Sie dieses Verhalten, wenn Sie selbst definierte Anker benutzen. Innerhalb von CSS-styled-content werden die Anker bereits passend gesetzt.
400 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts ATagParams Der Parameter ATagParams funktioniert ähnlich wie der bereits erwähnte additionalParams. In diesem Fall fügen Sie jedoch keine URL-Parameter hinzu, sondern versorgen das a-Tag selbst mit zusätzlichen Attributen. So können Sie CSS-Klassen oder InlineStyles hinzufügen, um dem Link eine spezielle Formatierung mitzugeben. ATagParams verfügt erfreulicherweise seit TYPO3 4.0 über stdWrap-Eigenschaften, sodass Sie die Werte auch dynamisch erzeugen können. temp.meinLink = TEXT temp.meinLink { field = linktext typolink { target = _top parameter.field = linkurl section = inhalt ATagParams { field = linklayout wrap = } } } Lizensiert für Markus Mueller
userFunc Abschließend sei noch die Möglichkeit erwähnt, die automatisch erzeugten Links mithilfe des Parameters userFunc zur Weiterverarbeitung an eine eigene PHP-Funktion zu übergeben. Jedoch ist es angesichts der vielfältigen Möglichkeiten von typolink fraglich, ob Sie davon jemals Gebrauch machen müssen.
10.8 Spezielle stdWrap-Funktionen verwenden Problem Nachdem Sie in den vorigen Rezepten dieses Kapitels die gängigen Funktionen aus dem stdWrap-Baukasten kennengelernt haben, möchten Sie sich auch einen Überblick über ein paar exotischere Funktionen verschaffen. Sie werden sie zwar in der Regel eher selten benötigen, dennoch kann es manchmal ganz hilfreich sein, ein paar zusätzliche DebugInformationen zu erhalten, den ausgegebenen Code mit Kommentarzeilen zu strukturieren oder die Inhalte bei der Verarbeitung durch TypoScript mithilfe eigener PHP-Funktionen vor- bzw. nachzubereiten.
Lösung
Max. Linie
Verwenden Sie die debug-, userFunc- und comment-Funktionen aus dem stdWrap-Baukasten.
10.8 Spezielle stdWrap-Funktionen verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 401
Max. Linie
debug Gibt den aktuellen Inhalt eines TypoScript-Elements oder einer Funktion als Text aus.
Links
debugData Erzeugt eine tabellarische Ansicht des aktuellen Arrays $cObj-data. debugFunc Erzeugt einen direkten Debug-Output in Form von Text oder als Tabelle formatiert. editIcons/editPanel Fügen einzelnen Elementen die für das Frontend-Editing nötigen Bearbeitungselemente hinzu. postUserFunc/postUserFuncInt Verarbeiten den Inhalt eines TypoScript-Elements, nachdem er bereits durch TypoScript-Parameter beeinflusst wurde. prefixComment Versieht die Ausgabe einzelner TypoScript-Elemente mit Kommentarzeilen. preUserFunc Verarbeitet den Inhalt eines TypoScript-Elements, bevor er durch weitere TypoScriptParameter beeinflusst wird. Lizensiert für Markus Mueller
Diskussion debug Mit diesem Schalter wird die komplette Ausgabe eines TypoScript-Elements durch die Funktion HTMLSpecialChars() geschickt und danach in pre-Tags verpackt. Dadurch erhalten Sie eine textbasierte Ausgabe, die auch die im Element erzeugten HTML-Tags lesbar werden lässt, ohne dass Sie dazu in den Quelltext sehen müssten. Üblicherweise wird diese Funktion lediglich in der Entwicklungsphase eines Projekts eingesetzt. Wenn Sie jedoch verschiedene Codebeispiele ausgeben wollen, um etwa die Arbeitsweise von TypoScript-Elementen zu verdeutlichen, können Sie debug ebenfalls dazu verwenden. meinDebugOutput = TEXT meinDebugOutput { value = Debug Output wrap = | debug = 1 }
Das Ergebnis dieses Codes sähe im HTML-Code folgendermaßen aus: <pre>Debug Output
Max. Linie
Und hier das Ergebnis im Browser: Debug Output
402 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts debugData Mit diesem Schalter aktivieren Sie die tabellarische Ausgabe des aktuellen Arrays $cObj-> data. Damit können Sie einfach und komfortabel überprüfen, welche Daten dem jeweiligen TypoScript-Element momentan zur Verarbeitung zur Verfügung stehen. Dies ist besonders hilfreich, wenn Sie innerhalb eines TypoScript-Elements Daten verschiedener Datenbanktabellen verwenden. Der Inhalt von $cObj-data ist dann nicht immer sofort nachvollziehbar, weil er gegebenenfalls mehrmals wechselt.
Lizensiert für Markus Mueller
temp.meinDebugOutput = COA temp.meinDebugOutput { stdWrap.debugData = 1 10 = TEXT 10.field = title 20 = CONTENT 20 { table = tt_content renderObj = COA renderObj { stdWrap.debugData = 1 10 = TEXT 10.field = header } } }
Mit diesem Code würden Sie verschiedene Debug-Tabellen erzeugen, wobei sich die erste auf die Datenbanktabelle pages bezieht, gefolgt von mehreren Tabellen, die sich auf die Datenbanktabelle tt_content beziehen. Die Anzahl letzterer Tabellen ist in dem Fall abhängig von der Anzahl der auf der Seite verwendeten Inhaltselemente. Jede der Tabellen zeigt Ihnen dabei immer genau einen Datensatz in Form von Paaren aus einem Feldnamen und dessen jeweiligem Wert.
debugFunc Dieser Schalter erzeugt eine ähnliche Ausgabe, wie sie bereits mithilfe von debug erzeugt werden kann. Jedoch erfolgt die Ausgabe direkt, also noch vor dem HTML-Header der ausgegebenen Seite. Der Inhalt wird dabei in b-Tags anstatt in pre-Tags verpackt. Um eine übersichtlichere Formatierung in Form von Tabellen zu erhalten, wie sie z.B. von debugData erzeugt wird, können Sie anstatt des Werts 1 ausnahmsweise den Wert 2 verwenden. Die Ausgabe erfolgt dabei jeweils innerhalb einer Tabellenzeile pro Element. Wenn Sie diese Funktion also mehrfach verwenden, erhalten Sie auf diese Weise eine vollständige Debug-Tabelle vor dem HTML-Header.
Max. Linie
temp.meinDebugOutput = COA temp.meinDebugOutput { stdWrap.debugFunc = 2 10 = TEXT 10.field = title
10.8 Spezielle stdWrap-Funktionen verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 403
20 = CONTENT 20 { table = tt_content renderObj = COA renderObj { stdWrap.debugFunc = 2 10 = TEXT 10.field = header } }
Links
}
editIcons/editPanel Eine ausführliche Beschreibung dieser Funktionen finden Sie in Rezept 9.5.
postUserFunc, postUserFuncInt, preUserFunc
Lizensiert für Markus Mueller
Mithilfe dieser stdWrap-Funktionen können Sie eine eigene PHP-Funktion aufrufen, um den Inhalt eines TypoScript-Elements zu bearbeiten. Hierzu werden zwei Variablen an die aufgerufene Funktion übergeben, von denen die erste den aktuellen Inhalt liefert und die zweite die TypoScript-Konfiguration für die Funktion selbst. Das bedeutet, dass Sie neben den üblichen TypoScript-Parametern auch eigene Parameter an die Funktion übergeben können, um diese nach Bedarf zu beeinflussen. Dabei werden nur die innerhalb des Parameters postUserFunc, postUserFuncInt oder preUserFunc angegebenen Einstellungen berücksichtigt. temp.meineNachbearbeitung = COA temp.meineNachbearbeitung { 10 = TEXT 10.field = title 20 = TEXT 20.field = substitle stdWrap.postUserFunc = user_klasse->user_funktion stdWrap.postUserFunc { cObject = TEXT cObject.field = nav_title eigenerParameter = eigenerWert } }
oder
Max. Linie
temp.meineVorbereitung = COA temp.meineVorbereitung { stdWrap.preUserFunc = user_klasse->user_funktion stdWrap.preUserFunc { cObject = TEXT cObject.field = nav_title eigenerParameter = eigenerWert }
404 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
10 = TEXT 10.field = title 20 = TEXT 20.field = substitle }
Damit die PHP-Funktion aufgerufen werden kann, müssen Sie sie vorher mithilfe dieses Codes inkludieren: page.includeLibs.userKlasse = fileadmin/scripts/user_klasse.php
Alle an die Funktion übergebenen TypoScript-Parameter werden unabhängig davon, ob es eigene oder offizielle Parameter sind, selbstverständlich nur dann innerhalb der PHPFunktion berücksichtigt, wenn Sie dafür entsprechende Verarbeitungsfunktionen in den PHP-Code eingebaut haben. Der Unterschied zwischen diesen drei stdWrap-Funktionen liegt zum einen in der Reihenfolge, zum anderen im Caching-Verhalten. preUserFunc verarbeitet den Inhalt, bevor er durch sonstige TypoScript-Parameter beeinflusst wird. postUserFunc hingegen nimmt die Bearbeitung vor, nachdem alle anderen Parameter berücksichtigt wurden. postUserFuncInt schaltet dabei zusätzlich das Caching des erzeugten Inhalts ab.
prefixComment Lizensiert für Markus Mueller
Mit dieser Funktion können Sie einzelnen Teilen Ihres TypoScript-Codes eigene Kommentare hinzufügen, die später das Auffinden bestimmter Elemente im ausgegebenen HTML-Code vereinfachen. Speziell in der Entwicklungsphase einer Site können Sie diese Kommentare nutzen, um z.B. bei Fehlern in der Validierung des Codes herauszufinden, welches TypoScript-Element dafür verantwortlich ist. Die Syntax für diese Kommentare sieht folgendermaßen aus: [Anzahl der Tabstopps]|[Kommentartext]
Zusätzlich ist es möglich, den Kommentartext dynamisch zu gestalten, sodass beispielsweise die UID eines Elements, dessen Inhaltstyp oder andere nützliche Angaben in den Kommentarcode mit einfließen. Die Schreibweise ist dabei identisch mit der in Rezept 10.2 beschriebenen Vorgehensweise für die Funktionen dataWrap und insertData. Hier ein Beispiel für eine Elementdefinition bei der Ausgabe von Inhalten aus tt_content: meinElement = COA meinElement { stdWrap.prefixComment = 2|{field:CType}-Element Nr. {field:uid} 10 < lib.stdheader 20 < temp.meinElementSetup }
Max. Linie
Der Kommentar selbst wird immer mit einem Tabstopp eingerückt. Über den ersten Parameter vor dem |-Symbol legen Sie daher die Anzahl der Tabstopps fest, mit denen die nach dem Kommentar folgende HTML-Zeile eingerückt wird.
10.8 Spezielle stdWrap-Funktionen verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 405
Max. Linie
10.9 Die Hierarchie von Wraps und anderen Funktionen kennenlernen
Links
Problem Sie wollten schon immer wissen, wie die einzelnen Wraps für TypoScript-Elemente und Menüeinträge eigentlich zusammenhängen? Dazu wollen Sie aber nicht immer in der TSref nachschlagen müssen und die gesamte Liste der Funktionen herunterscrollen.
Lösung Erzeugen Sie zwei einfache TypoScript-Elemente, nämlich ein TEXT- und ein HMENUElement, und lassen Sie TYPO3 selbst die Antwort liefern. Notieren Sie dazu die Wraps in der Reihenfolge, in der sie in der TSref zu finden sind. Sämtliche Wraps für HMENUEinträge finden Sie dabei unter der Rubrik TMENUITEM, alle Wraps für Elemente, die nicht in einem Menü vorkommen, befinden sich in der Rubrik stdWrap. Dieser Code kommt in Ihr TS-Setup: Lizensiert für Markus Mueller
Max. Linie
temp.wrapTest = TEXT temp.wrapTest { value = Textlicher Inhalt innerWrap =
|
innerWrap2 =
|
preCObject = TEXT preCObject.value = <preCObject />
postCObject = TEXT postCObject.value =
<postCObject /> wrap = <wrap>
|
noTrimWrap = |<noTrimWrap>
|
| wrap2 = <wrap2>
|
dataWrap =
|
prepend = TEXT prepend.value = <prepend />
append = TEXT append.value =
wrap3 = <wrap3>
|
outerWrap =
|
} temp.menuWrapTest = HMENU temp.menuWrapTest { 1 = TMENU 1 { expAll = 1 NO { ATagBeforeWrap = 0 allWrap =
|
406 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
wrapItemAndSub = <wrapItemAndSub>
|
<wrapItemAndSub> before = beforeWrap =
|
linkWrap =
|
after = afterWrap =
|
} } 2 < .1 } page = PAGE page.10 < temp.wrapTest page.20 < temp.menuWrapTest
Sie können aber auch darauf verzichten und einfach gleich auf die Ergebnisse zurückgreifen, die wir Ihnen in der Diskussion zeigen. Jedoch kann es ganz hilfreich sein, ein solches automatisches Nachschlagewerk zur Verfügung zu haben, weil Sie sämtliche weiteren stdWrap-Funktionen in der gleichen Art und Weise austesten können. Damit lassen sich eventuelle Fragen wie »Welche meiner verwendeten stdWrap-Funktion wird zuerst ausgeführt?« oder »Funktioniert prioriCalc nach einem dataWrap?« recht einfach beantworten. Lizensiert für Markus Mueller
Max. Linie
Diskussion Das gezeigte Codebeispiel liefert im Bereich temp.wrapTest folgendes Ergebnis für alle TypoScript-Elemente mit Ausnahme von Menüeinträgen: <wrap3> <prepend /> <wrap2> <noTrimWrap> <wrap> <preCObject /> Textlicher Inhalt <postCObject />
10.9 Die Hierarchie von Wraps und anderen Funktionen kennenlernen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 407
Wir haben die einzelnen Pseudo-Tags zusätzlich eingerückt, um die Übersicht zu erhöhen. Die eigentliche Ausgabe ist lediglich linksbündig. Innerhalb von Menüeinträgen stehen Ihnen diese Wraps zunächst nicht zur Verfügung. Dafür werden hier spezielle Wraps verwendet, um Situationen, die gerade innerhalb von Menüs häufig auftreten, gerecht werden zu können. Dies ist das Ergebnis aus temp.menuWraptest für einen Eintrag in einem Textmenü:
Links
<wrapItemAndSub> ----------------Linktext ---------------- Untermenü nach gleichem Muster Lizensiert für Markus Mueller
Max. Linie
Hier die gleiche Ausgabe, jedoch mit ATagBeforeWrap=1, was dazu führt, dass sich der linkWrap innerhalb der a-Tags befindet, anstatt diese zu umschließen: <wrapItemAndSub> ---------------- Linktext ---------------- Untermenü nach gleichem Muster
Die gestrichelten Linien markieren die Position des a-Tags innerhalb der Menü-WrapKonstrukte. Wie Sie sehen, können Sie mit den üblichen Wraps innerhalb eines Menüs nicht direkt arbeiten. Speziell wenn Sie den eigentlichen Linktext innerhalb der a-Tags verpacken wollen, bleibt zunächst nur der Parameter linkWrap. Dennoch brauchen Sie auf die Wraps aus dem ersten Beispiel nicht zu verzichten, weil sämtliche Menüzustände über stdWrap-Eigenschaften verfügen, die sich auf den Linktext beziehen. Hier ein Codebeispiel dazu:
408 | Kapitel 10: Der stdWrap-Baukasten: Grundlegende TypoScript-Funktionen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
temp.menuWrapTest = HMENU temp.menuWrapTest { 1 = TMENU 1 { expAll = 1 NO { ATagBeforeWrap = 1 allWrap =
|
wrapItemAndSub = <wrapItemAndSub>
|
before = beforeWrap =
|
linkWrap =
|
after = afterWrap =
|
stdWrap.wrap = <stdWrap.wrap>
|
} } 2 < .1 }
Das Ergebnis dieses Beispiels:
Lizensiert für Markus Mueller
<wrapItemAndSub> ---------------- <stdWrap.wrap> Linktext ---------------- Untermenü nach gleichem Muster
Wie Sie sehen, können Sie auf diese Weise eine beliebige Anzahl von Wraps miteinander kombinieren, wenn die verwendeten Objekte oder Wraps ihrerseits über stdWrap-Eigenschaften verfügen. So können Sie auch bestimmte Abfragen für einige der Wraps einbauen, damit diese nur dann verwendet werden, wenn ein oder mehrere Kriterien erfüllt sind – ein Prinzip, das z.B. bei mehrspaltigen Layouts mit fließenden Größenangaben zum Einsatz kommt, um ganze Spalten auszublenden, wenn für diese kein Inhalt vorhanden ist.
Max. Linie
Sie sollten speziell das Prinzip der Wraps und deren Reihenfolge weitestgehend verinnerlichen, bevor Sie sich den folgenden TypoScript-Kapiteln zuwenden, weil es sich dabei um eines der Grundprinzipien bei der Arbeit mit TYPO3 handelt.
10.9 Die Hierarchie von Wraps und anderen Funktionen kennenlernen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 409
Max. Linie
Vakat Lizensiert für Markus Mueller
First
Kapitel 11
KAPITEL 11
Funktionale TypoScript-Elemente verwenden
11.0 Einführung
Lizensiert für Markus Mueller
In den Kapiteln 8, 9 und 10 haben Sie bereits die stdWrap-Funktionen sowie die sogenannten Toplevel Objects kennengelernt. Mit den Toplevel Objects können Sie die Ausgabe für verschiedene Medien vorbereiten und das entsprechende Grundgerüst für die eigentlichen Inhalte erzeugen. Damit diese Inhalte jedoch aus der Datenbank in das Frontend gelangen können, benötigen Sie weitere TypoScript-Elemente, die als Content Object oder auch cObject bezeichnet werden. Unter diesem Oberbegriff werden im Prinzip alle Elemente zusammengefasst, die irgendetwas mit der Ausgabe und Strukturierung von Inhalten zu tun haben. Dennoch ist es unserer Meinung nach sinnvoll, diese Elemente ihrerseits in zwei Gruppen aufzuteilen: • Echte Inhaltselemente, die z.B. Menüs, Texte, Bilder, Überschriften und ähnliche Dinge ausgeben. • Funktionale Elemente, die über die einfachen stdWrap-Funktionen hinausgehen, wie z.B. eine Strukturierungshilfe, eine Zwischenablage, Bildbearbeitungsfunktionen und Aufrufe eigener PHP-Funktionen. In diesem Kapitel werden wir uns zunächst mit der zweiten Gruppe beschäftigen, weil diese die Grundlagen für viele Rezepte der ersten Gruppe liefern wird. Das Setzkastenelement COA z.B. wird in fast allen anderen Rezepten zur gezielten und übersichtlichen Strukturierung des TypoScript-Codes eingesetzt. LOAD_REGISTER und RESTORE_REGISTER bilden die TypoScript-eigene Zwischenablage, auf deren Hilfe Sie speziell in den fortgeschrittenen Menürezepten und in Kapitel 14 angewiesen sein werden.
Max. Linie
Mit dem GIFBUILDER liefert Ihnen TYPO3 eine interne Bildbearbeitungssoftware, die seit Version 4.0 auch mit 24-Bit-Farbtiefe aufwarten kann und erstaunliche Ergebnisse liefert. GIFBUILDER beherrscht neben der Verarbeitung von PostScript und TrueTypeSchriften sowohl das Arbeiten in Ebenen als auch verschiedene Maskierungstechniken und Effekte, was ihn zu einem unentbehrlichen Helfer im Bereich der grafischen Menüs und Überschriften macht. | 411 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Zu guter Letzt werden wir noch kurz auf das cObject USER/USER_INT eingehen, das es Ihnen ermöglicht, eigenen PHP-Code in das bestehende System TYPO3 mit einzubinden. USER/USER_INT bildet daher die Grundlage für fast alle Erweiterungen. Eine detailliertere Erläuterung finden Sie in den Kapiteln 15, 16, 17 und 18 zum Thema Extensions.
Links
Bevor Sie sich an das Bearbeiten der eigentlichen Inhaltslemente begeben, sollten Sie zumindest die Grundlagenrezepte aus diesem Kapitel gelesen haben: • Rezept 11.1, Mit COA Inhalte zusammenfassen und mit stdWrap versehen • Rezept 11.4, Mit LOAD_REGISTER und RESTORE_REGISTER Elemente zwischenspeichern • Rezept 11.8, Mit dem GIFBUILDER einfache Grafiken erstellen
11.1 Mit COA Inhalte zusammenfassen und mit stdWrap versehen Problem Lizensiert für Markus Mueller
Sie wollen verschiedene Inhaltselemente zu einem einzigen Objekt zusammenfassen. Außerdem wollen Sie die einzelnen Elemente mit stdWrap-Funktionen bearbeiten können. Dabei sollen aber auch Elemente zum Einsatz kommen, die selbst nicht über stdWrapFunktionen verfügen.
Lösung Verwenden Sie das Setzkastenelement COA und verschachteln Sie es gegebenenfalls. Dieser Code kommt in Ihr TS-Setup:
Max. Linie
temp.meinInhalt = COA temp.meinInhalt { wrap = | 10 = TEXT 10.value = Als Erstes ein Text 20 = COA 20 { 10 < styles.content.get stdWrap.wrap = | stdWrap.required = 1 } 5 = TEXT 5.value = Ein Text noch vor dem ersten Text 30 = COA 30 { 10 = RECORDS 10 { tables = tt_content source = 22
412 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
conf.tt_content { # hier die Definition von RECORDS } } stdWrap.wrap = | stdWrap.required = 1 } }
Und dieser ins Setup Ihrer Seite: page = PAGE page.10 < temp.meinInhalt
Diskussion Bei der Nutzung von stdWrap-Funktionen ist Ihnen sicherlich bereits aufgefallen, dass diese nicht immer an gewünschter Stelle oder im gewünschten Umfang zur Verfügung stehen. Diese Inkonsistenz resultiert aus der Tatsache, dass es sich bei TYPO3 um ein gewachsenes System handelt, das zunächst von nur einem einzigen Programmierer entwickelt wurde. Dabei wurden bestimmte Funktionen nur dort verwendet, wo sie im konkreten Anwendungsfall sinnvoll erschienen. An anderer Stelle wurden sie einfach weggelassen, weil ein möglicher Anwendungszweck damals noch nicht klar ersichtlich war. Lizensiert für Markus Mueller
Im Lauf der Zeit wurde das System von mehreren Kernentwicklern weitergeführt, jedoch behielt man die ursprüngliche Form der TypoScript-Elemente aus Kompatibilitätsgründen bei. Aus diesem Grund gibt es auch heute noch eine Reihe von TypoScript-Elementen, die keinerlei stdWrap-Funktionalität bieten. Dennoch gibt es ein einfaches Hilfsmittel, das Ihnen auch bei diesen Elementen zumindest einen Teil der stdWrap-Funktionen zur Verfügung stellt: das sogenannte COBJ_ARRAY oder auch COA. Das verwandte Objekt COA_INT ist in der Funktionsweise identisch, wird jedoch beim Render-Vorgang prinzipiell neu erzeugt und nicht aus dem Cache geholt. COA verfügt selbst über if, wrap und stdWrap als Parameter, COA_INT zusätzlich noch über includeLibs für die Verwendung eigener Skripte. Der Aufbau eines solchen COA ist denkbar einfach. Stellen Sie sich einen Adventskalender vor, dessen einzelne Türen mit einer Zahl versehen sind. Hinter jeder Tür befindet sich ein Element des COA, und es wird in der entsprechenden Reihenfolge der Zahlen abgearbeitet. Dabei ist es völlig unerheblich, in welcher Reihenfolge Sie die Elemente in das COA eintragen. Maßgeblich ist ausschließlich dessen Nummer.
Max. Linie
Die in diesem Beispiel gezeigte Reihenfolge der Elemente dient nur zur Veranschaulichung. Auch wenn die Reihenfolge bei der Ausgabe unabhängig von der Reihenfolge im TypoScript-Template und nur auf Basis der Nummerierung bestimmt wird, sollten Sie auch in Ihrem Template eine möglichst korrekte Reihenfolge einhalten, um unnötige Verwirrung zu vermeiden.
11.1 Mit COA Inhalte zusammenfassen und mit stdWrap versehen | 413 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Jedes dieser Elemente kann entweder ein anderes TypoScript-Element oder aber ein weiteres COA sein, deswegen lassen sich COA-Elemente hervorragend verschachteln. Ähnlich wie bei einem Setzkasten, dessen einzelne Felder mit weiteren Brettchen in kleinere Bereiche aufgeteilt werden, können Sie so sehr einfach Elemente gruppieren und wenn nötig Elemente und weitere Untergruppen von Elementen zusammenfassen. Wenn Sie bei der Nummerierung in Zehnerschritten vorgehen, bleibt so immer genügend Platz, um zwischen den Bereichen weitere Elemente einzufügen.
Links
Wenn Sie sich von Beginn an angewöhnen, eine Seite prinzipiell mit mindestens einem solchen COA-Setzkasten aufzubauen, können Sie damit sicherstellen, dass unabhängig von den darin enthaltenen Elementen auf jeden Fall stdWrap-Funktionen nutzbar sind, um z.B. Bedingungen abzufragen oder das Element mit Wraps zu verpacken. Im Beispiel wird ein Wrap um ein Element RECORDS gelegt, obwohl dieses Element selbst weder wrap noch stdWrap.wrap zulässt. Seit TYPO3-Version 4.2 verfügt nun auch das Element RECORDS über stdWrap-Funktionen, das Beispiel mag jedoch für andere Elemente oder für ältere TYPO3-Versionen dennoch hilfreich sein.
Lizensiert für Markus Mueller
Ein weiterer Vorteil ist, dass Sie gegebenenfalls existierende stdWrap-Funktionen des eigentlichen Elements unangetastet lassen. Im gezeigten Beispiel wird styles.content. get in ein COA-Element kopiert. Da Sie die stdWrap-Funktion auf das COA-Element anwenden und nicht auf styles.content.get selbst, können Sie guten Gewissens Funktionen wie wrap, outerWrap oder innerWrap verwenden, ohne sich Gedanken machen zu müssen, ob Sie dabei bereits bestehende gleichnamige Funktionen des Originalelements überschreiben. COA wird damit zu einem der wichtigsten Werkzeuge beim Aufbau von strukturiertem TypoScript-Code.
11.2 Das Caching von Inhalten deaktivieren Problem Sie wollen für bestimmte Inhalte das Caching deaktivieren. Damit soll sichergestellt werden, dass die entsprechend konfigurierten Inhalte bei jedem Seitenaufruf neu generiert und dadurch immer mit aktuellen Daten versorgt werden. Sie wollen dabei die Möglichkeit haben, sowohl für ganze Seiten als auch für einzelne Inhaltselemente festzulegen, ob diese im Cache landen sollen oder nicht.
Max. Linie
Max. Linie 414 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Lösung Wenn Sie ganze Seiten ohne Caching generieren wollen, fügen Sie diesen Eintrag in Ihr TS-Setup ein: config.no_cache=1
Soll dies nur für bestimmte Seiten gelten, können Sie dafür ein sogenanntes ExtensionTemplate anlegen. Dieses Template nimmt die Einstellung nur für die Seite, auf der es sich befindet, sowie für den zu dieser Seite gehörigen Teil des Seitenbaums vor. Für das Deaktiveren des Cachings bestimmter Inhaltselemente, die Sie mit TypoScript generieren, sollten Sie das TypoScript-Element COA_INT verwenden. temp.inhaltMitCache = COA temp.inhaltMitCache { 10 = TEXT 10.data = date: H:i:s 10.wrap = Zeit im Cache: |
}
Lizensiert für Markus Mueller
temp.inhaltOhneCache = COA_INT temp.inhaltOhneCache { 10 = TEXT 10.data = date: H:i:s 10.wrap = Aktuelle Echtzeit: |
} page = PAGE page.10 < temp.inhaltMitCache page.20 < temp.inhaltOhneCache
Diskussion Üblicherweise werden Inhaltselemente, die Sie in TypoScript generieren, nur einmal erzeugt und danach aus einem Cache ausgegeben. Dort verbleiben sie im einmal erzeugten Zustand, bis dieser Cache gelöscht wird. Dies kann sowohl manuell durch den Administrator oder den Redakteur erfolgen als auch durch bestimmte Seiteneinstellungen, die dafür sorgen, dass der Cache für diese Seite in einem bestimmten Zeitintervall regelmäßig gelöscht wird. Wenn Sie wie im obigen Beispiel den Parameter config.no_cache = 1 verwenden, wird dieses Verhalten komplett abgeschaltet und bei jedem Aufruf der Seite neuer Inhalt erzeugt.
Max. Linie
Wundern Sie sich nicht, wenn die Inhalte trotz Verwendung dieses Parameters weiterhin aus dem Cache zu kommen scheinen. Seit TYPO3-Version 4.2 kann die Funktionalität des no_cache-Parameters nämlich im Install-Tool abgeschaltet werden. Überprüfen Sie daher, ob der Parameter TYPO3_CONF_ VARS[FE][disableNoCacheParameter] gesetzt ist, bevor Sie weitere Maßnahmen ergreifen.
11.2 Das Caching von Inhalten deaktivieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 415
Weil dies jedoch erhebliche Auswirkungen auf die Gesamtperformance der Seite hat, ist es ratsam, diesen Schalter nur im Notfall zu verwenden und ansonsten auf das TypoScript-Element COA_INT zurückzugreifen.
Links
Hierbei wird im Cache ein Platzhalter hinterlegt, der für den ungecachten Inhalt steht. Bei jedem Aufruf der Seite wird der Inhalt aus dem Cache ausgelesen, und dabei wird überprüft, ob ein solcher Platzhalter vorhanden ist. Ist dies der Fall, wird das entsprechende COA_INT-Element ausgeführt und der Platzhalter mit dem Resultat ersetzt. Wenn Sie wissen wollen, welche Auswirkungen das auf den Inhalt der jeweiligen Seite hat, verwenden Sie dazu einfach den zweiten Beispielcode. Hier werden zwei Inhaltselemente erzeugt, von denen das COA-Element in den Cache gepackt wird, das COA_INTElement jedoch nicht. Wenn Sie dieses Verhalten einmal genauer beobachten wollen, sollten Sie das Rezept 8.4 lesen und die dort beschriebenen Funktionen des Admin-Panels nutzen. Sie können damit sehr genau erkennen, welche Elemente über COA_ INT eingebunden wurden und wie diese gerendert und in die Ausgabe eingebaut werden.
Lizensiert für Markus Mueller
In beiden Elementen wird ein Text erzeugt, der mithilfe der stdWrap-Funktion data die aktuelle Uhrzeit zugewiesen bekommt. Beim ersten Aufruf der Seite sind beide Uhrzeiten noch identisch. Wenn Sie nun jedoch die Seite neu laden, ohne vorher den Cache zu löschen, werden Sie feststellen, dass sich nur die Uhrzeit im COA_INT-Element ändert, während sie im COA-Element gleich bleibt. Erst nach einem erneuten Löschen des Caches sind beide Uhrzeiten beim nächsten Aufruf wieder identisch. Auf diese Weise können Sie sämtliche Inhalte vom Caching ausklammern, die unbedingt ständig aktuell erzeugt werden müssen. Dies können z.B. Newseinträge, Warenkörbe oder ähnliche Dinge sein, bei denen der Benutzer interaktiv Veränderungen herbeiführen kann oder eine aktuelle Version dieses Inhalts erwartet. Aus Gründen der Performance sollten Sie COA_INT-Elemente sparsam verwenden. Wahlweise können Sie für einzelne Seiten das Caching auch in den Seiteneigenschaften abschalten, indem Sie das Kontrollkästchen Nicht cachen aktivieren. Bei einem Aufruf der Seite wird dann der Parameter &no_cache=1 an die URL angehängt. Jedoch ist dies wirklich nur für einzelne Seiten empfehlenswert, weil in diesem Fall der darunterliegende Teil des Seitenbaums ignoriert wird und Sie alle weiteren Seiten ebenfalls manuell vom Caching ausschließen müssten. Zudem wirkt sich auch hier gegebenenfalls der seit TYPO3 4.2 verfügbare Parameter TYPO3_CONF_VARS[FE][disableNoCacheParameter] aus.
Max. Linie
Max. Linie 416 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
11.3 Inhalt nur bei Bedarf zweispaltig anzeigen Problem Ihren Redakteuren stehen die zwei Spalten normal und rechts für die Eingabe von Elementen zur Verfügung. Sie wollen, dass die Ausgabe immer dann zweispaltig erfolgt, wenn in beiden Spalten Inhalte vorhanden sind. In allen anderen Fällen soll sie einspaltig bleiben.
Lösung Verwenden Sie das Element COA zusammen mit den stdWrap-Funktionen required, outerWrap, if und numRows. Dieser Code kommt ins TS-Setup für das Element selbst:
Lizensiert für Markus Mueller
temp.myContent = COA temp.myContent { stdWrap.required = 1 stdWrap.wrap ( |
) 10 = COA 10 { stdWrap.required = 1 stdWrap.outerWrap.cObject = TEXT stdWrap.outerWrap.cObject { value = | if.isTrue.numRows < styles.content.getRight } 10 < styles.content.get } 20 = COA 20 { stdWrap.required = 1 stdWrap.outerWrap.cObject = TEXT stdWrap.outerWrap.cObject { value = | if.isTrue.numRows < styles.content.get } 10 < styles.content.getRight } }
Im Stylesheet verwenden Sie beispielsweise diese Einstellungen:
Max. Linie
.beideSpalten { width: 800px; }
11.3 Inhalt nur bei Bedarf zweispaltig anzeigen | 417 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
.linkeSpalte { float: left; width: 500px; margin-right: 10px; } .rechtSpalte { float: left; width: 290px; } .clearer { clear: both; font-size: 0; line-height: 0; }
Links
... und diesen Code im TS-Setup der Seite: page = PAGE page { 10 < temp.myContent }
Diskussion Lizensiert für Markus Mueller
Wie bereits in Rezept 11.1 erwähnt, eignet sich das COA-Element hervorragend als Setzkasten, um verschiedene Inhalte zusammenzusetzen. Dabei stehen Sie jedoch häufig vor der Frage: Was tun, wenn ein oder mehrere der verwendeten Elemente nicht vorhanden sind? Wie können Sie verhindern, dass der dafür vorgesehene Bereich als leere Fläche erscheint? Ein schönes Beispiel ist die Verwendung von zweispaltigen Layouts. Dazu haben Sie den Redakteuren im Backend die Spalten normal und rechts eingerichtet. Je nachdem, welche dieser Spalten nun gefüllt ist, sollen folgende Regeln gelten. • Wenn keine Spalte gefüllt ist, soll keinerlei HTML-Code erzeugt werden. • Wenn beide Spalten gefüllt sind, soll das Layout zweispaltig sein. • Wenn nur eine der beiden Spalten gefüllt ist, soll diese sich über die ganze Seite erstrecken. Zunächst brauchen Sie den Setzkasten: das äußere COA. Es enthält je ein weiteres COAObjekt für die beiden Spalten. Das lässt Ihnen die Möglichkeit offen, für beide Spalten zusätzliche Dinge wie wrap, innerWrap und outerWrap festzulegen. Alle stdWrap-Eigenschaften der eigentlichen Spalteninhalte bleiben dabei unverändert. Damit im Fall von leeren Spalten kein HTML-Code angezeigt wird (also auch nicht der Wrap des äußeren Setzkastens), arbeiten Sie hier mit der stdWrap-Funktion required:
Max. Linie
stdWrap.required = 1 stdWrap.wrap = HTML|HTML
418 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Damit wird festgelegt, dass der umschließende HTML-Code nur ausgegeben werden soll, wenn der Setzkasten nicht leer ist. Kommen wir nun zu den einzelnen Spalten. Gesetzt den Fall, dass nur eine Spalte mit Inhalt gefüllt ist, benötigen Sie kein zusätzliches div-Tag für diese Spalte. Sollten jedoch beide Spalten gefüllt sein, müssen sie zwangsläufig in ein eigenes div-Tag gepackt werden, das Sie später mithilfe von CSS floaten lassen können. Ohne diese zusätzlichen Tags würden die Inhalte nicht nebeneinander, sondern nacheinander angezeigt werden. Um das wie gewünscht umzusetzen, benötigen Sie einen Wrap, der sich je nach Bedarf einoder ausschalten lässt. Der übliche einfache wrap fällt also aus, weil er keine stdWrap-Eigenschaften hat. Jedoch bieten sich weitere wrap-Funktionen an, die ihrerseits über stdWrapEigenschaften verfügen, wie z.B. innerWrap, innerWrap2, outerWrap. Weil Sie in diesem Fall den äußersten Rahmen der Spalten festlegen wollen, verwenden Sie outerWrap. outerWrap.cObject = TEXT outerWrap.cObject { value = HTML|HTML }
Lizensiert für Markus Mueller
In dieser Form würde outerWrap allerdings immer um die einzelnen Spalten gelegt werden. Um genau das zu verhindern, fügen Sie eine if-Abfrage hinzu. Weil keine weiteren Details für die Abfrage benötigt werden, reicht ein simples isTrue aus. Die abzufragende Bedingung lautet: Ist in der jeweils anderen Spalte Inhalt zu finden? Dies regeln Sie mithilfe von numRows. Im Prinzip gibt numRows die Anzahl von Einträgen einer select-Abfrage aus. Weil in styles.content.get bereits eine solche Abfrage enthalten ist, reicht es aus, numRows zusammen mit diesem Objekt zu verwenden. Auf diese Weise sparen Sie sich den Bau einer eigenen Abfrage. outerWrap.cObject = TEXT outerWrap.cObject { value = HTML|HTML if.isTrue.numRows < styles.content.get }
bzw. outerWrap.cObject = TEXT outerWrap.cObject { value = HTML|HTML if.isTrue.numRows < styles.content.getRight }
Diese Abfrage regelt nun, ob und wann der outerWrap-Text angewendet wird.
Max. Linie
Es gibt sicherlich auch andere Ansätze zur Lösung dieses Problems, aber dieser hier ist äußerst schlank, übersichtlich und leicht nachzuvollziehen. Das br-Element clearer wird übrigens benötigt, um sicherzustellen, dass eventuelle Browser-Bugs die zweispaltige Darstellung mit float verhindern.
11.3 Inhalt nur bei Bedarf zweispaltig anzeigen | 419 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
11.4 Mit LOAD_REGISTER und RESTORE_REGISTER Elemente zwischenspeichern
Links
Problem Sie wollen verschiedene Teile Ihres TypoScript-Templates oder auch Ergebnisse aus Funktionen einzelner Teilbereiche zwischenspeichern. Diese sollen teilweise in identischer Form, teilweise aber auch modifiziert an anderen Stellen des Templates wieder zum Einsatz kommen.
Lösung Verwenden Sie die TypoScript-Elemente LOAD_REGISTER und RESTORE_REGISTER. Die einzelnen Register innerhalb eines LOAD_REGISTER-Elements können Sie mit reinem Text befüllen:
Lizensiert für Markus Mueller
page = PAGE page { 10 = LOAD_REGISTER 10 { meinTextRegister = Das ist eine Zeile Text im Register } 20 = TEXT 20.data = register:meinTextRegister }
Oder Sie verwenden stdWrap-Funktionen, um dem Register einen Inhalt zuzuweisen: page = PAGE page { 10 = LOAD_REGISTER 10 { meinTextRegister.cObject = TEXT meinTextRegister.cObject.value = Das ist ein Textelement in einem Register } 20 = TEXT 20.data = register:meinTextRegister }
RESTORE_REGISTER löscht den letzten Eintrag aus dem Register.
Diskussion
Max. Linie
LOAD_REGISTER ist im Prinzip nichts anderes als ein Zwischenablagestapel, der per TypoScript mit beliebigen Inhalten gefüllt werden kann. Wenn Sie ein solches Register verwenden wollen, können Sie ihm einen beliebigen Namen geben. Dennoch sollten Sie aussagekräftige Bezeichnungen vorziehen.
420 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Zum Speichern eines Texts geben Sie dem Register einen Namen und weisen ihm als Wert den gewünschten Text zu. Diesen Vorgang können Sie mit einem Register beliebig oft wiederholen. Das Register funktioniert dabei nach dem Stapelprinzip. Es sind prinzipiell alle Einträge darin vorhanden, maßgeblich für die Ausgabe ist jedoch nur derjenige, der als letzter eingetragen wurde: page = PAGE page { 10 = LOAD_REGISTER 10 { meinTextRegister = Das ist der erste Text im Register } 20 = LOAD_REGISTER 20 { meinTextRegister = Das ist der zweite Text im Register } 30 = LOAD_REGISTER 30 { meinTextRegister = Das ist der dritte Text im Register } }
Lizensiert für Markus Mueller
Sobald das Register befüllt ist, kann es an beliebig vielen anderen Stellen mithilfe der stdWrap-Funktionen data oder dataWrap ausgelesen werden. page = PAGE page { 10 = LOAD_REGISTER 10 { meinTextRegister = Das ist der erste Text im Register } 20 = LOAD_REGISTER 20 { meinTextRegister = Das ist der zweite Text im Register } 30 = LOAD_REGISTER 30 { meinTextRegister = Das ist der dritte Text im Register } 40 = TEXT 40.data = register:meinTextRegister }
Wenn Sie die entsprechende Seite nun aufrufen, werden Sie lediglich die letzte Zeile Das ist der dritte Text im Register vorfinden. Um an die vorigen Einträge im Registerstapel zu gelangen, benötigen Sie das Element RESTORE_REGISTER. Es hat keinerlei weitere Parameter und entfernt lediglich den zuletzt gespeicherten Eintrag aus dem Stapel, indem es den vorigen Eintrag wiederherstellt.
Max. Linie
page = PAGE page { 10 = LOAD_REGISTER
11.4 Mit LOAD_REGISTER und RESTORE_REGISTER Elemente zwischenspeichern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 421
10 { meinTextRegister = Das ist der erste Text im Register } 20 = LOAD_REGISTER 20 { meinTextRegister = Das ist der zweite Text im Register } 30 = LOAD_REGISTER 30 { meinTextRegister = Das ist der dritte Text im Register } 40 = TEXT 40.data = register:meinTextRegister 40.wrap =
50 = RESTORE_REGISTER 60 = TEXT 60.data = register:meinTextRegister 60.wrap =
70 = RESTORE_REGISTER 80 = TEXT 80.data = register:meinTextRegister 80.wrap =
Links
} Lizensiert für Markus Mueller
Max. Linie
Wenn Sie die Seite nun aufrufen, werden Sie die drei verschiedenen Textzeilen sehen, jedoch in umgekehrter Reihenfolge gemäß dem aus der Programmierung bekannten LIFO-Prinzip – Last In First Out. Zusätzlich zu der Möglichkeit, Werte direkt zuzuweisen, bietet Ihnen LOAD_REGISTER sämtliche Funktionen des stdWrap-Baukastens. Sie können also auch ganze Blöcke von TypoScript-Code verwenden und das Ergebnis in einem Register speichern, wenn Sie beispielsweise mit der Funktion cObject arbeiten. Zusätzlich können Sie den aktuellen Wert des Registers selbst zum Befüllen ebenfalls wiederverwenden, indem Sie die stdWrap-Funktionen data oder dataWrap nutzen. Danach verändern Sie diesen Inhalt nach Wunsch. page = PAGE page { 10 = LOAD_REGISTER 10 { meinTextRegister = Das ist der erste Text im Register } 20 = TEXT 20 { data = register:meinTextRegister } 30 = LOAD_REGISTER 30 { meinTextRegister.dataWrap = {register:meinTextRegister} mit Anhang } 40 = TEXT 40 { data = register:meinTextRegister } }
422 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Max. Linie
Oder wenn Sie ganze Blöcke modifizieren wollen: page = PAGE page { 10 = LOAD_REGISTER 10 { meinTextRegister.cObject = COA meinTextRegister.cObject { wrap = | 10 = TEXT 10.value = Das ist der erste Block 10.wrap = | 20 = TEXT 20.value = Das ist Text im ersten Block 20.wrap =
|
} } 20 = LOAD_REGISTER 20 { meinTextRegister.cObject = COA meinTextRegister.cObject { wrap = | 10 = TEXT 10.value = Das ist der zweite Block 10.wrap = | 20 = TEXT 20.value = Das ist Text im zweiten Block 20.wrap =
|
} } 30 = LOAD_REGISTER 30 { meinTextRegister.cObject = COA meinTextRegister.cObject { 10 = TEXT 10.data = register:meinTextRegister 20 = TEXT 20.value = Das ist ein zweiter Text im zweiten Block 20.wrap =
|
} } 40 = TEXT 40.data = register:meinTextRegister 40.wrap =
50 = RESTORE_REGISTER 60 = TEXT 60.data = register:meinTextRegister 60.wrap =
70 = RESTORE_REGISTER 80 = TEXT 80.data = register:meinTextRegister 80.wrap =
}
11.4 Mit LOAD_REGISTER und RESTORE_REGISTER Elemente zwischenspeichern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 423
Auf diese Weise können Sie alle denkbaren Varianten von Inhalten sammeln, zwischenspeichern und wiederverwenden. Dabei müssen dies nicht immer mehrere Elemente in einem Stapel sein. Auch als reine Zwischenablage einzelner Elemente leistet LOAD_ REGISTER gute Dienste. Im Gegensatz zum Kopieren von temporären Elementen mithilfe von TypoScript wird der Code in diesem Fall nur ein einziges Mal gerendert und danach das Ergebnis kopiert. Diese Lösung ist also auch aus Gründen der Performance interessant.
Links
Innerhalb des TypoScript-Codes von CSS-styled-content wird beispielsweise ein LOAD_ REGISTER verwendet, um den Wert des Feldes header_position zusammen mit einem style-Attribut zwischenzuspeichern. Der Inhalt des Registers lautet in diesem Fall: style="text-align:[Wert von header_style];"
Danach wird das Register benutzt, um den insgesamt fünf verschiedenen Header-Typen die korrekte Ausrichtung mitzugeben. In den folgenden Rezepten und Kapiteln werden Sie des Öfteren auf diese hilfreiche Zwischenablage stoßen.
11.5 Links im Fließtext als Fußnoten ausgeben Lizensiert für Markus Mueller
Problem TYPO3 verfügt von Hause aus über komfortable Möglichkeiten zur Erzeugung von Links im Fließtext. Wenn Sie content(default) oder CSS-styled-content verwenden, ist darin bereits der erforderliche TypoScript-Code enthalten, der für die automatisierte Erzeugung und Ausgabe der Links verantwortlich ist. Links werden anhand eines speziellen TypoTags namens erkannt, das für interne wie auch externe Links automatisch beim Speichern durch den RTE erzeugt wird. Dieses TypoTag kann dabei per Mausklick im RTE oder, falls Sie keinen RTE verwenden, durch direkte Eingabe im Text erstellt werden. Unabhängig davon, welche Art von Link Sie verwenden und wie Sie diese erstellt haben, werden sie üblicherweise direkt in den ausgegebenen Fließtext eingebaut. Wenn Sie TYPO3 jedoch für wissenschaftliche Abhandlungen, Fachbücher, Doktorarbeiten oder ähnliche Projekte verwenden, ist es oft erforderlich, dass diese Links nicht direkt im Fließtext erscheinen, sondern als Fußnoten am Fuß der Seite platziert werden. Statt des eigentlichen Links soll nach dem verlinkten Text ein nummerierter Verweis erscheinen, der per Mausklick zur entsprechenden Fußnote führt.
Lösung Modifizieren Sie parseFunc.link und verwenden Sie LOAD_REGISTER.
Max. Linie
Dieser Code kommt in Ihr TS-Setup: tt_content.text.20.parseFunc.tags.link > tt_content.text.20.parseFunc.tags.link = COA
424 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Max. Linie
tt_content.text.20.parseFunc.tags.link { 10 = COA 10 { if.isTrue { typolink { parameter.data=parameters : allParams extTarget=_blank target=page } } 10 = LOAD_REGISTER 10 { linkNumber = TEXT linkNumber.dataWrap = 1+{register:currentLink} currentLink = TEXT currentLink { data = register:linkNumber prioriCalc = 1 } linkList { data = register:linkList append = TEXT append { typolink { parameter.data=parameters : allParams extTarget=_blank target=page } parseFunc { constants=1 } dataWrap (
[{register:currentLink}]| ) } } } } 20 = COA 20 { 10 = TEXT 10.current = 1 10.trim = 1 20 = TEXT 20 { if.isTrue { typolink { parameter.data=parameters : allParams extTarget=_blank target=page } }
11.5 Links im Fließtext als Fußnoten ausgeben | 425 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
data = register:currentLink typolink { parameter { data = register:currentLink wrap = #cLL| } } noTrimWrap = | <span >[|] |
Links
} } }
und dieser ins TS-Setup Ihrer Seite: config.typolinkLinkAccessRestrictedPages = 1 page = PAGE page.10 < styles.content.get page.20 = TEXT page.20.dataWrap = <strong>Liste der Links im Text:
Diskussion Lizensiert für Markus Mueller
Wenn Sie mit aktiviertem RTE eine URL oder eine E-Mail-Adresse eingeben, wird daraus automatisch ein TypoLink im Format Text. Falls Sie die Texte ohne RTE eingeben, müssen Sie die Links entsprechend formatieren. Dazu müssen Sie die URL oder die E-Mail-Adresse manuell mit dem erwähnten TypoTag umschließen. Aus einer URL http:// www.domain.tld wird also http://www.domain. tld, aus einer E-Mail-Adresse
[email protected] [email protected]. Interne Links verwenden statt einer URL oder E-Mail die UID der verlinkten Seite: Link zu Seite 123. Ohne die entsprechenden TypoTags funktioniert das Rezept bei deaktiviertem RTE nicht.
Sie verwenden externe und interne Links im Fließtext. Diese Links sollen elementübergreifend als Fußnoten am Ende jeder Seite erscheinen. Der ursprünglich verlinkte Text soll dabei im Textblock erhalten bleiben und mit einem Verweis zur passenden Fußnote versehen werden.
Max. Linie
Um dies mit Bordmitteln und ohne eine spezielle Extension zu realisieren, benötigen Sie in erster Linie zwei TypoScript-Elemente: das Element LOAD_REGISTER und die stdWrap-Funktion parseFunc sowie deren Parameter link. Mithilfe von parseFunc.link wird innerhalb von content(default) und CSS-styled-content die automatische Ausgabe von Links bewerkstelligt. In der Regel werden dabei diese Links während des Render-Vorgangs eines Textblocks direkt in den Text eingebaut.
426 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Um dies zu verhindern, müssen Sie parseFunc.link dahingehend modifizieren, dass anstatt des Links ein Zähler generiert wird, der einen Sprungverweis zur Fußnote mit der entsprechenden Nummer erhält. Dazu müssen Sie innerhalb von parseFunc.link ein LOAD_REGISTER-Element einbauen. Lesen Sie hierzu bei Bedarf Rezept 11.4, das sich mit den Grundlagen des LOAD_REGISTER-Elements beschäftigt. Für die aktuelle Problemstellung wird LOAD_REGISTER benutzt, um die echten Links gesammelt zwischenzuspeichern und am Ende der Seite auszugeben. Die Funktion parseFunc ist für die eigentliche Ausgabe des Texts verantwortlich. Damit legen Sie fest, wie TYPO3 mit HTML-Tags, TypoTags, Links und anderen Dingen verfahren soll, die der Redakteur im Backend eingegeben hat. Im Beispiel haben wir uns auf reine Textelemente beschränkt. Im Prinzip können Sie den Code jedoch auch für Links in Überschriften und anderen Feldern als bodytext verwenden. In der ersten Zeile teilen Sie TYPO3 mit, dass die bisherige Behandlung von Links komplett überschrieben werden soll. tt_content.text.20.parseFunc.tags.link >
Lizensiert für Markus Mueller
Danach weisen Sie dem Link-Bereich ein Setzkastenelement COA zu. Dieser Setzkasten enthält zwei Elemente, ein COA mit einem Element LOAD_REGISTER für die Erzeugung der Liste und ein weiteres COA für die Ausgabe der nummerierten Verweise. Sichtbar ist dabei im Frontend nur das zweite COA, weil LOAD_REGISTER lediglich intern Daten speichert, aber keine eigene Ausgabe erzeugt. tt_content.text.20.parseFunc.tags.link = COA tt_content.text.20.parseFunc.tags.link { 10 = COA 10 { if.isTrue { typolink { parameter.data=parameters : allParams extTarget=_blank target=page } } 10 = LOAD_REGISTER 10 { ... } } 20 = COA 20 { ... } }
Max. Linie
Max. Linie 11.5 Links im Fließtext als Fußnoten ausgeben | 427 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Links Die if-Abfrage am Anfang sorgt dafür, dass der Link nur ersetzt und in die Liste eingetragen wird, wenn er auch erzeugt werden konnte. Damit werden Links zu versteckten oder gelöschten Seiten automatisch nicht berücksichtigt.
Die Linkliste erzeugen Sie im Prinzip nicht anders als sonst die echten Links. Jedoch werden die Links mit den dazugehörigen Nummern im LOAD_REGISTER geparkt. Die ersten beiden Elemente dienen als Zähler. Im Beispiel heißen sie linkNumber und currentLink, die Namen sind jedoch frei wählbar. Zuerst füllen Sie linkNumber mit dem Wert des Registers currentLink, was anfangs 0 ergibt. Dann fügen Sie +1 per wrap hinzu. Im nächsten Schritt füllen Sie currentLink mit dem Inhalt von linkNumber, also x+1, und berechnen den Wert per prioriCalc. Für jeden gefundenen Link erhöht sich so der Wert von currentLink um 1. linkNumber = TEXT linkNumber.dataWrap = 1+{register:currentLink} currentLink = TEXT currentLink { data = register:linkNumber prioriCalc = 1 }
Lizensiert für Markus Mueller
Im nächsten Element erzeugen Sie den eigentlichen Link. Dazu füllen Sie das Register linkList, dessen Name ebenfalls frei wählbar ist, zunächst einmal mit sich selbst. Per append hängen Sie den neuen Linkblock als TEXT an den bisherigen Inhalt an. In diesem TEXT-Element ist die Funktion typolink enthalten. Diese erzeugt den eigentlichen Link wie bisher aus den im Feld bodytext angegebenen Parametern. Per dataWrap versehen Sie den Link nun mit einem Anker. Zusätzlich wird ihm die Verweisnummer in eckigen Klammern vorangestellt und das Ganze in einem li-Tag verpackt. linkList { data = register:linkList append = TEXT append { typolink { parameter.data=parameters : allParams extTarget=_blank target=page } parseFunc { constants=1 } dataWrap (
[{register:currentLink}]| ) } }
Max. Linie
Max. Linie 428 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Das ergibt als Eintrag z.B. für den ersten Link:
[1]Linkziel1 Für jeden weiteren Link wird ein ähnlicher Block hinzugefügt.
[1]Linkziel1 [2]Linkziel2 [3]Linkziel3 Lizensiert für Markus Mueller
Sollten Sie diesen Code mit TYPO3 in Version 3.x verwenden wollen, müssen Sie das kleine c aus cLL entfernen. Dies ist in TYPO3 4.x+ notwendig, weil ab dieser Version immer der Buchstabe c als Präfix für sämtliche mit typolink erzeugten Links verwendet wird, die auf einen Anker verweisen, um sicherzustellen, dass die ID dieses Links W3C-konform erzeugt wird. Nach W3C muss eine ID mit einem Buchstaben beginnen. In diesem Beispiel wäre das zwar auch ohne Präfix der Fall gewesen, jedoch wird bei der Erzeugung des Links nicht geprüft, ob das erste Zeichen bereits ein Buchstabe ist.
Das Element LOAD_REGISTER ist damit abgeschlossen. Im folgenden COA erstellen Sie nun den im Text sichtbaren Verweis zur Fußnote. Dieses COA besteht aus zwei Elementen – dem ursprünglich verlinkten Textbereich und dem einzufügenden Verweis zum dazugehörigen Anker. Weil der Originaltext als Inhalt an parseFunc übergeben wird, können Sie ihn per current=1 wieder einfügen. Danach werden mit trim=1 überflüssige Leerzeichen am Anfang und am Ende entfernt. 10 = TEXT 10.current = 1 10.trim = 1
Im zweiten Textelement verwenden Sie als Text die aktuelle Nummer des jeweiligen Links aus dem Register currentLink. Diese Nummer bekommt über typolink den Verweis zum passenden Anker. Hierbei können Sie sich eine Eigenschaft von typolink-Parametern zu Nutze machen, die diesen Vorgang erheblich vereinfacht:
Max. Linie
Wird bei einem typolink eine Kombination aus # und einer Zahl als alleiniger Parameter verwendet, also z.B. #123, geht TYPO3 automatisch davon aus, dass es sich um einen Anker innerhalb der aktuellen Seite handelt, und konstruiert den Link entsprechend. Es reicht also völlig aus, wenn Sie innerhalb des typolink das zuvor definierte Präfix als wrap verwenden.
11.5 Links im Fließtext als Fußnoten ausgeben | 429 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Aus kosmetischen Gründen sollten Sie den Link in ein eigenes span-Tag packen, damit Sie ihn später per CSS z.B. rot färben können. In diesem Fall wird das über noTrimWrap erreicht, damit die Leerzeichen erhalten bleiben. Auch hier wird zunächst mit einer ifAbfrage überprüft, ob der Link erzeugt werden kann. Nur dann wird der Verweis zu diesem Link ebenfalls erzeugt.
Links
Lizensiert für Markus Mueller
20 = TEXT 20 { if.isTrue { typolink { parameter.data=parameters : allParams extTarget=_blank target=page } } data = register:currentLink typolink { parameter { data = register:currentLink wrap = #cLL| } } noTrimWrap = | <span >[|] | }
Damit ist die Konstruktion der beiden Hauptteile LOAD_REGISTER und parseFunc.link abgeschlossen. Wenn Sie nun an beliebiger Stelle in Ihrer Seite das Template styles. content.get einfügen, werden die Links automatisch nummeriert und ersetzt. Um die Linkliste am Seitenende auszugeben, fügen Sie einfach nach diesem Template ein TEXTElement ein und weisen ihm das komplette Register linkList mithilfe der stdWrap-Funktion data zu. page.10 < styles.content.get page.20 = TEXT page.20.dataWrap =
Wenn Sie erreichen wollen, dass auch Links auf geschützte Seiten in der Liste auftauchen, sollten Sie den Parameter config.typolinkLinkAccessRestrictedPages = 123 verwenden. 123 steht dabei für die UID einer Seite, die ein zentrales Login-Formular bereithält. Lesen Sie hierzu auch Rezept 12.2.
11.6 Hierarchische Abschnittsübersichten Problem
Max. Linie
Sie möchten in Ihrer Abschnittsübersicht die semantische Struktur der Überschriften berücksichtigen. Je nachdem, welche der möglichen Layoutvarianten von h2 bis h5 verwendet wird, soll eine entsprechende Ebene einer ul-Liste erzeugt werden.
430 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lösung Passen Sie die Ausgabe von Abschnittsübersichten des Inhaltselements Menü/Sitemap mithilfe von renderObj, LOAD_REGISTER und if-Abfragen so an, dass unterschiedliche Überschriften je nach gewähltem Header-Layout in eigenen ul-Listen angezeigt werden.
Lizensiert für Markus Mueller
tt_content.menu.20.3 > tt_content.menu.20.3 = COA tt_content.menu.20.3 { stdWrap.wrap = | stdWrap.required = 1 10 < styles.content.get 10 { select { andWhere = sectionIndex!=0 } renderObj = COA renderObj { 5 = LOAD_REGISTER 5 { layoutTemp.dataWrap = {register:lastHeaderLayout}-{field:header_layout} layoutDifference.data = register:layoutTemp layoutDifference.prioriCalc = 1 } 10 = TEXT 10.value = 10.if { value.data = register:lastHeaderLayout equals.field = header_layout } 20 = TEXT 20.value =
20.if { value.data = register:lastHeaderLayout isGreaterThan.field = header_layout } 30 = TEXT 30.value =
30.if { value = 0 isGreaterThan.data = register:layoutDifference } 40 < .30 40.value = 40.if.value = 1 50 < .40 50.if.value = 2 60 < .40 60.if.value = 3 100 = TEXT
Max. Linie
Max. Linie 11.6 Hierarchische Abschnittsübersichten | 431 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
100 { field = header typolink.parameter.dataWrap = #{field:uid} _top wrap =
| } 200 = LOAD_REGISTER 200 { lastHeaderLayout.field = header_layout }
Links
Lizensiert für Markus Mueller
} } 20 = CASE 20 { key.stdWrap.dataWrap = {register:lastHeaderLayout}-{register:firstHeaderLayout} key.prioriCalc = 1 default = TEXT default.value = 1 = TEXT 1.value = 2 = TEXT 2.value = 3 = TEXT 3.value = 4 = TEXT 4.value = } }
Diskussion Wenn Sie für die Erstellung von Abschnittsübersichten das Inhaltselement Menü/Sitemap verwenden, haben Sie sicherlich bereits feststellen können, dass eine hierarchische Struktur dabei nicht vorgesehen ist. Es wird lediglich eine Liste von Titeln erstellt, deren Link jeweils auf den dazugehörigen Abschnittsanker verweist. Im Zeitalter der Barrierefreien Informationstechnik-Verordnung BITV und semantischer Strukturen ist es jedoch sinnvoller, diese bereits bei der Erzeugung von Navigationen zu berücksichtigen. Das W3C hat für den semantisch korrekten Einsatz von Überschriften Folgendes festgelegt: Einer Überschrift einer bestimmten Ordnung folgt immer eine Überschrift höherer, gleicher oder direkt folgender Ordnung. Das Überspringen von Ordnungen ist bei absteigender Aufeinanderfolge unzulässig. Daraus folgt: • Auf h2 folgt entweder h1, h2 oder h3, nie aber h4 oder h5. • Auf h3 folgt entweder h1, h2, h3 oder h4, nie aber h5. • Auf h4 folgt entweder h1, h2, h3, h4 oder h5.
Max. Linie
Da die Ordnung h1 für den eigentlichen Seitentitel verwendet werden sollte, bleiben für Überschriften von und in Inhaltselementen lediglich die Ordnungen h2 bis h5 übrig.
432 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Ein Menü, das auf Basis dieser Angaben erstellt wird, sollte sinnvollerweise für jede Ordnung eine entsprechende Ebene einer ul-Liste verwenden. Je nach der semantischen Ebene der Überschriften ergeben sich so verschachtelte Listen ähnlich dem in Rezept 12.11 vorgestellten Universalmenü. Um dies zu erreichen, müssen Sie zunächst das Originalmenü leeren. Danach erhält der soeben geleerte Bereich ein Setzkastenelement COA, damit Sie die verwendeten Elemente später mit einem umschließenden wrap versehen können. Das COA erhält genau ein Element, das per styles.content.get gefüllt wird. Da Sie nur einen kleinen Teil davon benötigen, wird die select-Abfrage entsprechend modifiziert und ein eigenes COA als renderObj eingebaut.
Lizensiert für Markus Mueller
tt_content.menu.20.3 > tt_content.menu.20.3 = COA tt_content.menu.20.3 { stdWrap.wrap = | stdWrap.required = 1 10 < styles.content.get 10 { select { andWhere = sectionIndex!=0 } renderObj = COA renderObj { 10 = TEXT 10.field = header 10.wrap =
} } }
Innerhalb dieses COA kommen zwei LOAD_REGISTER zum Einsatz, der Rest besteht aus simplen TEXT-Elementen, die mit if-Abfragen gesteuert werden, und einem CASEElement, das je nach der Ebene des letzten Elements in der Liste ausreichend viele schließende Tags an den Code anhängt. Jede der möglichen Optionen für das Feld header_layout entspricht einer Zahl von 0 bis 5. Im ersten LOAD_REGISTER wird eine Differenz aus den Werten des vorherigen und des aktuellen header_layout gebildet. Dabei greift es auf das zweite LOAD_REGISTER zurück, in dem der aktuelle Wert gespeichert wird. Da dies beim ersten Durchlauf noch nicht gefüllt ist, ergibt sich für die Rechenoperation ein Wert kleiner oder gleich null. Bei allen folgenden Rechenoperationen ist der Wert größer oder gleich null. Für jede der möglichen Differenzen gibt es ein passendes TEXT-Objekt, das nur berücksichtigt wird, wenn der dazugehörige Wert überschritten wird.
Max. Linie
renderObj = COA renderObj { 5 = LOAD_REGISTER
11.6 Hierarchische Abschnittsübersichten | 433 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links
5 { layoutTemp.dataWrap = {register:lastHeaderLayout}-{field:header_layout} layoutDifference.data = register:layoutTemp layoutDifference.prioriCalc = 1
Lizensiert für Markus Mueller
} 10 = TEXT 10.value = 10.if { value.data = register:lastHeaderLayout equals.field = header_layout } 20 = TEXT 20.value =
20.if { value.data = register:lastHeaderLayout isGreaterThan.field = header_layout } 30 = TEXT 30.value =
30.if { value = 0 isGreaterThan.data = register:layoutDifference } 40 < .30 40.value = 40.if .value = 1 50 < .40 50.if.value = 2 60 < .40 60.if.value = 3 100 = TEXT 100 { field = header typolink.parameter.dataWrap = #{field:uid} _top wrap =
| } 200 = LOAD_REGISTER 200 { lastHeaderLayout.field = header_layout } }
Verwenden Sie bei den if-Abfragen isGreaterThan anstelle von equals, weil Sie damit sicherstellen, dass nicht nur ein Element, sondern alle in Frage kommenden berücksichtigt werden. Ist die Differenz zum Vorgänger z.B. größer als drei, kommen die Elemente 30, 40, 50 und 60 direkt nacheinander zum Einsatz und nicht nur Element 60. Für eine angenommene Struktur
Max. Linie
Layout 2 Layout 3 Layout 4 Layout 4
434 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Layout 3 Layout 4 Layout 2
ergibt sich folgender Durchlauf: • Layout 2: header_layout ist größer als das noch nicht vorhandene Register lastHeaderLayout, was einem Wert von 0 entspricht. Element 20 erzeugt ein öffnendes ul-Tag. Element 100 erzeugt den Link mit einem öffnenden li-Tag. Element 200 füllt das Register lastHeaderLayout. • Layout 3: header_layout ist größer als lastHeaderLayout. Element 20 erzeugt wieder ein öffnendes ul-Tag, Element 100 den Link, und Element 200 füllt das Register. • Layout 4: Wie Layout 3. • Layout 4: header-layout ist gleich lastHeaderLayout. Element 10 erzeugt ein schließendes li-Tag. • Layout 3: Die Differenz von header-layout zum Vorgänger ist 1. Element 30 erzeugt schließende Tags für li, ul und li, Element 100 den Link. Element 200 füllt das Register. • Layout 4: Wie Layout 4 oben. Lizensiert für Markus Mueller
• Layout 2: Die Differenz zum Vorgänger ist 2. Element 30 erzeugt die schließenden Tags. Element 40 erzeugt weitere schließende Tags, um die Ebene korrekt abzuschließen, Element 100 den Link. Element 200 füllt das Register. Das CASE-Element erzeugt die letzten schließenden Tags, indem es die Startebene mit der Ebene des letzten Elements vergleicht und das entsprechende TEXT-Element verwendet. 20 = CASE 20 { key.stdWrap.dataWrap = {register:lastHeaderLayout}-{register:firstHeaderLayout} key.prioriCalc = 1 default = TEXT default.value = 1 = TEXT 1.value = 2 = TEXT 2.value = 3 = TEXT 3.value = 4 = TEXT 4.value = }
Nach diesem Prinzip werden sämtliche Ebenen korrekt ineinander verschachtelt, und Sie erhalten ein semantisch identisch strukturiertes Abbild der Überschriften Ihrer Seite.
Max. Linie
Max. Linie 11.6 Hierarchische Abschnittsübersichten | 435 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
11.7 Vorhandene TypoScript-Register finden und nutzen
Links
Problem Sie nutzen beim Einsatz von TypoScript bereits eigene Register, um zum Beispiel Inhalte zwischenzuspeichern und wiederzuverwenden oder um bestimmte Zählwerte beim Durchlauf verschiedener Programmschleifen zu ermitteln. Aus Gründen der besseren Performance und um das Rad nicht immer neu erfinden zu müssen, wollen Sie dabei nur solche Register verwenden, die nicht bereits vom TYPO3Kern selbst oder durch System-Extensions wie CSS-styled-content zur Verfügung gestellt werden. Sie wollen daher zunächst in Erfahrung bringen, welche Register bereits genutzt werden und welche Werte sich darin befinden.
Lösung Erzeugen Sie eine eigene kleine PHP-Datei namens debug_register.php mit folgendem Code: Lizensiert für Markus Mueller
Laden Sie diese nun ins fileadmin-Verzeichnis hoch und binden Sie den Pfad dorthin sowie den Funktionsaufruf am Ende Ihrer Seite ein, indem Sie dort ein USER_INT-Element platzieren: page.2000 = USER_INT page.2000 { includeLibs = fileadmin/debug_register.php userFunc = user_debug_register->user_main }
Sie sehen nun bei jedem Aufruf einer Seite die zum Zeitpunkt des Aufrufs verwendeten Register.
Diskussion
Max. Linie
Wenn Sie schon mit den TypoScript-Elementen LOAD_REGISTER und RESTORE_ REGISTER gearbeitet haben, wurden intern bereits Bereiche genutzt, die Sie mit dem gezeigten Codebeispiel sichtbar machen können. Es handelt sich dabei um Teilbereiche des TypoScript-Frontends, auch TSFE genannt, die register und registerStack genannt werden.
436 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Das register selbst ist ein Array, in dem sich jeweils Paare aus Schlüsseln und Werten befinden, wobei der Schlüssel dem Registernamen entspricht und der Wert dem aktuellen Inhalt des Registers. Der registerStack wiederum ist ein Array, das für jeden vorherigen Zustand von register ein Sub-Array enthält. Diese Sub-Arrays werden mit numerischen Schlüsseln angesprochen und können per LOAD_REGISTER hinzugefügt oder per RESTORE_REGISTER wieder entfernt werden. Dabei kommt ein recht einfacher Mechanismus zum Einsatz. Bei jedem Einsatz von LOAD_REGISTER wird zunächst eine Kopie des aktuellen Registers als neues Sub-Array im registerStack abgelegt. Danach werden mögliche neue Werte des aktuellen register-Arrays ermittelt und dort gespeichert. Bei Verwendung von RESTORE_REGISTER verhält es sich umgekehrt. Das aktuelle Register wird mit dem letzten Sub-Array aus dem registerStack überschrieben. Danach wird dieses Sub-Array aus dem registerStack entfernt.
Lizensiert für Markus Mueller
Die logische Konsequenz daraus ist, dass Sie nie wirklich exakt bestimmen können, welche Register zum Einsatz gekommen sind und welche Werte sich zu welchem Zeitpunkt darin befunden haben. Hinsichtlich der Verwendung von LOAD_REGISTER und RESTORE_REGISTER innerhalb von TypoScript-Templates ist das jedoch nicht wirklich relevant, weil Sie die Möglichkeit haben, über den TypoScript-Object-Browser herauszufinden, wo diese Elemente zum Einsatz kommen. Der oben gezeigte Code lässt zunächst nur einen Einblick in den letzten Zustand der beiden Arrays register und registerStack zu, nachdem die Seite also solche komplett gerendert wurde. Wenn Sie ihn im Zusammenspiel mit CSS-styled-content verwenden und sich auf der ausgegebenen Seite bestimmte Inhaltselemente befinden, werden Sie zwei interessante Dinge feststellen können: 1. Der Inhalt des Registers variiert je nachdem, ob Sie den Cache gelöscht haben oder nicht. Einige Register werden also offensichtlich auch dann befüllt, wenn der Seiteninhalt aus dem Cache geholt wird. 2. Es befindet sich speziell nach gelöschtem Cache noch eine Reihe von Einträgen im Register. Wenn Sie z.B. einen Text mit einem Bildelement verwendet haben, werden sich vermutlich Schlüssel wie IMAGE_NUM_CURRENT oder ORIG_FILENAME darin befinden. Speziell dann, wenn Sie mehrere Bilder in einem Element verwenden, könnte es daher interessant sein, den gesamten Verlauf des Registers zu beobachten. Dazu müssen Sie lediglich dafür sorgen, dass die debug-Funktion nicht nur am Ende der Seite, sondern während des gesamten Render-Vorgangs für jedes einzelne Bild separat aufgerufen wird. Ändern Sie daher den Code folgendermaßen ab:
Max. Linie
page.includeLibs.debug_register = fileadmin/debug_register.php tt_content.stdWrap.append = USER
11.7 Vorhandene TypoScript-Register finden und nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 437
tt_content.stdWrap.append { userFunc = user_debug_register->user_main } tt_content.image.20.1.stdWrap.append = USER tt_content.image.20.1.stdWrap.append { userFunc = user_debug_register->user_main } page = PAGE page.10 < styles.content.get page.2000 = USER page.2000 { userFunc = user_debug_register->user_main }
Links
Im ersten Abschnitt erzeugen Sie mithilfe von tt_content.stdWrap.append einen Aufruf der debug-Funktion nach jedem einzelnen Inhaltselement. Der nächste Abschnitt geht eine Ebene tiefer und sorgt im Bereich tt_content.image.20.1 seinerseits mithilfe von stdWrap.append dafür, dass nach jedem einzelnen Bild ebenfalls die debug-Funktion aufgerufen wird.
Lizensiert für Markus Mueller
Wie Sie an der Ausgabe erkennen können, verändern sich die Inhalte einiger Register dabei kontinuierlich. Andere Register sind während der Ausgabe der eigentlichen Bilder noch gar nicht vorhanden und werden offensichtlich erst später erzeugt und mit entsprechenden Werten befüllt. Der registerStack ist in jedem Fall leer, was zwei Schlussfolgerungen zulässt: Entweder wurde keinerlei LOAD_REGISTER-Element genutzt, oder es wurden ausreichend viele RESTORE_REGISTER-Elemente verwendet, um den registerStack wieder in seinen Urzustand zu versetzen. Letzteres ist übrigens in diesem Fall die korrekte Aussage, denn unter CSSstyled-content kommen im Bereich lib.stdHeader sehr wohl LOAD_REGISTER-Elemente zum Einsatz, diese wurden jedoch zum Zeitpunkt des Aufrufs der debug-Funktion jeweils komplett abgearbeitet und sind bereits aus dem registerStack entfernt.
Damit Sie nun nicht jedes einzelne TypoScript-Element mit einem zusätzlichen Aufruf der gezeigten debug-Funktion versehen müssen, um eventuell zur Verfügung stehenden Registereinträgen auf die Spur zu kommen, haben wir im Folgenden eine Liste der Default-Register und ihres jeweiligen Einsatzzwecks zusammengestellt. Dennoch kann Ihnen die Funktion hilfreich zur Seite stehen, wenn Sie das Verhalten Ihrer eigenen LOAD_REGISTER-Elemente nachverfolgen wollen. Diese Register stehen Ihnen bei Verwendung des TYPO3-Kerns und der Extension CSSstyled-content automatisch zur Verfügung. Wenn Sie darauf zugreifen möchten, können Sie dafür eine der folgenden Codevarianten verwenden.
Max. Linie
temp.meinRegisterWert = TEXT temp.meinRegisterWert { data = register:registerName }
438 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
temp.meinRegisterWert = TEXT temp.meinRegisterWert { dataWrap = Der Wert von registerName ist: {register:registerName} } temp.meinRegisterWert = TEXT temp.meinRegisterWert { value = Der Wert von registerName ist: {register:registerName} inserData = 1 }
columnwidth Bei der Berechnung von mehreren Bildern für die Bereiche tt_content.image und tt_content.textpic muss CSS-styled-content je nach Anzahl der Bilder einen Bildblock erzeugen, der aus Spalten und Reihen besteht. In diesem Register befindet sich der Wert für die Breite des jeweils breitesten Bilds einer Spalte inklusive eventuell nötiger seitlicher Abstände.
count_menuItems
Lizensiert für Markus Mueller
Dieses Register kommt beim Rendern von Menüs zum Einsatz und enthält immer die Anzahl aller Elemente des jeweiligen Menüabschnitts. Auf der ersten Ebene ist das die Anzahl der Hauptseiten des Menüs, auf jeder folgenden Ebene die Anzahl der jeweiligen direkten Kinder der übergeordneten Seite. Mit dieser Angabe können Sie z.B. dafür sorgen, dass ein Menü erst dann überhaupt dargestellt wird, wenn es eine bestimmte Mindestanzahl an Elementen aufweist.
count_HMENU_MENUOBJ bzw. count_MENUOBJ Beim Rendern von Menüs werden diese Register als Zählregister benutzt und für jeden sichtbaren Menüeintrag um eins erhöht. Dabei wird jedoch nicht pro Ebene separat gezählt, sondern durchgehend für das gesamte sichtbare Menü. Eine separate Auswertung pro Ebene ist daher nicht möglich und müsste mit einem eigenen LOAD_REGISTER realisiert werden.
headerStyle bzw. headerClass Diese Register werden von CSS-styled-content im Bereich lib.stdheader verwendet, um für verschiedene Layoutvarianten der Überschriften eines Inhaltselements die passenden Styles und CSS-Klassen vorzuhalten. Sie werden per LOAD_REGISTER erzeugt und nach Verwendung per RESTORE_REGISTER wieder gelöscht, stehen also nur während des Renderns einer Überschrift zur Verfügung.
ICON_REL_PATH
Max. Linie
Hier wird bei Verwendung von CSS-styled-content für den Bereich tt_content.uploads der Pfad zum jeweils passenden Icon einer Datei gespeichert. Dieser Pfad wird danach von einem IMAGE-Element genutzt, um das Icon für diese Datei zu rendern.
11.7 Vorhandene TypoScript-Register finden und nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 439
Max. Linie
IMAGE_NUM bzw. IMAGE_NUM_CURRENT
Links
CSS-styled-content berechnet in den Bereichen tt_content.image und tt_content.textpic die jeweils in den Inhaltselementen verwendeten Bilder einzeln, um sie danach auszugeben. Um jedem Bild weitere Informationen zuordnen zu können, die ebenfalls in Form einer separierten Liste vorliegen, benötigt man die Positionsnummer des aktuell berechneten Bilds. Diese wird zum Beispiel verwendet, um passende Alternativtexte oder Bildunterschriften auszuwählen.
imageheight, imagespace bzw. imagewidth Beim Rendern eines einzelnen Bilds durch CSS-styled-content befindet sich in diesen Registern der Wert für Höhe, Abstand oder Breite des Bilds, nachdem sämtliche Skalierungsoder Beschnittfunktionen ausgeführt wurden. Diese Register werden bei Verwendung mehrerer Bilder jedes Mal überschrieben und enthalten am Ende nur noch die Werte des jeweils letzten Bilds.
ORIG_FILENAME
Lizensiert für Markus Mueller
Bei Verwendung von CSS-styled-content werden in den Bereichen tt_content.image und tt_content.textpic die jeweils in den Inhaltselementen verwendeten Bilder zunächst umgerechnet, dann in einem temporären Ordner abgelegt und schließlich ausgegeben. In diesem Register befindet sich für jedes einzelne Bild zum Zeitpunkt seiner Berechnung der Pfad zur Originaldatei. Sie können diesen Pfad zum Beispiel nutzen, um die Bilder mit Links zu versehen, die es dem User ermöglichen, die Originale herunterzuladen.
rowwidth bzw. rowWidthPlusTextMargin Bei der Berechnung von mehreren Bildern für die Bereiche tt_content.image und tt_ content.textpic muss CSS-styled-content je nach Anzahl einen Bildblock erzeugen, der aus Spalten und Reihen besteht. In diesen Registern befindet sich der Wert für die Breite der jeweils breitesten Reihe. Letzteres verwendet den Wert inklusive eventuell nötiger seitlicher Abstände.
SPLIT_COUNT Hier finden Sie beim Einsatz der stdWrap-Funktion split die Positionsnummer des aktuell gerenderten Abschnitts. Dies ist besonders nützlich, wenn Sie andere Inhalte hinzufügen müssen, die ebenfalls vorher in Abschnitte zerlegt wurden, wie zum Beispiel eine Reihe von Bildern mit dazugehörigen Bildunterschriften.
SUBPART_XXX
Max. Linie
Wenn Sie das TypoScript-Element TEMPLATE und darin den Bereich subparts verwenden, erhält jeder Subpart einen eigenen Platz im Register. Der Name des Registers entspricht dem Namen des Subparts mit vorangestelltem SUBPART_. Das XXX steht hier also
440 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
für einen beliebigen Namen. Auf diese Weise können Sie den Inhalt eines Subparts ganz einfach direkt aus dem Register abrufen, um ihn mehrfach auszugeben, und müssen ihn nicht jedes Mal neu berechnen lassen.
SWORD_PARAMS Dieses Register dient der Ablage vom User eingegebener Suchbegriffe. Es wird zum Beispiel von CSS-styled-content ausgewertet, um diese Suchbegriffe als additionalParams an einen typolink anzuhängen.
SYS_LASTCHANGED In diesem Register befindet sich immer der Zeitstempel des jeweils jüngsten Elements einer Seite. Dies kann nach einer entsprechenden Änderung die Seite selbst sein, der Zeitstempel wird jedoch auch dann geändert, wenn sich eines der Inhaltselemente geändert hat. Wollen Sie also einen Text der Art »Zuletzt geändert am ...« ausgeben, brauchen Sie dazu nicht extra eine Datenbankabfrage vorzunehmen.
totalwidth Lizensiert für Markus Mueller
Bei der Berechnung von mehreren Bildern für die Bereiche tt_content.image und tt_content.textpic muss CSS-styled-content je nach Anzahl einen Bildblock erzeugen, der aus Spalten und Reihen besteht. In diesem Register befindet sich der Wert für die Gesamtbreite des Bildblocks inklusive seitlicher Abstände der einzelnen Bilder bzw. Spalten. Beim Einsatz einer der vielen hundert Extensions, die für TYPO3 verfügbar sind, stoßen Sie gegebenenfalls auf weitere Register, für die sich wiederum mit der zuerst gezeigten Lösung eine Debug-Ausgabe erzeugen lässt. Einige der hier gezeigten Register werden Sie außerdem in weiteren Rezepten dieses Buchs im Einsatz erleben können.
Siehe auch Lesen Sie die Rezepte 11.4, 11.5 und 11.6, wenn Sie weitere Möglichkeiten für den Einsatz von Registern kennenlernen wollen.
11.8 Mit dem GIFBUILDER einfache Grafiken erstellen Problem Sie wollen eine Seite gemäß den Vorgaben zur Corporate Identity Ihres Kunden gestalten. Dabei müssen Sie Buttons erzeugen, die in der Hausschrift des Kunden beschriftet werden.
Max. Linie
Weil diese Hausschrift nicht als Standardschriftart auf allen Systemen zur Verfügung steht, müssen Sie die Buttons als Grafiken erstellen. Dies soll von TYPO3 automatisch erledigt werden, wobei die Beschriftung der Buttons jeweils aus der Datenbank ausgelesen wird.
11.8 Mit dem GIFBUILDER einfache Grafiken erstellen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 441
Max. Linie
Lösung
Links
Verwenden Sie die Hausschrift des Kunden und nutzen Sie die Objekte TEXT und BOX des GIFBUILDER. Für das Setup des GIFBUILDER kommt dieser Code in Ihr TS-Setup:
Lizensiert für Markus Mueller
temp.gifBuilderSetup = GIFBUILDER temp.gifBuilderSetup { XY = [20.w]+20,30 backColor = #FF8700 10 = BOX 10 { dimensions = 0,0,[20.w]+20,2 color = #69A500 align = l,b } 20 = TEXT 20 { text.field = title fontFile = fileadmin/fonts/hausschrift.ttf fontSize = 20 fontColor = #ffffff offset = 10,22 } }
So verwenden Sie diesen Code als einfache Grafik im Inhalt: page = PAGE page { 10 = IMAGE 10 { file < temp.gifBuilderSetup wrap = | } }
Und so in einem GMENU:
Max. Linie
temp.grafikMenu = HMENU temp.grafikMenu { wrap = | entryLevel = 0 1 = GMENU 1 { expAll = 1 wrap =
NO = 1 NO < temp.gifBuilderSetup NO.allWrap =
| IFSUB < .NO IFSUB { allWrap =
| } }
442 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
2 < .1 2 { wrap = } 3 < .2 } page = PAGE page { 10 < temp.grafikMenu }
Diskussion Für das automatische Generieren und Bearbeiten von Bildern, Icons, Grafiken und grafischen Beschriftungen bringt TYPO3 eine integrierte Bildverarbeitung mit. Auf der einen Seite nutzt es die Funktionalitäten des Grafikpakets ImageMagick, auf der anderen Seite die der PHP-Module gdlib1 oder gdlib2.
Lizensiert für Markus Mueller
Wenn Sie gdlib2 auf Ihrem Server installiert haben, können Sie trotz der Bezeichnung GIFBUILDER auch Grafiken erzeugen, die über mehr als die bei GIF-Dateien üblichen 256 Farben verfügen. Mit der Vorgängerversion gdlib1 ist dies nicht möglich.
Eine Kombination aus verschiedenen Steuerfunktionen für diese beiden Grafikwerkzeuge in einem TypoScript-Element ist der sogenannte GIFBUILDER. Im Prinzip funktioniert der GIFBUILDER wie eines der gängigen Grafik- oder Bildbearbeitungsprogramme. Sie arbeiten in verschiedenen Ebenen, die vom GIFBUILDER wie die Folien eines Overheadprojektors übereinander gelegt werden und letztlich eine einzelne Grafikdatei als Ergebnis liefern. Jede dieser Ebenen wird, wie bereits von den TypoScript-Elementen PAGE und COA bekannt, durch einen numerischen Bereich markiert. Die Reihenfolge der Ebenen entspricht dabei immer der numerischen Reihenfolge und nicht der eigentlichen Reihenfolge im TS-Setup. Sie sollten daher immer in Schritten von mindestens 10 arbeiten, damit Sie später gegebenenfalls weitere Ebenen einfügen können. Innerhalb jeder Ebene können Sie entweder mit Objekten wie TEXT, IMAGE, OUTLINE oder BOX arbeiten oder Funktionen wie EFFECTS, EMBOSS, SHADOW, SCALE, WORKAREA und CROP einfügen, die die Darstellung der darunterliegenden Ebenen beeinflussen. Zusätzlich besteht die Möglichkeit, auf TEXT-Ebenen direkt mit den Funktionen zu arbeiten oder IMAGE-Ebenen mit einer Maske zu versehen. Auch Verschachtelungen des GIFBUILDER sind möglich, indem Sie auf IMAGE-Ebenen oder in deren Masken ein weiteres GIFBUILDER-Objekt erzeugen.
Max. Linie
Max. Linie 11.8 Mit dem GIFBUILDER einfache Grafiken erstellen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 443
In der Lösung haben wir einen einfachen Aufbau einer solchen GIFBUILDER-Grafik verwendet, wie er sehr häufig in Menüs oder als Button zum Einsatz kommt. Sie besteht aus einer Hintergrundfarbe, einem BOX-Objekt, um eine Linie zu erzeugen, und dem eigentlichen TEXT.
Links
Zuerst legen Sie mit XY Breite und Höhe der Grafik fest. Die beiden Werte werden durch ein Komma getrennt. Da Sie nicht wissen können, wie groß der verwendete Text später sein wird, haben Sie hier die Möglichkeit, sich auf bestimmte Objektebenen zu beziehen und deren Maße abzufragen. Dazu schreiben Sie die Objetktnummer gefolgt von .w für die Breite oder .h für die Höhe in eckige Klammern. Zusätzlich können Sie noch mit normalen Rechenoperationen arbeiten. Auch der Bezug auf mehrere Objekte innerhalb einer Rechenoperation ist erlaubt. XY = 100,30
oder XY = [10.w]+20,30
oder XY = [10.w]-[30.w]+20,[30.h]
Lizensiert für Markus Mueller
Nach der Bemaßung weisen Sie der Grafik mithilfe des Parameters backColor eine Hintergrundfarbe zu. Die Farbe können Sie entweder als HTML-Farbe mit Namen wie z.B. aqua oder hexadezimal, z.B. #123456, oder als kommaseparierte Liste von RGB-Werten 123,123,123 angeben. Zusätzlich sind auch Berechnungen mit +, – oder * erlaubt, um z.B. hellere oder dunklere Werte derselben Farbe zu erhalten oder den Tonwert zu verschieben. Diese wirken sich jedoch immer auf alle RGB-Kanäle gleichzeitig aus. Wenn Sie keine Farbe angeben, wird als Default mit Weiß gearbeitet. backColor = red
oder backColor = #ff0000
oder backColor = 255,0,0
oder backColor = 255,0,0 : *0.5
oder backColor = 255,0,0 : -64
Max. Linie
Die auf drei Stellen reduzierte Schreibweise von Hexadezimalwerten, z.B. #fc9 anstatt #ffcc99, wie sie in Stylesheets zum Einsatz kommt, funktioniert nicht!
444 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
backColor ist einer der wenigen Parameter im GIFBUILDER, die Sie auch mithilfe von stdWrap-Funktionen bearbeiten können. So ist es z.B. möglich, die gewünschte Hinter-
grundfarbe aus einem Datenbankfeld auszulesen, damit die Redakteure später selbstständig die Hintergrundfarbe bestimmen können. backColor.field = meineHintergrundfarbe
Es folgt die erste Ebene, die in diesem Fall aus einem BOX-Objekt besteht. Wie der Name vermuten lässt, dienen BOX-Objekte dazu, rechteckige Formen mit verschiedenen Maßen und Farben zu erzeugen. Hierzu gibt es drei Parameter innerhalb einer BOX: dimensions, color und align. Mit dimensions legen Sie ähnlich wie schon für XY die Größe des Rechtecks fest. In diesem Fall kommen zwei weitere Werte hinzu, mit denen Sie den linken oberen Eckpunkt der BOX festlegen können. Die Reihenfolge der mit Kommata separierten Werte ist: Startpunkt X, Startpunkt Y, Breite, Höhe
Lizensiert für Markus Mueller
Bei jedem dieser Werte können Sie wie bereits für XY beschrieben mit Rechenoperationen und Bezügen auf andere Elemente arbeiten. Der Parameter color bestimmt die Füllfarbe des Rechtecks. Die erlaubten Werte und Berechnungen sind identisch mit denen von backColor. Mithilfe von align können Sie das Rechteck innerhalb der Arbeitsfläche ausrichten. Damit werden die vorher gegebenenfalls festgelegten Werte für die Startpunkte X und Y überschrieben. Die Reihenfolge der durch ein Komma getrennten Werte ist: Horizontale Ausrichtung, Vertikale Ausrichtung
Zulässige Angaben für die horizontale Ausrichtung sind r, c oder l für right, center oder left. Bei der vertikalen Ausrichtung können Sie t, c oder b für top, center oder bottom verwenden. In unserem Beispiel erzeugen Sie ein Rechteck, das an der linken oberen Ecke der Grafik beginnt und bei einer Höhe von 2 px genauso breit wird wie der Text auf Ebene 20. Es erhält eine grüne Füllfarbe und wird danach linksbündig an der Unterkante der Grafik ausgerichtet. 10 = BOX 10 { dimensions = 0,0,[20.w]+20,2 color = #69A500 align = l,b }
Abschließend folgt die eigentliche TEXT-Ebene, auf deren Maße sich sowohl die Grundfläche der Grafik als auch das BOX-Objekt bereits beziehen. Die grundlegenden Parameter für die Erzeugung eines Texts haben wir in unserem Beispiel verwendet.
Max. Linie
Das TEXT-Objekt des GIFBUILDER ist nicht zu verwechseln mit dem TypoScript-Element TEXT, das Sie zur Erzeugung von HTML-Texten verwenden. Die dort verfügbaren Parameter funktionieren innerhalb des GIFBUILDER nur teilweise oder gar nicht!
11.8 Mit dem GIFBUILDER einfache Grafiken erstellen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 445
Sie benötigen den Parameter text, um den Text entweder manuell oder wie im Beispiel über eine stdWrap-Funktion aus der Datenbank auszulesen, fontFile, um anzugeben, wo die Datei für die gewünschte Schriftart zu finden ist, fontSize und fontColor für Schriftgröße und -farbe sowie offset für die Positionierung des Texts auf der Arbeitsfläche.
Links
Der Parameter fontColor bietet die gleichen Möglichkeiten für Werteangaben, wie bereits für backColor beschrieben. Leider können Sie fontSize nur als absoluten Pixelwert angeben und nicht auf die Maße anderer Elemente beziehen oder berechnen. Wenn Sie außer für text keine weiteren Angaben machen, wird als Default die Schriftart Nimbus mit 12 px Größe in Schwarz verwendet. Ohne eine korrekte Angabe des offset-Parameters werden Sie keinen Text auf Ihrer Arbeitsfläche vorfinden. Dies liegt daran, dass die vertikale Positionierung des Texts anhand seiner Grundlinie vorgenommen wird. Da sich der Koordinatenpunkt 0,0 an der linken oberen Ecke der Arbeitsfläche befindet, führt ein nicht gesetzter offset-Wert dazu, dass der Text zu hoch und damit außerhalb der Arbeitsfläche positioniert wird. Sie sollten daher als zweiten Wert für offset immer mindestens die Schriftgröße angeben.
Lizensiert für Markus Mueller
Fügen Sie die auf diese Weise erzeugte Grafik nun z.B. als Seitenüberschrift oder als Button in ein Grafikmenü ein. Falls Sie noch nicht wissen, wie Seiteninhalte oder grafische Menüs erzeugt werden, lesen Sie vorher die entsprechenden Rezepte in den Kapiteln 9, 12 und 13.
11.9 Zugängliche grafische Header anlegen Problem Sie wollen eine Seite gemäß den Richtlinien für zugängliche Webseiten gestalten. Sie wollen dabei für Überschriften die üblichen Tags von h1 bis h5 benutzen und diese semantisch korrekt einsetzen. Ihr Kunde besteht jedoch darauf, bestimmte Schriften, die in seinem Styleguide definiert sind, zu verwenden. Sie können daher auf den Einsatz von Grafiken nicht verzichten, um sicherzustellen, dass auch die Schriften des Styleguides, die nicht auf dem System des Betrachters installiert sind, korrekt angezeigt werden. Diese Grafiken sollen von TYPO3 automatisch generiert werden.
Lösung Verändern Sie die Ausgabe von lib.stdheader. Verwenden Sie dazu die Elemente IMG_ RESOURCE und GIFBUILDER sowie dynamisch erzeugte Inline-Styles.
Max. Linie
Dieser Code kommt in Ihr TS-Setup: lib.stdheader.10 { 1 >
446 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Max. Linie
2 > 3 > 4 > 5 > } lib.stdheader.10 { 1 = IMG_RESOURCE 1 { file = GIFBUILDER file { XY = [10.w]+10,[10.h]+10 backColor = #ffffff transparentColor = #ffffff transparentBackground = 1 10 = TEXT 10 { text.field = header fontSize = 32px fontFile = fileadmin/fonts/GEO231H.TTF fontColor = #ff0000 offset = 0,32 } } stdWrap { prepend = TEXT prepend { dataWrap = 30 = TEXT 30.value = <span style="display:block; width:1px; height:1px; overflow: hidden;"> } append = TEXT append { current = 1 wrap = | } } } 2 < .1 2 { file.10.fontSize = 28px file.10.offset = 0,28 stdWrap { prepend { dataWrap = }
450 | Kapitel 11: Funktionale TypoScript-Elemente verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
append = TEXT append { field = header wrap = | } }
Per prepend erzeugen Sie ein TEXT-Element mit dem Wert der ursprünglichen h1-classZuweisungen. In unserem Beispiel gehen wir wie gesagt von CSS-styled-content aus. Dort kommen die Register headerStyle und headerClass zum Einsatz. Das prepend-Element endet mit style=, denn die folgenden CSS-Eigenschaften erzeugen Sie mit der nächsten stdWrap-Funktion. In diesem Fall verwenden Sie die Funktion innerWrap. Der Einfachheit halber haben wir in diesem Beispiel den innerWrap mithilfe eines COA-Elements in drei Teile zerlegt. Bei den folgenden Kopien des Setup-Elements für die weiteren Überschriftentypen müssen Sie dann nur noch den variablen Teil ändern und nicht jedes Mal die komplette Zeile einfügen.
Lizensiert für Markus Mueller
Max. Linie
Im ersten Teil wird der Wert des IMG_RESOURCE-Elements in background:url eingefügt und erhält zusätzlich die Eigenschaften no-repeat und display:block. Die Höhe des gesamten h1-Tags soll 40 px betragen. Im zweiten Teil wird die Breite festgelegt, die für alle Überschriften identisch sein soll. Im dritten Teil wird schließlich das span-Tag erzeugt, mit dem der Text versteckt wird. Gegebenenfalls müssen Sie die Werte für die Größen je nach verwendeter Schriftart ein wenig anpassen. Per append wird nun ein letztes TEXT-Element angehängt, das den eigentlichen Text der Überschrift und die schließenden span- und h1-Tags enthält. Für den folgenden Überschriftentyp wird nun zunächst eine Kopie gemacht. Da sich für jede Kopie nur ein Teil der Daten ändern muss, werden in der dazugehörigen geschweiften Klammer auch nur diese Daten aufgeführt. Alle anderen bleiben so erhalten, wie Sie sie für den ersten Überschriftentyp festgelegt haben. 2 < .1 2 { file.10.fontSize = 28px file.10.offset = 0,28 stdWrap { prepend { dataWrap =
13.12 Eine HTML-Vorlage verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 589
Max. Linie
Links
Lizensiert für Markus Mueller
TYPO3 Kochbuch
Inhalt xcbs e e rweeeeeeeeee rew
In der Beispieldatei können Sie die folgenden besonderen Markierungen erkennen:
Max. Linie
###DOKUMENT### Diese Markierung wird als Hauptunterteilung verwendet. Wir wollen lediglich diesen Teil der HTML-Vorlage verwenden und die restlichen Teile unberücksichtigt lassen, weil TYPO3 den -Bereich bereits automatisch für uns erzeugt und wir diesen später nicht doppelt in der Ausgabe haben wollen.
590 | Kapitel 13: Statische und dynamische Inhalte ausgeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
###PAGETITLE### Hier werden Sie dynamisch den Seitentitel einbinden. ###NAVIGATION### Dieser Platzhalter steht für das Hauptmenü, das später an dieser Stelle dynamisch von TYPO3 eingebunden werden soll. ###CONTENT### Dies ist der Bereich, in dem der eigentliche dynamische Inhalt ausgegeben werden soll. Fügen Sie nun das folgende TypoScript-Setup in Ihr TypoScript-Template ein:
Lizensiert für Markus Mueller
Max. Linie
// Anlegen eines temporären Objekts für eine Navigation // wird später als Kopie in die Ausgabe eingebunden temp.navigation.main = HMENU temp.navigation.main { wrap = | 1 = TMENU 1 { wrap =
NO { wrapItemAndSub =
| } } 2 < .1 3 < .1 } // hier die Definition des PAGE-Objekts mit Verwendung des TEMPLATE-Objekts // Einbindung einer HTML-Designvorlage page = PAGE page { 100 = TEMPLATE 100 { template = FILE template { file = fileadmin/vorlagen/index.html } workOnSubpart = DOKUMENT marks { PAGETITLE = TEXT PAGETITLE { field = title } } subparts { NAVIGATION < temp.navigation.main CONTENT < styles.content.get } } }
13.12 Eine HTML-Vorlage verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 591
Zunächst erzeugen Sie, wie bereits hinlänglich bekannt, ein PAGE-Objekt. Als Ausgabeobjekt innerhalb des PAGE-Objekts verwenden Sie in diesem Fall jedoch nicht direkt eines der bekannten cObjects TEXT oder CONTENT, sondern das TEMPLATE-Objekt.
Links
Zunächst müssen Sie das TEMPLATE-Objekt mit einer Vorlage füllen, theoretisch können Sie dazu beliebige cObjects benutzen, sinnvoll ist hier die Verwendung eines FILEObjekts, was eine Datei aus dem Dateisystem einliest. Der Inhalt der Datei wird somit an das TEMPLATE-Objekt übergeben. Damit das TEMPLATE-Objekt nur den Teil der Datei verwendet, der mit den Markierungen ###DOKUMENT### begrenzt ist, wird die Eigenschaft workOnSubpart=DOKUMENT gesetzt. Die beiden weiteren Eigenschaften des TEMPLATE-Objekts marks und subparts werden anschließend dazu benutzt, die jeweiligen Markierungen zu füllen. Die zu verwendenden Markierungen werden im TypoScript jeweils als Eigenschaften unterhalb von marks bzw. subparts eingesetzt. Bitte beachten Sie dabei, dass Groß- und Kleinschreibweise unterschieden werden und die Markierungen im TypoScript ohne die umgebenden ###-Zeichen zu verwenden sind. Außerdem können Sie eine Bezeichnung nicht gleichzeitig für marks und subparts verwenden.
Lizensiert für Markus Mueller
Mit marks sprechen Sie einzelne Markierungen an, in diesem Fall wird jedes Vorkommen der Zeichenkette ###MARKIERUNG### mit dem angegebenen TypoScript-Objekt ersetzt. Mit subparts ersetzen Sie Teilbereiche einer Vorlage. Dazu muss der Bezeichner genau zweimal in der Vorlage enthalten sein. In diesem Fall werden die gesamten Inhalte vom ersten Vorkommen von ###SUBPARTMARKIERUNG### bis zum zweiten Vorkommen komplett ersetzt. Die Subpart-Markierungen können, wie im Beispiel, in Kommentare eingebettet werden, um das Layout der statischen Vorlage nicht zu beeinflussen. Anders als bei den marks werden die Kommentarzeichen bei den subparts in der Ausgabe entfernt.
Sowohl marks als auch subparts sind vom Datentyp cObject, d.h., ihnen kann jedes beliebige in TypoScript verfügbare cObject zugewiesen werden. Dabei können Sie natürlich auch wie im Beispiel Kopien von TypoScript-Objekten verwenden. Ihrer Schöpfungskraft sind dabei fast keine Grenzen gesetzt, Sie können sich von den vielen Rezepten in diesem und den anderen Kapiteln anregen lassen.
Diskussion Ein großer Vorteil bei diesem Verfahren ist, dass Sie Ihr Layout zunächst völlig unabhängig von TYPO3 mit (X-)HTML und CSS entwickeln und testen können. In der Praxis treten dabei schnell Probleme mit den Pfaden zu eingebundenen Ressourcen auf. In der obigen XHTML-Vorlage wird beispielsweise mit folgendem Code eine Bilddatei eingebunden:
Max. Linie
592 | Kapitel 13: Statische und dynamische Inhalte ausgeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Hier wird also eine Bilddatei über eine relative Pfadangabe eingebunden. Wenn Sie die Vorlage in TYPO3 einbinden und im Frontend ausgeben, wird diese relative Pfadangabe nicht mehr zur gewünschten Datei führen. Das TEMPLATE-Objekt sieht natürlich auch für diese Problemstellung eine Lösung vor. Mit der Eigenschaft relPathPrefix können Sie solche Pfadangaben automatisch mit einem Präfix versehen lassen. Modifizieren Sie das obige TypoScript wie folgt: // Code aus obigem Beispiel // zusätzliche Angabe: page { 100 { relPathPrefix = fileadmin/vorlagen/ // optional abweichend für bestimmte Tags: // relPathPrefix.TAG = fileadmin/ressourcen/ } }
Als Ergebnis wird der Pfad zu dem eingebundenen Bild in der Ausgabe wie folgt umgeschrieben:
Lizensiert für Markus Mueller
Nun ist das Bild sowohl in der Vorlage als auch in der endgültigen Ausgabe von TYPO3 korrekt eingebunden. In Sonderfällen können Sie noch für bestimmte Tags ein abweichendes Präfix vergeben. Dies würde für Bilder über folgende Konfiguration möglich sein: relPathPrefix.IMG = ressourcen/. Leider ist das nur möglich, wenn auch relPathPrefix gesetzt ist. Achten Sie auf entsprechend korrekte Bezeichnungen der Markierungen, gerade bei der Anzahl der # vertut man sich leicht. Bei subparts müssen immer zwei exakt gleich bezeichnete Markierungen vorhanden sein. Beachten Sie, dass es bei subparts auch erforderlich ist, dass Sie irgendeine Zeichenkette zwischen den Markierungen einbinden, die Ersetzung bei direktem Aufeinanderfolgen der Anfangs- und Endmarkierung funktioniert nicht.
Das TEMPLATE-Objekt muss nicht unbedingt auf eine Datei zugreifen. Da für dessen Eigenschaft template jedes beliebige cObject zu verwenden ist, zeigt folgender Code, wie Sie die Vorlage über das TEXT-Objekt direkt im TypoScript angeben können:
Max. Linie
page = PAGE page { 100 = TEMPLATE 100 { template = TEXT template { // mehrzeilige Wertzuweisung für TEXT.value mit '()' value ( ###PAGETITLE### ) }
13.12 Eine HTML-Vorlage verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 593
marks { PAGETITLE = TEXT PAGETITLE { field = title } }
Links
} }
Da es sich auch beim TEMPLATE-Objekt selbst um ein cObject handelt, können Sie es selbstverständlich nicht nur im PAGE-Objekt, sondern an allen Stellen, an denen cObjects verwendet werden können, einbinden. Es ist also beispielsweise möglich, über eine entsprechende Markierung und ein dazu passendes workOnSubpart auch einen Teil des header zu extrahieren und es in page.headerData.55 zu verwenden.
Lizensiert für Markus Mueller
page = PAGE page { headerdata.55 = TEMPLATE headerdata.55 { template = FILE template { file = fileadmin/vorlagen/index.html } workOnSubpart = HEADER } }
Auch viele Plugins in TYPO3 verwenden zur Ausgabe XHTML-Vorlagen. Hierbei kommen allerdings zumeist spezielle Extension-spezifische Implementierungen zum Einsatz. So ist es beispielsweise bei der Extension tt_news nur erforderlich, im TypoScript über plugin.tt_news.templateFile = fileadmin/vorlagen/myttnews.html eine Vorlage zuzuweisen, hier sind die Optionen des TEMPLATE-Objekts nicht analog verwendbar. Sollten Sie eine andere Zeichenkette als ### zur Auszeichnung der Platzhalter wünschen, können Sie die Eigenschaft markerWrap des TEMPLATE-Objektes verwenden. # Das TEMPLATE-Objekt liegt in page.100 page.100 { markerWrap = $$$|$$$ }
Sie müssen die Zeichenkette, mit der die Platzhalter beginnen sollen, und die Zeichenkette, mit der die Platzhalter enden, durch das Zeichen | getrennt angeben. Achten Sie dabei darauf, dass Sie Zeichenketten verwenden, die nicht als reguläre Inhalte auftreten.
Max. Linie
Max. Linie 594 | Kapitel 13: Statische und dynamische Inhalte ausgeben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Siehe auch Mit der Extension Page Template Selector (Key: 'rlmp_tmplselector') haben Sie die Möglichkeit, dem Redakteur auf Seitenebene eine Auswahl an HTML-Vorlagen in einem Auswahlfeld zur Verfügung zu stellen. Die jeweils gewählte Datei wird dann von der Extension an das TEMPLATE-Objekt übergeben. Mit der Extension Template Auto-parser (Key: 'automaketemplate') können Sie die HTML-Vorlagen vorab verarbeiten lassen, um bestimmte Tags automatisch mit entsprechenden ###MARKERN### zu versehen. Nach unseren Erfahrungen ist es aber allein schon zum Zweck der Dokumentation und Transparenz sinnvoll, die dynamischen Teile einer Vorlage manuell mit Markern/Subparts auszuzeichnen. In Rezept 9.3 finden Sie ein Beispiel dafür, wie eine solche Vorlage zur Erzeugung eines dynamischen CSS-Stylesheets genutzt werden kann.
Lizensiert für Markus Mueller
Max. Linie
Max. Linie 13.12 Eine HTML-Vorlage verwenden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 595
Vakat Lizensiert für Markus Mueller
First
Kapitel 14
KAPITEL 14
TypoScript ausreizen
14.0 Einführung
Lizensiert für Markus Mueller
In den ersten Kapiteln zum Thema TypoScript haben wir Ihnen wie versprochen die eigentliche Funktionsweise erläutert, bevor wir in den weiterführenden Kapiteln an konkreten Anwendungsbeispielen demonstriert haben, wie umfangreich und mächtig TypoScript in der Anwendung sein kann. In diesem Kapitel wollen wir Ihnen nun abschließend zeigen, dass Sie weitaus mehr mit reinem TypoScript erreichen können, als es auf den ersten Blick den Anschein haben mag. Obwohl TypoScript in erster Linie eine Konfigurationssprache ist und keine wirkliche Programmiersprache, lassen sich damit erstaunliche Ergebnisse erzielen, wenn Sie als Anwender in der Lage sind, ab und zu ein wenig um die Ecke zu denken. Eine elegante Kombination aus den einzelnen Elementen, teilweise entgegen ihrer ursprünglichen Bestimmung genutzt, ist dabei oftmals der sinnvollere Ansatz als eine statische Lösung mit eigenem PHP-Code. Denn eine TypoScript-basierte Lösung bietet immer ein Maximum an Flexibilität. Sie benötigen ein alphabetisches Inhaltsverzeichnis oder eine mehrseitige Navigation mit einem Seitenbrowser? Sie wollten schon immer ein Menü konstruieren, das dem Seitenbaum im TYPO3-Backend nachempfunden ist? Sie wollen die TYPO3-internen Bildbearbeitungsfunktionen einmal wirklich ausnutzen? Sie wollen ein Newssystem ohne spezielle Extension ausschließlich auf Basis von Seiten und Inhaltselementen realisieren? Das alles lässt sich äußerst komfortabel mithilfe von TypoScript lösen. In den folgenden Rezepten zeigen wir Ihnen, wie.
Max. Linie
Alle Rezepte dieses Kapitels bewegen sich sicherlich in einem Grenzbereich, in dem es sorgfältig abzuwägen gilt, was letztlich sinnvoller ist: die hier gezeigte TypoScript-basierte Lösung oder aber ein eigens dafür erstelltes PHP-Skript mit der gleichen Funktionalität. TypoScript ist dabei auf jeden Fall die flexiblere Lösung, während die PHP-Lösung bei gutem Programmierstil um einiges performanter sein dürfte.
| 597 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Es ging uns in diesem Kapitel jedoch nicht darum, die beste oder schnellste Lösung zu präsentieren, sondern vor allem darum, zu demonstrieren, dass TypoScript zu deutlich mehr in der Lage ist, als nur diverse Parameter an ein paar PHP-Funktionen zu übergeben.
Links
Ein letzter Hinweis, bevor Sie sich mit diesem Kapitel beschäftigen: Die hier gezeigten Rezepte sind absolut ungeeignet für TypoScript-Neulinge! – Wenn Sie noch keine weitergehenden Erfahrungen mit TypoScript gesammelt haben, sollten Sie zunächst mit Kapitel 8 beginnen und sich dann langsam hierhin vorarbeiten.
14.1 TypoScript-Elemente intelligent als Hilfsmittel nutzen Problem
Lizensiert für Markus Mueller
Sie kennen sich mit den Grundprinzipien von TypoScript aus und haben bereits einige Erfahrung, was den Einsatz der verschiedenen TypoScript-Elemente betrifft. Dabei sind Sie hin und wieder an Grenzen gestoßen, an denen Sie mit den in der TSref und auch in den vorhergehenden Rezepten dieses Buchs beschriebenen Möglichkeiten nicht mehr weitergekommen sind. Nun benötigen Sie verschiedene Ansätze, wie Sie mit TypoScript-Bordmitteln dennoch über diese Grenzen hinausgehen können, ohne dabei auf andere Hilfsmittel zurückgreifen zu müssen.
Lösung Verwenden Sie TypoScript-Elemente unabhängig von ihrem ursprünglichen Einsatzbereich und lösen Sie sich dabei von der eigentlichen Bedeutung des Elementnamens. Kombinieren Sie verschiedene TypoScript-Elemente mithilfe von stdWrap-Funktionen. Setzen Sie dabei einfach auf Ihre Kreativität und denken Sie ruhig des Öfteren ein wenig um die Ecke. Wir haben dieses Rezept bewusst an den Anfang dieses Kapitels gestellt, weil es Ihnen die Grundlagen dazu liefern soll, die vielfältigen Möglichkeiten, die Ihnen TypoScript bietet, später wirklich ausreizen zu können. Die eigentliche Kernfunktionalität von TypoScript befindet sich vor allem im stdWrapBaukasten. Immer dann, wenn ein stdWrap-Parameter eines Elements seinerseits über eigene stdWrap-Eigenschaften verfügt, können Sie durch den Einsatz von cObject ein weiteres TypoScript-Element nutzen, um den Inhalt dieses Parameters zu bestimmen.
Max. Linie
Mithilfe von TEXT und der stdWrap-Funktion split, die wiederum ein einzelnes IMAGEElement ansteuert, können Sie z.B. einen Bildblock rendern: lib.meinBildblock = COA lib.meinBildblock {
598 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
10 = TEXT 10 { field = image split { token = , cObjNum = 1|*|2|*|3 1 = IMAGE 1 { file { import = uploads/pics/ import { current = 1 } width = 200m height = 100m } wrap = | } 2 < .1 2.wrap = | 3 < .1 3.wrap = | } } wrap = | }
Genauso gut können Sie TEXT aber auch verwenden, um einen dynamischen Wrap zu erzeugen, der auf bestimmte Parameter reagieren kann: lib.meinEingepackterInhalt = COA lib.meinEingepackterInhalt { 10 = TEXT 10.value = Ein wenig Text 20 = TEXT 20.value = Und noch etwas mehr Text stdWrap.outerWrap.cObject = TEXT stdWrap.outerWrap.cObject { value = | dataWrap = | } }
Oder Sie nutzen ein HMENU als Lieferant für eine Liste von Seiten-IDs:
Max. Linie
lib.meinInhalt = CONTENT lib.meinInhalt { table = tt_content select { pidInList.cObject = HMENU pidInList.cObject { entryLevel = -1 1 = TMENU 1 {
14.1 TypoScript-Elemente intelligent als Hilfsmittel nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 599
NO { doNotLinkIt = 1 stdWrap.field = uid allWrap = ||*|,||*| }
Links
} } } }
Das Element CONTENT eignet sich umgekehrt wiederum hervorragend, um ein Menü zu erstellen:
Lizensiert für Markus Mueller
lib.meinMenue = COA lib.meinMenue { 10 = TEXT 10.value = Die neuesten 5 Unterseiten 10.wrap = | 20 = COA 20 { wrap =
10 = CONTENT 10 { table = pages select { orderBy = tstamp max = 5 } renderObj = TEXT renderObj { field = title typolink.parameter.field = uid wrap =
| } } } }
Und der Einsatz eines COA-Elements empfiehlt sich z.B. für die dynamische Zuordnung von Parametern für einen typolink:
Max. Linie
lib.meinDynamischerLink = COA lib.meinDynamischerLink { 10 = TEXT 10 { field = header typolink.parameter.cObject = COA typolink.parameter.cObject { 10 = TEXT 10.dataWrap = {field:pid}#{field:uid} 20 = TEXT 20 { field = layout noTrimWrap = | - layout|| }
600 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
30 = TEXT 30 { field = subheader noTrimWrap = | || } } } }
Natürlich können Sie auch mit einer intelligenten Reihenfolge verschiedener stdWrapFunktionen erstaunliche Ergebnisse erzielen. temp.meinDynamischerInhalt = TEXT temp.meinDynamischerInhalt { dataWrap = DB : tt_content : {GPvar:meineUid} : bodytext wrap3 = {|} insertData = 1 }
Diskussion
Lizensiert für Markus Mueller
TypoScript ist auf der einen Seite ein unglaublich mächtiges Werkzeug, um ein so komplexes System wie TYPO3 so komfortabel wie möglich zu konfigurieren und die dahinterliegenden PHP-Funktionen zu steuern. Auf der anderen Seite führt es oftmals zu Verwirrungen, weil viele Programmierer den Fehler begehen, es als eine wirkliche Programmiersprache zu betrachten, und daher meinen, die Grenzen des Machbaren seien bei der Nutzung von TypoScript recht eng gesteckt. Bei näherer Betrachtung stellt sich jedoch vielfach heraus, dass TypoScript weitaus flexibler ist, als es zunächst den Anschein hat, und dass man damit viele Dinge lösen kann, deren Bewältigung auf den ersten Blick nicht möglich erschien. Zugegeben, Sie müssen manchmal ein wenig um die Ecke denken, um zum Erfolg zu kommen, aber wenn Sie das erst einmal getan haben, werden Sie feststellen, dass es nur wenige Dinge gibt, die sich nicht mithilfe von TypoScript lösen lassen. Sie sollten dabei allerdings immer auch die Performance des Systems im Hinterkopf behalten, das Sie gerade mit TypoScript konfigurieren wollen. Auch wenn wir in diesem Buch in einigen Beispielen einen recht exzessiven Einsatz von TypoScript demonstrieren, bedeutet dies nicht, dass TypoScript immer das Mittel der Wahl sein sollte. Oftmals kommt eine entsprechende PHP-Funktion, die Sie über eine Extension einbinden, schneller zum Ziel, was sich speziell bei sehr dynamischen Seiten mit kurzfristig wechselnden Inhalten bemerkbar macht, weil deren Inhalte nicht aus dem Cache geholt werden können. Jedoch tragen die gezeigten Beispiele sicherlich dazu bei, das allgemeine Verständnis für TypoScript zu verbessern.
Bildblock rendern
Max. Linie
Im ersten Codebeispiel zeigen wir Ihnen, wie Sie mithilfe eines TEXT-Elements einen Bildblock erzeugen können. Das eigentliche IMAGE-Element kommt hier erst sehr spät zum Einsatz, denn der Inhalt des image-Felds der Tabelle tt_content besteht zunächst einmal
14.1 TypoScript-Elemente intelligent als Hilfsmittel nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 601
Max. Linie
aus Dateinamen, was im Prinzip nichts anderes ist als eine Aneinanderreihung simpler Textabschnitte.
Links
Dieser Text wird nun ausgelesen und mithilfe der stdWrap-Funktion split anhand des Kommas als Trennzeichen in einzelne Abschnitte zerlegt, von denen jeder danach genau einen Dateinamen enthält. lib.meinBildblock = COA ib.meinBildblock { 10 = TEXT 10 { field = image split { token = , } } wrap = | }
Lizensiert für Markus Mueller
Max. Linie
Da die Funktion split über optionSplit-Eigenschaften verfügt, können Sie hier anhand der Position eines Bilds innerhalb des Blocks bestimmen, wie dieses Bild gerendert werden soll. In diesem Fall unterscheiden wir nur zwischen erster, mittlerer und letzter Position, wobei die mittlere Position für alle Bilder außer dem ersten und dem letzten Gültigkeit hat. Lesen Sie hierzu bei Bedarf die einführenden Rezepte zu den stdWrap-Funktionen split und optionSplit. Für jeden Bildtyp gibt es nun ein eigenes kleines Setup, in dem zum ersten Mal das eigentliche IMAGE-Element zum Einsatz kommt. Der Dateiname wird dabei mithilfe von current = 1 eingefügt, denn im Rahmen von split wird current immer mit dem Inhalt des Abschnitts gefüllt, der gerade gerendert werden soll. cObjNum = 1|*|2|*|3 1 = IMAGE 1 { file { import = uploads/pics/ import { current = 1 } width = 200m height = 100m } wrap = | } 2 < .1 2.wrap = | 3 < .1 3.wrap = |
Wir haben die einzelnen Elemente lediglich kopiert und ihnen danach verschiedene Wraps zugewiesen. Sie können selbstverständlich noch weiter gehen und sämtliche Parameter der einzelnen Bildtypen unterschiedlich gestalten.
602 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Dynamischer Wrap Im zweiten Beispiel sehen Sie, wie Sie mithilfe eines TEXT-Elements den Inhalt des Wraps eines anderen Elements dynamisch befüllen können. Nicht alle Wraps verfügen über stdWrap-Eigenschaften, daher müssen Sie für diesen Trick einen der passenden Wraps wie z.B. den hier gezeigten outerWrap verwenden. Da Sie im Rahmen von stdWrap auf sämtliche darin verfügbaren Funktionen zurückgreifen können, steht Ihnen selbstverständlich auch die Funktion cObject zur Verfügung. Das bedeutet für dieses Beispiel, dass Sie den outerWrap aus einem beliebigen TypoScriptElement erzeugen können. Hier haben wir ein TEXT-Element genommen, Sie können aber auch ein COA- oder gar ein USER-Element verwenden, um den Inhalt des Wraps zu bestimmen. Da ein Wrap immer einen entsprechenden Platzhalter verwendet, der unter Standardbedingungen dem Pipe-Symbol | entspricht, müssen Sie darauf achten, dass dieser Platzhalter nicht verloren geht. Aus diesem Grund ist der eigentliche value des TEXT-Elements mit eben diesem Platzhalter belegt. Danach wird um den Platzhalter herum per dataWrap ein dynamischer Inhalt gelegt. Das Ergebnis des TEXT-Elements wäre: | Lizensiert für Markus Mueller
Wie Sie sehen können, ist der Platzhalter noch vorhanden, sodass der outerWrap sich ebenfalls wie gewünscht um den Inhalt des ursprünglichen Elements legen kann.
pidInList per HMENU erzeugen Das dritte Beispiel demonstriert den Einsatz eines HMENU-Elements, um für das selectStatement eines CONTENT-Elements die dafür erforderliche Liste von Elternseiten zu erzeugen. Dies ist deswegen recht hilfreich, weil die Angabe von pidInList nicht komplett eliminiert werden kann. Geben Sie keinen Wert an, wird als Default-Wert this verwendet. Sie können also immer nur auf die aktuelle oder eine explizit angegebene Seite zugreifen. Wir haben in diesem Beispiel das entryLevel des HMENU-Elements auf -1 gesetzt. Es erzeugt also ein Menü der direkten Unterseiten der aktuellen Seite. Sie können natürlich andere entryLevel verwenden und selbstverständlich auch weitere Ebenen einsetzen, um die Anzahl der verfügbaren uid-Werte zu vergrößern. lib.meinInhalt = CONTENT lib.meinInhalt { table = tt_content select { pidInList.cObject = HMENU pidInList.cObject { entryLevel = -1 } } }
Max. Linie
Max. Linie 14.1 TypoScript-Elemente intelligent als Hilfsmittel nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 603
Mithilfe von doNotLinkIt wird nun innerhalb des TMENU-Items NO dafür gesorgt, dass der sonst in Menüs übliche Link nicht ausgegeben wird. Stattdessen greifen Sie unter Verwendung von stdWrap auf das Feld uid zurück und verpacken dessen Wert in einem allWrap.
Links
1 = TMENU 1 { NO { doNotLinkIt = 1 stdWrap.field = uid allWrap = ||*|,||*| } }
Da alle Parameter innerhalb eines Menuitems über optionSplit verfügen, lässt es sich hier recht einfach bewerkstelligen, dass der erste Eintrag keinen Wrap erhält. Das Ergebnis ist daher eine saubere, kommaseparierte Liste der uid-Werte aller Unterseiten. Das CONTENT-Element wird demzufolge deren Inhalte darstellen.
Menü per CONTENT erzeugen
Lizensiert für Markus Mueller
Max. Linie
Wie Sie im folgenden Beispiel sehen können, eignet sich umgekehrt auch ein CONTENT-Element durchaus, um damit ein Menü zu erzeugen. Wir haben es zunächst in einem COA-Setzkasten untergebracht, um die Zuweisung einer zusätzlichen Überschrift zu vereinfachen. Da der Parameter pidInList auch dann mit seinem Default-Wert this genutzt wird, wenn Sie ihn nicht explizit angeben, zeigt dieses Beispiel ein Menü der Unterseiten der aktuellen Seite. Durch die Verwendung von tstamp DESC für orderBy erfolgt eine Sortierung nach dem neuesten Datum, und mithilfe von max wird die Ausgabe auf fünf Seiten begrenzt. lib.meinMenue = COA lib.meinMenue { 10 = TEXT 10.value = Die neuesten 5 Unterseiten 10.wrap = | 20 = COA 20 { wrap =
10 = CONTENT 10 { table = pages select { orderBy = tstamp DESC max = 5 } } } }
Haben Sie im vorigen Beispiel noch deren Inhalte ausgegeben, so erzeugt der nun folgende Code ein echtes Menü mit Links zu den jeweiligen Seiten. Diese Links werden mithilfe von
604 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
typolink erzeugt, dessen Eigenschaft parameter per stdWrap-Funktion field den Wert der jeweiligen uid einer Seite zugewiesen bekommt. So entsteht jeweils ein Link zur Seite, der als Text den Titel der Seite erhält. renderObj = TEXT renderObj { field = title typolink.parameter.field = uid wrap =
| }
Mithilfe der entsprechenden Wraps haben wir auch in diesem Beispiel für eine valide und semantisch korrekte Ausgabe als ungeordnete Liste gesorgt.
Typolink-Parameter per COA erzeugen Das nächste Beispiel geht noch etwas detaillierter auf die Funktion typolink ein. Deren Eigenschaft parameter besteht nämlich aus bis zu vier verschiedenen Teilen, die sich selbstverständlich auch dynamisch erzeugen lassen, denn typolink.parameter verfügt seinerseits über stdWrap-Eigenschaften. Lesen Sie dazu bei Bedarf die entsprechenden Rezepte zum Thema typolink. Wie hier gezeigt, kann man die einzelnen Abschnitte also hervorragend mithilfe eines COA-Elements bestücken. Lizensiert für Markus Mueller
lib.meinDynamischerLink = COA lib.meinDynamischerLink { 10 = TEXT 10 { field = header typolink.parameter.cObject = COA typolink.parameter.cObject { } } }
Im ersten Abschnitt erzeugen Sie nun zunächst den Link auf die Elternseite und dort direkt zum passenden Inhaltselement. Dazu benötigen Sie die uid der Elternseite des Elements, also dessen pid, und zusätzlich seine eigene uid. Diese werden durch ein Doppelkreuz getrennt und sorgen so dafür, dass der Link bereits zum richtigen Sprungziel führt: 10 = TEXT 10.dataWrap = {field:pid}#{field:uid}
Es gibt jedoch noch weitere Bereiche von parameter zu besetzen. Jeder dieser Bereiche wird, wie bereits im typolink-Beispiel des stdWrap-Kapitels beschrieben, anhand eines Leerzeichens erkannt. Sie wollen auf die Angabe eines Targets verzichten, aber eine CSSKlasse sowie einen Titel zuweisen. Den Verzicht auf eine Eigenschaft markieren Sie mit einem Minuszeichen, daher sieht der nächste Abschnitt folgendermaßen aus:
Max. Linie
20 = TEXT 20 { field = layout noTrimWrap = | - layout|| }
14.1 TypoScript-Elemente intelligent als Hilfsmittel nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 605
Sie benötigen die Funktion noTrimWrap, damit die Leerzeichen zwischen den einzelnen Angaben erhalten bleiben und nicht per PHP-Funktion trim() abgeschnitten werden. Hier wird also das Target übersprungen, und auf Basis des Werts aus dem Feld layout wird eine passende CSS-Klasse layoutX zugewiesen. Abschließend wird noch ein titleAttribut erzeugt, das seinen Inhalt aus dem Feld subheader bezieht.
Links
30 = TEXT 30 { field = subheader noTrimWrap = | || }
Selbstverständlich hätten Sie diese Reihe auch direkt mit einem einzigen dataWrap erzeugen können: lib.meinDynamischerLink = TEXT lib.meinDynamischerLink { value = Linktext typolink.parameter.dataWrap = {field:pid}#{field:uid} - {field:layout} {field:title} }
Jedoch können Sie bei der ursprünglichen Lösung jeden einzelnen Teil wiederum in Abhängigkeit von anderen Parametern variabel gestalten, indem Sie z.B. if-Abfragen einbauen oder die stdWrap-Funktion override nutzen. Lizensiert für Markus Mueller
Max. Linie
lib.meinDynamischerLink = COA lib.meinDynamischerLink { 10 = TEXT 10 { value = Linktext typolink.parameter.cObject = COA typolink.parameter.cObject { 10 = TEXT 10.dataWrap = {field:pid}#{field:uid} 20 = TEXT 20 { field = layout override.data = GPvar:layout noTrimWrap = | - layout|| } 30 = TEXT 30 { field = title if.isTrue.data = GPvar:showtitle noTrimWrap = | || } } } }
Das Ergebnis wäre eine dynamisierte Ausgabe des Links, die auf zwei GET-/POST-Variablen reagieren kann, nämlich layout und showtitle. Sobald die Variable layout nicht leer ist, überschreibt sie den Wert des Felds layout bei der Erzeugung der CSS-Klasse, und der Titel des Links wird nur dann erzeugt, wenn showtitle ebenfalls nicht leer ist. 606 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Rekursiv dynamisieren Unser letztes Beispiel ist deswegen besonders elegant, weil es zeigt, wie Sie ein TypoScript-Konstrukt, das ursprünglich keinerlei dynamische Eingaben zulässt, durch die geschickte Anordnung verschiedener Parameter dennoch dynamisch gestalten können. Bei der eigentlich nur statisch zu belegenden Zeile handelt es sich um folgende spezielle Syntax der stdWrap-Funktion data: data = DB : tt_content : 123 : bodytext
Damit können Sie den Inhalt des Felds bodytext aus dem Inhaltselement mit der uid 123 auslesen. Wenn Sie nun in der Lage wären, die Zahleneingabe dynamisch vorzunehmen, z.B. über einen GET-Parameter, wäre es möglich, schnell und komfortabel beliebige Inhaltselemente anzusteuern, und genau das zeigt dieses Beispiel. Bedingt durch die absolut festgelegte Reihenfolge der stdWrap-Funktionen, können Sie nämlich dafür sorgen, dass diese Zeile quasi doppelt ausgewertet wird. Dazu wird zunächst mithilfe von dataWrap ein dynamischer Wert an die Stelle von 123 geschrieben. temp.meinDynamischerInhalt = TEXT temp.meinDynamischerInhalt { dataWrap = DB : tt_content : {GPvar:meineUid} : bodytext } Lizensiert für Markus Mueller
Das Ergebnis wäre jetzt lediglich die Ausgabe folgender Textzeile im Frontend: DB : tt_content : 123 : bodytext
wobei 123 für einen beliebigen Zahlenwert steht, der über den GET-Parameter meineUid übergeben wurde. Durch die folgenden beiden TypoScript-Parameter wird dieser Text aber seinerseits wieder zu einem dynamischen Stück TypoScript-Code gemacht: wrap3 = {|} insertData = 1
Es entsteht nämlich zunächst aufgrund der Verwendung von wrap3 ein Text, der wiederum direkt so im Frontend ausgegeben würde: {DB : tt_content : 123 : bodytext}
Durch den Einsatz der Funktion insertData werden aber sämtliche Werte innerhalb der der geschweiften Klammern nochmals dynamisch ausgewertet, und aus dem eigentlich statischen Text wird so die korrekte Datenbankabfrage. Dies funktioniert selbstverständlich nur, weil die Reihenfolge der Funktionen innerhalb des stdWrap-Baukastens festgelegt ist: dataWrap kommt vor wrap3, und beide liegen vor insertData.
Max. Linie
Wie Sie sehen, ist selbst der redundante Einsatz verschiedener Wraps in TypoScript nicht nur willkürlich oder gar unnütz, sondern durchaus auch sinnvoll und hilfreich. Die Beispiele dieses Rezepts zeigen natürlich nur einen kleinen Teil der Möglichkeiten. Lassen Sie Ihrer Kreativität einfach ein wenig Freiraum, und Sie werden noch viele weitere Möglichkeiten finden, wie Sie die Flexibilität von TypoScript ausreizen können. Einige davon zeigen wir Ihnen in den folgenden Rezepten.
14.1 TypoScript-Elemente intelligent als Hilfsmittel nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 607
Max. Linie
Siehe auch
Links
Wenn Sie die Funktionsweise der einzelnen hier verwendeten stdWrap-Funktionen genauer kennenlernen wollen, lesen Sie das Kapitel 10.
14.2 Die Ausgabe in Abhängigkeit von Bedingungen dynamisch anpassen Problem Sie wollen bei der Ausgabe Ihrer Seiten auf bestimmte Bedingungen reagieren können. Diese Bedingungen gehen aber über die reine Abfrage der Seiten-ID, des Browsers oder bestimmter Zeit- oder User-Angaben hinaus. Daher reicht Ihnen die Palette der verfügbaren Conditions nicht aus, und Sie benötigen einen weiter reichenden Ansatz, um die möglichen Zustände zu verarbeiten. Sie wollen aber dennoch ohne den Einsatz einer userFunc auskommen und das Ziel mit TypoScriptBordmitteln erreichen, weil Sie sich nicht die Mühe machen wollen, eigenen PHP-Code in Form einer Extension einzubinden. Lizensiert für Markus Mueller
Lösung Verwenden Sie das TypoScript-Element CASE und benutzen Sie weitere stdWrap-Funktionen, mit denen Sie den key für die Entscheidung zwischen den einzelnen Ergebnissen mit Inhalt versehen. Dies kann eine einfache Abfrage zum Beispiel des layout-Felds der Seite sein: lib.meinSchalter = COA_INT lib.meinSchalter { 10 = CASE 10 { key.data = page:layout default = TEXT default.value = Grundlayout 1 = TEXT 1.value = Speziallayout 1 2 = TEXT 2.value = Speziallayout 2 } }
Sie können aber auch komplexere Strukturen einbauen, indem Sie ein cObject als key benutzen:
Max. Linie
lib.meinSchalter = COA_INT lib.meinSchalter { 10 = CASE
608 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
10 { key.cObject = COA key.cObject { 10 = TEXT 10.data = page:layout 20 = TEXT 20.data = date:w } default = TEXT default.value = Grundlayout 10 = TEXT 10.value = Speziallayout 1 am Wochenende 16 < .10 11 = TEXT 11.value = Speziallayout 1 in der Woche 12 < .11 13 < .11 14 < .11 15 < .11 } }
Diskussion Lizensiert für Markus Mueller
TYPO3 liefert Ihnen im Rahmen der schon im Kapitel 8 beschriebenen Conditions bereits eine recht breit gefächerte Palette von Reaktionen auf mögliche Bedingungen. Die Arbeit mit diesen Conditions wird aber oftmals deutlich verkompliziert – zum einen, weil Conditions nur außerhalb geschweifter Klammern verwendet werden dürfen, zum anderen, weil es nicht ganz einfach ist, mehrere Bedingungen miteinander zu kombinieren, wenn diese Bedingungen mehrere eindeutig definierte Zustände kennen und nicht nur wahr oder falsch. Mithilfe des TypoScript-Elements CASE können Sie dieses Problem elegant und komfortabel lösen, denn Sie können den Inhalt des eigentlichen Entscheidungsträgers, genannt key, mithilfe von stdWrap-Funktionen bestimmen. Als key können dabei auch Texte verwendet werden, was eine Kombination verschiedener Felder zum Befüllen ermöglicht. PHP-Entwickler werden die Struktur des CASE-Elements kennen, denn sie ist im Prinzip identisch mit einem switch(). Für jedes der Ergebnisse der möglichen Kombinationen können Sie im CASE-Element ein entsprechendes Element anlegen, das immer dann verwendet wird, wenn das Ergebnis dem Namen des Elements entspricht. Wird kein passender Elementname zum Ergebnis gefunden, kommt stattdessen das default-Element zum Einsatz.
Max. Linie
Im ersten Beispiel gibt es nur einen einzigen Parameter, nämlich das Feld layout, das im Backend als Select-Box dargestellt wird und verschiedene numerische Werte annehmen kann. Je nach gewähltem Layout reagiert das CASE-Element mit einer passenden Ausgabe, also entweder einem Grundlayout oder den Varianten Speziallayout1 oder Speziallayout2.
14.2 Die Ausgabe in Abhängigkeit von Bedingungen dynamisch anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 609
Max. Linie
Das zweite Beispiel ist schon ein wenig komplizierter, denn auch der zweite Parameter kann verschiedene numerische Werte annehmen, nämlich die Wochentage von 0 bis 6. Es ergibt sich also eine Kombination aus Wochentag und layout-Feld, die bei n angenommenen Layoutvarianten als Ergebnis einen der folgenden Werte haben könnte:
Links
10,11,12,13,14,15,15,20,21,22,...,n6
Sie müssen nun für die relevanten Ergebnisse – und nur für diese – jeweils ein entsprechendes Element anlegen. Alle anderen Elemente können Sie danach kopieren, falls sie den gleichen Wert haben sollen wie ein bereits angelegtes Element, oder Sie ignorieren sie einfach, und sie werden mit der default-Einstellung gerendert. Das gezeigte Beispiel verwendet nur zwei Parameter – und dazu noch solche, die auch als Condition verwendbar gewesen wären. Jedoch zeigt sich bereits hier der Vorteil gegenüber Conditions: Sie können wesentlich präziser auf die einzelnen Zustände reagieren, ohne für jedes einzelne Ergebnis eine passende Kombination aus Conditions anlegen zu müssen. Der Code bleibt übersichtlicher und schlanker. Im Unterschied zu Conditions werden die möglichen Zustände von CASE zudem nicht bereits beim Parsen des TypoScript-Codes ausgewertet, sondern erst dann, wenn das Element selbst durch die Frontend-Engine gerendert wird. Lizensiert für Markus Mueller
Max. Linie
Speziell wenn Sie nun weitere Parameter hinzufügen, befinden Sie sich gegenüber dem Einsatz von Conditions bereits deutlich auf der Überholspur. Mit dieser Variante reagieren Sie zum Beispiel nur dann auf die beiden anderen Parameter, wenn zusätzlich noch feststeht, dass es sich um das erste Element auf der Seite handelt. lib.meinSchalter = COA_INT lib.meinSchalter { 10 = CASE 10 { key.cObject = COA key.cObject { 10 = TEXT 10.data = page:layout 20 = TEXT 20.data = date:w 30 = TEXT 30.data = cObj:parentRecordNumber } default = TEXT default.value = Grundlayout 101 = TEXT 101.value = Speziallayout 1 am Wochenende 161 < .101 111 = TEXT 111.value = Speziallayout 1 in der Woche 121 < .111 131 < .111
610 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
141 < .111 151 < .111 } }
Und diese Variante behandelt alle Seiten, deren Titel mit dem Begriff »TYPO3« beginnt, nochmals gesondert, indem sie ihnen ein T zuweist, während alle anderen Seiten ein N erhalten.
Lizensiert für Markus Mueller
Max. Linie
lib.meinSchalter = COA_INT lib.meinSchalter { 10 = CASE 10 { key.cObject = COA key.cObject { 10 = TEXT 10.data = page:layout 20 = TEXT 20.data = date:w 30 = TEXT 30.data = cObj:parentRecordNumber 40 = TEXT 40.value = T 40.if.value.data = page:title 40.if.value.substring = 0,5 40.if.equals.value = TYPO3 50 < .40 50.value = N 50.if.negate = 1 } default = TEXT default.value = Grundlayout 101T = TEXT 101T.value = TYPO3 Layout 1 am Wochenende 161T < .101T 111T = TEXT 111T.value = TYPO3 Layout 1 in der Woche 121T < .111T 131T < .111T 141T < .111T 151T < .111T 101N = TEXT 101N.value = Normal Layout 1 am Wochenende 161N < .101N 111N = TEXT 111N.value = Normal Layout 1 in der Woche 121N < .111N 131N < .111N 141N < .111N 151N < .111N } }
14.2 Die Ausgabe in Abhängigkeit von Bedingungen dynamisch anpassen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 611
Um zu verdeutlichen, welche Wirkung die letzte Variante auf die Ausgabe des Inhalts hat, hier noch einmal in Worten die Entscheidungskriterien:
Links
1. Wenn das layout-Feld einen anderen Wert hat als 1, nimm auf jeden Fall den default-Wert. 2. Wenn der Wochentag 0 oder 6 lautet, nimm das Wochenende, ansonsten die Woche. 3. Wenn es sich um ein anderes Element als das erste auf der Seite handelt, nimm auf jeden Fall den default. 4. Wenn der Titel der Seite mit TYPO3 beginnt, nimm den passenden TYPO3-Text, ansonsten den normalen. Am letzten Beispiel kann man übrigens auch recht gut erkennen, dass es sich bei den Elementnamen nicht etwa um wirkliche Nummerierungen handelt, wie sie beispielsweise in einem COA-Setzkasten vorkommen, sondern um frei kombinierbare Strings. Sie können selbstverständlich beliebig viele weitere Parameter verwenden, mit denen Sie das Ergebnis des COA-Elements im key des CASE-Elements verändern. Denken Sie dabei lediglich immer daran, die namentlichen Entsprechungen für jedes relevante Ergebnis ebenfalls anzulegen. Lizensiert für Markus Mueller
Siehe auch Wenn Sie wissen wollen, wie Sie mithilfe von Conditions auf ähnliche Weise den Inhalt unter bestimmten Bedingungen verändern können, lesen Sie Rezept 8.8.
14.3 Ein alphabetisches Inhaltsverzeichnis anlegen Problem Sie haben eine umfangreiche Seite mit vielen interessanten Inhaltselementen. Anstelle der üblichen Sitemap auf Seitenebene wollen Sie ein komplettes, alphabetisch sortiertes Verzeichnis aller Inhaltselemente einer Sprache anlegen. Dabei soll der Link des aufgelisteten Titels direkt zum ausgewählten Element führen. Außerdem wollen Sie die Links gruppieren, wobei jede Gruppe den Anfangsbuchstaben als Markierung erhalten soll. Speziell wenn Sie TYPO3 dazu benutzen, Inhalte für Bücher, technische Publikationen, Diplomarbeiten oder ähnliche Dinge zu erzeugen, ist ein solches Inhaltsverzeichnis sehr nützlich, wenn nicht unumgänglich.
Lösung
Max. Linie
Verwenden Sie HMENU, LOAD_REGISTER und CONTENT. Erzeugen Sie mithilfe eines TMENU eine Liste von Seiten und nutzen Sie diese, um die dazugehörigen Inhalte mit einem CONTENT-Element aus der Datenbank auszulesen. 612 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Dieser Code kommt in Ihr TS-Setup: temp.getPages = HMENU temp.getPages { special = directory special.value = 1 1 = TMENU 1 { expAll = 1 NO { doNotShowLink = 1 stdWrap.cObject = LOAD_REGISTER stdWrap.cObject { allPages.dataWrap = {register:allPages},{field:uid} } } } 2 < .1 3 < .1 4 < .1 }
Lizensiert für Markus Mueller
Max. Linie
temp.getContentList = COA temp.getContentList { wrap =
10 < temp.getPages 20 = CONTENT 20 { table = tt_content select { pidInList.data = register:allPages orderBy = header languageField = sys_language_uid andWhere = sectionIndex=1 AND header!='' } renderObj = COA renderObj { 10 = TEXT 10 { outerWrap.cObject = COA outerWrap.cObject { 10 = TEXT 10 { value =
<span >| if.isFalse.data = register:firstLetter } 20 = TEXT 20 { value =
<span >| if.isTrue.data = register:firstLetter } } field = header crop = 1|
14.3 Ein alphabetisches Inhaltsverzeichnis anlegen | 613 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
if { value.data = register:firstLetter equals.field = header equals.crop = 1| negate = 1 }
Links
} 20 = TEXT 20 { field = header typolink { parameter.dataWrap = {field:pid}#c{field:uid} } wrap = - |
} 30 = LOAD_REGISTER 30 { firstLetter.field = header firstLetter.crop = 1| } } } 30 = TEXT 30.value =
Lizensiert für Markus Mueller
}
Und dieser kommt ins TS-Setup Ihrer Seite: page.10 < temp.getContentList
Diskussion Eine der komfortabelsten Eigenschaften von TYPO3 ist die Fähigkeit, beliebige Varianten von Menüs, Sitemaps und sonstigen Navigationselementen zu erstellen. Wenn Sie content(default) oder CSS-styled-content verwenden, können Sie auf einen vordefinierten Satz solcher Elemente zugreifen, indem Sie einfach ein Inhaltselement vom Typ Menü/Sitemap auf der Seite einfügen. In der Regel arbeiten diese Navigationselemente auf Seitenebene. Das bedeutet, dass Sie entweder eine Seitenstruktur oder die Inhaltsstruktur einer oder mehrerer Seiten als Menü abbilden können. Genau genommen ist eine Sitemap jedoch nichts anderes als ein Inhaltsverzeichnis. Deswegen ist es durchaus sinnvoll, wenn dieses Inhaltsverzeichnis nicht nur alle verfügbaren Seitentitel auflistet, sondern gleich deren Inhalte. Eine alphabetische Sortierung sollte dabei selbstverständlich sein, und zur besseren Übersicht werden die Elemente nach Anfangsbuchstaben gruppiert. Die jeweilige Sprache wird bei mehrsprachigen Seiten ebenfalls berücksichtigt.
Max. Linie
Um ein solches alphabetisch sortiertes Inhaltsverzeichnis mit Bordmitteln und ohne eine spezielle Extension zu realisieren, benötigen Sie in erster Linie drei TypoScript-Elemente: die Elemente HMENU, LOAD_REGISTER und CONTENT sowie zusätzlich ein paar Funktionen aus dem stdWrap-Baukasten.
614 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
LOAD_REGISTER ist im Prinzip nichts anderes als eine Zwischenablage, die per TypoScript mit beliebigen Inhalten gefüllt werden kann. Alle diese Inhalte verfügen über stdWrap-Eigenschaften, sodass Sie den Inhalt des Registers wie ein echtes cObject bearbeiten können. HMENU und das dazugehörige TMENU haben in diesem Fall nur reine Füllfunktion, um eine Liste von Seiten in das LOAD_REGISTER zu befördern. Per CONTENT wird das eigentliche Menü gerendert, wobei dort ein weiteres LOAD_REGISTER für die Anfangsbuchstaben zum Einsatz kommt. Doch nun zu den Details. Im ersten Teil erzeugen Sie ein HMENU, das den kompletten Seitenbaum unterhalb einer bestimmten Seite darstellen soll. Im Beispiel haben wir die Seite 1 verwendet, Sie können dort aber auch jede andere Seite eintragen oder gegebenenfalls das Feld pages abfragen, wenn Sie diesen Code für ein Inhaltselement Menü/Sitemap verwenden wollen. Wichtig ist vor allem der Parameter expAll=1, der dafür sorgt, dass alle Unterseiten ebenfalls durchlaufen werden.
Lizensiert für Markus Mueller
temp.getPages = HMENU temp.getPages { special = directory special.value = 1 1 = TMENU 1 { expAll = 1 NO { doNotShowLink = 1 stdWrap.cObject = LOAD_REGISTER stdWrap.cObject { allPages.field = uid allPages.dataWrap = {register:allPages},| } } } 2 < .1 3 < .1 4 < .1 }
Da Sie in diesem Fall ein blindes Menü erzeugen wollen, das lediglich Inhalte ins LOAD_ REGISTER füllt, benötigen Sie zunächst den Parameter doNotShowLink=1. Hiermit wird sichergestellt, dass keinerlei Link im Frontend zu sehen ist. Ab der Zeile 2 < .1 wird der bis dahin erzeugte Code für die weiteren Ebenen bereitgestellt. Wenn Sie mehr als vier Ebenen in Ihrer Seite verwenden, müssen Sie hier weitere Zeilen nach dem gleichen Muster einfügen.
Max. Linie
Der eigentliche Kern dieses Menüs ist jedoch die besondere Verarbeitung der Seiteninformationen. Weil jedes NO-Element (und alle anderen Zustände wie ACT, IFSUB, CUR usw.) über stdWrap-Eigenschaften verfügt, können Sie statt des üblichen title-Felds auch eigene cObject-Elemente einbauen. In diesem Fall erzeugt jedes Menüelement einen Eintrag im Register allPages. Das einzutragende Feld ist die UID der Seite, weil diese später benötigt
14.3 Ein alphabetisches Inhaltsverzeichnis anlegen | 615 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
wird, um die dazugehörigen Inhaltselemente zu ermitteln. Damit das Register nicht einfach überschrieben wird, stellen Sie den bisherigen Wert plus ein Komma per dataWrap voran. So erzeugen Sie eine kommaseparierte Liste aller Seiten, die in einem Menü erscheinen dürfen. Seiten vom Typ nicht im Menü oder mit gesetztem im Menü verstecken werden nicht berücksichtigt.
Links
stdWrap.cObject = LOAD_REGISTER stdWrap.cObject { allPages.dataWrap = {register:allPages},{field:uid} }
Das zweite temporäre Element erzeugt die eigentlichen Links. Weil Sie direkt zu den einzelnen Elementen verlinken wollen, benötigen Sie die UID des jeweiligen Elements aus der Tabelle tt_content. Auf Basis dieser UID werden bei Verwendung von content(default) oder CSS-styled-content die Anker bei den einzelnen Elementen gesetzt. Ein Link zu solch einem Anker besteht also prinzipiell aus den zwei Zahlen pid#uid sowie seit TYPO3-Version 4.0 einem c vor der UID, um die Anker W3C-konform mit id-Attributen zu versehen. Linktext
Lizensiert für Markus Mueller
Die UID der Elemente erhalten Sie durch das cObject CONTENT. Hier können Sie festlegen, aus welcher Tabelle die Elemente ausgewählt werden sollen (in diesem Fall tt_content), welche Seiten dabei als Eltern vorkommen dürfen (pidInList), welches Feld als Sortierkriterium verwendet werden soll (orderBy), welche Sprache die Elemente haben sollen (languageField) und welche Kriterien sie erfüllen müssen, um zum Einsatz zu kommen (andWhere). Im Prinzip erzeugen Sie damit eine genau definierte MySQLAbfrage, die eine Anzahl von Elementen zurückgibt. Was genau mit diesen Elementen geschehen soll, legen Sie im renderObj fest. Besonders zu beachten ist hier, wie das zuvor erzeugte Register allPages verwendet wird. Durch die Positionierung am Anfang (10 < temp.getPages) wird sichergestellt, dass das Register vollständig gefüllt ist, bevor die Elemente ausgewählt werden. Mithilfe von pidInList.data = register:allPages wird die kommaseparierte Liste in die Abfrage eingefügt. In dieser vereinfachten Form würde der folgende Code bereits funktionieren und eine Liste von Links mit jeweils einer Zeilenschaltung am Ende erzeugen.
Max. Linie
temp.getContentList = COA temp.getContentList { 10 < temp.getPages 20 = CONTENT 20 { table = tt_content select { pidInList.data = register:allPages orderBy = header languageField = sys_language_uid andWhere = sectionIndex=1 AND header!='' } renderObj = TEXT
616 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
renderObj { field = header typolink { parameter.dataWrap = {field:pid}#c{field:uid} } wrap = |
} } }
Das Feld header liefert die Überschrift des jeweiligen Elements, wobei Sie im Bereich andWhere festlegen sollten, dass nur Elemente mit gefülltem header verwendet werden dürfen, für die der sectionIndex gesetzt ist. Andere Elemente und deren header werden damit ignoriert. Sie können also weiterhin Ihren Seiteninhalt in mehrere Elemente aufteilen, und nur die relevanten erscheinen im Menü. Mithilfe von typolink wird aus dem header ein TYPO3-kompatibler Link gebaut, der eventuell anzuhängende GET-Parameter automatisch mit berücksichtigt. Benötigt werden dazu lediglich zwei Teile: die PID des Elements (sprich die UID der Seite, auf der es sich befindet) und seine eigene UID, damit der entsprechende Anker angesprochen werden kann. Alles Weitere wird von typolink erledigt. In diesem Fall ergibt dataWrap die kürzeste Schreibweise, um zwei verschiedene Felder direkt einzufügen. Lizensiert für Markus Mueller
Max. Linie
Die Liste als solche ist jetzt fertig. Es geht nun also darum, sie ein wenig übersichtlicher zu gestalten und zum Beispiel eine echte ul-Liste mit den jeweiligen Anfangsbuchstaben zu erzeugen. Hierzu müssen Sie ein wenig tiefer in die TypoScript-Materie eintauchen. Zunächst machen Sie aus dem einfachen TEXT ein Setzkastenelement COA. Innerhalb dieses COA können Sie verschiedene zusätzliche Elemente um den eigentlichen Link herumgruppieren. renderObj = COA renderObj { 10 = TEXT 10 { value = etwas davor
} 20 = TEXT 20 { field = header typolink { parameter.dataWrap = {field:pid}#c{field:uid} } wrap = |
} 30 = TEXT 30 { value = etwas danach
} }
14.3 Ein alphabetisches Inhaltsverzeichnis anlegen | 617 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Die gewünschte ul-Liste soll folgendermaßen aussehen:
Links
Die Regel hierfür lautet: Wenn ein Anfangsbuchstabe erstmalig vorkommt, soll vor dem entsprechenden Link
<span>Anfangsbuchstabe erscheinen. Eine Ausnahme bildet der erste Eintrag, denn hier ist das erste schließende Tag überflüssig. Um dies zu erreichen, benötigen Sie ein weiteres Register, das den Anfangsbuchstaben des vorhergehenden Links enthält. Das bedeutet, dass der Link zuerst erzeugt werden muss, um danach das Register zu füllen. Lizensiert für Markus Mueller
Max. Linie
Daher kommt das cObject LOAD_REGISTER an die Stelle des Textes etwas danach. Das Register bekommt den Namen firstLetter. Als Inhalt wird zunächst das Feld header abgefragt und mithilfe von crop auf die Länge 1 gekürzt. Weil Sie hier nicht wie vorher gezeigt mit dataWrap arbeiten, wird das Register jedes Mal einfach überschrieben. Es befindet sich also immer nur ein Buchstabe darin. Dem Link können Sie bereits die nötigen liTags als wrap verpassen. renderObj = COA renderObj { 10 = TEXT 10 { value = etwas davor
} 20 = TEXT 20 { field = header typolink { parameter.dataWrap = {field:pid}#c{field:uid} } wrap = - |
} 30 = LOAD_REGISTER 30 { firstLetter.field = header firstLetter.crop = 1| } }
618 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Die eigentliche Kunst liegt nun darin, wie Sie dieses Register nutzen, um daraus die verschiedenen ul-Tags zu konstruieren. Sie benötigen dazu zwei separate Abfragen: 1. Gibt es bereits einen Anfangsbuchstaben im Register? 2. Ist der Anfangsbuchstabe des aktuellen Links ein anderer als der im Register? Mit der ersten Abfrage legen Sie fest, wie der Wrap um den jeweiligen Buchstaben aussehen soll. Die zweite bestimmt, ob überhaupt etwas vor dem folgenden Link gerendert werden muss oder nicht. Verwenden Sie outerWrap oder einen vergleichbaren wrap mit stdWrap-Eigenschaften, damit Sie den Wrap aus einem COA konstruieren können. In diesem COA befinden sich zwei TEXT-Elemente, von denen nur eins gerendert wird. Ist das Register firstLetter noch leer (if.isFalse), gibt es nur eine öffnende ul-li-Kombination, ist es bereits gefüllt (if. isTrue), kommt noch eine schließende Kombination hinzu.
Lizensiert für Markus Mueller
Der eigentliche Inhalt wird über das Feld header abgefragt und mit crop auf die Länge 1 gekürzt. Die Abfrage arbeitet hier mit dem Mechanismus negate=1. Das bedeutet im Klartext: Aus true wird false und umgekehrt. Sie fragen also ab, ob der Anfangsbuchstabe des aktuellen Links dem im Register gleicht. Tut er das, gibt die Abfrage false zurück, und der gesamte Textblock einschließlich des outerWrap wird nicht gerendert. Ist der Buchstabe jedoch ein anderer als der im Register, gibt die Abfrage true zurück, und der Buchstabe wird samt outerWrap dargestellt. 10 = TEXT 10 { outerWrap.cObject = COA outerWrap.cObject { 10 = TEXT 10 { value = - <span >|
if.isFalse.data = register:firstLetter } 20 = TEXT 20 { value =
- <span >|
if.isTrue.data = register:firstLetter } } field = header crop = 1| if { value.data = register:firstLetter equals.field = header equals.crop = 1| negate = 1 } }
Max. Linie
Max. Linie 14.3 Ein alphabetisches Inhaltsverzeichnis anlegen | 619 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Bleibt nur noch, diesen TEXT-Block anstelle des »etwas davor« im Code zu platzieren, und Sie haben das Problem erfolgreich gelöst. Nicht ganz, denn als aufmerksamer Leser haben Sie sicherlich bemerkt, dass eine schließende ul-li-Kombination fehlen würde. Diese wird abschließend mit einem einzelnen TEXT-Element am Ende des Codes eingefügt.
Links
Siehe auch Lesen Sie dazu auch das Kapitel 12. In Rezept 12.18 erfahren Sie, wie Sie dieses Menü als Standard-Setup für das Inhaltselement Menü/Sitemap hinterlegen und damit allen Redakteuren zur Verfügung stellen können.
14.4 Eine mehrseitige Navigation mit Seitenbrowser erstellen Problem Lizensiert für Markus Mueller
Sie wollen ein TypoScript-basiertes Menü so modifizieren, dass bei einer größeren Anzahl von Menüeinträgen die Zahl der dargestellten Einträge pro Seite automatisch begrenzt wird. Für alle Menüeinträge jenseits dieser maximalen Anzahl soll ein Seitenbrowser generiert werden, mit dessen Hilfe der Besucher durch die einzelnen Seiten blättern kann, um weitere Menüeinträge zu finden. Außerdem wollen Sie die Darstellung dergestalt verändern, dass der Titel der Seite immer als Überschrift gerendert wird und die Kurzbeschreibung, so vorhanden, als einfacher Text darunter.
Lösung • Leeren Sie die Originaleinstellung des Inhaltselements Menü der Unterseiten. • Verwenden Sie COA_INT und HMENU und erzeugen Sie den Seitenbrowser mithilfe von LOAD_REGISTER und entsprechenden stdWrap-Funktionen. • Verwenden Sie einen URL-Parameter startNummer, um die Position innerhalb des Seitenbrowsers zu bestimmen, und fügen Sie ihn unter config.linkVars ein. • Verwenden Sie eine Konstante maxAnzahl und fügen Sie diese ins Constants-Feld Ihres TS-Setup ein. Den vollständigen Code dieses Rezepts finden Sie auf der CD. Hier im Buch werden wir Ihnen die einzelnen Abschnitte in der Diskussion erläutern. Im config-Bereich Ihrer Seite fügen Sie den Parameter startNummer als linkVar ein:
Max. Linie
page { config.linkVars = startNummer (+ eventuelle vorhandene linkVar-Einträge) }
620 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Die Konstante maxAnzahl bestimmt, wie viele Einträge gleichzeitig zu sehen sind: maxAnzahl = 10
Diskussion Falls dies das erste Rezept zum Thema Navigation aus diesem Buch ist, das Sie bearbeiten, empfehlen wir Ihnen, zunächst die grundlegenden Rezepte in den Kapiteln 10 bis 12 zu lesen. Sie sollten sich bereits mit HMENU, LOAD_REGISTER und stdWrap befasst haben, bevor Sie sich an diesem fortgeschrittenen Rezept versuchen.
Aber nun zur eigentlichen Lösung: Wenn Sie umfangreichere Installationen mit mehreren hundert oder gar tausend Seiten zu verwalten haben, ergeben sich speziell bei Navigationen verschiedene Probleme. Eines dieser Probleme besteht darin, dass eine Liste von Unterseiten schnell den Rahmen einer einzelnen Seite sprengt. Unendlich lange HTMLAusgaben, die die Seite durch zeitaufwendiges Scrollen unbenutzbar machen, sind das Resultat.
Lizensiert für Markus Mueller
Hier bietet es sich in der Regel an, die Ausgabe über mehrere virtuelle Seiten zu verteilen, die jeweils eine begrenzte Anzahl von Menüeinträgen anzeigen. Zusätzlich erhält der Benutzer einen Seitenbrowser, mit dessen Hilfe er durch die virtuellen Seiten blättern kann, um die gewünschten Einträge zu finden. Um dies zu erreichen, müssen Sie zunächst die Gesamtanzahl der Menüeinträge ermitteln. Aus dieser Zahl und der maximalen Anzahl anzuzeigender Einträge ergibt sich die Anzahl der virtuellen Seiten. Für jede dieser Seiten gibt es im Seitenbrowser eine Zahl, die direkt auf die jeweilige virtuelle Seite verlinkt. Zusätzlich befindet sich am Anfang und am Ende der Seitenliste jeweils ein kleiner Pfeil, mit dessen Hilfe man vor- oder zurückblättern kann. Wird dabei das Ende der Liste erreicht, springt die Anzeige beim Weiterblättern automatisch an das andere Ende der Liste. Um das Rendern einer solchen Liste nicht unnötig zu verlangsamen, sollten Sie sowohl das Ermitteln der Gesamtanzahl als auch das Erzeugen der ersten Seitenansicht in einem Durchlauf, sprich innerhalb eines einzigen HMENU-Elements erledigen. Da HMENU per Default die Unterseiten der Rootseite anzeigt, benötigen Sie gegebenenfalls weiterführende Einstellungen wie z.B. entryLevel oder auch special. Das grundlegende Menü entspricht weitestgehend demjenigen, das Sie bereits aus Rezept 12.11 kennen. Bei genauerer Betrachtung werden Sie jedoch einen gravierenden Unterschied erkennen:
Max. Linie
temp.blaettermenu = COA temp.blaettermenu { 10 = HMENU 10 { 1 = TMENU
14.4 Eine mehrseitige Navigation mit Seitenbrowser erstellen | 621 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links
1 {
Lizensiert für Markus Mueller
NO { stdWrap.cObject = COA stdWrap.cObject { 20 = COA 20 { 10 = COA 10 { 20 = TEXT 20 { field = subtitle // title wrap = | htmlSpecialChars = 1 typolink { parameter.field = uid } } 40 = TEXT 40 { field = abstract wrap = |
required = 1 } } } } stdWrap.htmlSpecialChars = 0 doNotLinkIt = 1 } noBlur = 1 } wrap = | } }
Der ursprünglich innerhalb von NO erzeugte Link wird mithilfe von doNotLinkIt=1 abgeschaltet. Dies ist deshalb nötig, weil Sie im Verlauf dieses Rezepts ein LOAD_REGISTER benötigen, um die notwendigen Berechnungen durchzuführen. Da ein solches Register nur mithilfe von stdWrap.cObject eingefügt werden kann, würde dies dazu führen, dass der ursprüngliche Linktext überschrieben würde. Um das zu verhindern, sorgen Sie innerhalb von stdWrap.cObject dafür, dass dort ein Link nach Ihren Vorstellungen erzeugt wird, und schalten danach die eigentliche Linkfunktion ab. Als Basis für stdWrap.cObject dient ein Setzkastenelement vom Typ COA. Innerhalb dieses Elements erzeugen Sie zwei weitere Setzkastenelemente, die für die Verschachtelung der verschiedenen Register und Abfragen benötigt werden. Im innersten COA erstellen Sie danach zwei TEXT-Elemente.
Max. Linie
Das erste TEXT-Element bekommt den Wert des Felds subtitle zugewiesen. Falls dieses Feld leer sein sollte, wird stattdessen title verwendet. Der ermittelte Text wird mithilfe von typolink verlinkt. Es reicht, hierfür das Feld uid auszulesen, um die Seite eindeutig
622 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
zu identifizieren. Sämtliche weiteren Parameter werden automatisch durch typolink hinzugefügt. Im zweiten TEXT-Element binden Sie den Wert des Felds abstract ein und verpacken ihn in p-Tags. Mithilfe von required=1 sorgen Sie dafür, dass nur dann p-Tags erzeugt werden, wenn im Feld abstract Inhalt vorhanden ist. Füllen Sie nun den äußeren Setzkasten von NO mit dem bereits erwähnten LOAD_ REGISTER.
Lizensiert für Markus Mueller
stdWrap.cObject = COA stdWrap.cObject { 10 = LOAD_REGISTER 10 { nextPageCheck.cObject = TEXT nextPageCheck.cObject.dataWrap = ({register:count_HMENU_MENUOBJ}-1)/{$maxAnzahl} nextPageCheck.prioriCalc = 1 nextPageCheck2.cObject = TEXT nextPageCheck2.cObject.dataWrap = ({register:count_HMENU_MENUOBJ}-1)/{$maxAnzahl} nextPageCheck2.prioriCalc = intval pageCounter.cObject = TEXT pageCounter.cObject { data = register:pageCounter prioriCalc = 1 override.cObject = TEXT override.cObject.dataWrap = {register:pageCounter}+1 override.cObject.if { value.data = register:nextPageCheck2 equals.data = register:nextPageCheck } } pageList { data = register:pageList override.cObject = TEXT override.cObject { if { value.data = register:pageCounter isLessThan.data = register:currentPage } data = register:pageCounter override.dataWrap = {register:pageList},{register:pageCounter} override.if.isTrue.data = register:pageList } } currentPage.data = register:pageCounter } 20 { ... } }
Max. Linie
Max. Linie 14.4 Eine mehrseitige Navigation mit Seitenbrowser erstellen | 623 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Innerhalb dieses LOAD_REGISTER-Elements wird die Anzahl der erforderlichen Seiten für den Seitenbrowser berechnet. Hierzu wird der Zähler register:count_HMENU_MENUOBJ verwendet. Da dieser bei 1 beginnt, müssen Sie 1 davon abziehen, um beim ersten Element mit 0 zu beginnen. Danach wird dieser Zähler durch die maximale Anzahl von Einträgen pro Seite geteilt.
Links
Dies geschieht in den Registern nextPageCheck und nextPageCheck2 mithilfe von prioriCalc. Im ersten Register wird das Ergebnis der Division direkt gespeichert, im zweiten Register werden die Nachkommastellen abgeschnitten. Sind die Werte der beiden Register gleich, bedeutet dies, dass count_HMENU_MENUOBJ durch den Wert von maxAnzahl teilbar ist. Es wurde also die maximale Anzahl von Einträgen überschritten und der Seitenzähler muss um 1 erhöht werden. Genau das tun Sie im Register pageCounter. Das Register wird per data mit sich selbst gefüllt und mit prioriCalc berechnet. Für den Fall, dass nextPageCheck und nextPageCheck2 identisch sind, wird stattdessen der aktuelle Wert des Registers mithilfe von dataWrap um +1 ergänzt und dann berechnet.
Lizensiert für Markus Mueller
Im nächsten Schritt wird die Liste der Seiten aus kommaseparierten Werten erzeugt. Hierzu wird wie bereits bei pageCounter das Register pageList mit sich selbst gefüllt. Sollte der Wert des Registers pageCounter größer sein als der des Registers currentPage, wird beim ersten Durchlauf der Wert von pageCounter eingetragen. Das Register currentPage existiert beim ersten Durchlauf noch nicht und wird daher wie eine 0 gewertet. Ab dem zweiten Durchlauf legen Sie per if-Abfrage fest, dass ein Komma sowie der Wert des Registers pageCounter an das bereits bestehende Register pageList angehängt werden sollen. In dieser Abfrage wird einfach überprüft, ob pageList bereits einen Wert zugewiesen bekommen hat. Auch dies geschieht selbstverständlich nur, wenn vorher festgestellt wurde, dass der Wert von pageCounter größer ist als der von currentPage. Abschließend wird das Register currentPage mit dem Wert von pageCounter gefüllt, damit es ab dem zweiten Durchlauf zum Vergleichen genutzt werden kann. Im nächsten Schritt erzeugen Sie den eigentlichen Seitenbrowser und füllen ihn mit den nötigen Links. Als Erstes benötigen Sie die beiden Pfeile, mit denen der Besucher später blättern kann.
Max. Linie
30 = COA 30 { 10 = LOAD_REGISTER 10 { previousPage.cObject = TEXT previousPage.cObject.data = register:pageCounter previousPage.override.cObject = TEXT previousPage.override.cObject.dataWrap = {GPvar:startNummer}-1 previousPage.override.if.isTrue.data = GPvar:startNummer previousPage.prioriCalc = intval nextPage.cObject = TEXT nextPage.cObject.value = 2 nextPage.override.cObject = TEXT
624 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
nextPage.override.cObject.dataWrap = {GPvar:startNummer}+1 nextPage.override.if.isTrue.data = GPvar:startNummer nextPage.prioriCalc = intval
Lizensiert für Markus Mueller
} 20 = COA 20 { wrap = | 10 = TEXT 10 { value = < typolink { parameter.data = TSFE:id additionalParams.data = register:previousPage additionalParams.override.data = register:pageCounter additionalParams.override.if.isFalse.data = register:previousPage additionalParams.wrap = &startNummer=| } } } 40 = COA 40 { wrap = | 10 = TEXT 10 { value = > typolink { parameter.data = TSFE:id additionalParams.data = register:nextPage additionalParams.override.dataWrap = 1 additionalParams.override.if { value.data = register:pageCounter isGreaterThan.data = register:nextPage } additionalParams.wrap = &startNummer=| } } } }
Auch hier arbeiten Sie zunächst mit einem LOAD_REGISTER. Innerhalb dieses Elements weisen Sie zunächst den beiden Registern previousPage und nextPage Default-Werte zu, die immer dann verwendet werden, wenn die Seite ohne weitere URL-Parameter aufgerufen wurde. In diesem Fall befände sich der Besucher auf Seite 1 des Seitenbrowsers. Für previousPage wird daher der Wert von pageCounter verwendet, da der Pfeil nach links ans andere Ende der Seitenliste, also zur letzten Seite verlinken soll. Für nextPage muss logischerweise der Wert 2 verwendet werden.
Max. Linie
Ist in der URL der GET-Parameter startNummer gesetzt, müssen diese Werte per override überschrieben werden. Im Fall von previousPage wird dazu startNummer-1 verwendet, für nextPage entsprechend startNummer+1. Beide werden danach mit prioriCalc berechnet.
14.4 Eine mehrseitige Navigation mit Seitenbrowser erstellen | 625 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
In Abschnitt 20 erzeugen Sie nun den Pfeil nach links. Dabei erstellen Sie mit typolink einen Link zur aktuellen Seite. Dies erreichen Sie mithilfe von parameter.data = TSFE:id. Danach müssen Sie mit additionalParams den URL-Parameter zusammenbauen. Ist previousPage größer als 0, wird der Wert dieses Registers verwendet. Für den Fall, dass previousPage gleich 0 ist, der Besucher beim Blättern also auf Seite 1 angekommen ist, wird stattdessen der Wert von pageCounter verwendet. In beiden Fällen wird der String &startNummer= mithilfe von wrap vorangestellt.
Links
In Abschnitt 40 verfahren Sie ähnlich für den Pfeil nach rechts. Der Default-Wert wird dabei jedoch aus dem Register nextPage bezogen. Sollte der Wert von nextPage größer sein als der von pageCounter, wird stattdessen der Wert 1 verwendet. Für beide Pfeile werden also Links nach folgendem Muster erzeugt. Angenommen, wir befänden uns auf Seite 123 und im Seitenbrowser auf Seite 3: >
Lizensiert für Markus Mueller
Max. Linie
Zwischen den beiden Pfeilen sollen nun die Einträge aus dem Register pageList auf ähnliche Weise verlinkt werden. Hierzu fügen Sie in das bestehende COA-Element einen Abschnitt 30 ein. 30 = TEXT 30 { wrap = || data = register:pageList split { token = , cObjNum = 1|*|2|*| 1 { override.cObject = TEXT override.cObject { if { value.current = 1 equals.data = GPvar:startNummer } wrap = |<STRONG> | current = 1 } 10 = TEXT 10 { wrap = |<STRONG> | current = 1 if { isFalse.data = GPvar:startNummer } } 20 = TEXT 20 { wrap = | |
626 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
current = 1 typolink { parameter.data = TSFE:id additionalParams.current = 1 additionalParams.wrap = &startNummer=| } if { isTrue.data = GPvar:startNummer } } } 2 < .1 2 { 10 > 20.if > } } }
Innerhalb dieses Blocks kommt eine Kombination aus split, optionSplit, if-Abfragen und override zum Einsatz, um sämtliche Zustände der Links zu den einzelnen Seiten abdecken zu können. Lizensiert für Markus Mueller
Zunächst müssen Sie die Liste der Seiten per Komma separieren und für die einzelnen Elemente festlegen, wie sie gerendert werden sollen. Dies geschieht mithilfe der Funktion split, in der sie als Wert für token das Komma einsetzen. Da der Parameter cObjNum über optionSplit-Eigenschaften verfügt, können Sie hier genau festlegen, dass das erste Element anders behandelt werden soll als alle folgenden Elemente. Für das erste Element müssen Sie abfragen, ob der URL-Parameter startNummer gesetzt wurde. Ist dies nicht der Fall, befindet sich der Besucher in jedem Fall auf Seite 1, und der Link für diese Seite muss daher fett dargestellt werden. Dies geschieht im Unterbereich 10. Der Bereich override.cObject kommt hierbei noch nicht zum Tragen, weil er ebenfalls eine Abfrage enthält, die voraussetzt, dass startNummer bereits gesetzt wurde. In Bereich 20 wird davon ausgegangen, dass der Parameter startNummer bereits gesetzt wurde. Eine weitere Abfrage erfolgt hierbei nicht, denn sobald der Wert des zu erzeugenden Links (current=1) mit dem Parameter startNummer übereinstimmt, ist das Ergebnis der if-Abfrage im override.cObject wahr, und der Bereich 20 wird damit überschrieben. Ab der zweiten Seite benötigen Sie keine Unterscheidung mehr zwischen den Zuständen mit und ohne startNummer, da der Besucher nur dorthin gelangt sein kann, indem er auf einen Link geklickt und somit einen URL-Parameter übergeben hat. Machen Sie daher zunächst eine Kopie von Element 1 aus Ihrem optionSplit und entfernen Sie danach nur noch den Unterbereich 10 sowie die if-Abfrage im Unterbereich 20.
Max. Linie
Damit ist das mehrseitige Menü fast fertig. Fehlt nur noch ein umschließender div-Container, der nur dann angezeigt wird, wenn die Konstante maxAnzahl überschritten wird. Dies erreichen Sie mit stdWrap im abschließenden Codeblock.
14.4 Eine mehrseitige Navigation mit Seitenbrowser erstellen | 627 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links
Siehe auch Als Grundlage für dieses Rezept sollten Sie sich mit den fortgeschrittenen Rezepten zu stdWrap-Funktionen in Kapitel 10 sowie mit den Kapiteln 11 und 12 beschäftigen. In Rezept 12.18 erfahren Sie, wie Sie dieses Menü als Standard-Setup für das Inhaltselement Menü/Sitemap hinterlegen und damit allen Redakteuren zur Verfügung stellen können.
14.5 Den Backend-Seitenbaum als Frontend-Navigation simulieren Problem Sie haben eine umfangreiche Site mit einer größeren Anzahl von Ebenen. Damit die Navigation für die Nutzer dieser Seite so einfach wie möglich gemacht wird, möchten Sie einen Seitenbaum verwenden, wie Sie ihn bereits vom Backend her kennen.
Lizensiert für Markus Mueller
Bei einem Klick auf das Pluszeichen soll sich der entsprechende Teilbereich öffnen und bei einem Klick auf das Minuszeichen wieder schließen. Die aktuelle Seite soll dabei jedoch nicht verlassen werden. Erst bei einem Klick auf den Seitentitel selbst soll die entsprechende Seite aufgerufen werden. Außerdem wollen Sie auf die Verwendung von Frames, JavaScript und auf komplexe CSS-Spielereien mit versteckten Elementen verzichten.
Lösung Verwenden Sie die TypoScript-Elemente CONTENT und COA_INT zusammen mit den stdWrap-Funktionen split, if, outerWrap und innerWrap sowie einem GET-Parameter. Falls Sie dieses Rezept nicht Schritt für Schritt erarbeiten wollen, finden Sie den vollständigen Code am Stück auf der beiliegenden CD.
Diskussion Achtung! – Die hier gezeigte Lösung ist nur schwer nachvollziehbar, wenn Sie bisher keine hinreichenden Erfahrungen im Umgang mit TypoScript haben. Gegebenenfalls sollten Sie zunächst die Rezepte unter »Siehe auch« durchgehen und sich später mit diesem Ansatz beschäftigen. Unserer Meinung nach macht es wenig Sinn, den Code einfach nur zu verwenden, ohne ihn wirklich zu verstehen. Spätestens wenn Sie versuchen, ihn Ihren Bedürfnissen anzupassen, kostet das unnötig Zeit und Nerven.
Max. Linie
Doch nun zum Lösungsansatz: Sie werden sich vermutlich gefragt haben, warum dieses Rezept nicht in Kapitel 12 zu finden ist. Dies hat einen einfachen Grund. Damit ein Seitenbaum, wie er im Backend verwendet wird, funktioniert, muss man für einzelne Ele-
628 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
mente des Baums entscheiden können, ob diese ausgeklappt sein sollen oder nicht. In einem normalen HMENU wird dafür der Parameter expAll verwendet. Weil dieser jedoch nur für eine ganze Ebene, nicht aber für einzelne Elemente angewendet werden kann, kommt ein echtes HMENU hier nicht in Frage. Wenn Sie sich die Struktur eines Menüs einmal genauer anschauen, werden Sie jedoch schnell feststellen, dass dabei im Prinzip nichts anderes getan wird, als bestimmte Felder der Tabelle pages aufzulisten und mit einem Link zu versehen. Daher bietet es sich an, das cObject CONTENT zu verwenden. Das Auslesen der Elemente erfolgt mit einer select-Abfrage und das Erzeugen der Links im dazugehörigen renderObj. Das CONTENT-Element wird in eine ul-Liste gewrappt. Damit dies nur geschieht, wenn wirklich Inhalt vorhanden ist, kommt hier die stdWrap-Funktion required zum Einsatz. Mithilfe von pidInList.data = leveluid:0 setzen Sie den Startpunkt des Menüs auf die Root-Seite. Nebenbei legen Sie hier bereits mit where = doktype in (x,y,z) fest, welche Seitentypen verwendet werden können. In diesem Fall sind es die Typen Standard, Erweitert, Externe URL, Verweis und Abstand. Weil eine Abstand-Seite selbst nicht verlinkt werden darf, wird dies bereits in einer if-Abfrage berücksichtigt. Diese regelt, dass die Funktion typolink nur dann zum Einsatz kommt, wenn doktype (= Seitentyp) nicht 199 (= Abstand) ist.
Lizensiert für Markus Mueller
Max. Linie
temp.myFoldoutPart1 = CONTENT temp.myFoldoutPart1 { stdWrap { wrap = required = 1 } table = pages select { pidInList.data = leveluid:0 orderBy = sorting where = doktype in (1,2,3,4,199) } renderObj = COA renderObj { wrap = - |
10 = TEXT 10 { field = title typolink { parameter { field = uid if.value = 199 if.equals.field = doktype if.negate = 1 } } } } }
14.5 Den Backend-Seitenbaum als Frontend-Navigation simulieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 629
Mit dem bisherigen Code können Sie bereits eine Liste der ersten Ebene nach der RootSeite erzeugen. Damit die weiteren Ebenen mit einbezogen werden, müssen Sie das gesamte Objekt rekursiv anwenden.
Links
Dazu erzeugen Sie zunächst eine Kopie des Objekts und ändern den Parameter pidInList. Das maßgebliche Feld ist die UID der aktuellen Seite, weil diese als PID der Unterseiten dient. Danach wird die gesamte Kopie ins renderObj des bereits bestehenden Objekts direkt hinter den eigentlichen Linktext geschrieben. Je nach gewünschter Ebenenanzahl müssen Sie diesen Kopiervorgang entsprechend oft wiederholen. Im gezeigten Beispiel würden fünf Ebenen erzeugt, die allerdings alle noch aufgeklappt erscheinen. temp.myFoldoutPart2 < temp.myFoldoutPart1 temp.myFoldoutPart2 { select { pidInList > pidInList.field = uid } }
Lizensiert für Markus Mueller
temp.myFoldoutMenu = COA_INT temp.myFoldoutMenu { 10 < temp.myFoldoutPart1 10 { renderObj.20 < temp.myFoldoutPart2 renderObj.20 { renderObj.20 < temp.myFoldoutPart2 renderObj.20 { renderObj.20 < temp.myFoldoutPart2 renderObj.20 { renderObj.20 < temp.myFoldoutPart2 } } } } }
Damit die einzelnen Ebenen nicht sofort aufklappen, sondern erst auf Anforderung, benötigen Sie einen Parameter, der bei einem Klick auf ein Plussymbol die UID der dazugehörigen Seite in eine kommaseparierte Liste einträgt und an die URL anhängt. Außerdem benötigen Sie eine Abfrage für alle Menüs der höheren Ebenen, die ermittelt, ob für diese der entsprechende Parameter gesetzt ist oder nicht. Wir haben den Parameter in diesem Fall foldout genannt. Weil Sie foldout nur verwenden wollen, wenn die Seite über Unterseiten verfügt, benötigen Sie auch dafür eine Abfrage. Damit das Plussymbol direkt an den dazugehörigen Link gebunden wird, verwenden Sie die stdWrap-Funktion outerWrap für das TEXT-Element im renderObj.
Max. Linie
renderObj = COA renderObj { wrap = - |
10 = TEXT 10 {
630 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
outerWrap.cObject = COA outerWrap.cObject { if.isTrue.numRows { table = pages select { pidInList.field = uid where = doktype in (1,2,3,4,199) } } 10 = TEXT 10 { wrap = <span >| value = + typolink { ATagParams = title="fold out" parameter.data = leveluid:-1 additionalParams.cObject = COA additionalParams.cObject { 10 = TEXT 10.dataWrap = &foldout={field:uid} 10.if.isFalse.data = GPvar:foldout 20 = TEXT 20.value = &foldout= 20.dataWrap = |{field:uid},{GPvar:foldout} 20.if.isTrue.data = GPvar:foldout } } } } } }
Was passiert hier nun genau? – Zunächst fragen Sie mit if.isTrue.numRows ab, ob überhaupt Unterseiten existieren. Das sind logischerweise Seiten, deren PID der UID der gerade gerenderten Seite entspricht. Ist dies der Fall, wird ein Pluszeichen erzeugt und in ein span-Tag gepackt, damit es später mit CSS formatiert werden kann. Dieses Symbol erhält per typolink einen Link zur aktuellen Seite (leveluid:-1). Mit ATagParams erzeugen Sie einen Titel fold out, der später von einem Screenreader verwendet werden kann. Danach wird per additionalParams ein Parameter &foldout= erstellt. Ist dieser bereits als GET-Parameter in der URL enthalten, wird die UID der aktuellen Seite verwendet und zusätzlich der aktuelle Wert des Parameters angehängt. Gibt es noch keinen GET-Parameter, wird nur die UID verwendet. Auf diese Weise erhalten Sie einen Parameter &foldout= x,y,z. Dies entspricht einer Liste aller Seiten, die momentan den Status aufgeklappt haben. Hier die Abfrage im renderObj der höheren Ebenen, die ermittelt, ob die Elternseite in der Liste &foldout enthalten ist.
Max. Linie
temp.myFoldoutPart2 < temp.myFoldoutPart1 temp.myFoldoutPart2 { select {
14.5 Den Backend-Seitenbaum als Frontend-Navigation simulieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 631
pidInList > pidInList.field = uid
Links
} renderObj { if.value.data = GPvar:foldout if.isInList.field = pid } }
Das bisherige Ergebnis ist eine Liste von Seiten, die bei einem Klick auf das Pluszeichen eine Liste ihrer Unterseiten aufklappen. Das alles macht aber nur Sinn, wenn das Plusdanach zu einem Minussymbol wird und der dazugehörige Teilbereich bei einem Klick auf dieses Symbol wieder zugeklappt wird. Dazu fügen Sie einen weiteren TEXT-Block in das COA-Element des outerWrap ein. Außerdem erhalten der bisherige und der neue TEXT-Block eine if-Abfrage, die festlegt, dass nur einer der beiden Blöcke zum Einsatz kommt, je nachdem, ob die aktuelle UID in der kommaseparierten Liste vorkommt oder nicht. Ist sie enthalten, wird – verwendet, ansonsten +.
Lizensiert für Markus Mueller
Max. Linie
outerWrap.cObject = COA outerWrap.cObject { if.isTrue.numRows { table = pages select { pidInList.field = uid where = doktype in (1,2,3,4,199) } } 10 = TEXT 10 { wrap = <span >| value = + if.value.data = GPvar:foldout if.isInList.field = uid if.negate = 1 typolink { ATagParams = title="fold out" parameter.data = leveluid:-1 additionalParams.cObject = COA additionalParams.cObject { 10 = TEXT 10.dataWrap = &foldout={field:uid} 10.if.isFalse.data = GPvar:foldout 20 = TEXT 20.value = &foldout= 20.dataWrap = |{field:uid},{GPvar:foldout} 20.if.isTrue.data = GPvar:foldout } } } 20 = TEXT
632 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
20 { wrap = <span >| value = – if.value.data = GPvar:foldout if.isInList.field = uid typolink { parameter.data = leveluid:-1 ATagParams = title="fold in" additionalParams.cObject = COA additionalParams.cObject { 10 = TEXT 10 { data = GPvar:foldout split { token = , cObjNum = 1 1 { if.value.current = 1 if.equals.field = uid if.negate =1 current = 1 wrap = |, } } } wrap = &foldout=|0 } } } }
Bei näherer Betrachtung werden Sie feststellen, dass der zweite Textblock den &foldoutParameter auf eine völlig andere Art und Weise erzeugt als der erste. Der Grund dafür ist, dass die UID der jeweiligen Seite aus der kommaseparierten Liste entfernt werden muss, wenn diese aufgeklappt ist. So stellen Sie sicher, dass sie bei einem Klick auf das Minuszeichen ihre Unterseiten nicht mehr aufklappt. Sie erreichen dies mithilfe der stdWrap-Funktion split. Der TEXT-Block erhält als Wert zunächst den kompletten Inhalt des Parameters &foldout. Dieser Inhalt wird nun durch split in einzelne Zahlen zerlegt. Für jede dieser Zahlen wird mit einer if-Abfrage überprüft, ob sie mit der UID der aktuell gerenderten Seite übereinstimmt. Ist dies der Fall, wird dieser Eintrag übersprungen. Gibt es keine Übereinstimmung, wird die Zahl und ein Komma wieder in die Liste eingetragen. Aus kosmetischen Gründen wird nach dem letzten Komma eine 0 angehängt, die verhindert, dass am Ende der Liste eine Reihe von Kommata ohne Werte erzeugt wird. Das Ergebnis ist für jedes Minusymbol eine Liste, die bis auf die UID der dazugehörigen Seite alle anderen Werte für weitere aufgeklappte Seiten enthält.
Max. Linie
Max. Linie
Die nun folgenden Elemente haben kosmetische Aufgaben:
14.5 Den Backend-Seitenbaum als Frontend-Navigation simulieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 633
Mithilfe der stdWrap-Funktion innerWrap bekommt der Link ein weiteres span-Tag mit der Klasse current zugewiesen. Zusätzlich kommt dort wieder eine if-Abfrage zum Einsatz, die dafür sorgt, dass innerWrap nur dann ausgeführt wird, wenn die UID des Links identisch mit der UID der Seite ist, auf der sich der Betrachter im Moment befindet.
Links
Für alle Elemente, die keine Unterseiten besitzen, wird statt des Plus- bzw. Minuszeichens ein leeres span-Tag erzeugt, das dafür sorgt, dass die Elemente gleichmäßig ausgerichtet werden. Jeder Seitentitel bekommt außerdem per wrap einen waagerechten Strich vorangestellt:
Lizensiert für Markus Mueller
innerWrap.cObject = TEXT innerWrap.cObject { value = <span >| if.value.data = TSFE:id if.equals.field = uid } prepend = TEXT prepend { if.isFalse.numRows { table = pages select { pidInList.field = uid where = doktype in (1,2,3,4,199) } } value = <span > } wrap = <span >– |
Wenn Sie diesen Code verwenden, sollten Sie immer darauf achten, dass der Parameter foldout per config.linkVars im Setup Ihrer Seite eingetragen wird. Nur so können Sie sicherstellen, dass bei einem Klick auf einen Seitentitel der aktuelle Zustand des Seitenbaums erhalten bleibt. Falls dabei hin und wieder der Fall eintritt, dass der GET-Parameter doppelt angehängt wird, ist dies nicht weiter tragisch, da der zweite Eintrag den ersten prinzipiell überschreibt. Sie können dies aber auch verhindern, indem Sie config.uniqueLinkVars = 1 verwenden.
Durch die konsequente Verwendung von typolink bei der Erzeugung der Links stellen Sie übrigens sicher, dass alle anderen Parameter, die gegebenenfalls von weiteren Extensions hinzugefügt wurden, erhalten bleiben, wenn Sie diese unter config.linkVars eingetragen haben.
Max. Linie
Sollten Sie sich fragen, warum wir für das eigentliche myFoldoutMenu ein COA_INT verwendet haben und kein einfaches COA, hat dies einen einfachen Grund: Da Sie sich bei einem Klick auf eines der Symbole weiterhin auf der gleichen Seite befinden, muss selbstverständlich verhindert werden, dass das Menü aus dem Cache geholt wird, weil es sonst keine sichtbare Veränderung des Zustands gäbe. Genau dies wird mit COA_INT erreicht.
634 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Siehe auch Als Grundlage für dieses Rezept sollten Sie sich mit dem Rezept 13.5 und den fortgeschrittenen Rezepten für stdWrap-Funktionen in Kapitel 10 beschäftigen. In Rezept 12.18 erfahren Sie, wie Sie dieses Menü als Standard-Setup für das Inhaltselement Menü/Sitemap hinterlegen und damit allen Redakteuren zur Verfügung stellen können.
14.6 Kopfgrafiken mit halbtransparenten Textboxen erstellen Problem Sie wollen auf Ihrer Seite Kopfgrafiken mit halbtransparenten Textboxen im Stil von www. typo3.com einbinden. Dazu wollen Sie den Redakteuren die Möglichkeit geben, neben mehrzeiligen Überschriften auch die Hintergrundbilder für die jeweiligen Unterseiten zu variieren. Zusätzlich sollen die Grafiken auf zugängliche Weise in ein h1-Tag eingebettet werden. Lizensiert für Markus Mueller
Max. Linie
Lösung Erweitern Sie die Lösung aus Rezept 11.9 mithilfe der Maskiertechniken, die Ihnen im IMAGE-Objekt des GIFBUILDER-Elements zur Verfügung stehen. Verwenden Sie Seiten vom Typ Erweitert und laden Sie im dortigen Feld Dateien die gewünschten Hintergrundbilder hoch. Ab TYPO3-Version 4.2 finden Sie dieses Feld bereits im Seitentyp Standard. Wenn die Überschrift der Seite vom eigentlichen Titel abweichen soll, verwenden Sie das Feld Beschreibung und machen sich die Tatsache zu Nutze, dass dieses Feld bereits für mehrzeilige Eingaben vorgesehen ist. Verschachteln Sie mehrere GIFBUILDER-Elemente ineinander und nutzen Sie den Parameter mask, um den abgedunkelten Bereich in das Hintergrundbild einzublenden. temp.kopfgrafik = COA temp.kopfgrafik { wrap = | 10 = IMG_RESOURCE 10 { file = GIFBUILDER file { format = png XY = 955,128 10 = IMAGE 10 { file { width = 955 height = 128 import { required = 1
14.6 Kopfgrafiken mit halbtransparenten Textboxen erstellen | 635 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
data = levelmedia: -1, "slide" wrap = uploads/media/ | listNum = 0
Links
} }
Lizensiert für Markus Mueller
} 20 = IMAGE 20 { offset = 945-[20.w],128-[20.h]/2 file = GIFBUILDER file { XY = [10.w]+20,[10.h]+17 backColor = #000000 10 = TEXT 10 { text.field = abstract//title text.required = 1 fontFile = fileadmin/fonts/hausschrift.ttf fontColor = #ffffff fontSize = 30 offset = 10,30 niceText = 1 niceText.scaleFactor = 4 niceText.sharpen = 20 } } mask < .file mask { backColor = #999999 } } } stdWrap.outerWrap.cObject = COA stdWrap.outerWrap.cObject { 5 = LOAD_REGISTER 5.headerlines.cObject = TEXT 5.headerlines.cObject.field = abstract//title 5.headerlines.cObject.br = 1 10 = TEXT 10.value = 20 = TEXT 20.dataWrap = <span>{register:headerlines} } } }
Hier ein Beispiel für ein Stylesheet, wie es auf der Seite der TYPO3-Usergroup NRW http:// ug.typo3-nrw.de verwendet wird:
Max. Linie
#kopfgrafik { width: 955px; height: 128px; border-bottom: 1px solid #fff; }
636 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
#kopfgrafik h1 { width:955px; height:128px; border-top: 1px solid #ff8700; } #kopfgrafik h1 span { display:block; height:1px; width:1px; overflow:hidden; line-height:128px; }
Diskussion Im Zuge der neuen Corporate Identity von TYPO3 hat die offizielle Website www.typo3. com ebenfalls ein neues Gesicht erhalten. Im Kopfbereich der Seite, direkt unter dem Hauptmenü, befindet sich eine Kopfgrafik, die im rechten Bereich ein abgedunkeltes Feld inklusive einer Überschrift in der neuen Hausschrift Share aufweist. Lizensiert für Markus Mueller
Das Bild wurde zwar in diesem Fall von einem Grafiker produziert und dann manuell eingefügt, jedoch würde es sich anbieten, für eine ganze Serie solcher Kopfgrafiken die Bildbearbeitungsfähigkeiten von TYPO3 zu nutzen und diese automatisiert erzeugen zu lassen. Da TYPO3 ab Version 4.0 die Möglichkeit bietet, nun auch mit dem sogenannten GIFBUILDER qualitativ hochwertige Grafiken mit 24-Bit-Farbe zu produzieren, können Sie diese Aufgabe mit Bordmitteln lösen. Voraussetzung hierfür ist, dass PHP auf Ihrem Server über die aktuelle gdlib2-Library verfügt, weil die Vorgängerversion nur maximal 256 Farben erzeugen kann. Nutzer früherer TYPO3-Versionen müssen zusätzlich noch die Extension kb_ allcolors installieren, weil ansonsten auch unter Einsatz der gdlib2 nur mäßige Ergebnisse geliefert würden.
Doch nun zur Lösung: Zunächst benötigen Sie die eigentlichen Hintergrundgrafiken. Stellen Sie dazu den Seitentyp der entsprechenden Seiten, auf denen das Bild erstmalig vorkommen soll, auf Erweitert und laden Sie dann im Feld Dateien die jeweils gewünschte Grafik hoch. Erstmalig deswegen, weil wir in unserem Codebeispiel davon ausgehen, dass auf sämtlichen Unterseiten der jeweiligen Seiten dasselbe Bild zu sehen sein wird, es sei denn, Sie laden dort ein eigenes Bild hoch, für das dann die gleiche Regel gilt. Dies wird mithilfe der Option slide bei der Abfrage des Dateifelds media erreicht. Laden Sie außerdem die gewünschte Hausschrift in den Ordner fileadmin/fonts/ hoch.
Max. Linie
Zusätzlich bietet Ihnen der Seitentyp Erweitert noch das Textfeld Beschreibung, mit dessen Hilfe Sie sofort und ohne weitere Modifikationen mehrzeilige Texte für die Überschrift produzieren können.
14.6 Kopfgrafiken mit halbtransparenten Textboxen erstellen | 637 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links Seit TYPO3-Version 4.2 existiert der Seitentyp Erweitert nicht mehr, und Sie müssen die erforderlichen Dateien und Beschreibungen direkt im Seitentyp Standard einpflegen.
Das Grundgerüst dieser Grafiklösung besteht aus einem Setzkastenelement COA sowie einer IMG_RESOURCE, die mithilfe von stdWrap.outerWrap in den Inline-style eines h1Tags eingebettet wird. Zusätzlich wird innerhalb dieses outerWrap der Text aus dem Beschreibungsfeld abstract ausgelesen und mit Zeilenschaltungen versehen. Sollte das Feld leer sein, wird title als Text verwendet. Dieser Text wird in ein span-Tag verpackt, um ihn später unsichtbar machen zu können. Eine spezielle Verpackung wegen der Mehrzeiligkeit, wie sie in Rezept 11.11 beschrieben wird, ist hier aufgrund der festen Höhe der Hintergrundgrafik nicht erforderlich. Mithilfe der wrap-Eigenschaft des COA verpacken Sie das gesamte Konstrukt in einem umschließenden div-Tag. Innerhalb des Elements IMG_RESOURCE erzeugen Sie zunächst mithilfe des Parameters file ein GIFBUILDER-Element. Die format-Einstellung sollte PNG sein, um die maximal
Lizensiert für Markus Mueller
mögliche Qualität zu erzielen. JPG wäre ebenfalls möglich, das Format GIF würde sich nur bei vollflächigen Grafiken anbieten. Es folgen nun zwei Hauptebenen 10 und 20, die jeweils aus einem IMAGE-Objekt bestehen. Das erste Objekt liefert dabei das Hintergrundbild, im zweiten wird die jeweilige Überschrift auf grauem Hintergrund erzeugt. Weil dieses graue Rechteck den eigentlichen Hintergrund jedoch einfach nur überlagern würde, haben wir uns in diesem Fall der Maskiertechnik bedient, um in dieser Ebene das Hintergrundbild ebenfalls mit einzublenden. Hierzu wird innerhalb des IMAGE-Objekts als file ein weiteres GIFBUILDER-Element erzeugt. Dieses orientiert sich in seiner Größe am darin enthaltenen TEXT-Objekt 10 und erhält einen schwarzen Hintergrund. Nun erzeugen Sie in eben diesem TEXT-Objekt den eigentlich sichtbaren weißen Text. Er wird mithilfe von niceText geglättet, wobei der Parameter sharpen dafür sorgt, dass das Ergebnis nicht zu verschwommen wirkt. Um das so erzeugte schwarze Rechteck mit weißem Text in die Hintergrundgrafik einzublenden, benötigen Sie nun noch eine Maske. Diese besteht aus einer Kopie des Bereichs file, in der Sie lediglich die Hintergrundfarbe verändern müssen. Mit diesem Grauwert bestimmen Sie letztlich, welcher Anteil der Hintergrundgrafik durchscheinen soll. Etwas knifflig ist nur noch die Positionierung der zweiten Ebene, denn diese soll sich immer 10 px vom rechten Rand der Grafik entfernt befinden und in der Höhe zentriert werden. Hierzu verwenden Sie wieder die Berechnungsoptionen bei der Angabe von Größen und Positionswerten innerhalb des GIFBUILDER. In diesem Fall orientiert sich die Position der linken oberen Ecke des Rechtecks an seiner eigenen Größe. Hieraus ergibt sich die Formel:
Max. Linie
X = Breite des Bildes – 10 – Breite des Rechtecks Y = (Höhe des Bildes – Höhe des Rechtecks) / 2
638 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Da die Berechnung in GIFBUILDER-Objekten keine Punkt-vor-Strich-Regel verwendet, können Sie auf Klammern verzichten, und das Ergebnis lautet: offset = 945-[20.w],128-[20.h]/2
Je nach verwendeter Schriftart und Größe sowie gewünschtem Endformat der fertigen Grafik müssen Sie selbstverständlich die verwendeten Werte für XY, width, height, offset und fontSize entsprechend anpassen.
Siehe auch Die Grundlagen dieser Lösung finden Sie in drei der vorhergehenden Rezepte. Die zugängliche Ausgabe von Texten mit dem GIFBUILDER wird in Rezept 11.9 behandelt. Das Einfügen der Zeilenschaltungen für die Darstellung des gleichen Texts auf nicht grafischen Browsern stammt aus Rezept 11.11. Die Verwendung von Masken wird in Rezept 14.7 weiter gehend beschrieben.
14.7 Pseudotransparenzen für Überschriften oder Menüs erstellen Lizensiert für Markus Mueller
Problem Sie müssen eine Seite gemäß den Vorgaben zur Corporate Identity Ihres Kunden gestalten. Dabei sollen Sie dafür sorgen, dass sämtliche Links in der Navigation sowie alle Überschriften mit der Hausschrift des Kunden erzeugt werden. Außerdem sollen für Menüs und Überschriften Hintergrundgrafiken erzeugt werden, deren Größe sich dem textlichen Inhalt anpasst und die sowohl über abgerundete Ecken als auch einen seitlich versetzten weichen Schatten verfügen. Da die Seite selbst ebenfalls über eine Hintergrundgrafik verfügen soll, müssen Sie diese bei der Berechnung der Überschriften und Menüeinträge mit berücksichtigen, um sogenannte Blitzer zwischen dem Hintergrundbild und der Grafik im Vordergrund zu vermeiden.
Lösung Erzeugen Sie ein dynamisches Stylesheet und versehen Sie darin das body-Tag mit einer GIFBUILDER-Grafik als Hintergrund. Verwenden Sie dazu die Hausschrift des Kunden sowie eine Symbolschrift wie z.B. Zapf Dingbats und nutzen Sie die Objekte IMAGE, CROP, TEXT, BOX und EFFECTS des GIFBUILDER.
Max. Linie
Begrenzen Sie mithilfe von maxItems die Anzahl der Menüeinträge und legen Sie für jede Position mithilfe von optionSplit verschiedene Ausschnitte für den Hintergrund fest.
14.7 Pseudotransparenzen für Überschriften oder Menüs erstellen | 639 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Verwenden Sie je eine eigene Ebene für das Hintergrundbild und die Vordergrundgrafik. Erzeugen Sie die Vordergrundgrafik mithilfe eines GIFBUILDER-Elements und verwenden Sie eine ebenfalls mit GIFBUILDER erzeugte Maske, um Vordergrund und Hintergrund miteinander zu kombinieren.
Links
Die folgenden Teile benötigen Sie sowohl für das Menü als auch für den Header in Ihrem TS-Setup:
Lizensiert für Markus Mueller
Max. Linie
temp.bodyBackground = COA temp.bodyBackground { wrap = body {|} 10 = IMG_RESOURCE 10 { file { import = uploads/media/ import.data = levelmedia:-1,slide import.listNum = 0 width = 1024m height = 768m params = -quality 60 } stdWrap.wrap = background: #999999 url(|) no-repeat; } } temp.gifBuilderSetup = GIFBUILDER temp.gifBuilderSetup { format = jpg quality = 90 XY = [10.w],[10.h] backColor = #999999 10 = IMAGE 10 { file { import = uploads/media/ import.data = levelmedia:-1,slide import.listNum = 0 params = -quality 60 width = 1024m height = 768m } } 20 = CROP 20 { crop = 50,50,[30.w],65 || 50,115,[30.w],65 || 50,180,[30.w],65 || 50,245,[30.w],65 || 50,310,[30.w],65 } 30 = IMAGE 30 { file = GIFBUILDER file { format = jpg quality = 90 XY = [80.w]+65,65
640 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Max. Linie
backColor = #000000 10 = TEXT 10 { text = l fontFile = fileadmin/fonts/symbolschrift.ttf fontSize = 62 fontColor = #990000 offset = 10,49 } 20 = BOX 20 { dimensions = 36,5,[80.w],45 color = #990000 } 30 < .10 30 { offset = [80.w]+10,49 } 80 = TEXT 80 { text.field = title fontFile = fileadmin/fonts/hausschrift.ttf fontSize = 34 fontColor = #ffffff offset = 36,38 } } mask < .file mask { XY = [80.w]+65,65 10 { fontSize = 60 fontColor = #ffffff offset = 6,54 } 20 { dimensions = 30,11,[80.w],45 color = #ffffff } 30 { fontSize = 60 fontColor = #ffffff offset = [80.w]+8,54 } 40 = EFFECT 40 { value = blur=90 } 50 < .10 50 { fontSize = 62 fontColor = #ffffff offset = 10,49 }
14.7 Pseudotransparenzen für Überschriften oder Menüs erstellen | 641 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
60 = BOX 60 { dimensions = 36,5,[80.w],45 color = #ffffff } 70 < .50 70 { offset = [80.w]+10,49 }
Links
} } }
Für ein grafisches Menü kommt dieser Code in Ihr TS-Setup:
Lizensiert für Markus Mueller
Max. Linie
temp.effectsMenu = HMENU temp.effectsMenu { wrap = | entryLevel = 0 maxItems = 5 1 = GMENU 1 { wrap = NO = 1 NO < temp.gifBuilderSetup NO { allWrap = - |
} } } additionalStyles = PAGE additionalStyles { typeNum = 49 config { disableAllHeaderCode = 1 additionalHeaders = Content-type: text/css admPanel = 0 } 10 < temp.bodyBackground } page = PAGE page { bodyTag = includeCSS { mainCSS = fileadmin/css/main.css } headerData { 10 = TEXT 10 { dataWrap = } } 10 < temp.effectsMenu }
642 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Hier der Code für den grafischen Header nach dem gleichen Prinzip:
Lizensiert für Markus Mueller
lib.stdheader.10.5 > lib.stdheader.10 { 5 = IMG_RESOURCE 5 { file = GIFBUILDER file < temp.gifBuilderSetup file.20.crop = 0,0,500,65 file.30.file.80.text.current = 1 file.30.mask.80.text.current = 1 stdWrap { innerWrap.cObject = COA innerWrap.cObject { 10 = TEXT 10.dataWrap = 40 = TEXT 40.value = <span style="display:block 50 = TEXT 50.value = ; width:1px; height:1px; overflow:hidden;"> 60 = TEXT 60.current = 1 60.wrap = | } } } }
Mit diesem Setup werden sämtliche grafischen Überschriften in allen Inhaltselementen dem Menü angepasst. Achten Sie hierbei darauf, dass Sie für den Parameter CROP gegebenenfalls andere Werte verwenden müssen, damit der Hintergrund passend zur Position Ihrer Überschrift beschnitten wird. Logischerweise können Sie die grafische Überschrift in diesem Fall immer nur für das erste Elemente auf einer Seite verwenden, weil die Position der folgenden Element nicht genau vorhergesagt werden kann.
Diskussion
Max. Linie
Die eben beschriebene Problemstellung ist nicht selten. Der Kunde wünscht eine Darstellung, die sich mit CSS-Bordmitteln nicht realisieren lässt. Runde Ecken und Schatten sind in den CSS-Spezifikationen bisher nicht vorgesehen, Transparenzen und speziell Alphakanäle von PNG-Dateien in den verschiedenen Browsern nur unzureichend implementiert. Die Darstellung von Objekten mit einem weichen Schatten über einer Hintergrundgrafik gestaltet sich also mehr als schwierig. Als Workaround wird hier oft mit einer Zweischichtmethode gearbeitet, bei der erst die transparente Grafik eingebunden und später
14.7 Pseudotransparenzen für Überschriften oder Menüs erstellen | 643 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
eine zweite direkt darüber platziert wird. Dies führt jedoch zu einem nicht unerheblichen Überschuss an eigentlich unnötigen HTML-Elementen und ist einer semantischen Struktur sicherlich nicht dienlich.
Links
Für das bessere Verständnis dieses Rezepts empfiehlt es sich, dass Sie den Code nicht komplett kopieren und direkt verwenden. Geben Sie die einzelnen Bereiche exakt in der beschriebenen Reihenfolge ein, leeren Sie nach jedem Schritt den Cache und schauen Sie sich das Ergebnis an. Dadurch wird die Arbeitsweise des GIFBUILDER wesentlich besser nachvollziehbar. Aus demselben Grund finden Sie in diesem Rezept auch keine Bildschirmansichten. Im Übrigen würde je nach verwendeter Schriftart und Hintergrundgrafik Ihr Ergebnis sowieso von dem unsrigen abweichen. Daher müssen Sie gegebenenfalls die verwendeten Werte für Größen- und Positionsberechnungen ein wenig anpassen.
Lizensiert für Markus Mueller
Damit Sie dennoch einen weichen Schatten über einer Hintergrundgrafik erzeugen können, ohne dass dieser später wie ausgestanzt wirkt, bleibt nur, mit sogenannten Pseudotransparenzen zu arbeiten. Dabei wird eine Grafik erzeugt, deren Hintergrund exakt mit dem Teil des Seitenhintergrunds übereinstimmt, über dem sie sich befindet. Logischerweise funktioniert dieser Ansatz nur mit pixelgenauen Layouts, bei denen Größen- und Positionsangaben nicht relativ, sondern absolut berechnet werden. Da Sie aber auch diese Angaben dynamisch erzeugen können, muss das Layout nicht zwangsläufig unter allen Bedingungen identisch aussehen. Sehen Sie sich hierzu bei Bedarf die Rezepte zum Thema Conditions an, die Sie unter »Siehe auch« finden. Nach dem Prinzip von Rezept 9.3 erzeugen Sie zunächst eine Hintergrundgrafik in einem eigens dafür eingerichteten Seitentyp. Die Typnummer 49 ist nicht zwingend erforderlich, Sie können daher auch andere Werte verwenden, sollten dies aber bei der Einbindung in den header der eigentlichen Seite berücksichtigen. Weil es hier allerdings nur darum geht, das body-Tag mit einem Style zu versehen, haben wir in diesem Beispiel kein vordefiniertes Template verwendet, sondern generieren den CSS-Code direkt über TypoScript. Der hier verwendete Code erzeugt in jedem Fall einen grauen Hintergrund. Wird dabei innerhalb der Rootline ein Bild gefunden, das der Redakteur im Bereich Seitentitel bearbeiten unter Dateien hochgeladen hat, wird dieses zusätzlich zum grauen Hintergrund verwendet und bei Bedarf gekachelt. So können die Redakteure bequem für verschiedene Teilbereiche des Seitenbaums entsprechende Hintergrundgrafiken angeben, die immer automatisch ins Stylesheet eingebunden werden. Um zu verhindern, dass dabei durch extrem hochaufgelöste Dateien das System beim Berechnen der Grafiken überlastet wird, sollten Sie die Größe dieser Hintergrundgrafik mithilfe von width und height auf ein Maximum beschränken. Um dabei die Proportionen zu erhalten, notieren Sie hinter dem numerischen Wert ein m.
Max. Linie
Damit diese Grafik nun als Quelle für das in Rezept 10.9 beschriebene GMENU dienen kann, müssen Sie zunächst drei Ebenen für den GIFBUILDER festlegen. Die Hintergrundfarbe für das gesamte Element ist ebenfalls grau. Das Dateiformat soll JPG mit
644 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
einer Qualitätsstufe von 90 sein, weil GIF nur über 256 Farben verfügt. Daran können Sie erkennen, dass die Bezeichnung GIFBUILDER eigentlich nicht wirklich zutreffend ist, IMAGEBUILDER wäre eigentlich treffender. Da zu Zeiten der gdlib1 unter PHP aber nur 256 Farben erzeugt werden konnten, hat die Bezeichnung eher historische Gründe und wird nun aus Kompatibilitätsgründen beibehalten. Die erste der drei Hauptebenen, Ebene 10, enthält das bereits beschriebene Hintergrundbild. Auf Basis dieser Ebene wird zunächst auch die Ausgangsgröße der Grafik berechnet. Auf der folgenden Funktionsebene 20 wird mithilfe von CROP und optionSplit dafür gesorgt, dass der Ausschnitt aus diesem Hintergrund sich der Position des jeweiligen Menüpunkts anpasst. Da wir die Maximalanzahl der Einträge per maxItems auf 5 reduziert haben, gibt es im Beispiel nur fünf Einträge innerhalb von optionSplit. Sollten Sie mehr Einträge in Ihr Menü einbauen wollen, müssen Sie die entsprechende Konfiguration im optionSplit hinzufügen. Die Spielregeln hierfür lauten: • Die linke obere Ecke des ersten Eintrags befindet sich 50 px vom oberen und linken Rand entfernt. • Jeder Grafik ist so breit wie die Breite des Bildes, das auf Ebene 30 erzeugt wird, und 65 px hoch.
Lizensiert für Markus Mueller
• Für die Position der folgenden Einträge wird die Y-Position jeweils um 65 px vergrößert. Das bedeutet logischerweise, dass Sie in Ihrem allgemeinen, nicht dynamischen Stylesheet entsprechende Angaben machen müssen, damit diese Positionen übereinstimmen. Die einzelnen li-Tags dürfen dabei keinerlei vertikalen Abstand aufweisen, und die linke obere Ecke des umschließenden div-Tags sollte ebenfalls jeweils 50 px vom Rand entfernt sein. Auf Ebene 30 wird nun ein weiteres Bild hinzugefügt, das seinerseits mithilfe von GIFBUILDER erzeugt wird. Zusätzlich erhält es eine ebenfalls mit GIFBUILDER erstellte Maske, mit deren Hilfe es in das Originalbild kopiert wird. Falls Sie sich mit dem Prinzip einer Maske noch nicht auskennen, hier die grundlegenden Regeln: • Eine Maske besteht aus 256 Graustufen. • Sie dient als Berechnungsgrundlage für das Ineinanderkopieren zweier Bilder, wobei die Berechnung pixelweise anhand des Grauwerts erfolgt. • Das Hintergrundbild entspricht dabei der Farbe Schwarz, das Vordergrundbild der Farbe Weiß. • Ein Maskenwert von 50% Grau liefert als Ergebnis jeweils 50% von Vorder- und Hintergrundbild. • Die Anteile beider Bilder addieren sich immer zu 100%, 70% Grau liefern also 70% Hintergrund + 30% Vordergrund als Ergebnis.
Max. Linie
Max. Linie 14.7 Pseudotransparenzen für Überschriften oder Menüs erstellen | 645 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Für unser Beispiel folgt daraus, dass der Schatten nicht separat erzeugt werden muss, sondern über die Maske simuliert werden kann. Deswegen reicht es aus, für die eigentliche Grafik mit einem schwarzen Hintergrund zu arbeiten, der später durch die Maske keine harte Schnittkante, sondern eine weiche Ausblendung erhält.
Links
Die eigentliche Grafik wird nun aus vier Ebenen zusammengesetzt. Sie erhält, wie in Rezept 11.10 beschrieben, zwei Ebenen vom Typ TEXT. Darin werden die runden Ecken über eine Symbolschriftart erzeugt. Da der Linktext sich in diesem Fall auf Ebene 80 befindet, wurden die Größen- und Positionsberechnungen entsprechend angepasst. Das Ergebnis der unmaskierten Ausgabe wäre ein roter Button mit abgerundeten Ecken auf schwarzem Grund. Wir haben in diesem Beispiel für den Text die Ebene 80 verwendet, weil danach das gesamte Setup von file in den Bereich mask kopiert wird, um es für die Maske zu verwenden. In der Maske werden jedoch vor dem Textelement noch weitere Elemente eingefügt, die ebenfalls in Zehnerschritten durchnummeriert werden. Speichern Sie nun und kontrollieren Sie das Ergebnis. Sie sollten rechteckige Flächen sehen, die sich über dem von Ihnen gewählten Hintergrund befinden.
Lizensiert für Markus Mueller
Für die Maske benötigen Sie wiederum alle Elemente des ursprünglichen Menüs: den Linktext, um die Größenangaben daraus zu beziehen, sowie die drei Elemente zur Erzeugung des Schattens und deren Pendant, um den eigentlichen Button zu konstruieren. Daher wird zunächst das Setup des Bereichs file kopiert. Alle diese Elemente müssen gemäß den Spielregeln für Masken weiß sein und sich auf einem schwarzen Hintergrund befinden, damit später in den weißen Bereichen der eigentliche Button sichtbar werden kann. Daher werden nur die relevanten Parameter geändert. Dadurch ergibt sich ein weißer Button auf schwarzem Grund, dessen Schatten von Weiß nach Schwarz verläuft. Der Text bleibt unsichtbar, muss aber wegen der Größenanpassung auf jeden Fall als eigene Ebene mit einbezogen werden. In diesem Fall sollten Sie auf eine Skalierung um 50% verzichten und direkt in der Originalgröße arbeiten, weil die Hintergrundgrafik mit skaliert und damit nicht mehr zum Originalhintergrund passen würde. Wenn Sie dennoch eine Skalierung für einen AntialiasingEffekt vornehmen wollen, müssen Sie diese selbstverständlich auch für das dynamische Stylesheet angeben. In diesem Fall müssten Sie als Ausgangsmaterial Hintergrundbilder in doppelter Auflösung bereitstellen. Damit Sie das gleiche Setup für einen grafischen Header im Bereich lib.stdhheader verwenden können, müssen Sie es zunächst ebenfalls kopieren. Danach werden für den Parameter CROP sowie für die beiden Textelemente die Werte dem Setup von lib.stdheader angepasst.
Max. Linie
Max. Linie 646 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Siehe auch Die zugängliche Ausgabe von Texten mit dem GIFBUILDER wird in Rezept 11.9 behandelt. Das Erzeugen eines Hintergrundbilds und das Einbinden desselben über ein dynamisches Stylesheet wird in Rezept 9.3 beschrieben.
14.8 Inhalte von Extensions unabhängig von Plugins ausgeben Problem Sie haben eine oder mehrere Extensions installiert, die Ihnen zusätzlich zu den üblichen Inhaltselementen weitere Inhalte liefern, die so mithilfe von tt_content allein nicht darstellbar gewesen wären. Diese Extensions liefern jedoch die Inhalte nicht Ihren Wünschen entsprechend aus und sind zudem nicht so konfigurierbar, dass Sie mit einem eigenen HTML-Template oder zumindest mit TypoScript-Parametern auf die Ausgabe Einfluss nehmen könnten. Lizensiert für Markus Mueller
Sie wollen dennoch die Inhalte der Extension wunschgemäß ausgeben und sich dabei nicht durch den Extension-Autor in Ihrer Flexibilität beschränken lassen.
Lösung Versuchen Sie zunächst, die Ausgabe der Extension mithilfe eines COA- oder eines COA_INT-Setzkastens zu erweitern. temp.nameDesPlugins < plugin.nameDesPlugins plugin.nameDesPlugins > plugin.nameDesPlugins = COA plugin.nameDesPlugins { 100 < temp.nameDesPlugins }
So können Sie zumindest weitere Elemente, Parameter und Wraps hinzufügen. Sollte dies immer noch nicht ausreichen, was leider oftmals der Fall ist, greifen Sie einfach per CONTENT direkt auf die Tabelle der Extension zu. plugin.nameDesPlugins > plugin.nameDesPlugins = COA plugin.nameDesPlugins { 100 = CONTENT 100 { table = tabellenname
Max. Linie
Max. Linie 14.8 Inhalte von Extensions unabhängig von Plugins ausgeben | 647 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
select { pidInList = 123,456 andWhere.cObject = COA andWhere.cObject { wrap = uid=| 10 = TEXT 10.data = GPvar:meinParameter 10.prioriCalc = intval } } renderObj = COA renderObj { 10 = TEXT 10.field = feldname }
Links
} }
Zulässig sind für diese Art des Zugriffs sämtliche Tabellennamen, die mit den Kürzeln tt_, tx_, ttx_, fe_ oder user_ beginnen, sowie die Tabelle pages. Sie können daher per TypoScript keine Ausgabe sicherheitsrelevanter Systemtabellen vornehmen.
Diskussion Lizensiert für Markus Mueller
Eine der Grundregeln für den sinnvollen Einsatz eines Content-Management-Systems lautet: Es ist weitestgehend zwischen Inhalt, Logik, Struktur und Design zu trennen. HTML-Code ist hierbei ein Bestandteil der Struktur und hat demzufolge weder in der Datenbank (Inhalt) noch im PHP-Code (Logik) etwas zu suchen. Ausnahmen bestätigen jedoch auch hier die Regel, denn eine Funktion typolink z.B. sollte sicherlich einen entsprechenden Link zurückliefern dürfen. Bei der Programmierung von Extensions gehen die Autoren oftmals leider wesentlich weiter und codieren ganze HTML-Blöcke als feste Bestandteile der PHP-Logik ins Plugin. Mit etwas Glück finden Sie als Nutzer der Extension einige TypoScript-Parameter vor, mit deren Hilfe Sie zumindest einen geringen Einfluss auf die Darstellung nehmen können, aber im schlimmsten Fall sind Sie ganz einfach gezwungen, mit diesem HTML-Code zu leben oder die Extension eigenhändig umzuschreiben. Ein Resultat dieser Unsitte ist die Vielzahl redundanter Extensions im Repository, die teilweise nur hinzugefügt wurden, um eine bereits existierende Extension mit so selbstverständlichen Dingen wie HTML-Templates oder TypoScript-Parametern zu versehen. Da eine Extension, die über eigene Datenbanktabellen verfügt, aber prinzipiell aus zwei Komponenten, nämlich dem BE-Eingabeformular und dem Frontend-Plugin, besteht, können Sie bei Verwendung der gezeigten Codebeispiele teilweise oder vollständig auf entsprechende Hilfe des eigentlichen Plugins verzichten.
Max. Linie
Im ersten Beispiel zeigen wir Ihnen, wie Sie die Ausgabe eines Plugins mit zusätzlichen Elementen, stdWrap-Funktionen und Wraps versehen können, ohne die eigentliche Ausgabe des Plugins selbst zu verändern.
648 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Hierzu wird der Originalcode des Plugins zunächst in ein temporäres Element kopiert und danach gelöscht. temp.nameDesPlugins < plugin.nameDesPlugins plugin.nameDesPlugins >
Nun wird das Plugin als COA-Setzkasten neu erzeugt und mit dem vorher kopierten Code befüllt. plugin.nameDesPlugins = COA plugin.nameDesPlugins { 100 < temp.nameDesPlugins }
Auf diese Weise erhalten Sie einen vollwertigen Setzkasten, mit dessen Hilfe Sie nun sowohl vor als auch nach dem Element weiteren Code platzieren können. Zudem können Sie mithilfe von stdWrap-Funktionen Einfluss auf die Darstellung nehmen und das Ganze per Wrap in einen oder mehrere passende Container packen.
Lizensiert für Markus Mueller
temp.nameDesPlugins < plugin.nameDesPlugins plugin.nameDesPlugins > plugin.nameDesPlugins = COA plugin.nameDesPlugins { wrap = | 50 = TEXT 50.value = Überschrift 100 < temp.nameDesPlugins 150 = TEXT 150.value = © 2008 Mein Name stdWrap { fieldRequired = feldname } }
Wie Sie sehen, ist es so recht einfach, Dinge nachträglich einzubauen, die von ExtensionEntwicklern gern vergessen werden. Das zweite Beispiel wird vor allem dann interessant sein, wenn sich im Plugin der Extension fest eingebauter HTML-Code befindet, der sich auch mithilfe von TypoScript nur schwer beseitigen lässt. Es ist aber auch recht hilfreich, wenn Sie einfach nur mit möglichst wenig Aufwand auf eine bestimmte Tabelle zugreifen wollen, ohne dabei den kompletten Code-Overhead eines ausgewachsenen Plugins in Kauf nehmen zu müssen. Da die meisten Plugins nichts anderes tun, als eine Datenbankabfrage zu erzeugen und das Ergebnis in entsprechenden HTML-Code zu verpacken, bietet sich für diese Abfragen das TypoScript-Element CONTENT an. Mit diesem Element können Sie auf sämtliche Tabellen zugreifen, die für die Ausgabe im Frontend von Belang sind. Lediglich für die Ausgabe sicherheitsrelevanter Tabellen oder sonstiger Systemtabellen eignet es sich nicht.
Max. Linie
Der Grundaufbau ist denkbar einfach und im vorigen Kapitel eingehend beschrieben. Sie können eine Tabelle für die Abfrage eingeben, die select-Parameter bestimmen und die Ausgabe mithilfe eines renderObj vornehmen. Eine einfache Ausgabe eines Elements
14.8 Inhalte von Extensions unabhängig von Plugins ausgeben | 649 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
anhand eines vom Besucher der Seite eingegebenen Parameters können Sie mit dem gezeigten Beispiel bereits erzeugen. Auch hier wird zunächst der Code des Plugins gelöscht und danach komplett neu aufgebaut.
Links
plugin.nameDesPlugins > plugin.nameDesPlugins = COA plugin.nameDesPlugins { 100 = CONTENT 100 { ... } }
Achten Sie im Zusammenhang mit andWhere in jedem Fall darauf, die einzelnen Parameter zu überprüfen, um eventuelle MySQL-Injections zu verhindern. Im gezeigten Beispiel tun wir das mithilfe von prioriCalc, um sicherzustellen, dass nur Integer-Werte als uid verwendet werden können.
Lizensiert für Markus Mueller
andWhere.cObject = COA andWhere.cObject { wrap = uid=| 10 = TEXT 10.data = GPvar:meinParameter 10.prioriCalc = intval }
Sobald mithilfe der Abfrage ein Ergebnis zurückgeliefert wurde, stehen sämtliche Datenbankfelder der einzelnen Elemente im renderObj zur Verfügung und können dort per stdWrap-Funktionen entsprechend formatiert werden. renderObj = COA renderObj { 10 = TEXT 10.field = feldname }
Selbstverständlich lässt sich die andWhere-Abfrage beliebig erweitern, was auch der Grund für den Einsatz eines COA-Setzkastens an dieser Stelle ist. Um die verbrauchte Speichermenge zu reduzieren, können Sie die benötigten Felder angeben, und selbst eine Abfrage komplexerer Tabellenstrukturen ist möglich, denn der select-Parameter kennt auch die MySQL-Befehle zur Verknüpfung von Tabellen.
Max. Linie
plugin.nameDesPlugins > plugin.nameDesPlugins = COA plugin.nameDesPlugins { 100 = CONTENT 100 { table = tabellenname1 select { pidInList = 123,456 andWhere.cObject = COA andWhere.cObject {
650 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
10 = TEXT 10.data = GPvar:meinParameter 10.prioriCalc = intval 10.wrap = uid=| 20 = TEXT 20.data = GPvar:meinAndererParameter 20.prioriCalc = intval 20.noTrimWrap = | AND tstamp>| | 30 = TEXT 30.value = AND tabellenname2.uid IN (tabellenname1.related_names)| } selectFields = title,name join = tabellenname2 } renderObj = COA renderObj { 10 = TEXT 10.field = title 10.wrap = | 20 = TEXT 20.field = name 20.wrap = |
wrap = | }
Lizensiert für Markus Mueller
} }
Selbstverständlich steht es Ihnen frei, anstatt dieses TypoScript-Konstrukts doch lieber den PHP-Code der Extension zu verändern, jedoch sollten Sie diese Änderung wenn möglich in Absprache mit dem Autor der Extension gemeinsam publizieren, anstatt eigens dafür eine eigene Extension ins Repository zu laden. Beachten Sie in diesem Zusammenhang, dass Plugins auch im Bereich Datensatz einfügen eingesetzt werden können. Passen Sie den dort verwendeten Code gegebenenfalls entsprechend an.
14.9 Ein auf Seiten basierendes Newssystem erzeugen Problem Sie wollen mithilfe von TYPO3 ein umfangreiches Newssystem aufbauen. Die News sollen dabei aus mehreren Textblöcken, Bildern und anderen Elementen bestehen. In der Detailansicht sollen sie wie umfangreichere Artikel eines Magazins aufgebaut sein.
Max. Linie
Außerdem benötigen Sie eine übersichtliche Struktur für die Pflege des Systems im Backend und eine einfache Möglichkeit, das Caching-Verhalten einzelner Artikel sowie den Zugang zu einzelnen Abschnitten der Artikel nach bestimmten Kriterien und für bestimmte Benutzergruppen zu verwalten.
14.9 Ein auf Seiten basierendes Newssystem erzeugen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 651
Max. Linie
Aus diesen Gründen wollen Sie auf den Einsatz der sonst dafür üblicherweise verwendeten Extensions verzichten.
Links
Lösung Erzeugen Sie einen Seitenbaum, in dem Sie dann die jeweiligen Seiten für die News chronologisch anlegen und mit Inhalten füllen. Diesen Seitenbaum lesen Sie über unterschiedliche Menüelemente aus und erzeugen dadurch alle nötigen Listenansichten und Menüs, mit denen sich die Besucher durch die News navigieren können. Die Seitenbaumstruktur für das Newssystem ist nach folgendem Muster aufgebaut:
Lizensiert für Markus Mueller
Seitenbasierte News 2008 Januar 01 Nachricht mit einem aussagekräftigen Titel Andere Nachricht mit einem anderen Titel 05 Noch eine Nachricht mit einem anderen Titel ... 31 ... Dezember 10 Eine Nachricht vom zehnten Dezember ... 2006
Legen Sie die einzelnen Seiten jedoch erst dann an, wenn Sie an diesem bestimmten Tag eine Nachricht erstellen wollen. Der Monat Dezember wird z.B. erst dann erzeugt, wenn Sie die erste Nachricht dieses Monats anlegen wollen. Ist dies erst am 10. Dezember der Fall, legen Sie die Seite für diesen Monat auch erst an diesem Tag an. Jedes Jahr, jeder Monat und jeder Tag erhält eigene Seiten. Ein Tag beinhaltet jeweils alle zu diesem Tag gehörenden Nachrichten als Unterseiten, also immer eine Seite pro Nachricht. Die Inhalte der Nachrichten selbst bestehen aus einfachen Standardelementen wie z.B. Text, Text mit Bild, Multimedia, Tabellen oder Ähnlichem. So entsteht mit der Zeit ein kompletter Nachrichtenbaum, der aufgrund der Datumsstruktur sehr übersichtlich zu verwalten ist. Im TypoScript-Template erstellen Sie nun zunächst einzelne Menüelemente, um die verschiedenen Navigationsvarianten innerhalb eines Newssystems weitestgehend abzudecken.
Max. Linie
Alle folgenden Elemente stammen aus den vorangegangenen Rezepten zum Thema TypoScript und werden dort detailliert erläutert. Falls Sie also noch nicht ganz nachvollziehen können, was genau wir innerhalb der einzelnen Elemente tun, fangen Sie besser ein wenig weiter vorn an zu lesen und kommen später wieder hierhin zurück.
652 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Fangen Sie mit folgendem Rootline- oder Breadcrumb-Menü an, damit der Nutzer des Systems immer sofort erkennen kann, wo er sich genau befindet: lib.sieSindHier = COA lib.sieSindHier { wrap = | 10 = HMENU 10 { special = rootline special { range = 0|-1 } 1 = TMENU 1 { wrap = Sie sind hier NO { allWrap = - |
} } } }
Lizensiert für Markus Mueller
Max. Linie
Erzeugen Sie nun eine Blätternavigation, mit deren Hilfe der Leser sich innerhalb einer Ebene weiterbewegen oder aber zur übergeordneten oder untergeordneten Ebene wechseln kann. Innerhalb eines Jahres kann er so z.B. die Monate durchblättern, während er sich in einem Monat tageweise bewegt. lib.blaetterMenu = COA lib.blaetterMenu { outerWrap = | wrap = Blättern 10 = HMENU 10 { special=browse special { items ( up | prev | next ) items.prevnextToSection = 1 up.fields.title = } 1 = TMENU 1 { NO { allWrap = - |
} } }
14.9 Ein auf Seiten basierendes Newssystem erzeugen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 653
20 = HMENU 20 { entryLevel = -1 maxItems = 1 1 = TMENU 1 { NO { stdWrap.cObject = TEXT stdWrap.cObject.value = >> allWrap = - |
} } }
Links
}
Für die verschiedenen Ebenen benötigen Sie jeweils eine Möglichkeit, die Top Ten der neuesten Nachrichten in diesem Bereich anzuzeigen. Die erste Variante ist eine allgemeine Übersicht der zehn neuesten Newseinträge.
Lizensiert für Markus Mueller
lib.neuesteNachrichten = COA lib.neuesteNachrichten { wrap = | 10 = HMENU 10 { special = updated special { value.data = leveluid:0 beginAtLevel = 4 } maxItems = 10 1 = TMENU 1 { wrap = Neueste Nachrichten NO { allWrap = - |
} } } }
Die zweite Variante zeigt nur die neuesten zehn Einträge eines bestimmten Jahres, sobald sich der Leser auf der Jahresebene befindet. Das Ganze ist vergleichbar mit einem Archiv. Da der Code teilweise identisch mit der vorigen Variante ist, können Sie diesen zunächst kopieren und danach nur die entsprechenden Parameter ändern.
Max. Linie
lib.neuesteNachrichtenDesJahres < lib.neuesteNachrichten lib.neuesteNachrichtenDesJahres { wrap = | 10 { special {
654 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
value.data = leveluid:2 beginAtLevel = 3 } 1 { wrap = Neueste Nachrichten des Jahres } } }
Die dritte Variante wiederum zeigt nur die neuesten zehn Einträge eines bestimmten Monats, sobald sich der Leser auf der Monatsebene befindet. lib.neuesteNachrichtenDesMonats < lib.neuesteNachrichten lib.neuesteNachrichtenDesMonats { wrap = | 10 { special { value.data = leveluid:3 beginAtLevel = 2 } 1 { wrap = Neueste Nachrichten des Monats } } } Lizensiert für Markus Mueller
Zusätzlich benötigen Sie noch eine Übersicht der neuesten Nachrichten eines Tages. lib.neuesteNachrichtenDesTages = COA lib.neuesteNachrichtenDesTages { wrap = | 10 = HMENU 10 { entryLevel = -1 maxItems = 10 1 = TMENU 1 { alternativeSortingField = SYS_LASTCHANGED wrap = Neueste Nachrichten des Tages NO { allWrap = - |
} } } }
Ein Menü, das sämtliche Unterseiten der aktuellen Seite anzeigt, und zwar alphabetisch sortiert, sollte ebenfalls nicht fehlen.
Max. Linie
Da der Code ebenfalls teilweise identisch mit der vorigen Variante ist, sollten Sie diesen auch hier zunächst kopieren und danach nur die nötigen Parameter ändern.
14.9 Ein auf Seiten basierendes Newssystem erzeugen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 655
lib.direkteUnterseiten < lib.neuesteNachrichtenDesTages lib.direkteUnterseiten { wrap = | 10 { maxItems > 1 { alternativeSortingField = title wrap = Direkte Unterseiten } } }
Links
Und mithilfe dieses Menüs zeigen Sie schließlich eine Übersicht der verwandten Nachrichten unabhängig vom Datum an.
Lizensiert für Markus Mueller
lib.aehnlicheNachrichten = COA lib.aehnlicheNachrichten { wrap = | 10 = HMENU 10 { special = keywords 1 = TMENU 1 { wrap = Ähnliche Nachrichten NO { allWrap = - |
} } } }
All diese einzelnen Abschnitte werden nun in einem PAGE-Element zusammengefügt. Wir haben sie direkt als Unterelemente hineinkopiert, Sie können aber selbstverständlich auch mit einem TEMPLATE-Element arbeiten und die einzelnen Elemente bestimmten Subparts oder Marks zuweisen. page = PAGE page { ###Cache für eine Stunde konfigurieren### config { cache_period = 3600 } ###Navigationselemente### 10 < lib.sieSindHier 20 < lib.blaetterMenu 30 < lib.direkteUnterseiten 40 < lib.neuesteNachrichten ###CSS-styled-content### 50 < styles.content.get
Max. Linie
}
656 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
In den einzelnen Ebenen des Newssystems müssen Sie nun noch ein paar Anpassungen vornehmen, damit bestimmte Elemente nur auf bestimmten Ebenen angezeigt werden. Außerdem müssen Sie für die Rootebene die Sortierung der Unterseiten umkehren, damit das aktuellste Jahr an erster Stelle steht. Auf der nächsten Ebene muss sie gänzlich entfernt werden, weil die einzelnen Monate besser nicht alphabetisch sortiert werden sollten. Diese Aufgaben lösen Sie einfach und komfortabel mit Conditions. [treeLevel = 0] ###Rootebene - hier zeigt Menü 30 die Jahre### page.30.10.1.alternativeSortingField = title DESC [treeLevel = 1] ###Jahresebene - hier zeigt Menü 30 die Monate### page.30.10.1.alternativeSortingField > ###hier zeigt Menü 40 die Top 10 des Jahres### page.40 < lib.neuesteNachrichtenDesJahres [treeLevel = 2] ###Monatsebene - hier zeigt Menü 40 die Top 10 des Monats### page.40 < lib.neuesteNachrichtenDesMonats
Lizensiert für Markus Mueller
[treeLevel = 3] ###Tagesebene - hier zeigt Menü 40 die Top 10 des Tages### page.40 < lib.neuesteNachrichtenDesTages [treeLevel = 4] ###Nachrichtenebene - hier werden Menü 30### ###sowie auch Menü 40 nicht benötigt### page.30 > page.40 > ###dafür aber die ähnlichen Nachrichten### page.60 < lib.aehnlicheNachrichten [global]
Ihr seitenbasiertes Newssystem ist nun fertig, und Sie können mit der Pflege der einzelnen Artikel beginnen.
Diskussion Der Begriff News wird in Zeiten neuer Medien oft unterschiedlich verstanden. Speziell Menschen, die bisher vor allem im Bereich der gedruckten Medien tätig waren, haben oft eine völlig andere Vorstellung davon als Kollegen, die sich vor allem mit dem Internet beschäftigen.
Max. Linie
Da TYPO3 ein Content-Management-System ist, das vor allem im Internet zum Einsatz kommt, sind seine Extensions in erster Linie für dieses Einsatzgebiet optimiert. Das trifft auch für solche Extensions zu, die sich mit dem Thema News beschäftigen. Es werden internettypische Ansichten angeboten, also ein kurzer sogenannter Teaser, gefolgt von
14.9 Ein auf Seiten basierendes Newssystem erzeugen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 657
Max. Linie
einer relativ spartanisch gehaltenen Detailansicht, die ein paar Bilder mit einem Textblock kombiniert und allenfalls noch die Möglichkeit bietet, ein paar Links zu relevanten Dateien und verwandten News einzupflegen.
Links
Eine umfangreichere Darstellung ähnlich einem gedruckten Magazin, die z.B. aus mehreren Textblöcken, Bildern, Multimedia-Elementen und Tabellen besteht, ist nur schwer umzusetzen – es sei denn, Sie würden dem Rich Text Editor diese Arbeit überlassen, was aber wiederum sämtliche Varianten des Managements hinsichtlich Caching und Benutzergruppen unmöglich macht. Eine strukturierte Übersicht der einzelnen Nachrichten erhalten Sie zudem nur mithilfe eines Seitenbaums, der eine Reihe von sogenannten SysOrdnern nutzt, um die einzelnen Datensätze zu beherbergen. Kurz gesagt: Wer wirklich umfangreiche Nachrichten in einem vernünftigen Layout darstellen will, stößt mit den verfügbaren Extensions irgendwann an nicht ganz einfach zu umgehende konzeptionelle Grenzen.
Lizensiert für Markus Mueller
Da Sie aber aus Gründen der Übersichtlichkeit sowieso schon mit einem Seitenbaum arbeiten müssen, können Sie genau genommen gleich auf den Einsatz einer speziellen Extension verzichten und stattdessen die Nachrichten ebenfalls als einzelne Seiten anlegen. Eine mögliche Struktur haben wir Ihnen als Beispiel in der Lösung vorgestellt. Sie können natürlich auch eine davon abweichende Struktur verwenden. In unserem Beispiel erhält jedes Jahr, jeder Monat, jeder Tag und jede Nachricht jeweils eine eigene Seite, aber immer erst dann, wenn die erste Nachricht eines bestimmten Tages angelegt wird. Wir haben zwar auch schon Anwender gesehen, die einfach für das gesamte Jahr einen leeren Seitenbaum mit allen Monaten und Tagen angelegt haben, jedoch ist dies unserer Meinung nach wenig sinnvoll. Damit würden nämlich unnötig viele leere Seiten für alle die Tage erzeugt, für die keine Nachrichten zur Verfügung stehen. Dies führt sowohl in der Frontend-Ansicht als auch im Backend zu vermeidbarer Verwirrung.
Wenn Sie den Seitenbaum fertig angelegt haben, geht es nun darum, die Inhalte der Seiten passend zum Verhalten eines webbasierten Newssystems auszugeben. Der Mensch ist bekanntlich ein Gewohnheitstier, und so erwartet der durchschnittliche Nutzer von einem solchen Newssystem verschiedene Navigationselemente, die es ihm ermöglichen, schnell und zuverlässig an die gewünschten Inhalte zu gelangen. Zur Standardausstattung gehören: Eine Rootline- oder Brotkrumennavigation Diese befindet sich normalerweise im oberen Bereich einer Seite und zeigt dem Nutzer seine aktuelle Position innerhalb des Seitenbaums an.
Max. Linie
Eine Blätternavigation Die Blätternavigation verwendet die noch von alten Kassettenrekordern bekannten Pfeile. Mit einzelnen Pfeilen bewegt man sich innerhalb einer Ebene vor und zurück und mit Doppelpfeilen eine Ebene nach oben bzw. nach unten. 658 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Ein sogenanntes Teaser-Menü Hier werden die neuesten x Nachrichten des aktuell gewählten Tages bzw. Monats oder Jahres aufgelistet. Eine Übersicht aller Unterseiten der aktuellen Seite In der Tagesansicht sind das z.B. alle Nachrichten des aktuellen Tages in alphabetischer Reihenfolge. In der Jahresansicht sind das alle Monate, in denen es mindestens eine Nachricht ausgegeben wurde. Eine Übersicht aller Nachrichten zu einem ähnlichen Thema Diese Übersicht kommt immer nur dann zum Einsatz, wenn sich der Nutzer in der Detailansicht einer Nachricht befindet. So kann er einfach weitere Informationen zum Thema erhalten. Installieren Sie am besten außerdem, falls Sie das nicht sowieso schon getan haben, die System-Extension CSS-styled-content, deren Ausgabe im Code mithilfe der Zeile 50 < styles. content.get vorgenommen wird.
Lizensiert für Markus Mueller
Die einzelnen Menüvarianten für die nötigen Navigationselemente haben wir Kapitel 11 entnommen. Es handelt sich ausnahmslos um bereits im TYPO3-Kern vorhandene standard- oder special-Varianten des TypoScript-Elements HMENU, deren Beispielcode wir mit ein paar zusätzlichen Wraps versehen haben, um die einzelnen HTML-Container später komfortabel mithilfe von CSS positionieren zu können. Hinsichtlich des Layouts haben Sie also weitestgehend freie Hand und können so das Newssystem problemlos Ihren Bedürfnissen anpassen. Selbstverständlich müssen Sie es dabei nicht bei den mehr oder weniger spartanischen Ansätzen belassen, die wir hier gezeigt haben. Verwenden Sie doch z.B. für die Blätternavigation eine der GMENU-Varianten aus dem gleichen Kapitel und erzeugen Sie dabei die Symbole für vor, zurück, nach oben und nach unten mithilfe des GIFBUILDER. Oder nehmen Sie für das Teaser-Menü die Variante mit den Bildern und der Kurzbeschreibung, die wir ebenfalls in Kapitel 12 gezeigt haben. Für die Inhalte der einzelnen Nachrichtenseiten sind Ihnen ebenfalls deutlich weniger Grenzen gesetzt als beim Einsatz einer Extension: Sie können sämtliche Inhaltselemente, Texte, Bilder, Tabellen, Multimedia-Elemente, Linklisten, und sogar die Ausgabe anderer Extensions wie zum Beispiel einen Terminkalender mit einbauen.
Max. Linie
Jedes einzelne Element kann dabei bestimmten Benutzergruppen zugeordnet werden. Wenn Sie also mit geschützten Bereichen oder einfach mit der Möglichkeit arbeiten, sich als Nutzer zu registrieren und einzuloggen, können Sie Teilbereiche der Nachrichten von einer Registrierung des Nutzers abhängig machen. Sämtliche sonstigen Einstellungen, wie z.B. der Start- oder Stopzeitpunkt, sind ebenfalls für einzelne Abschnitte einstellbar. Dies ist vor allem dann recht nützlich, wenn innerhalb der Nachrichten auf zeitlich begrenzte Angebote verwiesen wird, für die Sie so zwei Inhaltselemente vorhalten können: eines mit den Angeboten selbst und ein anderes, das dem Benutzer mitteilt, dass die Angebote inzwischen leider abgelaufen sind.
14.9 Ein auf Seiten basierendes Newssystem erzeugen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 659
Max. Linie
Zum Schluss noch ein zusätzlicher Codeschnipsel, mit dessen Hilfe Sie sogar eine Suchfunktion einbauen können, die in der Ergebnisliste sämtliche Nachrichten auflistet, deren Keywords zum eingegebenen Suchbegriff passen.
Links
Lizensiert für Markus Mueller
lib.passendeNachrichten = COA lib.passendeNachrichten { wrap = | 10 = FORM 10 { dataArray { 10 { label = Suchwort: type = suchwort=input,40,40 required = 1 value.data = GPvar:suchwort specialEval = EREG : Nur Buchstaben von A bis Z : ^[a-zA-Z]*$ } } target = _top method = POST no_cache = 1 layout = ###LABEL######FIELD### accessibility = 1 dontMd5FieldNames = 1 formName = suchformular } 20 = HMENU 20 { special = keywords special { entryLevel = 1 mode = manual setKeywords.data = GPvar:suchwort } 1 = TMENU 1 { wrap = Passende Nachrichten NO { allWrap = - |
} } } }
Das Suchformular stammt übrigens aus einem der vorigen Rezepte, und das darauf folgende Menü ist lediglich eine Abwandlung des Menüs für die ähnlichen Nachrichten. Nur werden in diesem Fall die keywords nicht von der aktuellen Seite selbst bezogen, sondern direkt aus der POST-Variablen suchwort.
Max. Linie
Wie Sie sehen, sind Sie beim Einsatz eines seitenbasierten Newssystems weitaus flexibler, als hätten Sie dies mit einer Extension gelöst – und der Aufwand dafür hat sich durchaus in Grenzen gehalten. Besonders flexibel ist diese Lösung vor allem, weil jedes verwendete
660 | Kapitel 14: TypoScript ausreizen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Element aus einem vollwertigen COA besteht und damit die Benutzung von zusätzlichen Elementen oder Wraps wesentlich vereinfacht wird. Im Gegensatz zum oftmals proprietären TypoScript-Code mancher Extensions steht Ihnen in diesem Fall nämlich immer der gesamte stdWrap-Baukasten zur Verfügung, und der ist weitaus mächtiger, als es zunächst den Anschein hat. Wir hoffen, Ihnen das besonders mit diesem Kapitel verdeutlicht zu haben.
Siehe auch Die Grundlagen für alle verwendeten Menüs finden Sie im Kapitel 12. Das Suchformular ist in Teilen Rezept 13.10 entnommen. Den Seitenaufbau finden Sie in Rezept 9.1. Der Einsatz von Conditions wird in Rezept 8.8 behandelt, und sollte Ihnen die Erzeugung eines Seitenbaums nicht schnell genug gehen, könnte Rezept 4.1 Abhilfe schaffen.
Lizensiert für Markus Mueller
Max. Linie
Max. Linie 14.9 Ein auf Seiten basierendes Newssystem erzeugen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 661
Vakat Lizensiert für Markus Mueller
First
Kapitel 15
KAPITEL 15
Vorhandene Extensions nutzen
15.0 Einführung In diesem Kapitel werden Ihnen die Grundlagen zum Verständnis und zum Umgang mit Extensions in Ihrer TYPO3-Installation vermittelt.
Lizensiert für Markus Mueller
TYPO3 ist sehr modular aufgebaut. Der sogenannte Kern (engl. Core) von TYPO3 besteht aus über 500 PHP-Dateien und -Klassen, die die Basisfunktionalitäten zur Benutzerverwaltung, für Datenbankoperationen und Dateihandling sowie für die Formularerzeugung usw. bereitstellen. Zu einem mächtigen und flexiblen CMS wird TYPO3 erst durch die sogenannten Extensions, die den Funktionsumfang von TYPO3 erweitern oder verändern. Eine Extension ist dabei prinzipiell nichts weiter als eine Sammlung von Dateien, die zu einem Paket zusammengeschnürt sind und die Extension-Architektur von TYPO3 nutzen. Jede dieser Extensions verfügt zur Identifikation über einen eindeutigen Extension-Key. Die Funktionalitäten von Extensions können dabei sehr unterschiedlich sein. Extensions bieten Ihnen typischerweise eine oder mehrere der folgenden Möglichkeiten, auf Funktionen von TYPO3 Einfluss zu nehmen: • spezielle Ausgabemodule für das Frontend (FE-Plugins), • zusätzliche Datenbankfelder oder -tabellen, • zusätzliche Backend-Module oder Erweiterungen zu bestehenden Backend-Modulen, • neue Einträge im Kontextmenü (Klickmenü), • Änderungen an der Benutzeroberfläche durch angepasste Styles oder DatenbankMetaschemata, • PHP-Klassen und -Methoden, die als sogenannte Hooks oder XClasses auf die Kernfunktionalitäten Einfluss nehmen.
Max. Linie
Wenn Sie mehr über die Extension-Architektur erfahren möchten, sollten Sie die Kapitel 16 und 17 lesen. Eine komprimierte englischsprachige Darstellung finden Sie auf typo3.org unter http://typo3.org/documentation/documentlibrary/core-documentation/doc_core_api/current/view/2/1/.
Max. Linie | 663
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Extensions mit sehr zentraler Bedeutung sind bereits in den TYPO3-Installationspaketen enthalten. Diese Extensions werden als System-Extensions bezeichnet und sind nach der Installation im Ordner typo3/sysext zu finden. Zur Installation weiterer Extensions stehen die Ordner typo3/ext (globale Extensions) und typo3conf/ext (lokale Extensions) zur Verfügung. Hier ein Überblick über die Zuordnung:
Links
System-Extensions System-Extensions sind eng mit dem Kern von TYPO3 verbunden. Sie werden direkt mit den TYPO3-Installationspaketen ausgeliefert. Diese Extensions können dementsprechend nur über die Installationspakete bezogen und aktualisiert werden. Globale Extensions Diese stehen bei einer Installation unter Linux über Symlinks gleichzeitig für alle Installationen zur Verfügung. Lokale Extensions Individuelle Erweiterungen eines TYPO3-Projekts. Das sogenannte TYPO3 Extension Repository (TER) auf typo3.org/extensions/ stellt zahlreiche Extensions zur Nutzung bereit, es ist ein zentrales und öffentliches Depot verschiedenster Extensions für den Einsatz mit TYPO3. Lizensiert für Markus Mueller
Mit dem Erweiterungs-Manager verfügt Ihre TYPO3-Umgebung über ein zentrales und komfortables Werkzeug, um sämtliche Vorgänge zur Verwaltung der Extensions durchzuführen. Das entsprechende Modul ist im Menü Admin-Werkzeuge unter der Bezeichnung Erw-Manager zu finden und nur für Administratoren freigeschaltet.
Das Funktionsmenü des Erweiterungs-Managers Das Hauptmenü des Erweiterungs-Managers umfasst in der Grundinstallation die folgenden Punkte: • Loaded extensions • Install extension • Import extensions • Translation handling • Settings • Check for extension updates Die drei ersten Funktionen Loaded extensions, Install extensions und Import extensions erzeugen jeweils – unter verschiedenen Aspekten – Listendarstellungen von Extensions.
Loaded extensions
Max. Linie
Die in Ihrer TYPO3-Installation vorhandenen Extensions sind nicht unbedingt auch aktiv. Nur die Extensions, die auch von TYPO3 geladen werden, sind tatsächlich pro-
664 | Kapitel 15: Vorhandene Extensions nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
duktiv im TYPO3-System eingebunden. Das Rezept 15.1 zeigt Ihnen, wie Sie eine Übersicht über diese geladenen und aktiven Extensions erhalten.
Install extensions In Rezept 15.2 erfahren Sie dementsprechend, wie Sie eine Extension installieren und konfigurieren, um sie zu den geladenen Extensions hinzuzufügen. Sofern Sie eine solchermaßen aktivierte Extension später nicht mehr nutzen wollen, erfahren Sie in Rezept 15.7, wie Sie diese wieder deinstallieren und auch löschen können.
Import extensions Um eine Extension installieren zu können, muss diese natürlich in Ihrer TYPO3-Installation vorhanden sein. Sofern dies für eine bestimmte Extension noch nicht zutrifft, erfahren Sie in Rezept 15.5, wie Sie eine Extension aus dem TER importieren. Das Rezept 15.3 geht zusätzlich auf den Spezialfall ein, dass Sie eine bereits vorhandene Extension aktualisieren möchten. Bevor Sie eine Extension importieren können, müssen Sie allerdings wissen, welche Extension Sie überhaupt verwenden wollen. Das Rezept 15.4 gibt Ihnen dazu Tipps und Ratschläge, wie Sie eine für Ihre Problemstellung passende Extension finden. Lizensiert für Markus Mueller
Translation handling Über diesen Menüpunkt verwalten Sie Sprachpakete für Ihre TYPO3-Installation. Hier können Sie die Sprachpakete installieren und aktualisieren. Die dazu nötigen Funktionen werden im Rezept 15.10 im Detail beschrieben.
Settings Über den Menüpunkt Settings haben Sie die Möglichkeit, einige Parameter für den Zugriff auf das Repository festzulegen. Diese Parameter müssen Sie nur in einem der folgenden Fälle anpassen: • Um die Last zu verteilen und so eine möglichst performante Anbindung an das TER zu ermöglichen, wird das TER auf mehreren Servern gespiegelt. Standardmäßig erfolgt die Auswahl eines Servers zufallsgesteuert und transparent für den Benutzer. Möglicherweise möchten Sie aber einen bestimmten Spiegelserver bevorzugen oder gar ein eigenes Repository einbinden. • Sie möchten beim Import auch auf offiziell nicht unterstützte, d.h. möglicherweise unsichere Extensions zugreifen können. • Sie verwalten eine oder mehrere selbst erstellte Extensions, die sie gemäß Rezept 15.9 im TER veröffentlichen, und möchten die dafür erforderlichen Zugriffsparameter dauerhaft in Ihren Einstellungen hinterlegen.
Max. Linie
Wenn eine dieser Situationen auf Sie zutrifft, können Sie in Rezept 15.8 das entsprechende Vorgehen nachlesen.
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Einführung
| 665
Max. Linie
Check for extension updates
Links
Mithilfe dieses Menüpunkts können Sie prüfen, ob für Ihre installierten Extensions im TER neuere Versionen verfügbar sind. Hierdurch können Sie schnell einen Überblick darüber gewinnen, welche Extensions aktualisiert werden müssen. Sie müssen allerdings vor dem ersten Aufruf unter Import extensions auf den Button Retrieve/Update klicken, damit die aktuellsten Informationen aus dem TER auf Ihren Server übertagen werden. Beachten Sie, dass auch von nicht aktivierten Extensions ein Sicherheitsrisiko ausgeht. Jede Extension, die ein Sicherheitsloch aufweist, kann Eindringlingen Zugang auf Ihr System gewähren, auch wenn diese Extension nicht aktiv ist. Extensions können nicht nur über das TER, sondern auch direkt als Extension-Dateien mit der Endung .t3x verteilt werden. Das Rezept 15.6 zeigt Ihnen, wie Sie eine solche Extension-Datei erhalten können. Sollten Sie eigene Extensions im TER veröffentlichen wollen, finden Sie in Rezept 15.9 die dazu notwendigen Informationen.
15.1 Installierte Extensions ermitteln Lizensiert für Markus Mueller
Problem Sie möchten wissen, welche Extensions in Ihrer TYPO3-Installation installiert sind.
Lösung Rufen Sie den Erweiterungs-Manager auf. Wählen Sie im Funktionsmenü die Option Loaded extensions. Sie erhalten daraufhin eine Liste mit allen aktiven Extensions in Ihrer Installation. Über die Auswahlfelder Group By: und Show: beeinflussen Sie die Art der Auflistung. Über die beiden Kontrollkästchen Display shy extensions: und Show obsolete: können Sie festlegen, ob auch Extensions mit entsprechenden Eigenschaften in die Liste aufgenommen werden oder nicht. Über das Suchfeld und anschließenden Klick auf den Search-Button können Sie die Liste bei Bedarf einschränken. Die vollständige Liste erhalten Sie dann erst wieder, wenn Sie das Suchfeld leeren und erneut auf den Search-Button klicken.
Diskussion
Max. Linie
Über die Funktionen Loaded extensions und Install extensions erhalten Sie die gleiche Listenansicht. Der einzige Unterschied besteht darin, dass die Funktion Loaded extensions ausschließlich installierte Extensions berücksichtigt. Neben diesem – eher als Vorfilter zu verstehenden – Unterschied sind eine Reihe von weiteren Optionen und Konfigurationen in der Funktionalität für beide Ansichten identisch.
666 | Kapitel 15: Vorhandene Extensions nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Berücksichtigung von Extensions mit bestimmten Eigenschaften Einige Extensions sind als Shy kennzeichnet. Diese Auszeichnung ist für Standarderweiterungen oder Extensions, die keine herausragende Rolle spielen, vorgesehen. Dieser Ansatz hat schon manches Mal für Verwirrung gesorgt, weil die entsprechenden Extensions standardmäßig nicht in der Liste berücksichtigt werden. Dieses Feature wird möglicherweise auch in einer der nächsten Versionen von TYPO3 entfernt. Derzeit müssen Sie für eine vollständige Liste sicherstellen, dass das Kontrollkästchen Display shy extensions aktiviert ist. Extensions können neben Shy auch als Obsolet gekennzeichnet werden. Dies wird für Extensions verwendet, deren Einsatz nicht mehr empfohlen wird bzw. nicht mehr nötig ist, weil die Features der Extension anderweitig besser implementiert werden. Es handelt sich also um historisch überholte Extensions. Wenn Sie auch diese in der Listenansicht berücksichtigt haben wollen, müssen Sie das entsprechende Kontrollkästchen Show obsolete markieren.
Die Gruppierung in der Listenansicht Über das Auswahlfeld Group by ändern Sie das Gruppierungskriterium für die Listenansicht. Lizensiert für Markus Mueller
Category Gruppierung nach der vom Autor vergebenen Kategorie der Extension. Die offiziellen Kategorien umfassen Backend, Backend Modules, Frontend, Frontend Plugins, Miscellaneous und Examples, gegebenenfalls können aber auch weitere Kategoriebezeichnungen von einem Extension-Autor verwendet werden. Die Kategorien haben rein informativen Charakter und keinerlei technische Auswirkungen. Author Gruppierung nach dem Autor einer Extension. State Gruppierung nach dem vom Autor eingetragenen Status einer Extension. Da die einzelnen Autoren bei der Wahl freie Hand haben und individuelle Maßstäbe anlegen, ist der Status kein absoluter Bewertungsmaßstab. Type Die Installationsart einer Extension. Hierbei wird die Listenansicht in die Bereiche System-Extensions in typo3/sysext, globale Extensions in typo3/ext und lokale Extensions in typo3conf/ext eingeteilt.
Auswahl, welche Informationen in der Liste dargestellt werden Über das Auswahlfeld Show: bestimmen Sie, welche Informationen in der Liste angezeigt werden.
Max. Linie
• Die Darstellung Details beinhaltet die folgenden Informationen und Funktionen: Title
Der Titel der Extension.
15.1 Installierte Extensions ermitteln | 667 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Extension key
Links
Der Extension-Key. Version
Die derzeit lokal vorhandene Version. DL
Über das Diskettensymbol kann die Extension direkt als Datei heruntergeladen werden. Doc
Über das Dokument-Icon kann direkt das Manual aufgerufen werden, sofern die Extension über ein solches verfügt. Type
Der Installationstyp der Extension: Local, Global, System. Eine Besonderheit stellen Extensions dar, die mehrfach vorhanden sind. Die Reihenfolge beim Laden ist wie folgt: System-Extensions, globale Extensions, lokale Extensions. Eine lokale Extension überschreibt damit die gegebenenfalls in anderer Version vorliegende gleichnamige globale Extension. Der Erweiterungs-Manager weist dann mit der Bezeichnung Local GL auf diesen Umstand hin. State Lizensiert für Markus Mueller
Der Status nach Einschätzung des Autors. • Die Darstellung Description beinhaltet die folgenden Informationen: Title
Der Titel der Extension. Description
Eine Kurzbeschreibung der Extension. Author
Der Autor der Extension. • Die Darstellung More details beinhaltet die folgenden Informationen: Title
Der Titel der Extension. Priority
Hier kann eine Priorität für den Ladevorgang vorgegeben werden. Das Feature ist aber derzeit noch nicht implementiert. Mod. Tables
Hier kann eine Extension vermerken, welche Tabellenstrukturen verändert werden. Modules
Eine Auflistung der Backend-Module, die diese Extension bereitstellt.
Max. Linie
Max. Linie 668 | Kapitel 15: Vorhandene Extensions nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts Cl. Cache?
Ein Flag, das bei der Installation das Löschen des Caches anfordert. Internal?
Eine Extension, für die spezielle Unterstützung im TYPO3-Kern vorhanden ist. Shy?
Ein Flag zur Kennzeichnung als Shy-Extension (siehe Anfang der Diskussion). Alle verfügbaren Informationen erhalten Sie auch über die Einzelansicht einer Extension. Diese können Sie in der Listenansicht über einen Klick auf den Extension-Titel erreichen. Sollten Sie in der Einzelansicht einer Extension unter den Punkten Code warnings, Naming annoyances oder Files changed? auf Meldungen stoßen, können Sie diese i.d.R. ignorieren, weil sie nur für den Extension-Entwickler von Belang sind.
Über folgendes User-TSconfig können Sie die drei weiteren Listenansichten Technical, Validating, Changed? in das Auswahlfeld Show: aufnehmen. Diese Ansichten bieten eine Übersicht über die detaillierten technischen Extension-Informationen:
Lizensiert für Markus Mueller
mod.tools_em { # allow Technical-View-Listing allowTVlisting=1 }
Erläuterung zur Anzeige unter Files changed? In der Einzelansicht erhalten Sie möglicherweise unter Files changed? eine oder mehrere Meldungen. TYPO3 speichert auf Anforderung eines Entwicklers den Zeitstempel der letzten Änderung einer Datei. Damit wäre es prinzipiell schnell möglich herauszufinden, ob nach der Installation manuell Änderungen an den Dateien vorgenommen wurden. Leider vergessen viele Extension-Autoren, diese Zeitstempel vor einem Upload ins TER zu aktualisieren, sodass hier oftmals auch noch Änderungen des offiziellen Autors angezeigt werden. Eine Liste der installierten Extensions erhalten Sie auch über das Modul Admin-Werkzeuge/Konfiguration, wenn Sie dort im Funktionsmenü den Eintrag $TYPO3_LOADED_EXT wählen. In dem entsprechenden Baum sind die für TYPO3 wichtigsten technischen Details zur Einbindung der Extension abgelegt.
Siehe auch In Rezept 15.2 erfahren Sie, wie Sie eine Extension installieren, in Rezept 15.7, wie Sie eine Extension deinstallieren. Wenn Sie eine Recherche zu allen für TYPO3 verfügbaren Extensions durchführen möchten, sollten Sie das Rezept 15.4 lesen.
Max. Linie
Max. Linie 15.1 Installierte Extensions ermitteln | 669 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
15.2 Eine Extension installieren und konfigurieren
Links
Problem Sie möchten eine bestimmte Extension installieren.
Lösung Installation Wählen Sie im Hauptmenü des Backends im Bereich Admin-Werkzeuge den Punkt ErwManager. Daraufhin wird der Erweiterungs-Manager in den Hauptbereich des Backends geladen. Im Funktionsmenü des Erweiterungs-Managers müssen Sie den Punkt Install extensions auswählen. Sie erhalten nun eine Liste, die alle in Ihrer Installation vorhandenen Extensions anzeigt. In der ersten Spalte der Liste zeigt Ihnen ein kleines Symbol jeweils den Status einer Extension an: Lizensiert für Markus Mueller
Grüne Kugel mit Minuszeichen Die Extension ist bereits installiert. Graue Kugel mit Pluszeichen Die Extension kann bei Bedarf installiert werden. Rq Es handelt sich um eine Extension, die unbedingt vom System benötigt wird. Eine Installation oder Deinstallation ist nicht möglich. Klicken Sie auf das kleine grau dargestellte Icon mit der Kugel und dem Pluszeichen, um eine Extension zu installieren. Falls die Extension eine oder mehrere weitere Extensions voraussetzt, die Sie noch nicht installiert haben, weist der Erweiterungs-Manager Sie mit der Meldung Dependency Error entsprechend auf diese Abhängigkeit hin. Unter dem Link Import now (opens a new window) können Sie die benötigte Extension direkt importieren und installieren. Bei vielen Extensions ist die Installation damit bereits vollständig abgeschlossen, und es erscheint wieder die Listenansicht. Oftmals sind bei der Installation einer Extension aber eine oder mehrere der folgenden Operationen notwendig: • Änderungen des Datenbankschemas (Add tables) • Löschen des Caches (Clear Cache) • Anlegen eines Ordners im Dateisystem (Create upload folder)
Max. Linie
Diese Aktionen müssen Sie unbedingt einmalig durch einen weiteren Klick auf den Button Update ganz am unteren Ende der Seite ausführen. Damit ist die reine Installation abgeschlossen. 670 | Kapitel 15: Vorhandene Extensions nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Konfiguration In vielen Fällen stellen Extensions darüber hinaus im Erweiterungs-Manager allgemeine Konfigurationsoptionen zur Auswahl. Passen Sie diese Konfigurationsoptionen nach Bedarf an, die Erläuterungen sollten bei der Auswahl eine entsprechende Hilfestellung ermöglichen. Bestätigen Sie die Änderungen durch einen Klick auf den Button Update. Die Konfigurationsmaske kann jederzeit erneut aufgerufen werden. Dazu müssen Sie nur eine der Funktionen Install extensions oder Loaded extensions wählen und in der Listenansicht auf den Extension-Titel klicken. Wenn Konfigurationsoptionen verfügbar sind, lassen diese sich dort beliebig oft anpassen.
Diskussion Die Funktionalitäten von Extensions können sehr unterschiedlich sein, da über Extensions auf (fast) alle Funktionen des Systems Einfluss genommen werden kann. Auch die Komplexität von Extensions reicht von sehr einfach bis hin zu komplexen Anwendungen. Dementsprechend sind zur Verwendung einer Extension teilweise entsprechende Extension-spezifische Details zu berücksichtigen. Der grundsätzliche Weg, eine Extension nutzen zu können, ist wie folgt: Lizensiert für Markus Mueller
• Sofern die Extension noch nicht in Ihrer TYPO3-Installation vorhanden ist, muss diese über den Erweiterungs-Manager importiert werden. Das entsprechende Vorgehen wird in Rezept 15.5 beschrieben. • Die Extension muss mit dem Erweiterungs-Manager installiert und gegebenenfalls eingerichtet werden. Dies ist Gegenstand dieses Rezepts. • Die Extension muss möglicherweise zusätzlich über TypoScript oder TSConfig konfiguriert werden. Dazu muss die Dokumentation der Extension berücksichtigt werden. In der Regel muss neben diesem Rezept das entsprechende Manual der Extension zurate gezogen werden. Das Manual liegt standardmäßig als manual.sxw im Unterverzeichnis doc/ der Extension.
Mit der Funktion Install extensions des Erweiterungs-Managers werden alle Extensions aufgelistet, die für Ihre Installation verfügbar sind oder bereits installiert sind. Über die kleinen Icons vor der Extension-Bezeichnung können diese je nach Installationszustand installiert oder deinstalliert werden.
Max. Linie
Bei der Installation wird der Extension-Key in der Datei typo3conf/localconf.php im Schlüssel $TYPO3_CONF_VARS ['EXT']['extList'] an die vorhandenen Werte angehängt. Wenn Ihnen der Extension-Key bekannt ist, können Sie diesen mit entsprechender Vorsicht auch direkt dort eintragen. In seltenen Fällen ist es notwendig, eine bestimmte Reihenfolge beim Laden der Extensions einzuhalten. Dazu können Sie die Extension-Keys in
15.2 Eine Extension installieren und konfigurieren | 671 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
diesem Schlüssel einfach manuell umsortieren. Alternativ kann eine Extension auch durch Deinstallieren und direkt nachfolgendes erneutes Installieren an das Ende der Liste gesetzt werden.
Links
Kompatibilitätsprüfungen Möglicherweise erfordert eine Extension eine bestimmte Version von TYPO3 oder PHP oder ist von einer weiteren Extension abhängig. Dann weist der Erweiterungs-Manager bei der Installation mit der Meldung Dependency Error auf das Problem hin und verweigert die Installation. Dependency Error: running php-version is higher/lower than allowed
In diesem Fall müssen Sie Ihre Umgebung gegebenenfalls entsprechend anpassen, die benötigte Extension installieren oder eine andere Version der Extension verwenden, die diese Anforderungen möglicherweise noch nicht hat. Die Meldung is higher than allowed über zu hohe Versionsnummern bedeutet nicht immer zwingend, dass die Extension in Ihrer Umgebung nicht lauffähig ist. Erfahrungsgemäß können Sie diese Meldung auch oft einfach ignorieren und die Lauffähigkeit der Extension direkt auf Ihrer Umgebung testen.
Siehe auch Lizensiert für Markus Mueller
Der Import von Extensions, auch einer bestimmten Version, wird in Rezept 15.5 behandelt. Wenn Sie bereits selbst Extensions entwickeln, finden Sie in Rezept 17.14 eine Anleitung zum Erstellen einer Konfigurationsdatei, damit schon bei der Installation Ihrer Extension im Erweiterungs-Manager bestimmte Parameter vom Benutzer eingestellt werden können.
15.3 Eine Extension aktualisieren Problem Manche Extensions werden permanent weiterentwickelt, einige nur selten oder gar nicht angepasst. Oft werden aber von den Entwicklern in unregelmäßigen Abständen neue Versionen veröffentlicht, die entweder bekannt gewordene Probleme beseitigen oder neue Features hinzufügen. Um von einer solchen Aktualisierung zu profitieren, müssen Sie die Extension aktualisieren.
Lösung Rufen Sie über das Hauptmenü den Erweiterungs-Manager auf. Wählen Sie im Funktionsmenü den Punkt Import extensions. Als Ansicht sollte im Auswahlfeld Show: der
Max. Linie
Max. Linie 672 | Kapitel 15: Vorhandene Extensions nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Punkt Details aktiviert werden, damit Sie auf der Ergebnisseite die Versionsinformationen einsehen können. Unter der Überschrift Extensions in TYPO3 Extension Repository sehen Sie neben dem Button Retrieve/Update das Datum, an dem Sie die Extension-Liste das letzte Mal mit dem TER abgeglichen haben. Wenn dieser Zeitpunkt mehr als einige Tage zurückliegt, sollten Sie die Liste zunächst durch einen Klick auf Retrieve/Update aktualisieren. Für TYPO3-Versionen vor 4.2 beachten Sie bitte die Hinweise in der Diskussion.
Rufen Sie im Erweiterungs-Manager die Funktion Check for extension updates auf. Sie erhalten dann eine übersichtliche Liste mit allen Extensions, für die Aktualisierungen verfügbar sind. Aktivieren Sie die Option Display shy extensions, wenn Sie wirklich alle geladenen Extensions auf Aktualisierungen prüfen wollen. Nach einem Klick auf einen Extension-Titel kommen Sie in den Import/Update-Dialog; wählen Sie dort den gewünschten Installationsort aus. Dies sollte normalerweise der Eintrag Local: typo3conf/ext/EXTKEY/ (OVERWRITE) sein. Durch einen Klick auf den Button Import/Update wird die Extension aktualisiert. Lizensiert für Markus Mueller
Bei einer Aktualisierung werden sämtliche Extension-Dateien überschrieben. Somit gehen Änderungen, die Sie möglicherweise an den Extension-Dateien vorgenommen haben, verloren. Aus diesem Grund empfehlen wir, unbedingt von manuellen Änderungen an den Extension-Dateien abzusehen: Ein Extension-Update wird dadurch sehr erschwert.
Auf der folgenden Seite erhalten Sie oben unter der Überschrift Extension Import Results eine Statusmeldung zur Aktualisierung der Extension-Dateien. Im Erfolgsfall sollte diese Meldung mit dem Wort SUCCESS beginnen, andernfalls ist die Aktualisierung leider nicht geglückt. Möglicherweise erfordert das Update zusätzlich einige der folgenden Aktionen: • Änderungen des Datenbankschemas (Add tables) • Löschen des Caches (Clear Cache) • Anlegen eines Ordners im Dateisystem (Create upload folder) Diese müssen Sie unbedingt durch einen Klick auf den Button Update bestätigen, andernfalls treten in Zusammenhang mit der Extension möglicherweise Probleme auf. Dieses Vorgehen sowie die Auswahl von Konfigurationsoptionen entsprechen dem Vorgehen beim Installieren von Extensions; vergleichen Sie dazu bitte das Rezept 15.2.
Max. Linie
Max. Linie 15.3 Eine Extension aktualisieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 673
In seltenen Fällen stellt eine Extension bei internen Änderungen einen speziellen UpdateWizard zur Verfügung. Wurde dieser Wizard noch nicht ausgeführt, ist er über die Einzelansicht einer Extension im Funktionsmenü unter UPDATE! zu finden. Nachdem der Update-Wizard einmalig über den Button DO IT ausgeführt wurde, hat er seinen Zweck erfüllt und erscheint nicht mehr im Funktionsmenü.
Links
Diskussion Die Versionsnummern von Extension setzen sich analog zur TYPO3-Version nach folgendem Schema zusammen: Hauptversion.Unterversion.Entwicklungsversion In der Standardeinstellung werden Entwicklerversionen, die nur an der dritten Stelle der Versionsnummer von der derzeit verwendeten Version abweichen, bei einer Update-Prüfung nicht mit dem Icon zur Aktualisierung versehen. Dieses Verhalten können Sie durch die folgende Installationsvariable ändern: $TYPO3_CONF_VARS['EXT']['em_devVerUpdate'] = '1';
Sie können den Punkt All configuration im Install-Tool verwenden, um diese Änderung durchzuführen. Lizensiert für Markus Mueller
Hinweise für TYP03-Versionen vor 4.2 Aktualisierungen müssen hier direkt aus der Import extensions-Funktion des Erweiterungs-Managers erfolgen. Geben Sie den Extension-Key oder ein entsprechendes Suchwort in das Feld List or look up extensions ein und klicken Sie anschließend auf den Button Look up. Wenn Sie kein Suchwort eingeben, erhalten Sie beim Klick auf Look up eine vollständige Übersicht unter Berücksichtigung aller Extensions im TER. Extensions, für die ein Update im TER verfügbar ist, werden in der linken Spalte durch ein kleines grünes Icon mit zwei wirbelförmigen Pfeilen gekennzeichnet. Klicken Sie darauf, um die Extension zu aktualisieren. Dadurch wird die Extension in Ihrer TYPO3Installation durch die aktuellste Version der Extension aus dem TER ersetzt. Sie können in TYPO3-Versionen vor 4.2 die Extension TER Update Check (ter_update_check) separat aus dem TER installieren. Nach der Installation dieser Extension können Sie auch mit Versionen kleiner als 4.2 wie in der Lösung beschrieben verfahren.
Siehe auch Mehr zum Thema Import von Extensions finden Sie in Rezept 15.5, dort wird auch der Import einer bestimmten Version behandelt.
Max. Linie
Max. Linie 674 | Kapitel 15: Vorhandene Extensions nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
15.4 Nach Extensions recherchieren Problem Sie haben eine bestimmte Problemstellung, für die Sie eine Extension suchen.
Lösung Sie können das Online-Repository von typo3.org nach vorhandenen passenden Extensions durchsuchen. Geben Sie dazu die URL http://typo3.org/extensions/ in Ihrem Browser ein. Sie erhalten zunächst eine Liste mit den zuletzt im Repository aktualisierten Extensions. Sie können dort über verschiedene Funktionen und eine Freitextsuche nach einer Extension suchen. In den Suchergebnissen können Sie anhand der Kurzbeschreibung prüfen, ob eine Extension Ihren Anforderungen entspricht. Über den Extension-Titel gelangen Sie jeweils zur Infoansicht einer Extension, in der Sie weitere Details, inklusive der einzelnen enthaltenen Dateien, abrufen können. Außerdem ist von hier jeweils die Dokumentation (so vorhanden) aufrufbar. Diese stellt eine wichtige Quelle bei der Prüfung, ob eine Extension für Ihre Problemstellung geeignet ist, dar. Lizensiert für Markus Mueller
Sollten Sie keine für Ihre Problemstellung geeignete Extension finden, erfahren Sie in den Kapiteln 16 bis 19, wie Sie eine solche Extension selbst erstellen.
Diskussion Gerade bei einem Open Source-System gibt es bereits eine Vielzahl fertiger Lösungen. Im Repository von typo3.org werden viele solcher Extensions von der Community bereitgestellt. Zu beachten ist, dass die Extensions unterschiedliche Qualität aufweisen. Im offiziellen Repository werden Extensions in einem Review-Prozess auf offensichtliche Sicherheitsprobleme geprüft. Von der Verwendung offziell nicht freigegebener Extensions ist stark abzuraten. Allerdings sind mit einem erfolgreich bestandenen Review keinerlei weitere Qualitätsaussagen oder Sicherheitsgarantien verbunden. Open Source-Software wird generell unter Ausschluss jeglicher Garantieleistungen vertrieben.
Folgende Kriterien können darüber hinaus bei der Beurteilung der Qualität einer Extension helfen: Zahl der Downloads Die Anzahl der Downloads gibt Ihnen Aufschluss über die Installationsbasis einer Extension. Je größer die Zahl der Downloads, desto verbreiteter ist der Einsatz dieser
Max. Linie
Max. Linie 15.4 Nach Extensions recherchieren | 675 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Extension. Dabei ist dann tendenziell davon auszugehen, dass grundlegene Probleme bereits aus dem Weg geräumt wurden und die Extension die typischen Anforderungen einer großen Anwendergemeinde unterstützt.
Links
Versionshistorie Achten Sie auf das Datum der letzten Aktualisierung. Je weiter die letzte Aktualisierung zurückliegt, desto größer sind die Chancen, dass die Extension nicht mehr aktiv gepflegt wird und möglicherweise Probleme verursacht bzw. kein qualifizierter Ansprechpartner mehr gefunden werden kann. Versionsnummer und Status Da die Versionsnummer und der Status prinzipiell frei wählbar sind, sind diese Kriterien je nach Extension-Autor individuell sehr unterschiedlich zu bewerten. Dokumentation Nur sehr wenige Extensions können problemlos auf jegliche Dokumentation verzichten. Die Dokumentation hat bei TYPO3 einen hohen Stellenwert. Sollte die Extension über keine Dokumentation verfügen, ist dies ein stark negativ zu bewertendes Kriterium.
Lizensiert für Markus Mueller
Autor Möglicherweise liefert auch der Autor einen Hinweis auf die Tauglichkeit einer Extension. Bei dieser Bewertung sind allerdings ein gewisser Einblick in die TYPO3Community und Erfahrungen mit Extensions erforderlich. Anhand der Manuals und Beschreibungen sollten Sie abschätzen können, ob eine Extension eine Ihren Wünschen entsprechende Lösung bereitstellt. Vor dem Live-Einsatz müssen Sie zunächst eine Testinstallation vornehmen (siehe Rezept 15.2). Dies sollte idealerweise in einer vom Live-System getrennten Testumgebung erfolgen. Wenn Sie ein bestimmtes Feature in der Extension vermissen oder eine Rückfrage haben, sollten Sie sich zunächst an den Autor der Extension wenden. Berücksichtigen Sie dabei, dass die Extensions ohne finanzielle Gegenleistungen bereitgestellt werden und auch die Bearbeitung solcher Fragen für den Betreuer mit Aufwand verbunden ist. Sie sollten Ihre Fragen daher möglichst präzise und ohne Erwartungshaltung stellen. Weitere Anlaufstellen, um eine geeignete Extension zu finden, sind die Mailinglisten und Foren.
Siehe auch
Max. Linie
Die Rezepte 20.2 und 20.6 erläutern Ihnen Möglichkeiten für den Zugang zur Community, um möglicherweise Unterstützung für Ihr Extension-Projekt zu finden. Das Rezept 20.5 zeigt, wie Sie einen Feature-Wunsch in den Bug-Tracker von TYPO3 einbringen können. In den Kapiteln 16 bis 19 lernen Sie, eigene Extensions nach individuellen Bedürfnissen selbst zu erstellen.
676 | Kapitel 15: Vorhandene Extensions nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
15.5 Extensions importieren Problem Sie möchten eine zusätzliche Extension in Ihre Installation importieren.
Lösung Rufen Sie zunächst im Hauptmenü des Backends das Modul Admin-Werkzeuge/ErwManager auf. Dort wählen Sie im Auswahlfeld des Funktionsmenüs den Punkt Import extensions. Klicken Sie auf den Button Retrieve/Update, um die aktuelle Liste von typo3.org in eine lokal zwischengespeicherte Liste der verfügbaren Extensions zu übernehmen. Neben dem Button sehen Sie das Datum des letzten Abgleichs (wenn bereits einmal ein Abgleich stattgefunden hat). Dieses Datum sollte nicht mehr als einige Tage zurückliegen, sonst sollte die Liste aktualisiert werden.
Lizensiert für Markus Mueller
In das Input-Feld können Sie nun Suchbegriffe eingeben. Nach einem Klick auf Lookup erhalten Sie eine Liste der zu diesem Suchbegriff passenden Extensions. Wenn Sie das Suchfeld freilassen, erhalten Sie die vollständige Liste. In der ersten Spalte der Liste zeigt Ihnen ein kleines Icon die jeweils möglichen Aktionen an: Roter Pfeil Die Extension ist in Ihrer Installation noch nicht vorhanden und kann importiert werden. Zwei grüne Pfeile in Form eines Wirbels Die Extension liegt im TER in einer aktuelleren Version vor und kann aktualisiert werden. Leer Die Extension ist bereits aktuell, keine direkte Aktion verfügbar. Durch einen Klick auf das Icon in der ersten Spalte können Sie die Extension importieren bzw. aktualisieren.
Max. Linie
Die Darstellung der Listenansicht ist dabei abhängig von Ihren gewählten Einstellungen, um eine für Ihre Bedürfnisse optimierte Übersicht zu ermöglichen (Details zur Anpassung der Listenansichten erfahren Sie in Rezept 15.1). Führen Sie den Mauszeiger über den roten Pfeil neben der von Ihnen zu importierenden Extension, Sie bekommen dann einen kleinen Tooltipp angezeigt, der Ihnen die Aktion bei einem Klick nochmals erklärt. Wenn Sie die Extension dementsprechend importieren möchten, klicken Sie den Pfeil einfach an.
15.5 Extensions importieren | 677 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Das Verfahren muss bei mehreren zu importierenden Extensions jeweils einzeln wiederholt werden.
Links
Diskussion Bei einer Suche werden alle Felder der Extension berücksichtigt, dies umfasst auch die Beschreibung. In der Regel ist es sinnvoll, die Liste der Extensions durch ein Suchwort einzugrenzen. Die Informationen in der Liste haben bei der Einstellung Show: Details die folgenden Bedeutungen: Title Titel der Extension. Extension key Der Extension-Key. Version Die aktuellste Versionsnummer, die im TER verfügbar ist. Cur. Ver Die Versionsnummer der Extension in Ihrer Installation, wenn die Extension bereits vorhanden ist. Lizensiert für Markus Mueller
Cur. Type Der aktuelle Installationstyp: Local, Global oder System. DL Die Download-Statistik der Extension im TER: Sämtliche Downloads/Downloads dieser Version. State Status nach Einschätzung des Autors. Neben der Lösung, eine Extension aus einem Repository zu importieren, gibt es auch die Möglichkeit, eine Extension-Datei (Dateiendung .t3x) direkt einzuspielen. Dazu können Sie nach der Auswahl von Import extensions from online repository in der unteren Bildschirmhälfte über Durchsuchen einen Dateiauswahldialog aufrufen. Dort wählen Sie eine entsprechende Datei (wie und wo Sie eine solche Datei erhalten können, erfahren Sie in Rezept 15.6). Nach der Dateiauswahl und Schließen des Dialogfelds müssen Sie unter ...to location noch einen Installationsort (lokal oder global) wählen. Sollte die Extension bereits in der Installation vorhanden sein, aktivieren Sie bitte zusätzlich das Kontrollkästchen Overwrite any existing extension!, um das Überschreiben zu bestätigen. Um den Upload auszuführen, klicken Sie abschließend auf den Button Upload extension file.
Max. Linie
Sie können die Extension-Dateien auch manuell über das Dateisystem einspielen. Dazu müssen Sie lediglich den Ordner einer Extension mitsamt seinen Dateien in eines der Extension-Verzeichnisse typo3conf/ext oder typo3/ext kopieren.
678 | Kapitel 15: Vorhandene Extensions nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Konfigurationsoptionen im Install-Tool Die folgenden Konfigurationsoptionen in typo3conf/localconf.php beeinflussen das Verhalten beim Import, sie können bequem über das Install-Tool All configuration angepasst werden: [allowGlobalInstall]
Wenn gesetzt, können Extensions global im Ordner typo3/ext/ installiert, aktualisiert und auch gelöscht werden. $TYPO3_CONF_VARS['EXT']['allowGlobalInstall'] = '0';
[allowLocalInstall]
Diese Option erlaubt die Installation lokaler Extensions in typo3conf/ext. Außerdem können lokale Extensions aktualisiert und auch gelöscht werden. Diese Option ist standardmäßig aktiviert. $TYPO3_CONF_VARS['EXT']['allowLocalInstall'] = '1';
[allowSystemInstall]
Lizensiert für Markus Mueller
Wenn gesetzt, können Extensions als System-Extensions verwaltet werden. Standardmäßig werden diese Extensions im Ordner typo3/sysext/ abgelegt. Sie können damit beispielsweise die System-Extensions cms und lang aktualisieren. Sie sollten diese Option nur aktivieren, wenn Sie genau wissen, was Sie tun. Daher ist diese Option auch standardmäßig deaktiviert. $TYPO3_CONF_VARS['EXT']['allowSystemInstall'] = '0';
Diese Option hieß bis zur Version 4.0: [em_systemInstall] Beachten Sie dabei, dass der Webserver auch über entsprechende Rechte an den jeweiligen Ordnern verfügen muss.
Den Installationstyp wählen Je nach Einstellungsoptionen ist ein Import der Extensions nach typo3conf/ext, typo3/ext oder sogar typo3/sysext möglich. Wenn Sie die Art des Imports manuell vorgeben wollen, klicken Sie statt auf das rote Icon mit dem Pfeil auf den Extension-Titel. In der folgenden Detailansicht können Sie neben der Bezeichnung to: den Installationsort festlegen. Die Auswahl umfasst nur die per Konfiguration vorgegebenen möglichen Werte. Sie müssen den gewünschten Importvorgang hier durch einen Klick auf den Button Import/Update auslösen.
Eine bestimmte Version einer Extension importieren In manchen Fällen ist es gewünscht, eine bestimmte Version einer Extension zu importieren. Dies ist beispielsweise erforderlich, weil Sie Kompatibilitätsprobleme haben oder eine zu einer älteren Installation analoge Umgebung erstellen wollen.
Max. Linie
Max. Linie 15.5 Extensions importieren | 679 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Auch in diesem Fall klicken Sie statt auf das rote Icon mit dem Pfeil auf den ExtensionTitel. In der folgenden Detailansicht können Sie oben im Auswahlfeld eine der im Repository vorhandenen Versionen wählen. Wiederum müssen Sie den gewünschten Importvorgang hier durch einen Klick auf den Button Import/Update auslösen.
Links
Siehe auch Der Import einer Extension erfolgt standardmäßig von einem per Zufall ausgewählten Mirror. Sie können über die Einstellungen auch die Auswahl eines bestimmten Mirrors vorgeben. Das entsprechende Vorgehen wird in Rezept 15.8 beschrieben. Wie Sie eine Extension-Datei für den direkten Import erhalten, wird in Rezept 15.6 beschrieben. Mehr zur Bedeutung der Ordner, auch der Ordner für Extensions, erfahren Sie in Rezept 1.4.
15.6 Extensions exportieren oder sichern Problem Sie möchten eine Extension per E-Mail oder Datenträger austauschen oder ein Backup einer Extension anlegen. Lizensiert für Markus Mueller
Lösung Wählen Sie im Hauptmenü das Modul Erw-Manager und dort eine der Ansichten Available extensions to install oder Loaded extensions. In den Ansichten Details oder More details ist in der sechsten Spalte unter der Spaltenbezeichnung DL: ein kleineres Diskettensymbol zu sehen. Bei einem Klick auf dieses Icon wird der Download-Dialog Ihres Browsers aufgerufen.
Diskussion Extensions werden von TYPO3 in einem eigenen Dateiformat mit der Endung .t3x gehandhabt. Eine solche .t3x-Datei enthält die gesamte Extension zusammengepackt in einer einzelnen Datei. Um eine Extension aus Ihrer Installation als .t3x-Datei abzuspeichern, können Sie auch in einer der Listenansichten auf den Extension-Titel klicken, damit gelangen Sie in die Einzelansicht. In der Einzelansicht wählen Sie im Auswahlfeld den Punkt Backup/Delete aus. Dort finden Sie den Link Download extension "ext_key" as a file, mit dem Sie den Download starten können. Der Platzhalter ext_key wird natürlich dem Key der von Ihnen gewählten Extension entsprechen.
Max. Linie
Sie können eine solche .t3x-Datei auch von Extensions direkt aus dem Repository von typo3.org erhalten. Verwenden Sie dazu das Web-Interface zum TER unter der URL http:// typo3.org/extensions/. Sie müssen dort eine Extension recherchieren und in der Register680 | Kapitel 15: Vorhandene Extensions nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
navigation der Einzelansicht den Punkt Details verwenden. Ganz am unteren Ende finden Sie einen Link Download compressed extension .T3X file. Bei Bedarf ist es auch möglich, hier nur einzelne Dateien einer Extension herunterzuladen. In diesem Zusammenhang wird die Bezeichnung compressed verwendet. Dies führt oft zu der Annahme, dass es sich bei einer solchen Extension-Datei um ein gepacktes Archivformat (.zip) handelt. Dies ist aber nicht der Fall, ein gewöhnliches Packprogramm kann diese Dateien nicht verarbeiten. Es handelt sich um ein TYPO3-spezifisches Format, einen sogenannten serialisierten Stream, der zusätzlich komprimiert ist. Das Format kann ausschließlich über entsprechende Routinen in TYPO3 sinnvoll verarbeitet werden.
Siehe auch Nützliche Tipps zur Recherche von Extensions auf typo3.org finden Sie in Rezept 15.1, Rezept 15.5 behandelt die notwendigen Schritte, wie Sie Extensions importieren.
15.7 Extensions deinstallieren Problem Lizensiert für Markus Mueller
Sie möchten eine oder mehrere Extensions deinstallieren.
Lösung Mit dem Erweiterungs-Manager Rufen Sie im Erweiterungs-Manager die Funktion Loaded extensions auf. Über das Icon mit der kleinen grünen Kugel und dem Minuszeichen deinstallieren Sie die Extension. Je nach Art der Extension müssen Sie die Deinstallation möglicherweise noch auf einer Folgeseite bestätigen, weil bei einer Deinstallation sinnvollerweise der Cache gelöscht werden sollte. In diesem Fall bestätigen Sie die gewünschte Deinstallation einfach über den Button Remove extension.
Von Hand Wenn eine Extension einen kritischen PHP-Fehler verursacht, ist es möglich, dass Ihr TYPO3-Backend oder auch Ihre gesamte Site nicht mehr mit einem Browser erreichbar ist. In diesem Fall müssen Sie die Fehlermeldungen prüfen, die verantwortliche Extension identifizieren und von Hand deinstallieren:
Max. Linie
Öffnen Sie die Datei localconf.php im Verzeichnis typo3conf und entfernen Sie den entsprechenden Extension-Key aus der Variablen $TYPO3_CONF_VARS['EXT']['extList']. Vergessen Sie nicht, die Datei localconf.php anschließend abzuspeichern. Danach müssen Sie zusätzlich die möglicherweise vorhandenen Cache-Dateien mit dem Präfix temp_CACHED_* löschen. 15.7 Extensions deinstallieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 681
Max. Linie
Diskussion
Links
Eine andere Möglichkeit, die Datei localconf.php zu editieren, besteht möglicherweise noch über das Install-Tool. Wählen Sie dort den Abschnitt Edit files in typo3conf/. Danach erhalten Sie eine Liste aller Dateien, die sich in diesem Ordner befinden. Klicken Sie nun auf den Dateinamen localconf.php. Daraufhin öffnet sich ein Feld mit dem Dateiinhalt. Editieren Sie dann die entsprechende Zeile mit dem Eintrag $TYPO3_CONF_VARS['EXT'] ['extList'] = '...';. Wenn Sie eine Extension nicht nur deinstallieren wollen, sondern zusätzlich auch aus dem Dateisystem löschen möchten, gehen Sie wie folgt vor: • Rufen Sie im Erweiterungs-Manager die Funktion Install extensions auf. • Klicken Sie auf den Titel der Extension. • Falls die Extension noch aktiviert ist, müssen Sie diese zunächst über das grüne Symbol deinstallieren. • Wählen Sie in der Einzelansicht den Punkt Backup/Delete. • Klicken Sie auf den Link DELETE EXTENSION FROM SERVER.
Lizensiert für Markus Mueller
Neben den in $TYPO3_CONF_VARS['EXT']['extList'] eingetragenen Extensions werden von TYPO3 zusätzlich noch wenige sehr zentrale und wichtige Extensions über den Schlüssel $TYPO3_CONF_VARS['EXT']['requiredExt'] = 'cms,lang,sv'; geladen. Diese Extensions werden in der Listenansicht des Erweiterungs-Managers als Rq: gekennzeichnet und lassen sich nicht deinstallieren.
Siehe auch Wenn Sie noch mehr nicht benötigte Daten in Ihrer TYPO3-Installation löschen möchten, sollten Sie Rezept 2.6 lesen. Dort erfahren Sie, welche Dateien und Ordner Sie in Ihrer TYPO3-Installation problemlos entfernen können. In Rezept 1.10 erhalten Sie Hinweise zum generellen Umgang mit Fehlermeldungen.
15.8 Den Zugriff auf ein Repository konfigurieren Problem Sie möchten den Zugriff auf das Extension-Repository (TER) konfigurieren.
Lösung
Max. Linie
Rufen Sie im Erweiterungs-Manager die Funktion Settings auf. Über die Funktion Settings haben Sie Zugriff auf die folgenden Einstellungsmöglichkeiten:
682 | Kapitel 15: Vorhandene Extensions nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Security Settings Hier haben Sie die Möglichkeit, auch offiziell nicht unterstützte Extensions beim Zugriff auf das Repository zu berücksichtigen. Seit der TYPO3-Version 4.0 haben die Extensions einen sogenannten Review-Status. Dieser Status zeigt an, ob eine Extension eine Basisprüfung auf weit verbreitete Sicherheitsprobleme erfolgreich absolviert hat. Erst dann erhält sie den Status reviewed. Extensions, die diese Prüfung noch nicht erfolgreich absolviert haben, werden als unsupported gekennzeichnet und in der Standardeinstellung beim Import nicht berücksichtigt. Durch die Auswahl der Option Enable extensions without review (basic security check) im Abschnitt Security Settings können Sie dieses Verhalten ändern. User Settings Angaben in diesem Bereich sind ausschließlich beim Hochladen einer Extension in das TER erforderlich. Tragen Sie hier gegebenenfalls Ihren Benutzernamen und Ihr Passwort für das Login auf typo3.org ein.
Lizensiert für Markus Mueller
Mirror selection In diesem Bereich konfigurieren Sie, auf welches Repository der Erweiterungs-Manager beim Import oder Aktualisieren von Extensions zugreift. Von der unter Enter mirror list URL eingetragenen URL wird eine Liste von Servern bezogen, die das TER spiegeln. Diese Liste von TER-Mirror-Servern können Sie durch einen Klick auf Click here to reload the list aktualisieren. Standardmäßig wird beim Import per Zufall ein Mirror aus dieser Liste gewählt. Wenn Sie einen bestimmten Mirror verwenden möchten, wählen Sie den entsprechenden Eintrag über den Radio-Button aus und klicken danach auf Update. Diese Einstellung wird dann in Ihrem Benutzerprofil gespeichert.
Diskussion In der Standardinstallation ist der Zugriff über verschiedene Mirror auf das offizielle TYPO3 Extension Repository (TER) vorkonfiguriert. Wenn Sie statt des offiziellen ein eigenes Extension-Repository verwenden möchten, können Sie einen Wert unter Enter repository URL eintragen. http//www.example.com/ Beachten Sie, dass der Eintrag mit einem / endet. Ein solches selbst verwaltetes Repository muss eine entsprechend aufbereitete Datei extensions.xml.gz mit den Metadaten der vorhandenen Extension bereitstellen. Bei obigem Beispiel wird die entsprechende Datei unter folgendem Pfad erwartet: http://www.example.com/extensions.xml.gz
Max. Linie
Die auf typo3.org verwendeten Extensions für das TER können Sie über das SVN-Repository des typo3.org-Teams beziehen. Diese Extensions stellen auch Werkzeuge zur Erzeugung einer extensions.xml.gz-Datei bereit und liegen in den Extension-Ordnern, die mit ter beginnen: https://svn.typo3.org/Teams/typo3.org/trunk/ 15.8 Den Zugriff auf ein Repository konfigurieren | 683 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Siehe auch
Links
Wie Sie die Extensions aus einem Repository in Ihre Installation importieren, wird in Rezept 15.5 beschrieben.
15.9 Extensions über das TER veröffentlichen Problem Sie wollen eine selbst entwickelte Extension in das Online-Repository von TYPO3 einspielen, sodass auch andere TYPO3-Nutzer darauf zugreifen können.
Lösung Um Extensions in das TER einspielen zu können, benötigen Sie ein Benutzerkonto auf typo3.org. Sollten Sie noch kein entsprechendes Konto eingerichtet haben, finden Sie eine Beschreibung dazu in der Einleitung von Kapitel 20.
Lizensiert für Markus Mueller
Wählen Sie die Funktion Install extensions im Erweiterungs-Manager. Klicken Sie in der Extension-Liste auf den Titel Ihrer Extension, die Sie veröffentlichen möchten. In dem Funktionsmenü wählen Sie dann den Punkt Upload to TER. In die Felder Repository Username und Repository Password tragen Sie Ihren TYPO3-Benutzernamen und das Passwort ein. In das Textfeld Changelog for upload können Sie optional einen kurzen Hinweis zur veröffentlichten Version eintragen. Dieser sollte anderen Anwendern einen kurzen Überblick darüber geben, was sich seit der letzten Version geändert hat. Beim ersten Upload der Extension bietet es sich an, einen Kommentar wie beispielsweise »Initial upload« einzutragen. Unter Upload command können Sie bestimmen, wie die Versionsnummer der Extension gehandhabt werden soll. Durch einen Klick auf Upload extension schließen Sie den Upload ab. Sie können Ihren Benutzernamen und das Passwort auch wie in Rezept 15.8 beschrieben im Erweiterungs-Manager unter Settings speichern. Dann müssen Sie diese Daten nicht mehr bei jedem Upload erneut eintragen.
Diskussion Es gibt einige gute Gründe, eine Extension über das TYPO3 Online Repository (TER) zu verwalten • Sie unterstützen mit der Veröffentlichung Ihrer Extension das TYPO3-Projekt. • Sie bekommen durch die Veröffentlichung wertvolle Hinweise und Verbesserungsvorschläge von Benutzern, die Ihre Extension testen.
Max. Linie
Max. Linie 684 | Kapitel 15: Vorhandene Extensions nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
• Sie können Ihre Extension wesentlich einfacher verwalten, denn sie ist von jeder TYPO3-Installation aus verfügbar und kann so problemlos in verschiedenen Websites installiert, aber trotzdem zentral weiterentwickelt werden. • Ihre Extension wird möglicherweise in verschiedene Sprachen übersetzt. • Sie ernten neben Ruhm und Ehre vielleicht sogar ein paar neue Kunden. Da es schon zahlreiche Extensions zu vielen Themen gibt, sollten Sie sich erst einmal einen Überblick über deren Funktionalitäten und Einsatzgebiete verschaffen, bevor Sie eine Extension einstellen, deren Funktionen bereits von einer weiteren Extension bereitgestellt werden. Ansonsten würde die Vielzahl ähnlicher Extensions nur zu Verwirrung und Ressourcenverschwendung führen. Auch wenn Ihnen die Funktionen einer bereits bestehenden Extension nicht ausreichen, sollten Sie erst einmal überlegen, ob Sie nicht besser Ihre Ideen in diese Extension einfließen lassen und diese dem Autor über Patches zur Verfügung stellen, anstatt eine neue Extension zu erstellen, die die vorhandene Extension geringfügig erweitert. Halten Sie sich immer vor Augen, dass öffentliche Extensions ein Teil von TYPO3 sind und dessen Bild in der Öffentlichkeit beeinflussen können. Lesen Sie auch die Tipps und Hinweise im offiziellen TYPO3 Security Cookbook, das Sie unter folgender Adresse als PDF laden können: http://typo3.org/teams/security/.
Lizensiert für Markus Mueller
Siehe auch Ein Benutzerkonto für typo3.org können Sie über die URL http://typo3.org/community/ your-account/loginlogout/user-account/ anlegen. Wie Sie einen Extension-Key registrieren und was es dabei zu beachten gibt, steht in Rezept 16.1. Für die Dokumentation zu Ihrer Extension sollten Sie die folgende OpenOffice-Vorlage verwenden: http://typo3.org/documentation/document-library/core-documentation/doc_template/current/, mehr zum Schreiben von Handbüchern finden Sie auch in Rezept 20.3.
15.10 Sprachpakete verwalten Problem Sie möchten im Backend oder Frontend eine andere Sprache als die Standardsprache Englisch verwenden.
Lösung
Max. Linie
In der Standardinstallation sind zunächst ausschließlich englische Sprachdateien vorhanden. Der Erweiterungs-Manager verfügt über eine entsprechende Funktion, um weitere Sprachpakete hinzuzufügen.
15.10 Sprachpakete verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 685
Max. Linie
Rufen Sie dazu zunächst den Erweiterungs-Manager im Modul Admin-Werkzeuge auf. Aus dem Funktionsmenü wählen Sie den Punkt Translation handling. Daraufhin erhalten Sie eine Übersicht über alle für TYPO3 verfügbaren Sprachen. Wählen Sie aus dieser Liste alle von Ihnen gewünschten Sprachen aus, die Sie entweder für das Backend oder das Frontend verwenden möchten.
Links
Um mehrere Sprachen auszuwählen, müssen Sie beim Mausklick zusätzlich die Taste Strg gedrückt halten
Durch einen Klick auf den Button Save selection speichern Sie die durchgeführte Auswahl dauerhaft ab. Der Erweiterungs-Manager wird daraufhin bei allen zukünftigen Importvorgängen von Extensions automatisch prüfen, ob ein entsprechendes Sprachpaket für die Extension verfügbar ist, und dieses dann gegebenenfalls beim Import berücksichtigen. Über einen Klick auf den Button Check status against repository können Sie den Status aller Übersetzungen der derzeit geladenen Extensions überprüfen. Sie erhalten dann eine Liste aller geladenen Extensions, in der der Status des lokal vorhandenen Übersetzungspakets für jede ausgewählte Sprache mit dem Status auf dem Übersetzungsserver von TYPO3 verglichen wird. Lizensiert für Markus Mueller
N/A Die Ausgabe N/A bedeutet, dass keine entsprechende Übersetzung auf dem Übersetzungserver von TYPO3 vorliegt. ??? Mit der Ausgabe ??? weist der Erweiterungs-Manager darauf hin, dass der Status der Übersetzung nicht festgestellt werden konnte. Dies ist insbesondere auch dann der Fall, wenn die entsprechende Übersetzung noch gar nicht importiert wurde. OK Die Übersetzung ist auf dem aktuellsten Stand. Durch einen Klick auf den Button Update from repository können Sie die aktuellste Version der Übersetzungen des Übersetzungsservers von TYPO3 importieren. Sie erhalten dann zu jeder Extension eine kurze Rückmeldung: UPD Das Sprachpaket wurde aktualisiert. N/A Keine Sprachpakete verfügbar.
Diskussion
Max. Linie
TYPO3 wird in mehr als 40 Ländern verwendet. Dementsprechend gibt es auch Sprachpakete mit internationalisierten Ausgabedaten/Labels für entsprechend viele Sprachen.
686 | Kapitel 15: Vorhandene Extensions nutzen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Mit der Version 4.0 von TYPO3 wurde die Handhabung der gesamten Lokalisierung bzw. der Sprachpakete umgestellt. Diese Umstellung war erforderlich, weil die Übersetzungen mehr Unabhängigkeit von den eigentlichen Extensions benötigen. So ist es jetzt durch Einführung automatisch verwalteter und getrennter Sprachpakete für die Übersetzungsteams möglich, ihre Arbeit komplett selbstständig ohne Unterstützung der Extension-Entwickler durchzuführen. Zum jetzigen Zeitpunkt wird die getrennte Verwaltung von Sprachpaketen jedoch nur von den System-Extensions und nur sehr wenigen im TER verfügbaren Extensions genutzt. Viele Extensions im TER beinhalten die Übersetzungen nach wie vor innerhalb ihrer Extension-Ordner. In diesem Fall werden nicht nur die Labels der Standardsprache, sondern auch die Übersetzungen innerhalb der Dateien locallang_*.php oder locallang_*.xml gepflegt. Es ist jedoch davon auszugehen, dass alle Übersetzungen nach und nach in spezielle Sprachpakete ausgelagert werden.
Lizensiert für Markus Mueller
Dazu wird ab der TYPO3-Version 4.0 für jede Extension pro Sprache ein eigenes Sprachpaket als .zip-Datei erstellt. Der Erweiterungs-Manager lädt diese zunächst in das Verzeichnis typo3temp/ herunter. Anschließend werden die Sprachdateien vom ErweiterungsManager entpackt und in die entsprechenden Verzeichnisse in typo3conf/l10n/[lang-key] verteilt. Bei der Überprüfung des Status der Übersetzungen werden die ursprünglich heruntergeladenen .zip-Dateien in typo3temp/ zum Vergleich mit dem Übersetzungsserver verwendet. Auf diesen Umstand weist der Erweiterungs-Manager mit der Meldung If you want to force a full check/update, delete the l10n zip-files from the typo3temp folder. hin. Wenn Sie die Sprachdateien in typo3conf/l10n manuell bearbeitet oder dort Dateien ohne die Unterstützung des Erweiterungs-Managers eingespielt haben, sollten die Dateien in typo3temp/ zunächst gelöscht werden. Nur so werden Ihre Übersetzungen bei der nächsten Statusprüfung erneut vollständig mit dem offiziellen Übersetzungsserver abgeglichen. Die Übersetzungen werden derzeit ausschließlich auf einem speziellen Übersetzungsserver von den offiziellen Übersetzern durchgeführt. Für die Zukunft ist vorgesehen, dass Übersetzungen auch in jeder gewöhnlichen TYPO3-Installation durchgeführt werden können. Die Extension llxmltranslate, mit der die Übersetzungen durchgeführt werden können, ist bereits im TER verfügbar. Allerdings ist derzeit noch ungeklärt, mit welchem Verfahren solche lokal durchgeführten Übersetzungen wieder in die offiziellen Sprachpakete integriert werden können.
Siehe auch Wie die Sprachdateien aufgebaut sind und wie Sie mehrsprachige Ausgaben in Extensions verwenden, finden Sie in Rezept 17.7. Wenn Sie bei der Übersetzung von TYPO3 mitarbeiten möchten, ist die Seite http://typo3.org/extensions/translators/ die erste Anlaufstelle. Hilfestellung dazu finden Sie in Rezept 20.4.
Max. Linie
Max. Linie 15.10 Sprachpakete verwalten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 687
Vakat Lizensiert für Markus Mueller
First
Kapitel 16
KAPITEL 16
Extensions kickstarten und ausarbeiten
16.0 Einführung
Lizensiert für Markus Mueller
Die Erfahrung zeigt, dass jedes TYPO3-Projekt ein kleines bisschen anders ist und besondere Anforderungen, individuelle Vorstellungen, Wünsche und Bedürfnisse erfüllt werden müssen. TYPO3 bietet Ihnen mit seiner offenen und erweiterbaren Architektur umfangreiche Möglichkeiten, die Funktionalität und Bedienung von TYPO3 – und damit auch Ihre Website – durch eigene Extensions anzupassen oder zu erweitern. Mit Extensions können Sie die vielfältigen Konfigurationsmöglichkeiten von TypoScript, Installationsvariablen und eigenen PHP-Code kombinieren und so individuelle Erweiterungen schaffen, mit denen Sie zum Beispiel eigene Datenbankfelder nahtlos in die bestehende Datenbankstruktur einfügen, die Verarbeitung von Seiteninhalten anpassen oder neue Module im Backend integrieren (zahlreiche Rezepte in diesem Buch verwenden Extensions, um Kerneigenschaften von TYPO3 anzupassen). Hier erfahren Sie mehr über den grundlegenden Aufbau von Extensions, wie Sie diese in der Praxis einsetzen können und damit viele der Anforderungen aus der Praxis sicher meistern können. Wir empfehlen Ihnen für die Erstellung von Extensions den Extension Kickstarter. Der Extension Kickstarter ist selbst eine Extension, mit der Sie komfortabel neue Extensions erzeugen und integrieren können. Falls Sie diese Extension noch nicht installiert haben, wechseln Sie in das Modul Erw-Manager und wählen dort in der obersten Auswahlliste den Eintrag Install Extensions. Daraufhin erhalten Sie eine Liste der vorhandenen Extensions, die Sie installieren können. Aktivieren Sie dort die Extension Extension Kickstarter über das entsprechende Icon in der linken Spalte.
Max. Linie
Bevor Sie mit der Konfiguration oder Umsetzung Ihrer Extension beginnen, benötigen Sie einen eindeutigen Extension-Key. Dieser Extension-Key hat eine entscheidende Bedeutung für die Verwendung von Extensions: Zum einen wird anhand dieses Extension-Keys das Verzeichnis erstellt, in dem die gesamten Dateien der jeweiligen Extension gespeichert werden. Zum anderen kann die Extension später über diesen Extension-Key (innerhalb von TYPO3) eindeutig angesprochen werden, etwa um Dateipfade, Tabelleninformationen oder Konfigurationseinstellungen auszulesen. Den Extension-Key sollten Sie daher mit | 689 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
besonderer Sorgfalt wählen. In Rezept 16.1 erfahren Sie, was Sie dabei beachten und welche technischen Details Sie berücksichtigen sollten, um den Extension-Key auch zukünftig verwenden zu können.
Links
Lizensiert für Markus Mueller
In diesem Zusammenhang sei nochmals ausdrücklich darauf hingewiesen, dass es sich bei TYPO3 um ein Open Source-Produkt handelt, das der General Public License, kurz GPL, unterliegt. Das bedeutet, dass sämtliche Erweiterungen des Systems automatisch dieser Lizenz unterliegen, sobald sie veröffentlicht werden. Es gibt dabei keinen rechtlichen Zwang, eine Erweiterung zu veröffentlichen. Nur für Code, der unabhängig von TYPO3 lauffähig und sinnvoll ist, kann gegebenenfalls eine abweichende Lizenz verwendet werden. Die freie Verwendbarkeit der Software, die Ihnen die GPL garantiert, sollte Sie jedoch dazu inspirieren, Ihre Erweiterungen ebenso für alle frei nutzbar zu machen. Die TYPO3-Extension-API erleichtert dabei die Nutzung und Erweiterbarkeit des Codes durch andere. Denken Sie immer daran, dass TYPO3 und seine Weiterentwicklung als Open Source-Projekt von der Veröffentlichung freier Erweiterungen und Verbesserungen abhängt. Letztlich profitieren auch Sie von dieser Einstellung der TYPO3-Entwickler. Sollten Sie sich entschließen, eine Erweiterung zu veröffentlichen, liegt es in Ihrer Verantwortung sicherzustellen, dass der verwendete Code nicht in Konflikt zur GPL steht. Die Betreuer des Extension-Repository haben das Recht und die Pflicht, Erweiterungen, die Code mit anderen Lizenzmodellen enthalten, umgehend und ohne weitere Benachrichtigung zu entfernen.
Nachdem Sie einen Extension-Key vergeben haben, können Sie über die Oberfläche des Kickstarters bequem die weiteren Einstellungen für Ihre Extension vornehmen. In Rezept 16.2 erfahren Sie, welche Schritte dabei notwendig sind und wie Sie Ihre Arbeit mit dem Kickstarter optimieren können. Außerdem erfahren Sie mehr über den notwendigen Grundaufbau einer Extension, der dabei als Ausgangsbasis für den weiteren Ausbau angelegt wird. Aufbauend auf diesem Grundgerüst, können Sie dann zwischen weiteren Erweiterungsformen wählen, die Sie natürlich auch nach Belieben kombinieren können. In vielen Webapplikationen spielen Datenbanken eine entscheidende Rolle. Mit dem Kickstarter können Sie datenbankgestützte Webapplikationen zügig erstellen und in Ihre Website integrieren. Über die grafische Oberfläche können Sie Ihre Datenbankmodelle intuitiv umsetzen und legen gleichzeitig die entsprechenden Bearbeitungsformulare für das Backend an. In Rezept 16.3 erfahren Sie, wie Sie eine bestehende Datenbank um eigene Tabellen oder Felder erweitern und die passenden Eingabeformulare einrichten können. Diese Datenbankinhalte können Sie dann über die Bearbeitungsformulare im Backend pflegen und über sogenannte Frontend-Plugins im Frontend ausgeben.
Max. Linie
In Rezept 16.4 erfahren Sie, wie Sie eigene Inhaltselemente erstellen, mit denen Sie die gespeicherten Seiteninhalte nach eigenen Gestaltungsvorgaben auf Ihrer Website anbieten können. Das Rezept 16.5 befasst sich damit, wie Sie die Eingabemaske für Seiteninhalte anpassen, indem Sie eigene Überschriftentypen integrieren. So können Sie bequem eigene Überschriftenlayouts einbinden und nach Ihren Gestaltungsrichtlinien umsetzen.
690 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Eine weitere Möglichkeit, in die Inhaltsausgabe einzugreifen, besteht darin, dass Sie bestimmte Textbausteine, sogenannte Tags, implementieren, die dann nach der von Ihnen definierten Methode umgesetzt werden. In Rezept 16.6 erfahren Sie, wie Sie in Seiteninhalten eigene Tags verwenden, etwa um damit Textbausteine individuell auswerten zu können oder individuelle Hyperlinks zu erstellen. Auf der anderen Seite können Sie mit dem Kickstarter Extensions erstellen, die das Backend erweitern, etwa um Bearbeitungsschritte im Backend zu optimieren. Wenn Sie eigene Module in das TYPO3-Backend integrieren möchten, finden Sie in Rezept 16.7 die nötigen Grundlagen. Die hier gezeigten Anwendungsmöglichkeiten sollen verdeutlichen, dass der Kickstarter ein sehr hilfreiches Werkzeug darstellt, um wiederkehrende Aufgaben bei der Erstellung von Extensions zu erleichtern. Er sorgt dafür, dass die notwendigen Dateien erstellt und im TYPO3-Extension-Mechanismus registriert werden. Dabei berücksichtigt er automatisch die von Ihnen in den einzelnen Menüpunkten angelegten Komponenten Ihrer Extension. Flüchtigkeitsfehler bezüglich der Schreibweise von Klassennamen, falsche Dateinamen oder fehlende Dateien können durch die automatisierte Erzeugung des Programmcodes vermieden werden.
Lizensiert für Markus Mueller
Allerdings sollten Sie beachten, dass durch diese automatische Erzeugung meist auch eine spätere manuelle Nachbearbeitung der erzeugten Dateien erforderlich ist, denn der Programmcode ist in der Standardausgabe noch nicht für den produktiven Gebrauch vorgesehen, sondern dient als Vorlage für weitere Programmierschritte, mit denen Sie die Extension letztendlich an Ihre Bedürfnisse anpassen. Der Kickstarter wurde ursprünglich dafür entworfen, die Entwicklung eigener Erweiterungen zu erleichtern und einen einheitlichen, standardisierten Aufbau der Extensions sicherzustellen, der beispielsweise für einen automatisierten Austausch über das TYPO3-Extension-Repository (TER) notwendig ist. Die Rezepte in diesem Kapitel möchten Ihnen dabei den Zugang zu den erforderlichen Schritten erleichtern und Ihnen das nötige Hintergrundwissen vermitteln, diese Anpassungen eigenständig und zügig vorzunehmen. So geht das Rezept 16.8 darauf ein, wie Sie die Unterverzeichnisse anpassen müssen, um eine deutlichere Benennung der Verzeichnisse nach Ihren Wünschen zu ermöglichen. In der Praxis enthält eine Extension meist mehrere Unterverzeichnisse. Dieser Schritt ist wichtig, um die Arbeit mit mehreren Frontend-Plugins oder Backend-Modulen zu erleichtern. In Rezept 16.9 erfahren Sie, wie Sie Abhängigkeiten für Ihre Extensions festlegen und so eine Basiskonfiguration für Ihre Extension festlegen können. Das Rezept geht außerdem darauf ein, wie Sie Ihren Code resistenter gegenüber Veränderungen machen bzw. flexibler auf Veränderungen eingehen können.
Max. Linie
Wenn Sie Ihre Extension mit anderen TYPO3-Benutzern austauschen und der Welt präsentieren, ist es zumindest unter ästhetischen Gesichtspunkten sinnvoll, dass Sie das Standardsymbol vom Kickstarter durch ein individuelles Icon ersetzen. In Rezept 16.10 werden die dafür nötigen Schritte erläutert.
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Einführung
| 691
Max. Linie
Spätestens wenn Sie Ihre Extension anderen Benutzern oder Entwicklern zur Verfügung stellen, sollten Sie Ihre Änderungen am Code Ihrer Extension protokollieren. Für diesen Zweck hat der Kickstarter eine Datei names ChangeLog angelegt. Wie und in welchem Umfang Sie Ihre Änderungen in dieser Datei protokollieren sollten, erfahren Sie in Rezept 16.11.
Links
16.1 Einen passenden Extension-Key wählen Problem Sie möchten eine Extension (Erweiterung) für TYPO3 erstellen, die als geschlossene funktionale Einheit in mehreren TYPO3-Installationen verwendet wird und über den Erweiterungs-Manager verwaltet werden kann. Dazu benötigen Sie einen Extension-Key als eindeutigen Bezeichner.
Lösung
Lizensiert für Markus Mueller
Bei der Auswahl des Extension-Key müssen Sie beachten, dass dieser eindeutig ist, um eine Kollision mit anderen Extensions zu verhindern. Der Extension-Key sollte ausschließlich aus Kleinbuchstaben und Zahlen bestehen. Als einziges Sonderzeichen ist der Unterstrich _ erlaubt. Der Extension-Key sollte kurz und aussagekräftig sein. Es bietet sich an, mehrere Extensions mit einem firmen- oder projektspezifischen Präfix zu versehen, beispielsweise: t3kb_exone (projektspezifisch für das TYPO3 Kochbuch), mycom_exone (projektspezifisch für die Firma mycom). Aus historischen Gründen sind Extension-Keys, die mit tx oder u beginnen, nicht erlaubt. Wenn Sie sichergehen wollen, dass Ihr Extension-Key eindeutig ist, können Sie Ihre Extension-Keys im offiziellen TYPO3-Online-Repository registrieren: • Melden Sie sich mit Ihrem Frontend-Benutzerkonto auf typo3.org an (siehe Einleitung zu Kapitel 17). • Bei erfolgreichem Login auf typo3.org erscheint unter dem Menüpunkt Extensions/ Extension Keys eine zusätzliche Registerkarte Register keys. • Geben Sie einen Extension-Key ein, testen Sie diesen auf Gültigkeit und registrieren Sie ihn. Als einzige Ausnahme zu der Regel, dass Extension-Keys nicht mit u beginnen dürfen, ist das Präfix user_ für lokale Extensions vorgesehen. Diese Extensions können dann aber nicht im offiziellen Extension-Repository verwaltet werden.
Diskussion
Max. Linie
Über den Extension-Key wird der Name des Dateiordners festgelegt, in dem die Extension abgelegt wird. Der Extension-Key wird auch für die Bezeichnungen von Datei-, Klassenund Tabellennamen sowie in TypoScript innerhalb der Extension genutzt. Wenn ein
692 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Unterstrich _ im Extension-Key verwendet wird, entsprechen die Klassen-, Datei- und Tabellennamen nicht mehr zu 100% dem Extension-Key, da an diesen Stellen das Zeichen entfernt wird. Es ist dann also jeweils genau auf die zu verwendende Bezeichnung zu achten. Aus diesem Grund wird in den offiziellen Richtlinien empfohlen, auf die Verwendung des Unterstrichs zu verzichten. Trotzdem wird der Unterstrich in der Praxis aufgrund seiner visuellen Einprägsamkeit oft zusammen mit Präfixen verwendet, möglicherweise wird er jedoch aus technischen Gründen mittelfristig nicht mehr erlaubt. Eine Umstellung ist dann aber ohne größere Probleme möglich. Eine spätere Änderung eines bereits verwendeten Extension-Key ist sehr zeitaufwendig und fehleranfällig, daher sollte bereits in der Planungsphase an die Auswahl eines entsprechenden Extension-Key gedacht werden. Sie sollten darauf achten, eine möglichst knappe und aussagekräftige Bezeichnung zu wählen. Es werden maximal zehn alphanumerische Zeichen empfohlen. Durch die zentrale Registrierung auf typo3.org wird sichergestellt, dass jeder Extension-Key eindeutig ist. Nur so ist gewährleistet, dass eine Extension problemlos in jeder TYPO3Installation verwendet werden kann.
16.2 Ein Extension-Grundgerüst anlegen Lizensiert für Markus Mueller
Problem Sie möchten eine Extension für TYPO3 erstellen, die eine geschlossene funktionale Einheit bildet und die über den Erweiterungs-Manager verwaltet werden kann.
Lösung Mit dem Kickstarter können Sie zügig Ihre entwickelten Datenbankmodelle umsetzen und die Grundlage für TYPO3-konforme Applikationen erstellen. Dabei unterstützt der Kickstarter viele verschiedene Möglichkeiten für Extensions. Der grundsätzliche Ablauf bei Erstellung und Aufbau ist dabei immer gleich und wird in diesem Rezept beschrieben. Dies bildet die Grundlage für jede Art von Extension. Dies ist das grundsätzliche Vorgehen bei der Erstellung einer Extension mit dem Kickstarter: 1. Stellen Sie sicher, dass die Extension kickstarter installiert ist. 2. Rufen Sie den Kickstarter wie folgt auf: Wählen Sie das Modul Admin-Werkzeuge/ Erw-Manager und wählen Sie im daraufhin erscheinenden Hauptframe im Menü oben links die Funktion Neue Extension anlegen.
Max. Linie
3. Fügen Sie als Erstes den von Ihnen gewünschten Extension-Key in das Feld Enter extension key: ein und klicken Sie danach auf den Button Update. Das Rezept 16.1 erklärt Ihnen dazu den sinnvollen Umgang mit Extension-Keys.
16.2 Ein Extension-Grundgerüst anlegen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 693
Max. Linie
4. Im nächsten Schritt sollten Sie über das Icon mit dem Pluszeichen neben der Bezeichnung General Info mindestens die Metainformationen Titel und Beschreibung zu Ihrer Extension eingeben.
Links
5. Die Standardsprache in TYPO3 ist immer Englisch. Wenn Sie eine deutschsprachige Extension erstellen möchten, sollten Sie jetzt unter dem Menüpunkt Setup languages direkt eine neue Lokalisierung anlegen. Damit können Sie bereits im Kickstarter von vornherein mehrsprachige Labels erfassen, eine nachträgliche Modifikation ist um ein Vielfaches aufwendiger. 6. Lehnen Sie sich einen Moment zurück und überdenken Sie noch mal das Konzept und die Anforderungen zu der von Ihnen geplanten Extension. 7. Um das erzeugte Extension-Grundgerüst zu überprüfen, verwenden Sie den Button View result. Dort werden alle vom Kickstarter zu erzeugenden Dateien gelistet und lassen sich gegebenenfalls auch anzeigen. 8. Wenn Sie mit dem Ergebnis zufrieden sind, können Sie Ihre Extension über den Button Write in das entsprechende Zielverzeichnis Ihrer TYPO3-Installation einspielen. Beachten Sie unbedingt, dass dabei eventuell vorhandene ältere Versionen überschrieben werden. Über ein Kontrollkästchen können Sie gezielt einzelne Dateien von einer Speicherung ausnehmen, um möglicherweise eine ältere Version beizubehalten. Lizensiert für Markus Mueller
9. Bitte bedenken Sie, dass Ihre Extension zur Nutzung zusätzlich noch aktiviert werden muss, siehe dazu auch Rezept 15.2. Wenn Sie das Rezept aufmerksam nachvollzogen haben, haben Sie sicherlich bemerkt, dass diese Extension bisher über keinerlei Funktionalität verfügt. Um das zu ändern, fügen Sie, ausgehend von Ihren Anforderungen nach Schritt 6, über einzelne Wizards einen oder mehrere der vom Kickstarter unterstützten Extension-Bestandteile hinzu. Dazu geben Ihnen die Diskussion und die weiteren Rezepte in diesem Kapitel die notwendigen Hilfestellungen.
Diskussion Wir empfehlen in Schritt 4 der Lösung, unter General Info auch Ihren Namen und Ihre E-Mail-Adresse anzugeben. Wenn diese Angaben bereits unter Benutzerwerkzeuge ➝ Einstellungen ➝ Persönliche Daten in Ihrem Benutzerprofil hinterlegt sind, werden sie automatisch von dort übernommen. Der Kickstarter nutzt in jedem Fall die unter General Info angegebenen Daten und fügt den Namen und die E-Mail-Adresse entsprechend in die Copyright-Hinweise von Codedateien ein.
Max. Linie
Jede mit dem Kickstarter erstellte und manuell angepasste Extension kann nachträglich noch mal erneut über den Kickstarter bearbeitet werden. Dazu müssen Sie im Erweiterungs-Manager die Detailansicht einer Extension aufrufen (siehe dazu Rezept 15.1) und dort im Funktionsmenü oben rechts den Punkt In Kickstarter bearbeiten wählen. Anschließend wird die entsprechende Extension mit Ihrer ursprünglich im Kickstarter erstellten Konfiguration in den Kickstarter geladen. Achtung, das ist nicht bei jeder
694 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Extension möglich, außerdem gehen beim abschließenden Speichern sämtliche manuellen Änderungen verloren. Darauf wird aber auch noch mal bei einer entsprechenden Aktion in einem JavaScript-Pop-up hingewiesen. Der Kickstarter bietet Ihnen neben den in der Lösung angesprochenen Funktionen zur Eingabe der allgemeinen Informationen (General Info) und Auswahl der Sprachen (Setup languages) weitere Funktionen, um funktionale Bestandteile in Ihre Extension einzubauen. Sie können einen oder mehrere dieser Bestandteile in Schritt 6 der Lösung nutzen. Die folgende Liste zeigt Ihnen, wozu die einzelnen Funktionen nützlich sind: New Database Tables Hiermit können Sie Ihre Extension mit eigenen Datenbanktabellen versehen. Sie können mehrere solcher Tabellen anlegen und diese jeweils mit beliebig vielen Feldern versehen. Der Kickstarter erzeugt dann automatisch alle notwendigen Dateien, um diese Tabellen bei der Installation durch den Erweiterungs-Manager anlegen zu lassen und die entsprechenden Metainformationen in $TCA bereitzustellen, damit zugleich auch die notwendigen Eingabemasken zur Verfügung stehen. In Rezept 16.3 erfahren Sie mehr über das Anlegen von Datenbanktabellen und Feldern.
Lizensiert für Markus Mueller
Extend existing Tables Möglicherweise möchten Sie jedoch nur zusätzliche Felder zu einer bereits vorhandenen Tabelle hinzufügen. Dann ist diese Funktion die richtige Wahl. Da sie sich nur gering vom Anlegen eigener Datenbanktabellen unterscheidet, sollten Sie auch hierfür das Rezept 16.3 lesen, um eine detaillierte Anleitung zum Anlegen eigener Felder zu erhalten. Frontend Plugins Als Frontend wird bekanntlich die von TYPO3 ausgegebene Website bezeichnet. Wenn Sie hierfür eigene Inhaltselemente oder zusätzliche Funktionen bereitstellen möchten, bietet Ihnen diese Kickstarter-Funktion entsprechende Optionen. Als Ergebnis erhalten Sie immer ein eingebundenes PHP-Codefragment, in dem Sie die Ausgabe ausprogrammieren können. Die Rezepte 16.4, 16.5 und 16.6 stellen einige Lösungen dazu vor. Backend Modules Im Backend von TYPO3 haben Sie über das Hauptmenü auf verschiedene Module Zugriff. Über diese Funktion des Kickstarters können Sie ein eigenes Backend-Modul anlegen, das dann in dieses Hauptmenü integriert wird. Die Erstellung von BackendModulen wird in Rezept 16.7 erläutert.
Max. Linie
Integrate in existing Modules Einige der Module im Bereich Web oder User bieten Ihnen die Möglichkeit, eigene Extensions innerhalb des bestehenden Moduls in das Funktionsmenü zu integrieren. Wenn Sie Ihre Extension statt als eigenes Modul lieber in eines dieser Module integrieren wollen, sollten Sie diesen Punkt wählen. Die Erstellung von Backend-Modulen wird in Rezept 16.7 erläutert.
16.2 Ein Extension-Grundgerüst anlegen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 695
Max. Linie
Clickmenu items Im Seitenbaum des Backends, wie auch im Listenmodul, wird über einen Klick auf das Symbol eines Datensatzes ein Kontextmenü aufgerufen. Bei TYPO3 wird dieses Kontextmenü als Clickmenu bezeichnet. Über diese Funktion des Kickstarters können Sie dieses Menü um eigene Einträge erweitern, bei deren Auswahl das entsprechende PHP-Skript Ihrer Extension ausgeführt wird.
Links
Services Mit Services gibt es neben Hooks und XClasses eine weitere Möglichkeit, TYPO3 ohne Modifikationen am Source-Code zu erweitern. Die Idee dabei ist, dass zunächst eine Service-Definition erstellt wird, beispielsweise extrahiere Metainformationen aus Dateien oder authentifiziere einen Benutzer. Sobald ein solcher Service definiert ist, können sich hierfür mehrere verschiedene Implementierungen registrieren. Die verschiedenen Implementierungen werden dann automatisch ausgeführt. Dieses Konzept wird derzeit insbesondere von den Extensions cal und dam genutzt. Im Core gibt es einen Service zur Benutzerauthentifizierung. Lesen Sie http://typo3.org/documentation/document-library/core-documentation/doc_core_services/current/, wenn Sie mehr zu den Möglichkeiten und Prinzipien von Services erfahren möchten.
Lizensiert für Markus Mueller
Static TypoScript code Mit dieser Funktion können Sie TypoScript-Setup oder -Constants mit Ihrer Extension ausliefern. Beachten Sie, dass ein solches TypoScript-Template standardmäßig über Include Static from Extensions in einen Template-Datensatz eingebunden werden muss. TSconfig Analog zur Einbindung von TypoScript-Setup und -Constants können Sie über diese Funktion mit Ihrer Extension auch TSconfig-Optionen setzen. Zum Zeitpunkt der Drucklegung dieses Buchs ist diese Funktion des Kickstarters aber leider nicht funktionsfähig. Der Kickstarter erzeugt in jedem Fall nur das Grundgerüst einer Extension, d.h. nur die zur Einbindung einer Extension notwendigen Dateien und Konfigurationen. Dabei werden die TYPO3-spezifischen Konventionen für Ordner und Dateinamen berücksichtigt. Das Grundgerüst muss aber in nahezu allen Fällen ausgearbeitet werden. Hierzu sind entsprechende PHP-Kenntnisse und Editoren oder auch weitere Werkzeuge (beispielsweise zur Datenbankverwaltung) nützlich bzw. erforderlich. Die Dateien und Ordner in Ihrer Extension haben die folgende Bedeutung (die Sternchen stehen für die Zahlenwerte, die TYPO3 automatisch vergibt): ChangeLog In dieser Datei sollten Sie jeweils kurz und knapp Datum, Versionsnummer und durchgeführte Änderungen protokollieren. Bewährt hat sich folgendes Muster:
Max. Linie
2008-10-11
Vorname Name
* Ihre Beschreibung der Änderung, gegebenenfalls Bug-ID oder Hyperlinks
696 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Sie können natürlich auch andere Formatierungen verwenden. Wichtig ist nur, dass Sie die Änderungen protokollieren. README.txt Die README.txt beinhaltet eine kurze Erläuterung zur Extension: Was macht die Extension, wo kann man Hilfe bekommen? Es ist manchmal nützlich, grundlegende Informationen auch mit jedem beliebigen Text-Editor lesen zu können, statt immer ein Office-Programm öffnen zu müssen. ext_emconf.php Diese Datei dient der Aufnahme von Metainformationen wie Autor, Version und Kategorie zu einer Extension. Ausserdem können hier verschiedene Parameter gesetzt werden, um beispielsweise das Anlegen von Ordnern oder das Löschen des Caches bei einer Installation anzufordern. Hier werden auf Anforderung auch die Zeitstempel der letzten Dateimodifikationen gespeichert. Um diese zu aktualisieren, sollten Sie in der Einzelansicht einer Extension die Funktion Backup/Delete und dort den Punkt Update extension EM_CONF file ... wählen. Diese Datei enthält ausschließlich diese Parameter, die in dem Array $EM_CONF[$_EXTKEY] abgelegt werden. PHP-Funktionen sollten hier nicht eingebunden werden und werden gegebenenfalls auch vom Erweiterungs-Manager wieder entfernt.
Lizensiert für Markus Mueller
ext_localconf.php Die Datei ext_localconf.php ist die zentrale Datei der Extension, um PHP-Code zur Konfiguration auszuführen. Dabei sind das vornehmlich API-Aufrufe zur Integration der Extension in TYPO3. Die Datei ext_localconf.php jeder installierten Extension wird von TYPO3 automatisch bei jedem Aufruf im Backend und Frontend eingebunden. Es handelt sich dabei um nichts anderes als einen Extension-spezifischen Bestandteil, der zusätzlich zur zentralen Installationsdatei typo3conf/localconf.php geladen wird. ext_tables.php Die Datei ext_tables.php wird zu einem späteren Zeitpunkt als ext_localconf.php eingebunden. Sie dient der Konfiguration des Table-Configuration-Array ($TCA). Außerdem werden hier einige API-Aufrufe, die ihrerseits bereits auf $TCA zugreifen müssen oder nur im Backend verwendet werden, eingebunden. ext_tables.sql Diese Datei dient zur Speicherung der Datenbankdefinition für Tabellen und Felder der Extension. Der Inhalt entspricht einem CREATE-Statement nach dem SQL-Standard. Die Datei wird vor der Ausführung noch mal aus Kompatibilitätsgründen und als Vorsichtsmaßnahme von der Datenbankschicht geparst, d.h. möglicherweise auch modifiziert.
Max. Linie
ext_tables_static+adt.sql In dieser Datei können Sie Daten für den Import in die von Ihrer Extension angelegten Tabellen aufnehmen. Beachten Sie, dass zusätzlich eine exakte Kopie der Definition aus ext_tables.sql erforderlich ist, ansonsten bekommen Sie mit dem Werkzeug Database-Analyzer (siehe dazu Rezept 2.5) Probleme. 16.2 Ein Extension-Grundgerüst anlegen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 697
Max. Linie
ext_typoscript_constants.txt Hier kann TypoScript in Form von TypoScript-Constants hinterlegt werden. Diese werden dann zusammen mit der Extension automatisch eingebunden.
Links
ext_typoscript_setup.txt Hier kann TypoScript in Form von TypoScript-Setup hinterlegt werden. Dieses wird dann zusammen mit der Extension automatisch eingebunden. ext_typoscript_editorcfg.txt Hier kann eine Konfiguration für den Backend-CSS-Stylesheet-Editor (eine optionale Extension mit dem Key tstemplate_cssanalyzer) hinterlegt werden. Die Verwendung der Dateien ext_typoscript_constants.txt, ext_typoscript_ setup.txt und ext_typoscript_editorcfg.txt wird nicht empfohlen, stattdessen sollten die TypoScript-Templates wie in Rezept 18.1 beschrieben eingebunden werden.
Lizensiert für Markus Mueller
ext_conf_template.txt Über diese Datei können Sie bei der Installation Ihrer Extension im ErweiterungsManager bestimmte Parameter vom Benutzer einstellen lassen. Wie Sie diese Datei aufbauen und die Parameter nutzen, wird in Rezept 17.4 beschrieben. Das Ergebnis bekommen Sie im Erweiterungs-Manager beim Installieren einer Extension zu sehen, siehe dazu auch Rezept 15.2. ext_icon.gif Ein 18 x 16 Pixel großes Icon, das im Backend zur Identifizierung der Extension verwendet wird. Ersetzen Sie dieses Icon mit einer eigenen Grafik, um den Wiedererkennungswert der Extension zu erhöhen. (*/) locallang*.xml Die locallang*.xml-Dateien werden für sprachabhängige Bezeichnungen (Labels) genutzt. class.ext_update.php Hier können Sie eine PHP-Klasse ext_update mit einer Methode main() festlegen. Diese Methode wird dann im Erweiterungs-Manager über die Funktion UPDATE bei einer Aktualisierung der Extension auf Benutzeranforderung ausgeführt. Dies ist hilfreich, wenn eine neuere Version einer Extension inkompatible Änderungen beinhaltet. Die Methode kann dann für eine Umstellung nützliche Hilfe bereitstellen. pi*/ In den pi*-Ordnern befinden sich typischerweise die für ein Frontend-Plugin relevanten Dateien.
Max. Linie
mod*/ In den mod*-Ordnern befinden sich typischerweise die für ein Backend-Plugin (-Modul) relevanten Dateien.
698 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
cm*/ In den cm*-Ordnern befinden sich typischerweise die für einen Klickmenü-Eintrag relevanten Dateien. sv*/ In den sv*-Ordnern befinden sich typischerweise die für einen Service relevanten Dateien. res/ Hier können Sie Ressourcendateien, beispielsweise HTML-Vorlagen, Bilder oder auch zusätzliche optionale PHP-Dateien, ablegen. static Im Ordner static werden typischerweise optionale TypoScript-Standardtemplates für eine Extension gespeichert, die dann in einem TypoScript-Template-Datensatz unter Include static (from extensions): eingebunden werden können. Dieses Vorgehen ersetzt die Verwendung von ext_typoscript_setup.txt, ext_typoscript_constants.txt und ext_typoscript_editorcfg.txt. Dazu ist allerdings ein spezieller API-Aufruf notwendig, der in der Diskussion von Rezept 18.1 beschrieben wird. doc/
Lizensiert für Markus Mueller
Hier sollten Sie die Dokumentation zu Ihrer Extension ablegen. Des Weiteren speichert der Kickstarter hier die beim Erstellen einer Extension verwendeten Werte in den Dateien wizard_form.dat und wizard_form.html. Dadurch wird es möglich, die Extension-Einstellungen zu einem späteren Zeitpunkt noch mal mit dem Kickstarter zu bearbeiten und Änderungen vorzunehmen. Der Kickstarter legt die beschriebenen Dateien und Ordner abhängig von den beim Erzeugen der Extension genutzten Funktionen bei Bedarf automatisch an und fügt auch bereits entsprechende Inhalte ein. Das Verzeichnis res müssen Sie in der Regel selbst anlegen. Während die Bezeichnung der Dateien exakt nach diesem Muster erfolgen muss, können die Bezeichnungen der Ordner pi*, mod*, cm*, sv* und static durchaus abweichend sein, dabei hat der Entwickler völlig freie Hand. Solange Sie Ihre Extension entwickeln, ist es möglicherweise hilfreich, das Caching in TYPO3 zu deaktivieren. Um das Caching im Frontend zu deaktivieren, verwenden Sie folgendes TypoScript: config.no_cache = 1
Tun Sie dies nur, wenn Sie bereits etwas mit dem Caching-Mechanismus des Frontends vertraut sind, um später keine bösen Überraschungen zu erleben. Wenn Sie auch die ext_localconf.php oder ext_tables.php häufig bearbeiten, können Sie im Install-Tool unter [EXT][extCache] = 0 deren Caching deaktivieren.
Max. Linie
Max. Linie 16.2 Ein Extension-Grundgerüst anlegen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 699
Siehe auch
Links
Die Extension-Architektur, die Bedeutung der einzelnen Dateien und Ordner sowie der detaillierte Aufbau der ext_emconf.php-Datei ist in Kapitel 2.1 der TYPO3-Core-APIs beschrieben: http://typo3.org/documentation/document-library/core-documentation/doc_core_ api/current/view/.
16.3 Zusätzliche Datenbanktabellen und Felder hinzufügen Problem Sie möchten das Datenbankschema mit zusätzlichen Feldern oder einer eigenen Datenbanktabelle erweitern. Dabei möchten Sie sicherstellen, dass TYPO3 die bestehenden Bearbeitungsmasken automatisch anpasst bzw. zusätzliche zur Verfügung stellt.
Lösung Lizensiert für Markus Mueller
Um das Datenbankschema mithilfe einer Extension sauber zu erweitern, ist der erste Schritt in jedem Fall: Erzeugen Sie ein Extension-Grundgerüst, wie in Rezept 16.2 beschrieben! Das weitere Vorgehen unterscheidet sich etwas, je nachdem, ob Sie komplett neue Datenbanktabellen anlegen wollen oder Felder zu bereits bestehenden Tabellen hinzufügen möchten: Anlegen einer eigenen Datenbanktabelle: 1. Fügen Sie über das kleine Plussymbol neben New Database Tables die Konfiguration für eine zusätzliche Datenbanktabelle hinzu. 2. Fügen Sie unter Tablename die Bezeichnung Ihrer Datenbanktabelle ein. Der Kickstarter ergänzt hierbei automatisch Ihren Extension-Key als Präfix. 3. Fügen Sie für jede konfigurierte Sprache einen Title of the Table ein. Dieser Titel wird später innerhalb der TYPO3-Benutzeroberfläche, je nach Spracheinstellungen des Benutzers, als Bezeichnung verwendet. Felder einer bereits vorhandenen Tabelle hinzufügen: 1. Zum Hinzufügen einzelner Felder zu einer bereits existierenden Tabelle wählen Sie den Punkt Extend existing Tables.
Max. Linie
2. Wählen Sie im Auswahlfeld Which table zunächst die von Ihnen zu erweiternde Tabelle aus.
700 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
In beiden Fällen können Sie nun in der jeweiligen Bildschirmmaske unterhalb von NEW FIELD: eine beliebige Anzahl von Datenbankfeldern anlegen. Bei jedem Feld sind jeweils mindestens folgende drei Angaben nötig: • Unter Field name: legen Sie den Spaltennamen in der Datenbank fest. • Unter Field title: tragen Sie das jeweilige lokalisierte Label ein. Dieses wird später als Bezeichnung in den Eingabeformularen verwendet. Hier sollten Sie wieder je Sprache einen Eintrag vornehmen. • Unter Field type: wählen Sie abhängig vom geplanten Feldtyp eine entsprechend vorkonfigurierte Feldkonfiguration aus dem Auswahlfeld aus. Um Ihre Extension abzuschließen und dauerhaft zu speichern, sollten Sie den letzten Schritt nicht vergessen: • Sie müssen Ihre Extension unbedingt durch Auswahl der Buttons View result und anschließend Write abspeichern. Diesbezügliche Details werden in Rezept 16.2 erläutert. Wenn Sie die Extension jetzt installieren, werden die benötigten Tabellen und Felder automatisch vom Erweiterungs-Manager angelegt.
Lizensiert für Markus Mueller
Diskussion Durch das Hinzufügen von Tabellen und/oder Feldern werden folgende Dateien vom Kickstarter angelegt: • ext_tables.php • tca.php • ext_tables.sql • locallang_db.xml Wir werden nun einzeln auf den Sinn und Zweck dieser Dateien eingehen.
ext_tables.php
Max. Linie
TYPO3 verwendet die globale Array-Variable $TCA (Table Configuration Array) zur Verwaltung sämtlicher Metainformationen zu den angelegten Datenbanktabellen. Dieses Konfigurations-Array $TCA ist das Rückgrat der datenbankbasierten Verarbeitung in TYPO3. Ausgehend von diesem Array $TCA werden sowohl die Bearbeitungsformulare erzeugt und die Validierung der eingegebenen Daten vorgenommen als auch die interne Verarbeitung der Daten hinsichtlich Lokalisierungs-, Workspace- (Versionierungs-) und weiterer zentraler Funktionen gesteuert. Der Hauptindex im Array $TCA besteht aus einem Eintrag für jede dem System bekannte Datenbanktabelle (pages, tt_content, ..., tx_ extkey_tabelle).
16.3 Zusätzliche Datenbanktabellen und Felder hinzufügen | 701 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Zur Erweiterung des Datenbankschemas von TYPO3 wird die Datei ext_tables.php verwendet, diese dient der Modifikation des Arrays $TCA durch Extensions. Für eine von uns zusätzlich angelegte Tabelle hat der Kickstarter den folgenden Code in ext_tables.php erzeugt:
Links
Lizensiert für Markus Mueller
if (!defined ('TYPO3_MODE')) die ('Access denied.'); $TCA['tx_extkey_tabelle'] = array( ’ctrl’ => array( 'title' => 'LLL:EXT:ext_key/locallang_db.php:tx_extkey_tabelle', 'label' => 'name', 'tstamp' => 'tstamp', 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', 'default_sortby' => 'ORDER BY number', 'versioningWS' => TRUE, 'origUid' => 't3_origuid', 'languageField' => 'sys_language_uid', 'transOrigPointerField' => 'l18n_parent', 'transOrigDiffSourceField' => 'l18n_diffsource', 'delete' => 'deleted', 'enablecolumns' => array( 'disabled' => 'hidden', 'starttime' => 'starttime', 'endtime' => 'endtime', 'fe_group' => 'fe_group', ), 'dynamicConfigFile' => t3lib_extMgm::extPath($_EXTKEY).'tca.php', 'iconfile' => t3lib_extMgm::extRelPath($_EXTKEY).'icon_tx_extkey_tabelle.gif', ), 'feInterface' => array( 'fe_admin_fieldList' => 'hidden, number, description, length, width, height', ) );
Innerhalb des entsprechenden Tabellenschlüssels ist das im obigen Beispiel enthaltene Array unterhalb ctrl der zentrale Parameter zur Konfiguration einer Tabelle. In ctrl werden die wichtigsten Parameter zur Anzeige und Verarbeitung einer Tabelle im TYPO3Backend festgehalten, dies umfasst beispielsweise, welches Feld aus der Tabelle als Label im Backend verwendet werden soll (label), wie die Sortierung vorzunehmen ist (default_ sortby) und welche der vom TYPO3-Kern bereitgestellten Features zum Setzen des Veröffentlichungsstatus (versteckt, zeitgesteuert, Einschränkung auf bestimmte FrontendBenutzergruppen) verwendet werden sollen (enablecolumns). Die entsprechenden Einträge werden dabei abhängig von den jeweils im Kickstarter aktivierten Optionen gesetzt, können jedoch jederzeit manuell modifiziert werden. In Tabelle 16-1 finden Sie eine Übersicht über die verschiedenen Optionen; im Kickstarter ist auch jeweils über den Link What is this? eine entsprechende Hilfestellung erhältlich.
Max. Linie
Max. Linie 702 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts Tabelle 16-1: Die Optionen des Kickstarters
Lizensiert für Markus Mueller
Kickstarter-Option
Erläuterung
ctrl-Variable
Add "Deleted" field
Datensätze werden von TYPO3 oft nicht wirklich gelöscht. Stattdessen wird nur ein entsprechendes Flag im Datensatz gesetzt. Hier legen Sie die Bezeichnung des Felds für dieses Flag fest. Nur wenn Sie diese Option nicht verwenden (bspw. für vertrauliche Daten), werden Datensätze beim Löschen wirklich aus der Datenbank entfernt.
'delete' => 'deleted'
Add "Hidden" flag
Wenn Sie diese Option aktivieren, können die Datensätze versteckt werden. In diesem Zustand sind sie zwar vom Backend aus erreichbar und zu bearbeiten, werden aber bei einer Abfrage im Frontend, die ordnungsgemäß über eine APIMethode ausgeführt wird, nicht angezeigt.
'enablecolumns'// 'disabled' => 'hidden'
Add "Starttime"
Ein Feld, das einen Zeitstempel für einen Startzeitpunkt zur Veröffentlichung aufnimmt, hinzufügen. Die Auswertung erfolgt automatisch über die API-Methoden.
'enablecolumns'// 'starttime' => 'starttime'
Add "Endtime"
Ein Feld, das einen Zeitstempel für einen Endzeitpunkt zur Veröffentlichung aufnimmt. Die Auswertung erfolgt automatisch über die APIMethoden.
'enablecolumns'//'endtime' => 'endtime'
Add "Access group"
Falls Sie den Zugriff auf einzelne Datensätze im Frontend auf bestimmte Benutzergruppen beschränken möchten, lässt sich dies hier mit einem Mausklick aktivieren.
'enablecolumns'// 'fe_group' => 'fe_group'
Enabled localization features
Zur Unterstützung der Lokalisierung Ihrer Datensätze werden gleich mehrere Felder benötigt. Es werden jeweils einzelne Felder verwendet, um die Sprache des Datensatzes, eine Referenz auf das Originalelement und die seit der ersten Übersetzung im Original durchgeführten Änderungen zu speichern.
'languageField' => 'sys_language_uid' 'transOrigPointer-Field' => 'l18n_parent' 'transOrigDiffSourceField' => 'l18n_diffsource'
Enable versioning
Falls Sie die Möglichkeit benötigen, Ihre Datensätze zu versionieren, können Sie diese Option aktivieren, es werden dann eine Reihe weiterer Felder angelegt und verwendet.
'versioningWS' => TRUE,'origUid' => 't3_origuid',
Manual ordering of records If "Manual ordering" is not set, order the table by this field:
'sortby' => 'sorting' Sie können entweder explizit ein Feld verwenden, um einzelne Datensätze, wie bei Seiten und oder Inhaltselementen, gezielt mit einer manuellen 'default_sortby' => 'ORDER BY Sortierreihenfolge zu speichern, oder Sie geben number' lediglich eines der angelegten Felder an, das als Standard-Sortierschlüssel verwendet wird.
Max. Linie
Max. Linie 16.3 Zusätzliche Datenbanktabellen und Felder hinzufügen | 703 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Links
Tabelle 16-1: Die Optionen des Kickstarters (Fortsetzung) Kickstarter-Option
Erläuterung
ctrl-Variable
"Type-field", if any:
Sie haben die Möglichkeit, das Bearbeitungsformular im Backend, abhängig von dem Wert eines Felds, unterschiedlich aufzubauen. Hier legen Sie fest, aus welchem Feld der dabei verwendete Wert ausgelesen werden soll. Siehe dazu auch weiter unten unter types und palettes. Wichtig: Wenn Sie diese Option aktivieren, müssen Sie selbst manuell entsprechende Einträge unter types eintragen, ansonsten werden Sie schnell auf nicht benutzbare Backend-Formulare stoßen. Dies ist ein typischer Fehler, über den viele Entwickler anfangs stolpern, ohne ihn zu erkennen.
'type' => 'type'
Label-field:
Das Feld, das in den Überschriften als Titel eines Datensatzes verwendet werden soll.
'label' => 'name'
Lizensiert für Markus Mueller
Diese Informationen aus ext_tables.php werden von TYPO3 bei jedem Aufruf des Backends vorgehalten. Die Detailkonfiguration zu den einzelnen Feldern einer solchen Datenbanktabelle wird nur benötigt, wenn tatsächlich ein Datensatz dieser Tabelle bearbeitet wird. Aus diesem Grund nutzt der Kickstarter den Schlüssel dynamicConfigFile, um auf eine weitere Datei zu verweisen, in der die vollständige Konfiguration der entsprechenden Tabelle vorgenommen wird. Standardmäßig wird dazu die Datei tca.php genutzt. Die Datei ext_tables.php wird bei jedem Aufruf des TYPO3-Backends eingebunden, sie dient dazu, den wichtigen ctrl-Schlüssel der Tabellen anzulegen. Mit dem Schlüssel $TCA['tx_extkey_tabelle']['ctrl']['dynamicConfigFile'] wird die Detailkonfiguration aus Performancegründen in eine weitere Datei ausgelagert, die von TYPO3 nur bei Bedarf eingebunden wird.
Etwas anders ist der Inhalt von ext_tables.php, wenn Sie lediglich Felder zu einer bereits bestehenden Tabelle hinzugefügt haben. Sie finden dann dort Code nach dem folgenden Muster:
Max. Linie
$tempColumns = array( ’tx_extkey_feldeins’ => array( 'exclude' => 0, 'label' => 'LLL:EXT:ext_key/locallang_db.xml:tabelle.tx_extkey_feldeins', 'config' => array( 'type' => 'select', 'items' => array( array('LLL:EXT:ext_key/locallang_db.xml:tabelle.tx_extkey_feldeins.I.0', '0'), array('LLL:EXT:ext_key/locallang_db.xml:tabelle.tx_extkey_feldeins.I.1', '1'), array('LLL:EXT:ext_key/locallang_db.xml:tabelle.tx_extkey_feldeins.I.2', '2'),
704 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
array('LLL:EXT:ext_key/locallang_db.xml:tabelle.tx_extkey_feldeins.I.3', '3'), ), 'size' => 1, 'maxitems' => 1, ) ), ); t3lib_div::loadTCA('tabelle'); t3lib_extMgm::addTCAcolumns('tabelle',$tempColumns,1); t3lib_extMgm::addToAllTCAtypes('tabelle','tx_extkey_feldeins;;;;1-1-1');
In diesem Fall wird das Feld zunächst in einer temporären Variablen direkt in ext_tables. php konfiguriert. Von entscheidender Wichtigkeit sind die folgenden Aufrufe aus der TYPO3-API. t3lib_div::loadTCA('tabelle'); Wir haben bereits auf die Variable dynamicConfigFile und ihren Sinn hingewiesen. Bevor Sie Änderungen an der Konfiguration, sprich am $TCA, einer bestehenden Tabelle vornehmen, müssen Sie unbedingt sicherstellen, dass die Konfiguration der Tabelle zunächst vollständig geladen wird. Dazu ist die Methode t3lib_div::loadTCA ('tabelle') zu verwenden. Lizensiert für Markus Mueller
t3lib_extMgm::addTCAcolumns('tabelle',$tempColumns,1); Die Feldkonfiguration muss dann in das $TCA-Array der entsprechenden Tabelle eingefügt werden. Dafür wird die Methode t3lib_extMgm::addTCAcolumns('tabelle', FeldConfigArray) genutzt. t3lib_extMgm::addToAllTCAtypes('tabelle','tx_extkey_feldeins;;;;1-1-1'); Für eine Tabelle können über die sogenannte types-Konfiguration verschiedene Darstellungen der Felder als Backend-Formulare erzeugt werden. Mit diesem API-Aufruf wird dafür Sorge getragen, dass das Feld in allen für diese Tabelle erzeugten Formularen standardmäßig als Letztes hinzugefügt wird. Die Methode stellt zwei weitere Parameter zur Verfügung, mit denen Sie gezielt beeinflussen können, in welches der Formulare und an welcher Position das Feld aufgenommen wird. Das kann jedoch nicht über den Kickstarter beeinflusst werden. Sie können das $TCA einer bereits bestehenden Tabelle in ext_tables.php vollständig an Ihre Bedürfnisse anpassen. Sie müssen dann aber unbedingt zunächst das $TCA der Tabelle initialisieren. TYPO3 stellt dazu die Methode t3lib_div::loadTCA('tabellenname') zur Verfügung.
tca.php
Max. Linie
Für eine mit dem Kickstarter angelegte eigene Tabelle wird der $TCA-Eintrag erst in der Datei tca.php vervollständigt, diese Datei ist dann nach folgendem Muster aufgebaut, das auch dem Komplettaufbau von $TCA entspricht:
16.3 Zusätzliche Datenbanktabellen und Felder hinzufügen | 705 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Lizensiert für Markus Mueller
$TCA['extkey_tabelle'] = array( 'ctrl' => $TCA['tx_extkey_tabelle']['ctrl'], 'interface' => array(...), 'feInterface' => $TCA['tx_extkey_tabelle']['feInterface'], 'columns' => array( 'feldeins' => array( 'exclude' => 1, 'label' => 'LLL:EXT:t3kb_737/locallang_db.xml:tx_t3kb737_rooms.number', 'config' => array( 'type' => 'input', 'size' => '30', 'eval' => 'required', ), 'feldzwei' => array(...), 'felddrei' => array(...), .... ), 'types' => array( '0' => array('showitem' => 'feldeins,feldzwei, ...') ... ), 'palettes' => array( '1' => array('showitem' => 'feldsechs,feldsieben, ...') ... ), );
Links
Hier sind nun alle möglichen Hauptschlüssel für $TCA['extkey_tabelle'] aufgelistet: ctrl Dieser Schlüssel muss in ext_tables.php angelegt werden. Seine Bedeutung wurde bereits weiter oben beschrieben. An dieser Stelle wird in tca.php einfach der bereits bestehende Wert aus ext_tables.php hineinkopiert. interface Der Schlüssel interface enthält eine Liste aller Felder, die in einem Backend-Formular angezeigt werden können. Ein Feld wird allerdings nicht automatisch angezeigt, wenn es in dieser Liste enthalten ist, es muss auch im Abschnitt types beziehungsweise palettes angegeben werden. Zur Anzeige der Felder in Backend-Formularen kommen wir gleich noch unter den Beschreibungen zu types und palettes. feInterface feInterface enthält eine Liste aller Felder, die von der Bibliothek feAdminLib.inc erwartet wird, mit der Werte in der Datenbank auch von Frontend-Benutzern modifiziert werden können (sinnvoll beispielsweise für die Frontend-Benutzerkonten). Auch hier wird in tca.php wieder der Wert aus ext_tables.php hineinkopiert.
Max. Linie
columns Der Eintrag columns besteht aus einem Eintrag für jedes verwendete Feld. Hier wird jeweils die Konfiguration der einzelnen Felder festgelegt, beispielsweise die zu verwendende lokalisierte Bezeichnung und der Feldtyp (Auswahlfeld, Freitextfeld, Flex-
706 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
formfeld ...). In unserem Beispiel handelt es sich bei feldeins um ein einfaches Eingabefeld für Text ('type' => 'input') types Der types-Eintrag steuert die eigentliche Anzeige der Felder in den Backend-Formularen. In den jeweiligen Unterschlüsseln wird über den Schlüssel showitem eine Liste von Feldern definiert, die im Bearbeitungsformular angezeigt werden sollen. Die verschiedenen Unterschlüssel (0 im obigen Beispiel) sind nützlich, wenn Sie das Formular abhängig von dem Wert in einem bestimmten Feld gänzlich anders aufbauen wollen. Lesen Sie dazu am besten noch mal in Tabelle 16-1 die Beschreibung zur Option "Type-field", if any:. Innerhalb von showitem ist (vom Feldnamen durch Semikolon ; abgetrennt) die Angabe zusätzlicher Parameter möglich. Diese dienen unter anderem dazu, eine zweite Optionspalette mit weiteren Feldern hinter diesem Feld einzubinden oder den visuellen Stil zu beeinflussen. Ein Eintrag in $TCA['tx_extkey_tabelle']['types'] ['0']['showitem'] könnte beispielsweise auch wie folgt aussehen: =feldeins,feldzwei;;3;;1-3-4,...
Lizensiert für Markus Mueller
Damit wird hinter dem Feld feldzwei die Palette 3 angezeigt, mit 1-3-4 wird jeweils ein Eintrag aus dem entsprechenden Farb-(1), Style-(3) und Rahmenschema (4) des verwendeten Skins angesprochen. palettes Über palettes werden nicht so häufig benötigte Felder in eine zweite Optionspalette ausgelagert. Jeder verwendete Schlüssel kann von den entsprechenden Einträgen unter types aus referenziert werden. Auch hier gibt es nur einen Eintrag showitem, der die Liste der Felder festlegt. Beachten Sie, dass ein Feld nur in einer Palette enthalten sein darf.
ext_tables.sql Neben diesem Aufbau des entsprechenden $TCA ist für Datenbankeinträge auch eine Datei ext_tables.sql erforderlich. Diese dient dem Erweiterungs-Manager beim Import als Vorlage, um die benötigte Datenbankstruktur auch in der Datenbank anzulegen. Ihr Inhalt entspricht einem gewöhnlichen SQL-Create Statement: # # Table structure for table 'tx_extkey_tabelle' # CREATE TABLE tx_extkey_tabelle ( uid int(11) NOT NULL auto_increment, pid int(11) DEFAULT '0' NOT NULL, tstamp int(11) DEFAULT '0' NOT NULL, [...] height int(11) DEFAULT '0' NOT NULL,
Max. Linie
PRIMARY KEY (uid), KEY parent (pid) );
16.3 Zusätzliche Datenbanktabellen und Felder hinzufügen | 707 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
locallang_db.xml
Links
In den Eingabeformularen wird jedes Feld mit einem lokalisierten Label versehen. Die dazu notwendigen Einträge haben Sie im Kickstarter beim Anlegen der Felder vorgenommen. Diese Datei dient dazu, diese Angaben zu speichern.
Siehe auch Wir haben hier nur die zentralen und wichtigsten Optionen des $TCA erläutert, es lassen sich jedoch noch viele weitere Optionen und Funktionen nutzen. Die vollständige Referenz zu $TCA finden Sie im Dokument TYPO3-Core-API in Kapitel 4.2, http://typo3.org/ documentation/document-library/core-documentation/doc_core_api/current/view/. Wie Sie die Anordnung von Feldern in einem Formular gezielt beeinflussen oder ein Feld nur in bestimmte Formulartypen aufnehmen, wird in Rezept 6.9 bei der Diskussion der Methode t3lib_extMgm::addToAllTCAtypes behandelt. Wenn Sie ein bestehendes Feld modifizieren möchten, sollten Sie Rezept 6.7 lesen.
16.4 Eigene Inhaltselemente einbinden Lizensiert für Markus Mueller
Problem Sie möchten eigene Inhaltselemente erstellen und die Auswahlliste Typ um ein neues Inhaltselement erweitern, zum Beispiel wenn Sie den Inhalt in einem eigenen Layout ausgeben möchten.
Lösung Erstellen Sie eine neue Extension (in Rezept 16.2 finden Sie dazu die nötigen Hilfestellungen). Fügen Sie anschließend über das Plussymbol Add item rechts neben dem Menüpunkt Frontend Plugins ein neues Frontend-Plugin hinzu. In dem Eingabefeld Enter a title for the plugin vergeben Sie die Bezeichnung für das neue Inhaltselement. Dieser Wert erscheint später in der Auswahlliste für die einzelnen Inhaltselemente. Wählen Sie abschließend die Option Add as a totally new Content Element type. Standardmäßig speichert TYPO3 den Seiteninhalt beim ersten Seitenaufruf im Cache. Dies kann Nachteile haben, wenn Sie den Inhalt mit dynamischen Inhalten kombinieren möchten, etwa um bei jedem Seitenaufruf wechselnde Bilder anzuzeigen. In diesem Fall sollten Sie die Option USER cObjects are cached. Make it a non-cached USER_INT instead aktivieren. Der Inhalt wird dann unabhängig von Ihren Cache-Einstellungen ausgegeben und bei jedem Seitenaufruf neu generiert.
Max. Linie
Klicken Sie abschließend auf den Button View result und wählen Sie in der Auswahlliste Write to location die Option Local: ... Nachdem Sie Ihre Extension lokal gespeichert und
708 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
aktiviert haben, können Sie das neue Inhaltselement über die Auswahlliste Typ als Seiteninhalt anlegen. Zusätzlich zu dieser neuen Auswahlmöglichkeit wurde vom Kickstarter ein PHP-Skript erzeugt, über das die Ausgabe dieses Inhaltselements verarbeitet werden kann. Zusätzlich können Sie Ihrer Extension bestimmten TypoScript-Code vorgeben, den Sie anschließend in Ihrem Skript auswerten. Standardmäßig müssen Sie TypoScript-Code über die Template-Einstellungen als sogenanntes statisches Template über das Feld Include static einbinden. Wenn Sie die Option Enable this option if you want the TypoScript code to be set by default. aktivieren, wird das nötige TypoScript direkt eingefügt (lesen Sie in Rezept 18.1, wie Sie TypoScript in eigenen Extensions anwenden und welche Auswirkungen diese Einstellung auf dessen Verwendung hat).
Wenn Sie nun den neuen Inhaltstyp wählen und mit Inhalt füllen möchten, werden Sie feststellen, dass die Eingabemaske noch sehr reduziert ist und momentan lediglich Eingabefelder für eine Überschrift bietet. Geben Sie ungeachtet dieser Tatsache eine aussagekräftige Überschrift in das entsprechende Feld ein und speichern Sie den Inhalt mit dem Button Dokument speichern und Web-Seite anzeigen. TYPO3 begrüßt Sie daraufhin mit einem freundlichen: Lizensiert für Markus Mueller
Hello World! Here is the TypoScript passed to the method: userFunc tx_ext_key_pi1->main
Erinnern Sie sich an die Aussage von Rezept 16.2: Der Extension Kickstarter bildet nur das Grundgerüst für Ihre Vorhaben. Sie müssen dieses Grundgerüst dann entsprechend Ihren Wünschen anpassen. Die Ausgabe verdeutlicht, dass das Inhaltselement schon ordnungsgemäß funktioniert und eingebunden ist. Diese Standardausgabe ändern Sie nun, indem Sie die vom Kickstarter erzeugte PHP-Datei nach Ihren Wünschen anpassen. Vorher sollten Sie jedoch die Eingabemaske anpassen, um eigene Inhalte abspeichern zu können. Wechseln Sie dazu in das neu erstellte Extension-Verzeichnis und öffnen Sie dort die Datei ext_tables.php. In dieser Datei finden Sie die folgende Codezeile (aus Platzgründen sind die Feldwerte hier untereinander angeordnet): $TCA['tt_content']['types'][$_EXTKEY.'_pi1']['showitem']=' CType;;4; button;1-1-1, header;;3;;2-2-2 ';
Max. Linie
Mit dieser Zeile legen Sie die Felder fest, die in der Eingabemaske Ihres Inhaltselements erscheinen, und können zusätzlich noch Einfluss darauf nehmen, an welcher Position sich diese befinden. Im nächsten Schritt erweitern Sie diese Standardkonfiguration um weitere Felder, indem Sie deren Feldwerte an die jeweilige Stelle einfügen. Über folgende Änderung schalten Sie beispielsweise das Feld Text unterhalb vom Feld Überschrift frei:
16.4 Eigene Inhaltselemente einbinden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 709
Max. Linie
$TCA['tt_content']['types'][$_EXTKEY.'_pi1']['showitem']=' CType;;4; button;1-1-1, header;;3;;2-2-2, bodytext ';
Links
Möchten Sie in dem Textfeld das interaktive Texteingabefeld mit dem Rich Text Editor (RTE) freischalten, geben Sie zusätzlich zu dem Feldnamen noch folgende Feldkonfiguration an: $TCA['tt_content']['types'][$_EXTKEY.'_pi1']['showitem']=' CType;;4; button;1-1-1, header;;3;;2-2-2, bodytext;;;richtext[*] ';
Im Eingabefeld erscheint daraufhin der Rich Text Editor mit den Einstellungen, die Sie über TSconfig vorgeben. (Die Syntax der showitem-Konfiguration in Rezept 6.9 näher beleuchtet.) In Tabelle 16-2 finden Sie die Namen der relevanten Datenbankfelder, die Sie hier verwenden können Lizensiert für Markus Mueller
Max. Linie
Tabelle 16-2: Datenbankfelder, die Sie in Ihrem Inhaltsobjekt einblenden können . Datenbankfeld
Verwendung
CType
Die Auswahlliste für den Inhaltstyp (standardmäßig eingeblendet).
sys_language_uid
Die Auswahlliste für die ausgewählte Sprache.
l18n_parent
Die Auswahlliste für die ursprüngliche Übersetzung.
layout
Die Auswahlliste für das Layout des Inhaltselements.
colPos
Die Auswahlliste für die Spaltenposition.
date
Das Eingabefeld für das aktuelle Datum (standardmäßig vorhanden in der zweiten Optionspalette).
header
Das Eingabefeld für die Überschrift (standardmäßig eingeblendet).
header_position
Die Auswahlliste für die Position der Überschrift (standardmäßig vorhanden in der zweiten Optionspalette).
header_link
Das Eingabefeld für Hyperlinks zum Verlinken der Überschrift (standardmäßig vorhanden in der zweiten Optionspalette).
header_layout
Die Auswahlliste für den Überschriftentyp (standardmäßig vorhanden in der zweiten Optionspalette).
subheader
Das Eingabefeld für die Unterüberschrift.
bodytext
Das Eingabefeld für den Fließtext.
image
Das Dateifeld für verknüpfte Bilder.
imagewidth
Das Eingabefeld für die Bildbreite.
imageheight
Das Eingabefeld für die Bildhöhe.
imageorient
Die Auswahlliste für die Bildposition.
imageborder
Das Kontrollkästchen zum Aktivieren eines Bildrahmens.
710 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Tabelle 16-2: Datenbankfelder, die Sie in Ihrem Inhaltsobjekt einblenden können (Fortsetzung) Datenbankfeld
Lizensiert für Markus Mueller
Max. Linie
Verwendung
image_noRows
Das Kontrollkästchen zum Aktivieren der Option Keine Bilderreihen bilden.
image_link
Das Eingabefeld für die Verlinkung von Bildern.
image_effects
Die Auswahlliste für spezielle Bildeffekte.
image_frames
Die Auswahlliste für spezielle Bilderrahmen.
image_compression
Die Auswahlliste für die Bildkomprimierung.
imagecols
Das Eingabefeld der Spalten für Bilderreihen oder Tabellen.
imagecaption
Das Eingabefeld für die Bildbeschreibungen.
imagecaption_position
Die Auswahlliste für die Position der Bildbeschreibung.
altText
Das Eingabefeld für den Alternativtext der Bilder.
titleText
Das Eingabefeld für die Bildtitel.
longdescURL
Das Eingabefeld für die vollständige Beschreibung eines Bilds.
cols
Die Auswahlliste für die Anzahl der Tabellenspalten.
pages
Das Auswahlfeld für verknüpfte Seiten.
recursive
Die Auswahlliste für die Rekursionstiefe.
menu_type
Die Auswahlliste für den Menütyp (speziell für den Inhaltstyp Sitemap).
list_type
Die Auswahlliste für den Plugin-Typ (speziell für den Inhaltstyp Plugin).
select_key
Das Eingabefeld für den Plugin-Code.
table_bgColor
Das Eingabefeld für die Hintergrundfarbe einer Tabelle (speziell für den Inhaltstyp Tabelle).
table_border
Das Eingabefeld für die Rahmendicke einer Tabelle.
table_cellspacing
Das Eingabefeld für den Rahmenabstand einzelner Zellen (speziell für den Inhaltstyp Tabelle).
table_cellpadding
Das Eingabefeld für den Inhaltsabstand einzelner Zellen (speziell für den Inhaltstyp Tabelle).
media
Das Auswahlfeld für Dateien.
multimedia
Das Auswahlfeld für Multimedia-Dateien (kann gegenüber media größere Dateien speichern).
records
Das Auswahlfeld zum Speichern andere Datensätze.
spaceBefore
Das Eingabefeld für einen Abstand nach oben.
spaceAfter
Das Eingabefeld für einen Abstand nach unten.
section_frame
Die Auswahlliste für den Rahmentyp, der um das Inhaltselement gelegt wird.
sectionIndex
Das Kontrollkästchen zum Ausblenden des Inhaltselements in Abschnittsübersichten.
linkToTop
Das Kontrollkästchen zum Aktivieren eines Links zum Seitenanfang.
rte_enabled
Das Kontrollkästchen zum Deaktivieren des Rich Text Editor für dieses Inhaltselement.
pi_flexform
Das flexible Eingabefeld für beliebige weitere Felder. Um dieses Feld einzurichten, sind ein paar zusätzliche Schritte nötig, auf die in Rezept 16.9 eingegangen wird.
Nachdem Sie Ihr Eingabeformular angepasst haben, wechseln Sie zurück in die Eingabemaske und speichern den Datensatz erneut ab. TYPO3 erzeugt die neue Eingabemaske nun nach Ihren aktuellen Angaben, sodass Sie nun auch die neuen Felder befüllen können.
16.4 Eigene Inhaltselemente einbinden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 711
Max. Linie
Sie können den Inhalt dieser Felder jetzt über das PHP-Skript ausgeben, indem Sie das Skript entsprechend anpassen. Speichern Sie den Datensatz nun erneut und wechseln Sie in den Unterordner pi1 des neu erstellten Extension-Verzeichnisses. Dort finden Sie zwei Dateien: Die Datei mit dem Präfix class. beinhaltet die Funktion main(), mit der Sie die Inhaltsausgabe steuern können. Die zweite Datei mit dem Namen locallang-db.xml enthält lediglich optionale Sprachwerte, die Sie in Ihrem Frontend-Plugin bei Bedarf verwenden können (in Rezept 17.7 erfahren Sie mehr über deren Verwendung).
Links
Öffnen Sie die Datei mit dem Präfix class. und passen Sie die Funktion main() nach Ihren Wünschen an. Löschen Sie dazu zuerst den von TYPO3 erzeugten Beispielcode innerhalb der Funktion und geben Sie danach folgenden Code ein: function main($content,$conf) { $content = ''. $this->cObj->data['header'] .''; $content.= ''. $this->cObj->data['bodytext'] .'
'; return $content; }
Nun werden die beiden Felder Überschrift und Text im Frontend ausgegeben. Das Feld Überschrift wird durch den HTML-Tag als Überschrift erster Ordnung deklariert. Der Text wird als eigener Absatz von -Tags umschlossen. Lizensiert für Markus Mueller
Max. Linie
Falls Ihre Änderungen nicht übernommen werden, sollten Sie den TYPO3Cache leeren, indem Sie im Backend die Funktion Alle Caches löschen aufrufen.
Diskussion Mit eigenen Inhaltselementen können Sie Seiteninhalte individuell auf Ihrer Website ausgeben. Dabei nutzen Sie exakt die gleichen Eingabeformulare und Ausgabemechanismen, wie sie TYPO3 für reguläre Inhaltselemente verwendet – mit dem wesentlichen Unterschied, dass Sie die Eingabemaske und die Ausgabeoptionen nun völlig frei bestimmen können (die Feldinhalte speichert TYPO3 dabei standardmäßig in der Tabelle tt_content). Zusätzlich lässt sich die Inhaltsausgabe vollständig über das PHP-Skript Ihres FrontendPlugins steuern. In dieser Datei finden Sie eine Klasse mit der Methode main(), die hauptverantwortlich für die Verarbeitung und Darstellung des Inhaltselements ist. Hier bestimmen Sie, wie die Inhalte verarbeitet und an die Webseite zurückgegeben werden. Um mit den vorhandenen Inhalten Ihres Datensatzes komfortabel zu arbeiten, stellt Ihnen TYPO3 sämtliche Werte des aktuellen sowie des übergeordneten Datensatzes über das Objekt cObj (content Object) zur Verfügung, das Sie direkt über $this->cObj ansprechen können. Über dieses Objekt haben Sie zum Beispiel Zugriff auf sämtliche Felder des aktuellen und des übergeordneten Datensatzes. Das aktuelle Inhaltselement stellt momentan Ihr eigenes Inhaltselement dar, dessen Werte Sie über $this->cObj->data ansprechen können. Das übergeordnete Inhaltselement stellt die Seite dar, in der das Inhaltselement liegt. Deren Werte können Sie über $this->cObj->parentRecord['data'] erreichen.
712 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
In dem Skript haben Sie über dieses Objekt Zugriff auf alle Felder der Tabellen tt_content und pages und können diese bequem analysieren und auswerten. Die Ausgabe der Inhalte der Datenbankfelder Ihres Datensatzes erfolgt stets nach folgendem Muster: $content = $this->cObj->data['feld_name'];
Wenn Sie die Inhalte mit Werten aus den Seiteneigenschaften auslesen möchten, verwenden Sie den Aufruf über parentRecord: $content = $this->cObj->parentRecord['data']['feld_name'];
Viele relevante Informationen über die wichtigsten Datensätze liegen Ihnen damit schon standardmäßig über das Objekt cObj vor. Sie benötigen daher keine weiteren Datenbankabfragen, um an diese Informationen zu gelangen. Selbstverständlich können Sie diese Werte auch kombinieren. Ergänzend zu dem anfangs aufgeführten Codebeispiel geben Sie mit folgendem Beispiel zusätzlich zu den beiden Feldern Überschrift und Text noch den Titel der aktuellen Seite aus (zur besseren Übersicht wurden die Werte für den Seitentitel und die Überschrift in eigene Variablen geschrieben): function main($content,$conf) { $title = $this->cObj->parentRecord['data']['title']; $header = $this->cObj->data['header']; $content = ''. $header .' auf der Seite '. $title .''; $content.= '
'. $this->cObj->data['bodytext'] .'
'; Lizensiert für Markus Mueller
return $content; }
Da die gesamte Frontend- und TypoScript-Funktionalität in der System-Extension cms implementiert ist, finden Sie die für das Frontend wichtigen Klassen im Ordner typo3/sysext/cms/tslib. Die für das cObj-Objekt zuständige Klasse tslib_cObj wird in der Datei class.tslib_content.php zur Verfügung gestellt. Die Klasse tslib_pibase stellt die Basis für Ihr Fontend-Plugin dar, sodass Sie auch direkt sämtliche Methoden dieser Klasse in Ihrem Skript nutzen können.
Indem Sie diese Werte mit weiteren PHP- und TypoScript-Funktionen sowie CSS- und HTML-Angaben kombinieren, können Sie die Inhalte sehr flexibel nach Ihren Vorstellungen auf der Webseite ausgeben (achten Sie bei der Ausgabe von Datenbankinhalten darauf, dass Sie Ihren Code gegen XSS-Attacken absichern und die Inhalte beispielsweise mit der PHP-Funktion htmlspecialchars() verarbeiten, um HTML-Angaben zu entwerten, bevor sie auf der Webseite angezeigt werden).
Max. Linie
Wenn Sie Ihr Inhaltselement mit dem Kickstarter erstellen, nimmt dieser automatisch die nötigen Schritte vor, um Ihr Skript an den notwendigen Stellen in der TypoScript-Engine zu registrieren. Dadurch ist sichergestellt, dass Ihr Inhaltselement über das PHP-Skript Ihres Plugins verarbeitet wird, sobald eine Seite im Frontend aufgerufen wird, die Ihr Inhaltselement enthält. Die Registrierung Ihres Inhaltselements in der TypoScript-Engine findet dabei in drei Schritten statt. Zuerst wird das PHP-Skript mit folgendem TypoScript-
16.4 Eigene Inhaltselemente einbinden This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 713
Max. Linie
Befehl in die Seite eingebunden, sodass Ihre Methoden aus der Klasse überhaupt angesprochen werden können (dieser Befehl entspricht dabei dem PHP-Aufruf include()):
Links
includeLibs.tx_extkey_pi1 = typo3conf/ext/ext_key/pi1/class.tx_extkey_pi1.php
Anschließend wird die Funktion main Ihres Frontend-Plugins einem USER-Objekt zugewiesen (USER steht hierbei für userdefined cObject, also ein benutzerdefiniertes Inhaltsobjekt). Für Frontend-Plugins ist der Namensbereich plugin als Speicherort für TypoScriptAngaben sämtlicher Frontend-Plugins reserviert. Dementsprechend wird dort unter dem Extension-Key je nach gewählter Option ein USER- oder USER_INT-Objekt registriert. Wenn Sie bei der Erstellung des Inhaltselements die Option USER cObjects are cached. Make it a non-cached USER_INT instead aktiviert haben, wird hier anstatt des USERObjekts ein USER_INT-Objekt erzeugt. USER_INT-Objekte werden standardmäßig nicht im Cache gespeichert. Ansonsten wird der TypoScript-Code nach folgendem Muster eingefügt: plugin.tx_extkey_pi1 = USER plugin.tx_extkey_pi1 { userFunc = tx_extkey_pi1->main }
Lizensiert für Markus Mueller
Über das USER-Objekt wird durch die Eigenschaft userFunc die Methode main() in der eingebundenen Klasse Ihres Frontend-Plugins aufgerufen. Abschließend wird dieses USER-Objekt über folgenden TypoScript-Code in das tt_content-Objekt eingebunden: tt_content.ext_key_pi1 = COA tt_content.ext_key_pi1 { 10 = < lib.stdheader 20 = < plugin.tx_extkey_pi1 }
Um nun TypoScript-Parameter an Ihr Plugin zu übergeben, können Sie diese Vorgabe erweitern, indem Sie zum Beispiel Folgendes angeben: plugin.tx_extkey_pi1 = USER plugin.tx_extkey_pi1 { userFunc = tx_extkey_pi1->main eigener_parameter = 1 }
Diese Parameter können Sie über den Parameter $conf in Ihrem Skript auswerten, wenn Sie ihn über $conf['eigener_parameter'] ansprechen.
Siehe auch
Max. Linie
Eine vollständige Liste der vorhandenen Tabellenfelder ermitteln Sie über das Modul Konfiguration. Rezept 1.5 beschäftigt sich ausführlich mit der Handhabung dieses Moduls. Wenn Sie neue Felder für Ihr Inhaltselement benötigen, sollten Sie die Rezepte 16.3 und 19.2 lesen. Über den $conf-Parameter können Sie auch komplexere TypoScript-Angaben an Ihr Skript übergeben, die Sie dann mit dem cObj-Objekt auswerten können. Dadurch
714 | Kapitel 16: Extensions kickstarten und ausarbeiten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
können Sie Ihr Inhaltselement noch bequemer erweitern und auf vorhandene Inhaltselemente zurückgreifen. In Rezept 18.1 erfahren Sie, wie Sie damit Ihr Inhaltselement weiter ausbauen können.
16.5 Neue Überschriftentypen integrieren Problem Sie möchten die Auswahlliste für Überschriftentypen um einen neuen, eigenen Eintrag erweitern, beispielsweise wenn Ihnen die vorgegebenen Werte nicht ausreichen oder Sie eine ganz neue Überschrift mit unterschiedlichem Layout für die gleiche Hierarchie benötigen.
Lösung
Lizensiert für Markus Mueller
Erstellen Sie eine neue Extension (in Rezept 16.2 finden Sie dazu die nötigen Hilfestellungen). Fügen Sie anschließend über das Plussymbol Add item rechts neben dem Menüpunkt Frontend Plugins ein neues Frontend-Plugin hinzu. In dem Eingabefeld Enter a title for the plugin vergeben Sie die Bezeichnung für Ihre Überschrift. Dieser Wert erscheint später in der Auswahlliste für die Überschriftenlayouts. Wählen Sie abschließend die Option Add as a new header type. Standardmäßig wird die Überschrift nach dem ersten Aufruf im TYPO3-Cache gespeichert. Dies kann Nachteile haben, wenn Sie Ihre Überschrift zum Beispiel mit dynamischen Inhalten kombinieren möchten, etwa um die aktuelle Zeit sekundengenau anzuzeigen. In diesem Fall sollten Sie die Option USER cObjects are cached. Make it a noncached USER_INT instead aktivieren. Die Überschrift wird dann unabhängig von Ihren Cache-Einstellungen ausgegeben und bei jedem Seitenaufruf neu berechnet. Klicken Sie abschließend auf den Button View result und wählen Sie in der Auswahlliste Write to location die Option Local: ... Nachdem Sie Ihre Extension lokal gespeichert und aktiviert haben, steht Ihnen der neue Überschriftentyp in der Auswahlliste Typ in jedem Inhaltselement zur Verfügung. Zusätzlich zu dieser neuen Auswahlmöglichkeit wurde vom Kickstarter ein PHP-Skript erzeugt, über das der Inhalt des Felds Überschrift verarbeitet wird, wenn der entsprechende Typ gewählt wurde.
Max. Linie
Standardmäßig wird die Überschrift vom PHP-Skript von h1-Tags umschlossen und somit als Überschrift erster Ordnung angezeigt. Diese Standardausgabe ändern Sie nun, indem Sie die vom Kickstarter erzeugte PHP-Datei nach Ihren Wünschen anpassen. Wechseln Sie dazu in den Unterordner pi1 des neu erstellten Extension-Verzeichnisses. Dort finden Sie zwei Dateien: Die Datei mit dem Präfix class. beinhaltet die eigentliche Methode, mit der Sie die Inhaltsausgabe steuern können. Die zweite Datei mit dem Namen locallang.xml enthält Sprachwerte, die Sie in Ihrem Frontend-Plugin verwenden
16.5 Neue Überschriftentypen integrieren This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 715
Max. Linie
können. Öffnen Sie nun die Datei mit dem Präfix class. und passen Sie die Funktion main() Ihren Wünschen an.
Links
Diskussion Dadurch dass Sie Ihre Überschrift mit dem Kickstarter erstellt haben, wurden auch automatisch die nötigen Vorkehrungen getroffen, um Ihr Skript in der TypoScript-Engine zu registrieren. Wenn Sie Ihren neuen Überschriftentyp nun auswählen, wird der Inhalt des Eingabefelds an das PHP-Skript weitergeleitet, dort verarbeitet und wieder zurück an die TypoScript-Engine gegeben. In dem Skript können Sie den Feldinhalt mit weiteren PHPFunktionen bearbeiten oder mit HTML-Angaben nach Belieben anpassen. Beispielsweise können Sie den Tag mit einer bestimmten CSS-Klasse versehen, sodass Sie diese über Ihr CSS-Stylesheet direkt ansprechen können: class tx_extkey_pi1 extends tslib_pibase { function main($content,$conf) { return ' database <description>Beschreibung der Sprachdatei New Template Module Ein neues Template-Modul
Lizensiert für Markus Mueller
Die XML-Deklaration in der ersten Zeile verdeutlicht, dass sämtliche Sprachwerte im UTF8-Zeichensatz gespeichert werden. Achten Sie daher darauf, dass Sie die Texte auch im UTF-8-Zeichensatz abspeichern. Umgeben vom <meta>-Tag werden die Metadaten der Sprachdatei verwaltet. Anhand des Werts type kann die Datei einem bestimmten Kontext zugewiesen werden, in dem die Sprachdatei verwendet wird (diese Bereiche sind fest vorgegeben und beispielsweise wichtig für die Kategorisierung; sie sollten daher nicht nachträglich manuell geändert werden). Verwenden Sie in unserem Beispiel den Typ database. Anhand dieses Typs erkennt TYPO3, dass in dieser allgemeinen Sprachdatei Labels für Datenbankfelder gespeichert werden. Die Beschreibung der Sprachdatei im Tag <description> gibt Auskunft über den Verwendungszweck der Sprachwerte. Im Abschnitt werden die tatsächlichen Sprachwerte abgelegt. Über das Länderkürzel ermittelt TYPO3 die einzelnen Sprachwerte für die gewünschte Sprache. Mithilfe des eindeutigen Sprachschlüssels wird dann der jeweilige Sprachwert ausgelesen. Kombiniert mit dem Pfad zu der Sprachdatei, kann TYPO3 nun den jeweiligen Sprachwert systemweit eindeutig ermitteln.
Siehe auch Diese Sprachdateien lassen sich sehr komfortabel übersetzen. Die dafür nötigen Schritte werden in Rezept 20.4 erläutert. Um Ihre Seiteninhalte in unterschiedlichen Sprachen auszugeben, müssen Sie TYPO3 entsprechend konfigurieren. Rezept 9.4 führt Sie Schritt für Schritt durch diese Einstellungsmöglichkeiten. In Rezept 4.9 erfahren Sie, wie Sie mehrsprachige Inhalte komfortabel über das Backend eingeben können. Rezept 10.2 zeigt Ihnen, wie Sie auf eine ähnliche Art und Weise mehrsprachige Werte mit TypoScript auslesen. Um das Backend mehrsprachig einzustellen, müssen Sie möglicherweise weitere Sprachpakete installieren. In Rezept 15.10 erfahren Sie, wie Sie weitere Sprachpakete installieren.
Max. Linie
Max. Linie 17.7 Mehrsprachigkeit in eigenen Extensions unterstützen | 757 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
17.8 Datensätze in Workspaces versionierbar machen
Links
Problem Sie möchten sicherstellen, dass Ihre Datensätze versionierbar sind und über einen Workflow verwaltet werden können.
Lösung Aktivieren Sie beim Erzeugen Ihrer Tabellenstruktur im Kickstarter die Option Enable versioning. TYPO3 fügt dann alle nötigen Tabellenfelder und TCA-Einstellungen hinzu. Anschließend können Sie die Datensätze über die Workspace-Funktionen nutzen.
Diskussion Wenn Sie eine bestehende Datenbankstruktur haben, fügen Sie folgende Zeilen in die Datei ext_tables.sql Ihrer Extension ein:
Lizensiert für Markus Mueller
CREATE TABLE tabellen_name ( t3ver_oid int(11) DEFAULT '0' NOT NULL, t3ver_id int(11) DEFAULT '0' NOT NULL, t3ver_wsid int(11) DEFAULT '0' NOT NULL, t3ver_label varchar(30) DEFAULT '' NOT NULL, t3ver_state tinyint(4) DEFAULT '0' NOT NULL, t3ver_stage tinyint(4) DEFAULT '0' NOT NULL, t3ver_count int(11) DEFAULT '0' NOT NULL, t3ver_tstamp int(11) DEFAULT '0' NOT NULL, t3_origuid int(11) DEFAULT '0' NOT NULL KEY t3ver_oid (t3ver_oid,t3ver_wsid) )
Wechseln Sie nach dem Speichern in den Erweiterungs-Manager und öffnen Sie die Detailansicht Ihrer Extension, indem Sie auf den Extension-Titel klicken. TYPO3 wird Ihnen nun ein Update der Datenbankstruktur vorschlagen, das Sie mit einem Klick auf den Button Update bestätigen. Ihre Datenbanktabelle erfüllt nun alle Voraussetzungen für eine Versionierung. Im nächsten Schritt nehmen Sie die nötigen Einstellungen vor, damit TYPO3 die Versionierung auch ordnungsgemäß durchführt. Öffnen Sie dazu die Datei ext_tables.php und fügen Sie diese Zeile unterhalb der bestehenden TCA-Definitionen ein:
Max. Linie
// Versionierung aktivieren $TCA['tabellen_name']['ctrl']['versioningWS'] = true; $TCA['tabellen_name']['columns']['t3ver_label'] = array( 't3ver_label' => array( 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.versionLabel', 'config' => array(
758 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
'type' => 'input', 'size' => '30', 'max' => '30', ) ) );
Mit dem Wert versioningWS wird die Versionierung für die Tabelle in TYPO3 aktiviert. Im nächsten Schritt definieren Sie das Eingabefeld t3ver_label als Speicherort für Versionskommentare. Dadurch können die einzelnen Versionierungsschritte später kommentiert werden, wodurch die Änderungen für die Benutzer transparenter werden. Leeren Sie abschließend den Extension-Cache. Nachdem Sie diese Einstellungen vorgenommen haben, können Ihre Daten über Workspaces wie gewünscht versioniert werden.
Siehe auch Wenn Ihnen der Begriff »Workspace« völlig neu ist, sollten Sie vorher das Rezept 4.10 lesen. Darin werden die grundlegenden Eigenschaften eines Workspace erläutert. Eine vollständige Beschreibung der Datenbankfelder finden Sie bei den Erklärungen zum Begriff versioningWS auf der TYPO3-Website unter http://typo3.org/documentation/documentlibrary/core-documentation/doc_core_api/4.1.0/view/4/2/#id4055459. Lizensiert für Markus Mueller
17.9 IRRE für eigene Extensions nutzen Problem Sie wollen in Ihrer Extension Felder verwenden, mit denen der Nutzer später Verknüpfungen zu Einträgen anderer Tabellen der Datenbank herstellen kann. Außerdem sollen die verknüpften Datensätze direkt im Formular des Ausgangsdatensatzes zu bearbeiten sein, so wie wir es in Rezept 5.14 beschrieben haben. Kurz gesagt: Sie wollen IRRE in Ihren eigenen Extension nutzen.
Lösung
Max. Linie
Erstellen Sie entweder manuell oder mit dem Kickstarter die nötigen Dateien für Ihre Extension. Für den Fall, dass Sie den Kickstarter verwenden wollen, sollten Sie als Feldtyp zunächst den Typ Database Relation wählen. Weil der für IRRE benötigte Subtyp inline dort noch nicht zur Verfügung steht, können Sie nun entweder eine Selectorbox oder Field with element browser verwenden. Letzteres erzeugt ein Feld vom Typ group, während die vier Varianten der Selectorbox den Typ select anlegen. Beide Typen verhalten sich ähnlich wie inline, was die Datenbankverknüpfung selbst angeht. Jedoch erzeugt nur inline die gewünschte Ajax-Funktionalität.
17.9 IRRE für eigene Extensions nutzen | 759 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Editieren Sie nun den Code der Datei tca.php im Hauptverzeichnis Ihrer Extension und ändern Sie den Feldtyp des gewünschten Felds auf inline. Fügen Sie je nach Bedarf weitere Parameter hinzu, um das Verhalten der Inline-Formulare zu beeinflussen, und speichern Sie die Datei danach.
Links
Bei IRRE handelt es sich um eine Lösung, die prinzipbedingt von verknüpften Datensätzen ausgeht. Sie sollten daher nur für solche Felder, die mithilfe einer Verknüpfung auf andere Datensätze zugreifen, versuchen, sie auf IRRE umzustellen.
Ein grundlegender Code, um ein Feld mit IRRE-Eigenschaften auszustatten, könnte zum Beispiel so aussehen: 'meinfeldname' => array( 'exclude' => 1, 'label' => 'LLL:EXT:meineextension/locallang_db.xml:meinfeldname', 'config' => array( 'type' => 'inline', 'foreign_table' => 'eine_andere_tabelle' ) ), Lizensiert für Markus Mueller
Klicken Sie nun im Backend auf das Cache-Icon und wählen Sie Alle Caches löschen. Sie sollten jetzt sehen können, dass für das Feld meinfeldname bereits die IRRE-Funktionen genutzt werden, um das Backend-Formular aufzubauen. Im Prinzip ist dabei die Vorgehensweise identisch mit dem Feldtyp select. Es wird eine Liste kommaseparierter Werte in das Datenbankfeld eingetragen. Der Vorteil der IRRE-Verknüpfung ist jedoch bereits in diesem einfachen Ansatz vorhanden: Sie brauchen die Einträge nicht mehr vorher einzeln und separat anzulegen, um sie verknüpfen zu können. Erzeugung und nachfolgende Verknüpfung des Datensatzes werden parallel über Ajax-Aufrufe direkt aus dem IRREFormular angesteuert.
Diskussion Seit Version 4.1 verfügt TYPO3 über eine neuartige Methode, ein oder mehrere miteinander verknüpfte Datensätze im selben Backend-Formular zu editieren. Weil in diesem Fall die Datensätze nicht separat, sondern in Reihe geschaltet – englisch inline – bearbeitet werden können, nennt sich diese Methode folglich Inline Relational Record Editing. Die Kurzform setzt sich dabei aus den Anfangsbuchstaben zusammen und lautet IRRE. Mithilfe von IRRE lassen sich die verknüpften Datensätze wesentlich komfortabler editieren. Lesen Sie hierzu bei Bedarf das Rezept 5.14, in dem wir Ihnen kurz erklären, welche zusätzlichen Features durch den Einsatz von IRRE in Backend-Formularen zur Verfügung stehen.
Max. Linie
Da IRRE bisher in keinem der Felder genutzt wird, die nach einer TYPO3-Installation per Default zur Verfügung stehen, müssen Sie zunächst auf die Hilfe einer Extension zurück-
760 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
greifen, um die neuen Funktionen verwenden zu können. Sie können dabei eigene Felder mit IRRE-Verknüpfungen hinzufügen oder bereits bestehende Felder vom Typ group oder select umdefinieren. Maßgeblich ist lediglich, dass diese Felder auf eine sogenannte foreign table zugreifen müssen, damit sie auf IRRE umgestellt werden können. Setzen Sie diesen Feldtyp dennoch sparsam ein, denn mit jedem zusätzlichen Datensatz, der inline angezeigt werden muss, steigt die Gesamtdatenmenge, die benötigt wird, bis ein Formular vollständig geladen ist. Speziell bei Datensätzen mit RTE-Feldern ist die Wartezeit teilweise nicht unerheblich. Schränken Sie daher gegebenenfalls die maximal zulässige Zahl von Verknüpfungen entsprechend ein!
Wie Sie bereits in dem einfachen Beispielcode, den wir Ihnen in der Lösung gezeigt haben, sehen können, reichen ein paar grundlegende Informationen aus, um mit IRRE arbeiten zu können. Wirklich interessant wird der Einsatz aber erst durch einige zusätzliche Parameter, die zusammen mit IRRE eingeführt wurden und nur für den Typ inline, nicht aber für die bisherigen Typen select und group zur Verfügung stehen. Im Folgenden beschreiben wir die einzelnen Parameter genauer und zeigen Ihnen einige Beispiele für ihren Einsatz. Lizensiert für Markus Mueller
Verknüpfungsparameter Zunächst gibt es einige Parameter, die sich mit der eigentlichen Verknüpfung der jeweiligen Tabellen und Datensätze beschäftigen. foreign_table Dieser Parameter ist zwingend notwendig, denn ohne eine weitere Tabelle der Datenbank gäbe es keine Verknüpfung, also auch kein IRRE. Für einen Datensatz eines Hotels wäre die foreign_table z.B. die Tabelle angebote, um ein Hotel mit entsprechenden Angeboten für die Gäste verknüpfen zu können. foreign_field In diesem Feld der fremden Tabelle wird die ID des Elternelements abgespeichert, es sei denn, Sie benutzen echte MM-Verknüpfungen. Dann befindet sich in diesem Feld lediglich die Gesamtanzahl aller Verknüpfungen mit diesem Element. Letzteres spart aufwendige MySQL-Abfragen, um die Anzahl aus der Verknüpfungstabelle zu ermitteln. Um beim Beispiel der Hotels zu bleiben, könnten Sie hier für jedes Angebot feststellen, ob es gerade für ein Hotel zur Verfügung steht und, wenn ja, für welches.
Max. Linie
foreign_label Mit diesem Parameter können Sie das Feld festlegen, das für die Darstellung innerhalb des IRRE-Formulars den Titel liefern soll. Wenn Sie es nicht explizit angeben, wird stattdessen das Feld verwendet, das bereits in der TCA-Definition der verknüpften Tabelle festgelegt wurde. Verwenden Sie es daher nur, wenn Sie ein davon abweichendes Label benötigen. Im Fall von Hotels und Angeboten wäre es z.B. sinnvoll,
17.9 IRRE für eigene Extensions nutzen | 761 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
hier eine bestimmte interne Angebotsnummer zu verwenden, während der Titel des Angebots selbst aus einem anderen Feld bezogen wird.
Links
foreign_selector Wenn die fremde Tabelle ihrerseits über ein Datenbankfeld vom Typ select verfügt, um Verknüpfungen zu den Elternelementen zu erzeugen, können Sie dieses hier angeben, um eine Liste aller möglichen Kindelemente zu erzeugen. Diese können dann direkt in einer Mehrfachauswahlbox angeklickt werden. Die Auswahl der möglichen Einträge funktioniert hier sozusagen rückwärts. Es wird überprüft, ob bereits eine Zuordnung zu einem Hotel vorgenommen wurde und ob weitere zulässig sind. foreign_sortby und foreign_default_sortby Mit diesen beiden Parametern wird das Sortierverhalten der verknüpften Einträge innerhalb der Liste von verknüpften Einträgen bestimmt. Geben Sie hier bei Bedarf entsprechende Feldnamen an, die zum Sortieren verwendet werden sollen. Sinnvollerweise könnte hier z.B. für foreign_default_sortby das Feld genommen werden, das Sie für foreign_label verwendet haben. Für foreign_sortby kommt eher ein eigenes meine_sortierung-Feld infrage, weil darin ähnliche Zahlenwerte abgespeichert werden wie beim sorting-Feld, das Sie bereits aus den Tabellen pages oder tt_content kennen. Diese können aber von der Sortierung innerhalb des Containers, in dem sich die Einträge befinden, abweichen. Lizensiert für Markus Mueller
foreign_table_field Im Gegensatz zum Parameter foreign_field wird in dem Feld, das Sie hier angeben, keine id oder Verknüpfungsanzahl gespeichert, sondern der Tabellenname der gewählten Elterntabelle. Auf diese Weise lässt sich ein Kindelement nach dem Prinzip der schwachen Entität mit Elementen aus verschiedenen Elterntabellen verknüpfen. Es werden also immer mindestens zwei Informationen benötigt, um die Verknüpfung zweifelfsfrei ermitteln zu können. Im Fall der Angebote ergibt dies durchaus Sinn, denn es könnten ja auch Ferienanlagen, Pensionen und einzelne Häuser mit Angeboten verknüpft werden und nicht nur Hotels. foreign_unique Hier können Sie wiederum einen Feldnamen angeben. Dieses Feld muss einen Wert haben, der innerhalb aller Kindelemente nur ein einziges Mal vorkommen darf. Wenn Sie z.B. ein Hotel mit einer Anzahl von Angeboten verknüpfen, darf jedes Angebot selbstverständlich nur ein einziges Mal pro Hotel vorkommen. MM
Max. Linie
Wie bereits erwähnt, können Sie für die Verknüpfung auch eine MM-Tabelle verwenden, so wie es bereits für die Feldtypen select oder group möglich ist. Im inlineFeld selbst wird dann nur noch die Anzahl der Verknüpfungen gespeichert und nicht mehr die ids der verknüpften Einträge. Sie benötigen in dieser Tabelle mindestens die Felder uid_local und uid_foreign, und es wäre empfehlenswert, auch ein sorting-Feld zu verwenden, damit die Einträge sortiert werden können.
762 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Wenn Sie MM-Tabellen verwenden, können Sie darin nur die Verknüpfungen selbst speichern und verzichten damit auf die fortgeschrittenen Features von IRRE, die es ermöglichen, auch die Einträge in den Verknüpfungstabellen selbst mit weiteren Informationen und Attributen zu versehen und im Backend sichtbar zu machen!
Wir erweitern nun den Beispielcode ein wenig und fügen einige der bisher aufgeführten Parameter hinzu: 'meinfeldname' => array( 'exclude' => 1, 'label' => 'LLL:EXT:meineextension/locallang_db.xml:meinfeldname', 'config' => array( 'type' => 'inline', 'foreign_table' => 'mein_tabellenname', 'foreign_field' => 'mein_verknuepfungsfeld', 'foreign_label' => 'mein_labelfeld', 'foreign_default_sortby' => 'mein_labelfeld', 'foreign_sortby' => 'mein_sortierfeld', 'foreign_table_field' => 'mein_elterntabellenfeld', 'foreign_unique' => 'mein_titelfeld' ) ), Lizensiert für Markus Mueller
Damit dieses Beispiel funktionieren kann, müssen Sie selbstverständlich dafür sorgen, dass die genannten Felder in der Tabelle mein_tabellenname auch vorkommen. Wenn Sie allerdings bereits bestehende Tabellen mit den Datensätzen Ihrer Tabelle verknüpfen wollen, sollten Sie dennoch in der TCA-Definition so weit wie möglich auf ebenfalls bereits bestehende Felder dieser Tabelle zurückgreifen und nur im Notfall weitere Felder hinzufügen, um ein unnötiges Aufblähen der Tabellenstruktur zu verhindern.
Wenn Sie bis hierhin vor allem Parameter vorgefunden haben, die Sie vielleicht bereits von den Feldtypen select oder group her kennen, kommen wir nun zu den echten Neuerungen von IRRE. Bisherige Verknüpfungen mithilfe von MM-Tabellen fanden ausschließlich im Hintergrund statt. Als Backend-Benutzer hatten Sie lediglich Zugriff auf das Elternelement oder das Kindelement, nie aber auf die Verknüpfung selbst. Diese wurde lediglich in einer MM-Tabelle gespeichert und stand sonst für keinerlei Manipulationen seitens des Nutzers zur Verfügung. Zusätzliche Felder für die Anzeige von Informationen im Backend waren ebenfalls nicht vorgesehen.
Max. Linie
Der Feldtyp inline stellt seit TYPO3-Version 4.1 nun weitaus komfortablere Möglichkeiten zur Verfügung, indem nicht mit MM-Tabellen sondern mit sogenannten Intermediate-Tabellen gearbeitet wird, die ihrerseits über uid, pid, timestamp und andere Felder verfügen. Da diese Intermediate-Tabellen zusätzlich mit TCA-Definitionen ausgestattet sind, können die Einträge darin im Backend sichtbar gemacht und bearbeitet werden,
17.9 IRRE für eigene Extensions nutzen | 763 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
was ganz nebenbei auch noch die Möglichkeiten der Wiederherstellung von Zuständen sowie der Übersetzung und der Versionierung eröffnet.
Links
IRRE kennt also mehrere Prinzipien der Verknüpfung und setzt diese auf verschiedene Art und Weise um. Neben den bekannten Varianten 1:n und MM besteht nun die Möglichkeit, bidirektionale Verknüpfungen sowohl asymmetrisch als auch symmetrisch vorzunehmen. Eine asymmetrische Verknüpfung funktioniert dabei wie eine Eltern-KindBeziehung und greift dabei in der Regel auf verschiedene Tabellen zurück, während eine symmetrische Verknüpfung eine gleichberechtigte Ist-Partner-von-Beziehung zwischen zwei Datensätzen derselben Tabelle erzeugt. Für solche symmetrischen Beziehungen hält IRRE drei weitere Parameter bereit:
Parameter für symmetrische Verknüpfungen symmetric_field Dieser Parameter ist vom Verhalten her identisch mit dem bereits bekannten foreign_ field. Jedoch benötigt man für eine gleichberechtigte Beziehung immer zwei Elternteile. Innerhalb dieses Felds befinden sich daher Informationen über den zweiten.
Lizensiert für Markus Mueller
symmetric_label Es besteht die Möglichkeit, für den zweiten Elternteil auf ein anderes Feld der Tabelle zurückzugreifen, um das Label des Eintrags zu erzeugen, wenn man die Beziehung vom Kind aus betrachtet. Insgesamt ergeben sich so bis zu drei verschiedene Felder für das Label: eines, das per Default in der TCA-Definition der Tabelle selbst vorgesehen ist, eines für den ersten und eines für den zweiten Elternteil. symmetric_sortby Je nach Anwendungsfall ist es erforderlich, die einzelnen Einträge für die beiden Elternteile nach unterschiedlichen Kriterien zu sortieren. Mit diesem Parameter können Sie ein eigenes Sortierfeld für den zweiten Elternteil festlegen. Hier ein Beispiel für eine symmetrische Beziehung innerhalb der Tabelle meine_tabelle: 'meinfeldname' => array( 'exclude' => 1, 'label' => 'LLL:EXT:meineextension/locallang_db.xml:meinfeldname', 'config' => array( 'type' => 'inline', 'foreign_table' => 'intermediate_tabelle', 'foreign_field' => 'verknuepfungsfeld_1', 'foreign_sortby' => 'sortierfeld_1', 'symmetric_field' => 'verknuepfungsfeld_2', 'symmetric_sortby' => 'sortierfeld_2' ) ),
Max. Linie
Die TCA-Definition für die Tabelle intermediate_tabelle muss dann neben Feldern wie uid, pid usw. mindestens folgende Angaben enthalten: 'verknuepfungsfeld_1' => array( 'label' => 'Ein Label 1 hier',
764 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
'config' => array( 'type' => 'select', 'foreign_table' => 'meine_tabelle', 'maxitems' => 1, ) ), 'verknuepfungsfeld_2' => array( 'label' => 'Ein Label 2 hier', 'config' => array( 'type' => 'select', 'foreign_table' => 'meine_tabelle', 'maxitems' => 1, ) ), 'sortierfeld_1' => array( 'config' => array( 'type' => 'passthrough' ) ), 'sortierfeld_2' => array( 'config' => array( 'type' => 'passthrough' ) ),
Lizensiert für Markus Mueller
Auf diese Weise gibt es zwei verschiedene Eltern in der Haupttabelle, die gleichberechtigt – symmetric – auf ein gemeinsames Kind der Intermediate-Tabelle zugreifen. Beiden Seiten ist dabei die jeweils andere Seite bekannt: bidirectional. Bei genauerer Betrachtung werden Sie festgestellt haben, dass die Feldtypen für die beiden Verknüpfungsfelder selbst nicht vom Typ inline sind. Es handelt sich vielmehr um einfache select-Felder. Was bedeutet dies nun für das Bearbeiten der einzelnen Datensätze? Angeblich sollte man doch mithilfe von IRRE die einzelnen Datensätze direkt und zusammengefasst in einem einzigen Formular bearbeiten können! Im Prinzip ist dies auch in diesem Fall immer noch gegeben, denn wie bereits erwähnt sind die Datensätze der Intermediate-Tabelle ja selbst im Backend editierbar. Jedoch ist es oftmals nicht erwünscht, dass der Backend-Benutzer, der für die Verknüpfung von Datensätzen zuständig ist, sämtliche Daten daraus hinunter bis zur letzten Ebene verändern darf. Genau dies wird mit diesem Setup verhindert, denn es ermöglicht das direkte Erzeugen von Verknüpfungen in beliebiger Zahl – und dies innerhalb eines einzigen Datensatzes. Jedoch gibt es keine Möglichkeit, die verknüpften Datensätze selbst zu editieren.
Max. Linie
Diese Art der Intermediate-Tabelle wird also vor allem dort zum Einsatz kommen, wo verschiedene Benutzer für das Anlegen und das Verknüpfen von Datensätzen zuständig sind. Ein Beispiel ist eine Seminardatenbank mit zwei Zuständigkeitsbereichen: Im ersten Bereich werden z.B. die einzelnen Datensätze für Seminarinhalte, Dozenten und Räumlichkeiten angelegt. Im zweiten Zuständigkeitsbereich werden daraus konkrete Seminare mit entsprechendem Datum erzeugt. Die Redakteure des zweiten Bereichs dürfen aber auf
17.9 IRRE für eigene Extensions nutzen | 765 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
keinen Fall die Daten der zu verknüpfenden Datensätze ändern. Sie können daher lediglich Datensätze der Intermediate-Tabelle anlegen und diese nachher mit einem Seminar verknüpfen. Deswegen darf die Intermediate-Tabelle selbst lediglich mit dem Typ select ausgestattet sein.
Links
Parameter für das optische Verhalten Der Vollständigkeit halber folgt nun eine Liste der IRRE-Parameter, mit deren Hilfe Sie das Aussehen und Verhalten der IRRE-Felder innerhalb des Backend-Formulars beeinflussen können. Hauptsächlich geschieht dies innerhalb des Parameters appearance mit den darin enthaltenen Unterparametern. collapseAll Hierbei handelt es sich um einen einfachen Schalter. Setzen Sie ihn auf true bzw. 1, werden die Kindelemente beim Öffnen des Formulars zusammengeklappt angezeigt. Für den Fall, dass Sie ihn auf false oder 0 setzen, ist das Gegenteil der Fall, und alle Elemente werden aufgeklappt dargestellt. Empfehlenswert ist aus Gründen des besseren Überblicks eher die zusammengeklappte Darstellung.
Lizensiert für Markus Mueller
expandSingle Dies ist ebenfalls ein Schalter, der für das Umschalten zwischen zwei Kindelementen zuständig ist. Setzen Sie ihn auf true bzw. 1, wird ein bereits geöffnetes Kindelement wieder zusammengeklappt, wenn Sie ein anderes öffnen. Andernfalls würden die Elemente nur nach entsprechender manueller Anforderung wieder zusammengeklappt. Empfehlenswert ist auch hier eher, den Schalter auf 1 zu setzen, weil der Fokus dann eher auf dem aktuell zu bearbeitenden Element verweilen kann. newRecordLinkAddTitle Ein weiterer Schalter, mit dessen Hilfe Sie den Titel der jeweils passenden Tabelle zum Link Create New hinzufügen können. Bei aktiviertem Schalter stünde dann dort z.B. Create New Address. newRecordLinkPosition Hier können Sie einen der Strings top, bottom, both oder none eingeben, um zu bestimmen, an welcher Stelle der Link Create New relativ zu den bereits vorhandenen Kindelementen erscheinen soll. Die Default-Einstellung ist top, jedoch ist es durchaus sinnvoll, sowohl oberhalb als auch unterhalb der Liste einen solchen Link zur Verfügung zu haben, speziell dann, wenn die Liste sehr lang geworden sein sollte. In diesem Fall sollten Sie both verwenden. useCombination Da dieser Schalter sich vor allem für die fortgeschrittene Variante der IntermediateTabellen eignet, die unter anderem auch mit sogenannten Attributen arbeitet, empfehlen wir Ihnen hierzu das nächste Rezept zu lesen.
Max. Linie
useSortable Mit diesem Schalter aktivieren Sie eine Sortiermöglichkeit mithilfe der Drag-andDrop-Funktionen der script.aculo.us.Bibliothek.
766 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Auswahlboxen beschränken Zu guter Letzt noch ein paar Parameter für die Beschränkung von Auswahlboxen eines inline-Felds. size Dieser Parameter dient dazu, die Höhe der Auswahlbox in Zeilen festzulegen. autoSizeMax Dieser Parameter dient ebenfalls dazu, die Höhe der Auswahlbox in Zeilen festzulegen. Jedoch wird hier die Größe der Auswahlbox zunächst so lange der darin enthaltenen Anzahl an Einträgen angepasst, bis die hier angegebene maximale Zeilenzahl erreicht ist. maxitems bzw. minitems Mit diesen Parametern können Sie festlegen, wie viele Einträge innerhalb des inlineFeldes maximal bezw. minimal zulässig sind. Ein empfehlenswertes Setup für ein symmetrisches inline-Feld sieht demzufolge so aus:
Lizensiert für Markus Mueller
'meinfeldname' => array( 'exclude' => 1, 'label' => 'LLL:EXT:meineextension/locallang_db.xml:meinfeldname', 'config' => array( 'type' => 'inline', 'foreign_table' => 'intermediate_tabelle', 'foreign_field' => 'verknuepfungsfeld_1', 'foreign_sortby' => 'sortierfeld_1', 'symmetric_field' => 'verknuepfungsfeld_2', 'symmetric_sortby' => 'sortierfeld_2', 'appearance' => array( 'collapse' => true, 'expandSingle' => true, 'newRecordLinkAddTitle' => true, 'newRecordLinkPosition' => 'both', 'useSortable' => true ), 'autoSizeMax' => 10, 'maxItems' => 10, 'minItems' => 1 ) ),
Siehe auch
Max. Linie
Wenn Sie wissen wollen, wie ein solches Setup für einen Backend-Benutzer aussehen wird, lesen Sie Rezept 5.14. Wenn Sie anstatt der gezeigten einfachen IntermediateTabelle lieber Tabellen über mehrere Ebenen editierbar miteinander verschachteln wollen, lesen Sie das folgende Rezept. Da IRRE im Rahmen einer Diplomarbeit entwickelt wurde, finden Sie ein ausführliches Tutorial zum Thema als Extension zum Download im TER. Der Extension-Key lautet irre_tutorial.
17.9 IRRE für eigene Extensions nutzen | 767 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
17.10 Tabellen mit IRRE über mehrere Ebenen verschachteln
Links
Problem Sie haben bereits erste Erfahrungen mit dem Prinzip des Inline Relational Record Editing – kurz IRRE – gemacht und dabei festgestellt, dass Ihnen eine inline-Verknüpfung allein nicht ausreicht, weil Ihre Datensätze über mehrere Tabellen und Ebenen miteinander verbunden sind. Sie wollen daher mehrere IRRE-Formulare ineinander verschachteln, um einen Hauptdatensatz und möglichst viele dazugehörige Datensätze gleichzeitig in einem BackendFormular zu editieren.
Lösung Genau genommen, gibt es zwei Lösungen für dieses Problem, von denen eine relativ einfach ist: Lizensiert für Markus Mueller
Ohne Intermediate-Tabellen Falls Sie IRRE ohne Intermediate-Tabellen nutzen, verwenden Sie einfach in jeder Tabelle, die Sie verknüpfen wollen, ein Feld vom Typ inline. Stellen Sie danach, wie bereits im vorigen Rezept 17.9 beschrieben, entsprechende Verknüpfungen mithilfe von foreign_table und foreign_field her. Die dabei entstehenden 1:n-Relationen werden mittels IRRE automatisch verschachtelt dargestellt. Untergeordnete Datensätze befinden sich beim Editieren somit immer im Formular des Elternelements. Für n Ebenen gibt es also n-mal je ein aufklappbares Formular im Formular pro Datensatz einer Ebene.
Mit Intermediate-Tabellen Komplizierter wird es, wenn Sie diese Möglichkeit mit Intermediate-Tabellen nutzen wollen, denn in diesem Fall würde üblicherweise kein verknüpfter Datensatz direkt bearbeitbar im Formular des Elternelements angezeigt, sondern nur die Verknüpfung selbst. Um die Sache zu vereinfachen, stellt IRRE hierfür den Schalter useCombination als Parameter für appearance zur Verfügung. In Verbindung mit einem foreign_selector können Sie dann sowohl die Verknüpfung selbst also auch die verknüpften Datensätze bearbeiten.
Max. Linie
'meinfeldname' => array( 'exclude' => 1, 'label' => 'LLL:EXT:meineextension/locallang_db.xml:meinfeldname', 'config' => array( 'type' => 'inline', 'foreign_selector' => 'mein_selectorfeld', /*...*/
768 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
'appearance' => array( 'useCombination' => 1, /*...*/ ) ) ),
Jedoch sollten Sie in beiden Fällen bedenken, dass jedes weitere inline-Formular, das Sie innerhalb des Backends darstellen wollen, mit einem gewissen Verlust an Gesamtperformance erkauft werden muss. Auch hier gilt also die Regel: Weniger ist manchmal mehr. Schließlich wird ein zu umfangreicher Wust an IRRE-Formularen auch schnell unübersichtlich.
Diskussion
Lizensiert für Markus Mueller
Je nach Anwendungsfall müssen Sie Datensätze aus mehreren Tabellen miteinander verschachtelt verknüpfen. Bleiben wir beim Beispiel einer Hotelkette, wie es auch innerhalb des IRRE-Tutorials gern benutzt wird: Stellen Sie sich z.B. eine Hotelkette vor, die mehrere Hotels betreibt, in denen verschiedene Anzahlen von Zimmern zur Verfügung stehen, die wiederum verschiedenen Kategorien zuzuordnen sind und außerdem in Kombination mit verschiedenen Verpflegungsarten verschiedene Preise aus einer Liste erhalten. Allein für die Grundlage dieses Szenarios benötigen Sie mindestens fünf Tabellen, wenn Sie die Verknüpfungen auf die althergebrachte Weise weitestgehend normalisieren wollen. Die Einträge hieraus jeweils einzeln editieren und verknüpfen zu müssen, wäre sehr aufwendig zu realisieren, was dafür spricht, hier IRRE einzusetzen. Im ersten Beispiel der Lösung verweisen wir auf das vorhergehende Rezept, in dem Sie eine Anleitung für eine hierarchische Verknüpfung nach dem 1:n-Prinzip erhalten. Jedoch wäre auch diese Variante hier abgesehen von der besseren Übersicht nicht wirklich hilfreich, weil mit fünf verschiedenen Tabellen immer noch zu viele Datensätze benötigt würden. IRRE bietet daher zunächst die Möglichkeit, auch bei Verwendung von IntermediateTabellen die verknüpften Datensätze so anzuzeigen, dass sie editierbar sind. Hierzu müssen Sie zwei Parameter miteinander kombinieren, die für diese Lösung zwingend notwendig sind. Das Ganze funktioniert nur, wenn Sie sowohl foreign_selector als auch die appearance-Eigenschaft useCombination setzen.
Max. Linie
'meinfeldname' => array( 'exclude' => 1, 'label' => 'LLL:EXT:meineextension/locallang_db.xml:meinfeldname', 'config' => array( 'type' => 'inline', 'foreign_selector' => 'mein_selectorfeld', /*...*/
17.10 Tabellen mit IRRE über mehrere Ebenen verschachteln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 769
'appearance' => array( 'useCombination' => 1, /*...*/ )
Links
) ),
Aber man würde IRRE nicht so nennen, wenn es nicht wirklich manchmal ein wenig irre wäre. Neben diesen Schaltern gibt es nämlich noch eine weitere Möglichkeit, zusätzliche Verknüpfungen an bereits bestehende anzuflanschen. Wie Sie sich vielleicht erinnern, sind Intermediate-Tabellen vollwertige TYPO3-Tabellen, die nicht wie MM-Tabellen nur der Verknüpfung von Datensätzen dienen, sondern über ein eigenes TCA-Setup verfügen. Das macht sie zum einen im Backend editierbar, zum anderen können Sie aber beliebig viele andere Felder hinzufügen, die im IRRE-Jargon als Attribute bezeichnet werden. Attribute dienen zunächst einmal nur dazu, die verknüpften Datensätze der IntermediateTabellen näher zu beschreiben. Wenn man zum Beispiel verschiedene Personen miteinander verknüpft, könnte man eine Selectbox hinzufügen, um die Verknüpfung mit Attributen wie ist Bruder von oder ist verheiratet mit zu beschreiben. Lizensiert für Markus Mueller
Max. Linie
'verknuepfungsfeld_1' => array( 'label' => 'Ein Label 1 hier', 'config' => array( 'type' => 'select', 'foreign_table' => 'meine_tabelle', 'maxitems' => 1, ) ), 'sortierfeld' => array( 'config' => array( 'type' => 'passthrough' ) ), 'beziehungsart' => array( 'config' => array( 'type' => 'select' 'items' => array( array('Ist Bruder von', '1'), array('Ist Schwester von', '2'), array('Ist Vater von', '3'), array('Ist Mutter von', '4’) ) ) ),
Beachten Sie bitte, dass es sich hier nur um einen Ausschnitt des TCA-Setups handelt, das natürlich die üblichen TYPO3-typischen Felder wie uid, pid, tstamp usw. aufweisen muss, um wirklich editierbar zu sein.
770 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Sie ahnen vermutlich schon, was als Nächstes kommen wird. Die logische Schlussfolgerung lautet nämlich: Wenn man Selectboxen hinzufügen kann, kann man auch weitere inline-Felder hinzufügen. Im Rahmen von Verwandschaftsverhältnissen ergibt das zwar weniger Sinn, weil es dort nur eine begrenzte Anzahl von Möglichkeiten gibt, die man nicht ständig beim Editieren der Verknüpfungen erweitern muss, aber für unser erstes Beispiel mit der Hotelkette wäre es durchaus hilfreich. Hier könnte man z.B. innerhalb der Intermediate-Tabelle Zimmer mit Kategorien verknüpfen und zusätzlich in einem weiteren IRRE-Feld aktuelle Verpflegungsangebote mit an die Verknüpfung binden. Mithilfe eines weiteren Textfelds bestünde dann die Möglichkeit, für genau diese Verknüpfung einen Preis einzugeben.
Lizensiert für Markus Mueller
'hotel' => array( 'label' => 'Hotel', 'config' => array( 'type' => 'select', 'foreign_table' => 'hotel_tabelle', 'maxitems' => 1, ) ), 'zimmerkategorie' => array( 'label' => 'Zimmerkategorie', 'config' => array( 'type' => 'select', 'foreign_table' => 'zimmer_tabelle', 'maxitems' => 1, ) ), 'hotelsortierung' => array( 'config' => array( 'type' => 'passthrough' ) ), 'kategoriesortierung' => array( 'config' => array( 'type' => 'passthrough' ) ), 'verpflegungsart' => array( 'config' => array( 'type' => 'inline', 'foreign_table' => 'verpflegungsart', ) ), 'preis' => array( 'config' => array( 'type' => 'text' ) ),
Max. Linie
Max. Linie 17.10 Tabellen mit IRRE über mehrere Ebenen verschachteln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 771
Wie Sie sehen, sind die Möglichkeiten, Verknüpfungen komfortabel zu editieren, mithilfe von IRRE deutlich verbessert worden. Experimentieren Sie einfach ein wenig, um herauszufinden, was IRRE Ihnen noch alles ermöglichen wird.
Links
Siehe auch Wenn Sie zunächst die Grundlagen des IRRE-Prinzips kennenlernen wollen, lesen Sie das vorhergehende Rezept. Wollen Sie wissen, wie ein solches Setup für einen BackendBenutzer aussehen wird, lesen Sie Rezept 5.14. Da IRRE im Rahmen einer Diplomarbeit entwickelt wurde, finden Sie ein ausführliches Tutorial zum Thema als Extension zum Download im TER. Der Extension-Key lautet irre_tutorial.
17.11 Kernfunktionen und Prozesse individuell anpassen Problem Sie möchten bestimmte Kernfunktionen, Klassen oder Prozesse in TYPO3 individuell anpassen, ohne direkt Änderungen im Code vorzunehmen. Dabei möchten Sie sicherstellen, dass Ihre Anpassungen bei einer Aktualisierung der TYPO3-Version bestehen bleiben. Lizensiert für Markus Mueller
Lösung Um Kernfunktionen in TYPO3 zu erweitern, gibt es zwei Lösungansätze: Erweitern Sie PHP-Klassen der TYPO3-API über den sogenannten XClass-Mechanismus oder nutzen Sie bestehende Hooks im Quellcode, um Prozesse über eigene Skripten zu manipulieren und eigene Funktionen zu implementieren. Für das Verständnis des XClass-Mechanismus sind Basiskenntnisse in objektorientierter Programmierung notwendig, um die zugrunde liegenden Mechanismen zu verstehen. Bei Hooks ist es wichtig, dass Sie mit den internen Prozessen von TYPO3 vertraut sind und die Datei- und Klassenstruktur kennen. Nutzen Sie die XClass-Methode ... ... wenn Sie konkrete PHP-Klassen bzw. Kernfunktionen von TYPO3 erweitern möchten und die Hoheit über den Quellcode bzw. Ihre TYPO3-Instanz haben, also ganz genau wissen, welche XClasses in welcher Reihenfolge vorgenommen werden. Statische Klassen, wie z.B. class.t3lib_div.php, können prinzipiell nicht über den XClass-Mechanismus erweitert werden (in solchen Dateien/Klassen stehen Ihnen jedoch an vielen Stellen wiederum Hooks zur Verfügung). Folgende statische Klassen können Sie nicht über den XClass-Mechanismus anpassen:
Max. Linie
Max. Linie 772 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
t3lib_div() t3lib_extMgm() t3lib_BEfunc()
Die Klassen t3lib_div() und t3lib_BEfunc() stellen Hooks bereit, mit denen Sie das Verhalten mancher Methoden anpassen können. Die Klasse t3lib_extMgm() bietet keine Hooks. Besonders wichtig ist, dass der XClass-Mechanismus nur einmal auf eine Klasse angewendet werden kann. Es kann daher leicht zu ungewollten Nebeneffekten kommen, die Sie nicht oder nur schwer abfangen können. Ebenso kann sich in einer neuen TYPO3-Version die zugrunde liegende Klasse so ändern, dass Ihre XClassAnpassung unnötig oder fehlerhaft wird. Vermeiden Sie aus diesem Grund XClassing, wenn Sie Ihre Extension im TYPO3 Extension Repository veröffentlichen möchten. Sie haben wenig Kontrolle darüber, ob andere Extensions ebenfalls die Klasse über XClassing erweitern und es dadurch beim Endbenutzer zu Schwierigkeiten kommt.
Lizensiert für Markus Mueller
Weisen Sie im Handbuch Ihrer Extension deutlich darauf hin, dass Sie TYPO3-Klassen mit XClass erweitern. Wenn Ihnen Nebeneffekte mit anderen Extensions oder TYPO3-Versionen bekannt sind, können Sie in Ihrer Extension festlegen, dass diese Extensions nicht zusammen mit Ihrer Extension installiert werden dürfen und eine bestimmte TYPO3-Version verwendet werden muss (das dazu nötige Hintergrundwissen erhalten Sie in Rezept 16.9). Wie Sie XClasses für Ihre Zwecke einsetzen, wird detailliert in Rezept 17.12 beschrieben. Nutzen Sie Hooks ... ... um eigene Funktionalitäten in TYPO3-Prozesse zu integrieren. Hooks sind besondere Stellen im Quellcode von TYPO3, die an zahlreichen Stellen im Quellcode von TYPO3 von den Entwicklern angebracht wurden. Dort können Sie sich mit eigenen Funktionen einhängen und Einfluss auf die Verarbeitung der Daten nehmen. Hooks sind vom Codeumfang im Gegensatz zur XClass-Methode meistens schlanker, als würden Sie den Code von bestehenden Klassen dublizieren, nur um eine kleine Änderung vorzunehmen. In Rezept 17.13 erfahren Sie mehr über den Aufbau und erhalten Anwendungsbeispiele von Hooks. Sie können mit beiden Methoden mit nur wenigen Zeilen Code wesentliche Funktionen von TYPO3 an Ihre eigenen Anforderungen anpassen und erweitern. Dadurch dass der Code in einer Extension gekapselt ist, haben Sie die größtmögliche Sicherheit, dass Ihre Änderungen bei einem Update erhalten bleiben und weiterhin funktionieren.
Max. Linie
Max. Linie 17.11 Kernfunktionen und Prozesse individuell anpassen | 773 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Diskussion
Links
Bei der Entwicklung von TYPO3 wurde von Beginn an sehr viel Wert auf die Erweiterbarkeit des Codes gelegt. Zwar kann der Code an manchen Stellen nicht mit den weitaus mächtigeren objektorientierten Vererbungsmechanismen von PHP 5 mithalten, dennoch gibt es viele Mechanismen, die Erweiterungen sehr leicht machen. Direkte Änderungen am Code im TYPO3-Kern sollten Sie unter allen Umständen vermeiden. Diese erweisen sich erfahrungsgemäß spätestens beim nächsten Update der TYPO3Version als schwer handhabbar und müssen sorgfältig und genau dokumentiert werden. Wenn Sie dennoch Änderungen am TYPO3-Kern vornehmen, sollten Sie diese Änderungen protokollieren und in der Core-Liste zur Diskussion stellen. Möglicherweise sind Ihre Änderungen auch für andere Entwickler hilfreich und können in den Kern zurückfließen. Wenn Sie der Meinung sind, dass Ihre Änderung an der Klasse absolute Berechtigung hat, sollten Sie Ihren Vorschlag mit anderen Entwicklern diskutieren, sodass die Änderung eventuell sogar in den TYPO3-Kern aufgenommen werden kann. Das Rezept 20.5 gibt Ihnen Tipps an die Hand, um Ihre Änderungswünsche und Vorschläge an der richtigen Stelle anzubringen. Lizensiert für Markus Mueller
Siehe auch Es ist von großem Vorteil, wenn Sie eine genaue Vorstellung vom Aufbau von TYPO3 haben und wissen, wo Sie Änderungen für welchen Zweck anbringen können. Lesen Sie hierzu Rezept 1.4, um sich einen Überblick zu verschaffen. In Rezept 17.2 gehen wir näher auf die Verwendung von XClass-Techniken ein. In Rezept 17.3 behandeln wir detaillierter die Verwendung von Hooks. Die wichtigsten Punkte werden dort noch mal wiederholt und eingehender besprochen.
17.12 TYPO3-Klassen mit XClass erweitern Problem Sie möchten eine bestehende PHP-Klasse von TYPO3 individuell anpassen, ohne den Code der jeweiligen Datei direkt zu modifizieren. Dabei möchten Sie sicherstellen, dass Ihre Anpassungen bei einer Aktualisierung der TYPO3-Version bestehen bleiben.
Lösung Überlagern Sie PHP-Klassen objektorientiert über den sogenannten XClass-Mechanismus.
Max. Linie
Um XClasses zu erstellen, hat sich in der Praxis dieses Vorgehen bewährt:
774 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
1. Prüfen Sie, ob die gewünschte Klasse den XClass-Mechanisums unterstützt. Kontrollieren Sie dazu in der gewünschten Datei, ob folgende Zeilen vorhanden sind: if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['dateipfad']) { include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['dateipfad']); }
Nur wenn diese Zeilen in der Datei vorhanden sind, können Sie die Klasse überhaupt über den XClass-Mechanismus erweitern. Diese Codezeilen werden in der Diskussion näher erläutert. 2. Kopieren Sie sich aus diesem Code die folgende hervorgehobene Variable in die Zwischenablage: if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['dateipfad']) { include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['dateipfad']); }
Lizensiert für Markus Mueller
Der Dateipfad muss vollständig übernommen werden. Er stellt den Schlüsselwert dar, anhand dessen Sie später Ihre eigene UX-Klasse einbinden werden. 3. Legen Sie eine eigene Extension an, in der Sie alle Einstellungen vornehmen und die PHP-Datei ablegen. 4. Legen Sie eine PHP-Datei an, die nach dem folgenden Muster benannt ist: class.ux_klassen_name.php
Besonders wichtig ist hierbei, dass Sie das Präfix ux_ und den exakten Namen der Klasse angeben, die Sie erweitern möchten. 5. Legen Sie nun das Grundgerüst für Ihre Extension-Klasse an und geben Sie diesen Code in die Datei ein: class ux_klassen_name extends klassen_name { // Überschreiben und erweitern Sie hier die bestehenden Methoden. }
6. Passen Sie die im vorherigen Beispielcode hervorgehobenen Werte an Ihre Wünsche an. Der Klassenname besteht aus dem Präfix ux_ und dem Namen der Klasse, die Sie mit dem Befehl extends erweitern. Die exakte Benennung der Klasse ist für die Verwendung des XClass-Mechanismus essenziell wichtig. Der Name Ihrer neuen Klasse muss sich aus dem Präfix ux_ und dem ursprünglichen Klassennamen ableiten, da TYPO3 die Klasse nach einer fest vorgegebenen Konvention auflöst. 7. Implementieren Sie nun in dieser Klasse Ihre gewünschte Funktionalität.
Max. Linie
8. Registrieren Sie anschließend Ihre neue Klasse in TYPO3. Öffnen Sie dazu die Datei ext_tables.php und fügen Sie den Inhalt Ihrer Zwischenablage ein. Weisen Sie dieser Variablen den Pfad zur eben angelegten UX-Datei zu. Letztendlich sollte die Codezeile nach diesem Muster aufgebaut sein: $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['dateipfad'] = 'EXT:ext_key/ux_class_datei.php';
17.12 TYPO3-Klassen mit XClass erweitern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 775
Max. Linie
Hier geben Sie mit dem Marker EXT: den Pfad zur Extension mit dem Key ext_key an. TYPO3 übersetzt dann den Pfad zum jeweiligen Extension-Verzeichnis automatisch. 9. Speichern Sie nun alle Dateien ab und leeren Sie den Extension-Cache. Erst danach werden Ihre Änderungen wirksam.
Links
10. Testen Sie abschließend die geänderte Funktionalität der Klasse. So können Sie mit nur wenigen Zeilen Code die wesentlichen Funktionen von TYPO3 an eigene Anforderungen anpassen und erweitern. Dadurch, dass Sie den Code in eigene Extensions gekapselt haben, erreichen Sie die größtmögliche Sicherheit dahingehend, dass Ihre Änderungen bei einem Update erhalten bleiben und funktionieren.
Diskussion
Lizensiert für Markus Mueller
Der Name XClass kommt vom englischen Begriff crossing, also überschneiden. Der XClass-Mechanismus erlaubt Ihnen, bestimmte PHP-Klassen, die diesen Mechanismus unterstützen, über den PHP-Befehl extends zu erweitern. Dadurch wird die ursprüngliche Klasse an Ihre neue Klasse vererbt. Der Dreh- und Angelpunkt der XClass-Methode ist nun, dass die Objekte dieser Klasse nicht über den PHP-Befehl new klassen_name erzeugt werden, sondern über die API-Methode t3lib_div::makeInstance('klassen_name'). Diese Methode stellt den wesentlichen Mechanismus für die XClass-Funktionalität bereit. Sie prüft, ob XClass-Klassen für die gewünschte Klasse vorliegen, und gibt in dem Fall das Objekt der erweiterten Klasse zurück. Ansonsten instantiiert die Funktion das Objekt von der regulären Klasse. Nutzen Sie daher stets die Methode t3lib_div::makeInstance(), wenn Sie in Ihrem Code Objekte erzeugen möchten. Dadurch stellen Sie sicher, dass Sie in Ihrem Code immer die richtige Klasse verwenden. Neben dem korrekten Instantiieren der Klasse muss auch sichergestellt werden, dass die nötige XClass-Datei eingebunden wird, damit die erweiterte Klasse auch angesprochen werden kann. Genau aus diesem Grund speichern Sie den Dateipfad im Namensraum der globalen Variablen $TYPO3_CONF_VARS ab: $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['dateipfad_klasse'] = 'dateipfad_ux_class';
Der erste Schlüsselwert TYPO3_MODE legt fest, in welchem Bereich bzw. TYPO3-Modus die XClass aktiviert wird. Zur Verfügung stehen die Werte BE und FE. Standardmäßig wird dieser Wert mit der Konstanten TYPO3_MODE festgelegt. Das bedeutet, der Wert wird von TYPO3 dynamisch an die aktuelle Umgebung angepasst, und das Skript wird immer eingebunden – egal ob das Skript im Backend oder Frontend aufgerufen wird.
Max. Linie
In manchen Fällen benötigen Sie die Änderung jedoch nur im Backend beziehungsweise nur im Frontend. Sie können Ihre Änderung leicht auf einen Bereich beschränken, indem Sie die Kontante TYPO3_MODE in dieser Zeile auf den konkreten Wert FE oder BE setzen. $TYPO3_CONF_VARS['BE']['XCLASS']['dateipfad'] = 'dateipfad_ux_class';
776 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Wenn Sie Ihre Änderungen nur bei der Ausgabe im Frontend vornehmen möchten, sollten Sie den Schlüssel BE auf FE ändern: $TYPO3_CONF_VARS['FE']['XCLASS']['dateipfad'] = 'pfad_zur_ux_class_datei';
Somit können Sie festlegen, in welchem TYPO3-Modul die XClass akiviert wird. Der zweite Wert XCLASS legt nur den Namensraum für XClass-Skripten fest. An diesem Wert sollten Sie niemals Änderungen vornehmen. Der dritte Schlüsselwert ist der Pfad zur PHP-Datei, die erweitert werden soll. Da der Pfad zur Datei eindeutig ist, ist auch dieser Schlüsselwert eindeutig. Anhand des Dateipfads erhalten Sie einen eindeutigen Schlüsselwert, der auf eine Datei zeigt. Hierdurch erkennt TYPO3 dann, ob eine XClass-Datei vorliegt, und bindet diese bei Bedarf nach dem PHP-Code der urspünglichen Klasse ein. Dadurch ist sichergestellt, dass die ursprüngliche PHP-Klasse korrekt von der XClass erweitert werden kann: if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['dateipfad']) { include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['dateipfad']); }
Lizensiert für Markus Mueller
Diese Codezeilen sind nach folgendem Muster aufgebaut: Die erste Bedingung prüft, ob die Konstante TYPO3_MODE gesetzt ist. Diese Konstante kann den Wert FE oder BE haben. Über diese Konstante können Sie entscheiden, in welchem TYPO3-Modus Ihre Anpassung aktiv wird. Die zweite Bedingung prüft, ob für die Variable ein Wert gesetzt wurde: $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['dateipfad']
Hier wird der Pfad zu der PHP-Datei erwartet, die die UX-Klasse beinhaltet. Der Pfad wird dann in der zweiten Zeile über den PHP-Befehl include_once() eingebunden, sodass die UX-Klasse dem PHP-Parser zur Verfügung steht (den Wert dieser Variablen definieren Sie am Ende dieses Beispiels in der Datei ext_tables.php). Daher können Sie die ursprüngliche Klasse auch nur dann über den XClass-Mechanismus erweitern, wenn diese Zeile vorliegt. Die zahlreichen Möglichkeiten des XClass-Mechanismus bieten leider auch Stolperfallen. Zum Beispiel kann der XClass-Mechanismus nur einmal auf eine Klasse angewendet werden. Liegen mehrere XClasses für eine Klasse vor, verwendet TYPO3 die zuletzt in der Datei ext_tables.php registrierte XClass.
Max. Linie
Wenn Sie nun zum Beispiel Funktionen aus der ersten XClass in anderen Extensions erwarten und diese durch die zweite XClass nicht bereitgestellt werden, kann es sehr schnell zu Nebeneffekten kommen. Es kann daher passieren, dass auf der Zielplattform des Benutzers mehrere XClass-Klassen dieselbe Klasse erweitern und er dadurch ein anderes Ergebnis erhält als erwartet. Ebenso kann sich in einer neuen TYPO3-Version die zugrunde liegende Klasse so ändern, dass Ihre XClass-Anpassung unnötig oder fehlerhaft wird.
17.12 TYPO3-Klassen mit XClass erweitern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 777
Max. Linie
Vermeiden Sie aus diesem Grund XClassing, wenn Sie Ihre Extension im TYPO3 Extension Repository veröffentlichen möchten. In unbekannten Umgebungen haben Sie nur wenig Kontrolle darüber, ob andere Extensions ebenfalls die Klasse über XClassing erweitern und es dadurch beim Endbenutzer zu Schwierigkeiten kommt.
Links
Um zu schauen, ob bereits eine XClass neben Ihrer vorliegt, können Sie in Ihrer Extension eine zusätzliche Abfrage einführen, mit der Sie die Variable ebenfalls püfen: if ($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['dateipfad']) { // Eigene XClass festlegen } else { // Eintrag im Syslog erstellen, Nachricht im Backend ausgeben o.Ä. }
Zusätzlich dazu sollten Sie im Handbuch Ihrer Extension deutlich darauf hinweisen, dass Sie TYPO3-Klassen mit XClass erweitern. Wenn Ihnen Nebeneffekte mit anderen Extensions oder TYPO3-Versionen bekannt sind, können Sie in Ihrer Extension festlegen, dass diese Extensions nicht zusammen mit Ihrer Extension installiert werden dürfen und eine bestimmte TYPO3-Version verwendet werden muss (das dazu nötige Hintergrundwissen erhalten Sie in Rezept 16.9).
Lizensiert für Markus Mueller
Bei einem TYPO3-Update: Wenn Sie XClassing einsetzen, empfehlen wir Ihnen, den erweiterten Code der PHP-Klasse mit dem neuen Code der Kernklasse zu vergleichen und speziell auf Änderungen zu prüfen. Es kann sein, dass sich die Klasse durch das Update geändert hat, was zu Komplikationen mit Ihrer XClass führen kann.
Durch die hier gezeigte XClass-Methode haben Sie eine große Kontrolle über die vorliegenden Klassen von TYPO3 und können zahlreiche Änderungen vornehmen. Dadurch gewinnen Sie erheblich an Flexibilität und schützen Ihre Änderungen gleichzeitig vor Änderungen bei zukünftigen Updates. Wenn Sie die Stolperfallen klug umgehen, können Sie so relativ gelassen mit XClasses arbeiten und TYPO3 bis ins kleinste Detail an Ihre Bedürfnisse anpassen.
Siehe auch
Max. Linie
Es ist von großem Vorteil, wenn Sie eine genaue Vorstellung vom Aufbau von TYPO3 haben und wissen, wo Sie Änderungen für welchen Zweck anbringen können. Lesen Sie hierzu das Rezept 1.4 und die Einleitung zu diesem Kapitel, um sich einen Überblick zu verschaffen. Für das Verständnis des XClass-Mechanismus sind Basiskenntnisse in objektorientierter Programmierung notwendig, um die zugrunde liegenden Mechanismen zu verstehen. Hierzu eignen sich das PHP 5 Kochbuch von David Sklar, Adam Trachtenberg, Ulrich Speidel & Stephan Schmidt und Programmieren mit PHP von Rasmus Lerdorf, beide aus dem O’Reilly Verlag. Eine Übersicht über moderne Entwurfsmuster erhalten Sie in dem Buch PHP Design Patterns von Stephan Schmidt, das ebenfalls im O’Reilly Verlag erschienen ist.
778 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
17.13 Prozesse mit Hooks beeinflussen Problem Sie möchten bestimmte Prozesse in TYPO3 individuell anpassen oder erweitern, ohne direkt Änderungen im Code vorzunehmen. Dabei möchten Sie sicherstellen, dass Ihre Anpassungen bei einer Aktualisierung der TYPO3-Version bestehen bleiben.
Lösung Nutzen Sie Hooks, um TYPO3-Prozesse über eigene Skripten anzupassen oder zu erweitern. In Ihren Skripten können Sie dann eigene Funktionen implementieren und die Daten individuell weiterverarbeiten oder manipulieren. Wenn Ihnen der Begriff Hook noch unklar ist, sollten Sie zuerst das Rezept 17.11 lesen, um sich einen Überblick zu verschaffen. Auch die Beispiele weiter unten in der Diskussion helfen Ihnen, das Thema stärker einzukreisen.
Lizensiert für Markus Mueller
Da die Anwendungsfälle und Umsetzungsmöglichkeiten von Hooks sehr vielschichtig sind, zeigen wir hier den am häufigsten vorkommenden Vorgang als Beispiel. Falls Sie anderen Code finden bzw. vorliegen haben, müssen Sie den hier gezeigten Code entsprechend anpassen. Das dazu nötige Hintergrundwissen erhalten Sie in der Diskussion. Um Hooks für eigene Zwecke zu nutzen, hat sich folgendes Vorgehen bewährt: 1. Ermitteln Sie den richtigen Hook im Code, indem Sie in den Verzeichnissen t3lib und typo3 nach den Codeabschnitten suchen, über die die Hooks angesprochen werden. Suchen Sie nach diesen beiden Suchbegriffen: is_array($TYPO3_CONF_VARS['SC_OPTIONS']
und is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']
Selbstverständlich können Sie die Suche auch auf einzelne Dateien beschränken, wenn Sie schon genauer vermuten, wo sich der Hook befindet. Als Suchergebnis erhalten Sie zahlreiche Treffer. Wenn Sie eine Datei öffnen, sollte die Fundstelle in einem solchen Codeblock liegen: if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['pfad']['hookname'])) { ... }
Max. Linie
Die beiden Werte pfad und hookname unterscheiden sich je nach Datei- und Hookname. 2. Prüfen Sie anschließend den Code innerhalb der if-Abfrage. Anhand dieser Codeanalyse können Sie leicht erkennen, welcher Hook-Typ vorliegt und – falls nötig – welche Funktions- oder Klassennamen und Parameter erwartet werden.
17.13 Prozesse mit Hooks beeinflussen | 779 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Der Code kann so aussehen (der Übersichtlichkeit halber zeigen wir nur noch den Code innerhalb der if-Abfrage):
Links
$params = array(); foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['pfad']['hookname'] as $hookMethod) { t3lib_div::callUserFunction($hookMethod,$params,$this); }
Wie schon erwähnt, kann der Code je nach Hooktyp und Konfiguration unterschiedlich sein. Details zum Aufbau der Hooks sowie die unterschiedlichen Typen finden Sie in der Diskussion. 3. Prüfen Sie, ob der Hook Rückgabewerte aus Ihrem Skript weiterverarbeitet oder ob die Parameter per Referenz übergeben werden, sodass kein Rückgabeparameter notwendig ist. 4. Legen Sie eine neue Datei im Extension-Verzeichnis an, in der Sie später Ihre Programmlogik implementieren, die dann vom Hook abgearbeitet wird. Der Dateiname kann von Ihnen frei gewählt werden. Er sollte jedoch den Verwendungszweck eindeutig erkennen lassen. In der Praxis hat sich dieses Muster bewährt: class.tx_<extkey>__<methodenName>Hook.php
Lizensiert für Markus Mueller
Der Wert extkey entspricht dem Extension-Key Ihrer Extension. Den Wert klassenName ersetzen Sie mit dem Namen der Klasse, in der der Hook liegt. Ebenso ersetzen Sie den Wert methodenName mit dem Namen der Methode. Zum Beispiel könnte der Dateiname so lauten: class.tx_extkey_t3libdiv_sysLogHook.php 5. Füllen Sie diese Datei mit folgendem PHP-Code und implementieren Sie die Logik. Wir empfehlen Ihnen, alle Funktionen in einer separaten Klasse abzulegen. Die Klasse sollte analog zum Dateinamen aufgebaut sein: class tx_extkey_klassenNameHookName { public function methodenName($params, $pObj) { ... } }
Je nach Hooktyp werden auch bestimmte Funktionen erwartet. Achten Sie darauf, dass Sie die Methoden mit public als öffentlich markieren. 6. Erstellen Sie anschließend in der Klasse die vom Hook erwartete Methode inklusive der nötigen Parameter. 7. Öffnen Sie die Datei ext_localconf.php und registrieren Sie den Hook über folgende Syntax:
Max. Linie
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS'] ['pfad'] ['hookname'][] = 'EXT:extkey/datei:klassenname->methodenname';
Zur besseren Lesbarkeit haben wir den Code eingerückt. In Ihrem Skript muss der Code in einer Zeile stehen.
780 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
8. Speichern Sie abschließend die Datei und löschen Sie den Extension-Cache. Beim nächsten Aufruf des Hooks wird Ihre Methode dann abgearbeitet. 9. Erweitern Sie den Code nach Ihren Wünschen und testen Sie dann, ob Ihre Änderung wie gewünscht greift. Sie können nun mit wenigen Zeilen Code die wesentlichen Funktionen von TYPO3 an eigene Anforderungen anpassen und erweitern. Durch die Kapselung des Codes in eigene Extensions stellen Sie sicher, dass Ihre Änderungen bei einem Update erhalten bleiben und funktionieren.
Diskussion Sie finden Hooks meist dort, wo individuelle Bearbeitungsschritte gewährleistet werden sollten. Das Anwendungsspektrum von Hooks reicht von der Manipulation des HTMLCodes für die Seitengenerierung über das Anpassen des Speichervorgangs im Backend bis hin zum Erzeugen von eigenen TypoScript-Objekten für die Darstellung im Frontend. Es ist daher von großem Nutzen, wenn Sie schon vor der Suche wissen, welche Funktionalität Sie anpassen möchten, und die Suche so eingrenzen können.
Lizensiert für Markus Mueller
Um sie zu finden, ist es daher sehr nützlich, zumindest eine grobe Vorstellung von den internen Prozessen von TYPO3 zu haben und die Datei- und Klassenstruktur gut zu kennen. Dadurch können Sie besser eingrenzen, wo Hooks implementiert sind, und die Suche beschleunigen. Nützliche Einstiegshilfen finden Sie in den Rezepten 1.4 und 17.1. Für die Verwendung von Hooks ist es auch essenziell wichtig, dass Sie wissen, wie Hooks aufgebaut sein können. Grundsätzlich sind Hooks einfach nur spezielle Stellen im Code, an denen das globale assoziatives Array $TYPO3_CONF_VARS auf Einträge geprüft wird. Ist ein Eintrag vorhanden, wird das Array über eine foreach-Schleife abgearbeitet und der Verweis auf die Hookdatei samt des Methodennamens in ein Objekt umgesetzt. Ansonsten wird der Hook nicht abgearbeitet. Das Array $TYPO3_CONF_VARS ist der zentrale Speicherort für Konfigurationsparameter jeglicher Art. Die Syntax für die Verwendung eines Hooks ist dabei immer nach diesem Muster aufgebaut: $TYPO3_CONF_VARS['SC_OPTIONS']['datei_pfad']['hook_name'][] = 'wert';
Der Schlüsselwert datei_pfad gibt den relativen Pfad zur PHP-Datei an, in der der Hook liegt. Der Schlüsselwert hook_name entspricht dem Hooknamen, der angesprochen wird. Hieraus ergibt sich für jeden Hook eine eindeutige Referenz, über die er angesprochen werden kann. Beachten Sie, dass dieses mehrdimensionale Array über die Syntax »[ ]« noch eine weitere Dimension erhält, die von PHP automatisch numerisch hochgezählt wird. Oft werden die eckigen Klammern vergessen, sodass der Hook Ihr Skript nicht wie gewünscht verarbeitet.
Max. Linie
Max. Linie 17.13 Prozesse mit Hooks beeinflussen | 781 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Die Werte des daraus resultierenden Arrays werden dann vom Hook über eine foreachSchleife ausgelesen. Jeder übergebene Wert ist ein String, der jedoch je nach Hooktyp unterschiedlich aufgebaut sein muss, da sich die Verarbeitung der Werte je nach Hooktyp unterscheidet:
Links
1. Der Hook verarbeitet direkt den Wert des Arrays. Dies kommt häufig bei Hooks vor, die eine flexible Konfiguration für Funktionen bereitstellen, etwa wenn weitere Einträge in einem Array hinzugefügt werden sollen. Der Wert ist in diesem Fall ein einfacher String oder ein Array und keine Funktionsreferenz: foreach($GLOBALS['TYPO3_CONF_VARS']['BE']['hookname'] as $item) { $content.= $item['content']; }
Eine Beispielanwendung für diesen Hooktyp finden Sie in Rezept 3.8. 2. Der Hook ruft eine Funktion auf, die bestimmte Parameter verarbeitet, und gibt die geänderten Parameter entweder direkt zurück an die ursprüngliche Klasse, oder die Parameter werden als Referenz an Ihr Skript übergeben, sodass die Änderungen auch ohne Rückgabebefehl greifen. In diesem Fall können Sie über den Hook zum Beispiel eigene Werte in den Bearbeitungsprozess einschleusen, bestehende Werte manipulieren oder andere Funktionen je nach Kontext ausführen. Der Hookcode ist dann nach diesem Muster aufgebaut: Lizensiert für Markus Mueller
$params = array(); foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['pfad']['hookname'] as $hookMethod) { $content = t3lib_div::callUserFunction($hookMethod,$params,$this); }
Als Wert müssten Sie einen String nach diesem Muster übergeben: 'EXT:extkey/datei:klassenname->methodenname'
Ein Beispiel für diesen Hooktyp finden Sie in Rezept 18.4. 3. Der Hook erstellt aus dem Wert ein eigenständiges Objekt, das wiederum vom Hook diverse Werte erhält, die dann in Ihrem Skript verarbeitet werden können: foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['pfad']['hook_name'] as $classRef) { $hookObj = &t3lib_div::getUserObj($classRef); $hookObj->methodenName($content); }
Die Methoden der Klasse werden durch den Hook vorgegeben. Prüfen Sie daher an der Fundstelle genau, welche öffentlichen Methoden in Ihrem Skript verfügbar sein müssen. Auch hier übergeben Sie mit dem Wert eine Referenz auf Ihre PHP-Klasse an den Hook: 'EXT:extkey/datei:klassenname'
Max. Linie
Im Grunde ist dieser Hooktyp eine Weiterentwicklung vom Hooktyp 2, da durch die Objekte eine stärkere Kapselung der Programmlogik möglich ist und auch besondere
782 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Anforderungen an die Klasse in Ihrem Skript, etwa in Form von Interfaces, festgelegt werden können. Jeder Typ legt durch die unterschiedliche technische Implementierung auch gleichzeitig die Möglichkeiten fest, wie Sie Ihr Skript einbinden und Ihre Logik im PHP-Skript implementieren müssen. Der String wird in Hooks vom Typ 2 und 3 immer in eine PHP-Funktion umgewandelt. Hierbei kommen zwei Hilfsfunktionen zum Einsatz, die aus der Funktionsreferenz das Objekt bzw. den Funktionsaufruf herauslösen: &t3lib_div::getUserObj($_classRef); Diese Methode ermittelt aus dem String ein lokales Objekt, das dann die gewünschte Funktionalität kapselt. Besonders wichtig ist, dass dieses Objekt die vom Hook benötigten öffentlichen Funktionen besitzt und der Rückgabewert dem vom Hook geforderten Format entspricht. Selbstverständlich können Sie weitere private Funktionen in Ihrer Klasse nutzen, um Ihren Code modular zu halten. Wichtig ist nur, dass die Hook-Funktion die erwarteten Parameter an TYPO3 zurückgibt. Die benötigten Eigenschaften entnehmen Sie dem jeweiligen Codeabschnitt, in dem Sie den Hook gefunden haben.
Lizensiert für Markus Mueller
t3lib_div::callUserFunction($_funcRef,$_params,$this); Diese Methode ruft die Funktion auf, die Sie in dem String angegeben haben, und übergibt dieser Funktion die beiden Übergabeparameter $params und $this. Das assoziative Array $params wird oft mit weiteren Werten gefüllt, auf die Sie dann in Ihrem Skript zugreifen können. Der Parameter $this erlaubt eine Referenzierung auf das aufrufende Objekt. In jedem Fall legt der Hook fest, wie die Daten verarbeitet werden können. Sie sollten daher – wie in der Lösung beschrieben – den Aufbau des Hooks genau studieren. Da Hooks Arrays verarbeiten, können auch mehrere Objekte bzw. PHPFunktionen über einen Hook ausgeführt werden. Die Reihenfolge der Abarbeitung wird darüber festgelegt, in welcher Reihenfolge die Extensions installiert wurden. Wenn Ihre Prozesse voneinander abhängig sind, sollten Sie daher besonders darauf achten, dass sie in logischer Reihenfolge eingebunden bzw. registriert werden.
Beispiele Hooks geben Ihnen umfangreiche Möglichkeiten an die Hand, TYPO3 an vielen Stellen an Ihre Wünsche anzupassen. Sobald Sie die anfangs erwähnten Arbeitsschritte verinnerlicht haben, werden Sie Hooks schnell finden und Ihre Funktionalität implementieren können, ohne beim nächsten Update Änderungen am Code vornehmen zu müssen.
Max. Linie
Die folgende Übersicht zeigt Ihnen weitere Einsatzmöglichkeiten und erleichtert Ihnen die Suche nach den richtigen Stellen im Code. Indem Sie den Hooknamen in der jeweils
17.13 Prozesse mit Hooks beeinflussen | 783 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
unten im Beispiel angegebenen Datei suchen, gelangen Sie schnell zum Hook und können dort die Übergabe- und Rückgabeparameter ermitteln, sodass Sie zügig mit der Umsetzung Ihrer Programmlogik anfangen können:
Links
Eigene Warnungen im Backend-Modul Über Module anzeigen Diesen Hook können Sie nutzen, um Warnungen im Modul Über Module auszugeben, zum Beispiel wenn es mehrere Extensions gibt, die dieselbe Klasse per XClass erweitern. Der Warnhinweis ist sinnvoll, da hier mit Nebeneffekten zu rechnen ist. t3lib/class.t3lib_befunc.php ➝ displayWarningMessages Syslog-Funktionen erweitern Mit diesem Hook könnnen Sie eigene Syslog-Mechanismen implementieren und so zum Beispiel bei fatalen Serverfehlern einen SMS-Service zur Benachrichtigung des Systemadministrators ansprechen. Ein Beispiel, wie Sie Systemprozesse in TYPO3 protokollieren können, finden Sie in Rezept 2.11. Im TER finden Sie einige Extensions, die diesen Hook im Log-Mechanismus nutzen, etwa die Extension devlog. t3lib/class.t3lib_div.php ➝ systemLog
Lizensiert für Markus Mueller
Eigene Bedingungen in TypoScript integrieren Der Hook erlaubt Ihnen, neue Bedingungen in TypoScript zu integrieren. Diese Bedingungen können Sie dann nahtlos wie die vorhandenen Conditions in TypoScript verwenden. Die Verwendung dieser Bedingungen wird in Rezept 8.8 beschrieben. t3lib/class.t3lib_matchcondition.php ➝ matchConditionClass Weitere Kriterien zum Darstellen geschützter Inhalte definieren Komplexe Darstellungsoptionen bzw. -kriterien, die über mehrer Datenbankfelder formuliert werden: Nur wenn aktuelle KW in Feld X und Start-Datum < heute ist. t3lib/class.t3lib_page.php ➝ addEnableColumns Prozesse vor, während oder nach dem Speichern von Inhalten anstoßen Ein häufig genutzter Hook vom Typ 3, der zum Beispiel dazu verwendet werden kann, Backend-Benutzer nach der Bearbeitung eines Datensatzes automatisch per E-Mail zu benachrichtigen. t3lib/class.t3lib_tcemain.php ➝ processDatamapClass Der Hook erwartet ein Objekt mit diesen Methoden, die dann je nach Aktion aufgerufen werden: processDatamap_preProcessFieldArray() processDatamap_postProcessFieldArray() processDatamap_afterDatabaseOperations() processDatamap_afterDatabaseOperations() processCmdmap_preProcess() processCmdmap_postProcess() moveRecord_firstElementPostProcess() moveRecord_afterAnotherElementPostProcess()
Max. Linie
Max. Linie 784 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Sie müssen diese Methoden in Ihrem Skript vorsehen, da das Skript ansonsten mit einem PHP-Fehler abbricht. Wenn Sie keine Aktion in den Methoden definieren, bleiben die übergebenen Daten unberührt. Die Kritiker von Hooks bemängeln, dass sich durch zu viele Hooks die Performance von TYPO3 verschlechtert, da an vielen Stellen unnötige Abfragen eingebunden werden – gleichzeitig nimmt natürlich aber die Gestaltungsfreiheit für Entwickler zu. Die Implementierung neuer Hooks wird daher vom Core-Team immer sehr kritisch hinterfragt und erfordert eine Abstimmung. Wenn Sie der Überzeugung sind, dass ein Hook an einer bestimmten Stelle im Code sinnvoll wäre, können Sie diesen in der Core-Newsgroup diskutieren. Mehr zu den Newsgroups erfahren Sie in Rezept 20.6. Vermeiden Sie auf jeden Fall direkte Änderungen am Code des TYPO3-Kerns. Diese zeigen sich spätestens beim nächsten Update der TYPO3-Version als schwer handhabbar und erfordern eine genaue Dokumentation.
Siehe auch
Lizensiert für Markus Mueller
Da der Code von TYPO3 stetig erweitert und überarbeitet wird, ist es schwierig, eine Hook-Übersichtsliste aktuell zu halten. Eine bequeme Möglichkeit, sich einen umfassenden Überblick über aktuell vorhandene Hooks zu verschaffen, ist die Extension dmc_ hooklist. Diese Extension benötigt den PHP-TOKENIZER, der jedoch standardmäßig mit PHP 5 installiert wird. Einen vollständigen Überblick über die aktuellen Funktionen und Dateien erhalten Sie über die API-Dokumentation unter http://typo3.org/documentation/api/.
17.14 Extension-Parameter zentral verwalten Problem Sie möchten bestimmte Eigenschaften Ihrer Extension ändern, ohne in den Quellcode einzugreifen.
Lösung Speichern Sie die Werte über die Extension-Eigenschaften im Array $TYPO3_CONF_ VARS['EXT']['extConf']['ext_key']. Legen Sie dazu im Ordner Ihrer Extension die Datei ext_conf_template.txt an, falls diese noch nicht vorhanden sein sollte. In dieser Datei erzeugen Sie nun über eine spezielle Kommentarsyntax die Formularfelder, mit denen Sie später die gewünschten Werte im Erweiterungs-Manager anpassen können. Diese Felder erzeugen Sie nach diesem Muster:
Max. Linie
# cat=basic; type=feld_typ; label=Überschrift:Beschreibung variablen_name = standard_wert
17.14 Extension-Parameter zentral verwalten | 785 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links Jedes Feld können Sie mit einer eigenen Beschreibung versehen. Der Text wird unterteilt in eine Überschrift und die Beschreibung. Vor dem Doppelpunkt legen Sie die Überschrift fest. Diese wird automatisch nach 35 Zeichen abgeschnitten und mit drei Punkten abgekürzt. Nach dem Doppelpunkt beginnt die Feldbeschreibung. HTML-Tags sind hier nicht erlaubt.
Um beispielsweise ein Eingabefeld für eine Textvariable zu erzeugen, geben Sie folgenden Code ein (eine Liste weiterer Feldtypen finden Sie in der Diskussion): # cat=basic; type=text; label=Beispielüberschrift:Ein einfaches Eingabefeld variablen_name = standard_wert
Passen Sie nun die hervorgehobenen Werte an und speichern Sie die Datei ab. Wechseln Sie über das Modul Erw-Manager in den Erweiterungs-Manager und klicken Sie auf den Titel der entsprechenden Extension. Im Abschnitt Configuration finden Sie nun das Eingabefeld mit den entsprechenden Angaben. Nachdem Sie den Wert mit Update bestätigt haben, schreibt TYPO3 den Wert als serialisiertes Array in die Datei localconf.php. Anhand des oben genannten Beispiels wäre nun folgender neuer Eintrag in der Datei ext_ localconf.php vorhanden (der Wert ext_key entspricht dabei dem Extension-Key Ihrer Extension): Lizensiert für Markus Mueller
$TYPO3_CONF_VARS['EXT']['extConf']['ext_key'] = 'a:1:{s:14:"variablen_name";s:13:"standard_wert";}';
Beachten Sie, dass Sie den Update-Befehl im Erweiterungs-Manager immer durchführen müssen, wenn Sie eine neue Extension-Variable aktivieren möchten oder Änderungen an der Datei vorgenommen haben. Die Werte werden ansonsten nicht in die Datei localconf. php geschrieben und übernommen. Um die einzelnen Werte später wieder auszulesen, verwandeln Sie das serialisierte Array mit der PHP-Funktion unserialize() wieder in eine lesbare Form, über die Sie die Variablen und deren Werte erneut direkt ansprechen können: $lConf = unserialize($TYPO3_CONF_VARS['EXT']['extConf'][$_EXTKEY]); $wert = $lConf['variablen_name'];
Da diese Werte in der Datei localconf.php gespeichert werden, stehen Ihnen diese nun global in jeder Extension zur Verfügung. Sie können auf den serialisierten String der Konfigurationseinstellungen für die aktuelle Extension auch über die Variable $_EXTCONF zugreifen. Diese Variable stellt Ihnen den Wert aus $TYPO3_CONF_VARS['EXT']['extConf'][$_ EXTKEY] direkt zur Verfügung. Um das Beispiel in diesem Rezept anschaulicher zu halten, verwenden wir hier jedoch die ausführliche Schreibweise. In der Praxis sollten Sie die kürzere Schreibweise über den Aufruf der Variablen $_EXTCONF bevorzugen.
Max. Linie
Max. Linie 786 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Diskussion Mit diesen Konfigurationseinstellungen können Sie gezielt Parameter in Ihrer Extension auslagern und komfortabel über den Erweiterungs-Manager anpassen. Dadurch wird es beispielsweise möglich, individuelle Werte oder Extension-Einstellungen flexibel zu halten und schnell auf Änderungen einzugehen, ohne dabei die entsprechende Stelle im Quellcode ändern zu müssen. Sie können beliebig viele Felder erstellen, deren Eigenschaften Sie je nach gewünschtem Einsatzort und Datentyp schon entsprechend vorgeben können. So können Sie etwa mit dem Feldtyp int festlegen, dass nur Zahlenwerte gespeichert werden dürfen. Als Feldtypen stehen Ihnen folgende Werte zur Verfügung: type=boolean Erzeugt ein Kontrollkästchen, beispielsweise zum Ein- oder Ausschalten bestimmter Funktionen in der Extension. Der Standardwert gibt vor, ob diese Option standardmäßig aktiv ist oder nicht. Der Wert 0 deaktiviert die Auswahl. Bei Werten größer 1 wird die Auswahl aktiviert. type=int Erzeugt ein Eingabefeld für Zahlenwerte. Ist ein Wert ungültig, wird eine 0 angezeigt. Zeichenketten werden zu einer 0 umgewandelt. Negative Werte sind möglich.
Lizensiert für Markus Mueller
type=int+ Erzeugt ein Eingabefeld für positive Zahlenwerte. Ist der Wert ungültig, wird eine 0 angezeigt. Negative Werte sind nicht möglich. type=int[n-m] Erzeugt ein Eingabefeld für einen bestimmten Wertebereich. Der Wert muss im angegebenen Bereich liegen. Ist er kleiner, wird der Mindestwert verwendet. Ist er größer, wird der Maximalwert übernommen. type=text Erzeugt ein Standard-Eingabefeld für beliebigen Text. Dieses Feld wird auch immer dann angezeigt, wenn der Feldtyp unbekannt oder leer ist. Leere Werte werden akzeptiert.
Max. Linie
type=file Erzeugt eine Auswahlliste aller Dateien, die sich im Ordner res/ der jeweiligen Extension befinden. Zusätzlich kann die Auswahl auf bestimmte Dateitypen begrenzt werden. Geben Sie dazu die gewünschten Dateiendungen in eckigen Klammern hinter dem Feldtyp an. Beispielsweise würde folgende Angabe nur Dateien mit den Endungen html und tmpl erlauben (tmpl-Dateien stellen Template-Dateien dar): type= file[html,tmpl]. Wenn Sie Ihre Auswahl auf Bilder begrenzen möchten, können Sie auch den Wert IMG_EXT in den eckigen Klammern verwenden. Dieser Wert wird dann von TYPO3 automatisch mit dem Wert von $GLOBALS['TYPO3_CONF_VARS']['GFX'] ['imagefile_ext'] ersetzt. Damit greifen Sie auf die Grafikformate zurück, die Sie im
17.14 Extension-Parameter zentral verwalten | 787 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Install-Tool vergeben oder als Standardwert von TYPO3 übernommen haben (mehr über diese Standardwerte und das Install-Tool erfahren Sie in Rezept 1.6). Geben Sie dazu folgende Feldkonfiguration an: type=file[IMG_EXT].
Links
type=color Erzeugt ein Eingabefeld für HTML-Farbwerte. Zusätzlich zu dem Eingabefeld erscheint ein Auswahlfeld mit allen Standard-HTML-Farben sowie ein Vorschaufeld zur Kontrolle der Farbe. Der Farbwert muss mit sechs Zeichen angegeben werden (die CSS-Schreibweise mit drei Zeichen ist hier nicht gültig und wird von TYPO3 auf sechs Zeichen erweitert). type=wrap Erzeugt zwei Eingabefelder für einen Wrap. Die Werte werden in der Form erstes_ feld|zweites_feld abgespeichert und sind durch das Pipe-Symbol (|) voneinander getrennt. type=offset Erzeugt zwei Eingabefelder für x- und y-Koordinaten. Die Werte werden in der Form erstes_feld, zweites_feld abgespeichert und sind durch Kommata voneinander getrennt. Genau so geben Sie die Standardwerte vor. Lizensiert für Markus Mueller
type=options[option1,option2] Erzeugt eine Auswahlliste mit festen Werten. Zusätzlich können Sie mit folgendem Muster eine abweichende Beschreibung für jeden Punkt vergeben:type=options [Bezeichnung1=wert1,Bezeichnung2=wert2]. Stimmt der Standardwert mit einem Wert überein, wird der entsprechende Eintrag vorgewählt. type=small Erzeugt ein kleines Eingabefeld für Text, das sich nur durch die etwas kleinere Darstellung vom Feldtyp text unterscheidet. type=comment Erzeugt als Eingabefeld ein Kontrollkästchen, mit dem Sie das Kommentarzeichen # aktivieren können. Ist das Kontrollkästchen aktiv, wird der Wert zu einem #-Zeichen. Ansonsten bleibt der Wert leer. Setzen Sie den Standardwert auf 0, wird das Kontrollkästchen standardmäßig aktiviert. Diesen zugegebenermaßen etwas ungewöhnlichen Wert könnten Sie beispielsweise dazu verwenden, um dynamische TypoScript-Kommentare zu erzeugen. Folgendes Beispiel verdeutlicht diese Verwendungsmöglichkeit: $lConf = unserialize($TYPO3_CONF_VARS['EXT']['extConf'][$_EXTKEY]); $wert = $lConf['variablen_name']; t3lib_extMgm::addUserTSConfig(' '. $wert .' options.saveDocNew = 1 ');
Max. Linie
Beachten Sie, dass dies nur im Zusammenhang mit TypoScript funktioniert. PHPCode können Sie auf diese Weise nicht auskommentieren.
788 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
type = user[pfad_zur_methode] Erzeugt ein benutzerdefiniertes Feld. Die Darstellung steuern Sie über eine Methode in einer Klasse, die Sie über diese Syntax einbinden und ansprechen: EXT:ext_key/class.tx_userfeld.php:&tx_klassenname->methodenName
Die Methode erwartet einen Parameter, der ein Array mit den Werten fieldName und fieldValue enthält. Als Rückgabewert muss die Methode einen String liefern, der den HTML-Code für das Feld festlegt. Beachten Sie, dass Sie alle möglichen Feldtypen anlegen können, jedoch gibt es technische Limits bei der Speicherung. Es ist zum Beispiel nicht möglich, den Inhalt einer mehrzeiligen Textarea zu speichern, da TYPO3 nur einzeilige Werte als Konstanten unterstützt. Mit diesen Feldtypen können Sie Formularfelder für unterschiedliche Werte vorbereiten und die Eingabemöglichkeit auch entsprechend reduzieren. Bevor Sie die Werte dann an den gewünschten Stellen in Ihrer Extension verwenden, sollten Sie jedoch unbedingt den Wert auf seine Gültigkeit prüfen. Vertrauen Sie keinen Werten, die von außen in Ihre Skripten gelangen – auch wenn diese über die oben genannten Feldeigenschaften gewissermaßen schon vorab kontrolliert werden. Beispielsweise können Textfelder auch leer gelassen werden.
Lizensiert für Markus Mueller
Zusätzlich können Sie die Eingabefelder in Gruppen gliedern und sortieren. Jede Gruppe wird dabei mit einer eigenen Überschrift kenntlich gemacht, unter der die Eingabefelder aufgelistet werden. Dadurch können Sie beispielsweise spätere Anwendungsbereiche der Werte hervorheben und die Felder kategorisieren. Die Gruppen dienen lediglich der visuellen Gliederung und haben keinen Einfluss auf die spätere Verwendung oder Zugänglichkeit der Werte. Lassen Sie die Angabe leer, erscheint keine Überschrift. Gerade bei vielen Optionen sollten Sie die Einstellungsmöglichkeiten in logische Gruppen gliedern. Wenn Sie die Felder sortieren, können Sie die Reihenfolge der Felder anpassen, ohne den Code nachträglich umzustellen, was gerade bei umfangreichen Eingabeformularen hilfreich sein kann. Die Gruppe sowie die jeweilige Position geben Sie nach folgendem Muster an: # cat=basic/Gruppe/Sortierung; type=feld_typ; label=Überschrift:Beschreibung variablen_name = standard_wert
Für die Gruppierung stehen Ihnen folgende Gruppen zur Verfügung: # cat=basic/enable Die Felder werden unter der Überschrift Enable features abgelegt. Diese Gruppe ist ein allgemeiner Speicherort für beliebige Werte. # cat=basic/dims Die Felder werden unter der Überschrift Dimensions, widths, heights, pixels abgelegt. In dieser Gruppe speichern Sie beispielsweise x- und y-Koordinaten von Grafiken.
Max. Linie
Max. Linie 17.14 Extension-Parameter zentral verwalten | 789 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
# cat=basic/typo Die Felder werden unter der Überschrift Typography abgelegt. Hier können Sie typografische Werte wie Schriftgröße und Zeilenabstand anlegen. Die Feldtypen sollten int oder Auswahlfelder mit der Begrenzung [.ttf] sein.
Links
# cat=basic/file Die Felder werden unter der Überschrift Files abgelegt und sollten vor allem für den Feldtyp file verwendet werden. # cat=basic/color Die Felder werden unter der Überschrift Colors abgelegt. Die Felder sollten vom Typ color sein. # cat=basic/other Ähnlich wie in der Gruppe enable können Sie hier beliebige Felder anzeigen. Diese Gruppe wird standardmäßig verwendet, wenn die Gruppe unbekannt oder leer ist. Durch diese flexiblen Eingabeformulare stehen Ihnen zahlreiche Möglichkeiten offen, mit denen Sie selbst umfangreiche Einstellungen oder Parameter für die jeweilige Extension intuitiv anpassen können. Vermeiden Sie es daher, diese Werte fest in Ihren Programmcode zu integrieren, sondern lagern Sie die Werte so oft wie möglich in die Datei ext_conf_template.txt aus. Lizensiert für Markus Mueller
Siehe auch In Rezept 19.2 erfahren Sie, wie Sie weitere Parameter Ihrer Extension über das TYPO3Backend verwalten können. Mehr über die PHP-Funktionen serialize und unserialize erfahren Sie unter folgenden Adressen: http://www.php.net/serialize und http://www.php. net/unserialize.
Max. Linie
Max. Linie 790 | Kapitel 17: Einstieg in die TYPO3-API This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
First
Kapitel 18
KAPITEL 18
Frontend-Plugins weiter entwickeln
18.0 Einführung
Lizensiert für Markus Mueller
In diesem Kapitel erfahren Sie, wie Sie Ihre Frontend-Plugins im Detail ausbauen. Wir gehen auf spezielle Tricks und Kniffe ein, die sich bei der Erzeugung von Frontend-Plugins bewährt haben, und geben Hilfestellung bei häufigen Anforderungen. Das Kapitel gliedert sich in Rezepte, in denen Basiskonzepte beschrieben werden, und weiterführende Rezepte, die spezielle Anforderungen beschreiben. In Rezept 18.1 erfahren Sie, wie Sie die nahtlose Integration von TypoScript mit Ihrem PHP-Code nutzen können. Mit dem Wissen aus diesem Rezept schaffen Sie die Voraussetzung, Ihren PHP-Code durch eine geschickte Kombination mit TypoScript zu vereinfachen und flexibler zu halten. Zusätzlich können Sie über sogenannte Flexform-Felder eine äußerst anpassbare Eingabemaske für die jeweiligen Plugin-Einstellungen entwerfen. Hiermit haben Sie sehr flexible Möglichkeiten zur Verfügung, mit denen Sie das Frontend-Plugin steuern können. Ergänzend dazu geht Rezept 18.2 auf die Anforderung ein, dass Sie für Ihre Extension eine leicht erweiterbare Konfigurationsoberfläche zur Verfügung stellen sollen, mit der die Backend-Benutzer Parameter Ihrer Extenson – individuell pro Seite – einstellen können.
Max. Linie
Bei der Entwicklung von Frontend-Plugins werden Sie früher oder später spezielle Hyperlinks erzeugen müssen, etwa um bestimmte Extension-Parameter auf andere Seiten übertragen werden. In Rezept 18.3 erfahren Sie, wie Sie diese dynamischen Verknüpfungen in Ihren Frontend-Plugins mit den entsprechenden TYPO3-Funktionen umsetzen. Der Vorteil hierbei: TYPO3 kümmert sich vollständig um die Verwaltung der Linkparameter und stellt sicher, dass die Hyperlinks zur Zielseite korrekt umgesetzt werden. TYPO3 kontrolliert dabei beispielsweise, ob die Zielseite erreichbar ist oder die Hyperlinks über spezielle Rendering-Funktionen erstellt werden. Die Linkfunktion kann ab Version 4.1 über sogenannte Link-Handler flexibel erweitert werden. So können Sie zum Beispiel Hyperlinks zu eigenen Plugins erzeugen, ohne dass Sie sich bei der Eingabe Gedanken um die Zielseite machen müssen. Die dafür notwendigen Schritte werden ausführlich in Rezept 18.4 beschrieben. | 791 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Zudem kommt es häufig vor, dass Sie Benutzerdaten oder Extension-Parameter speichern und über mehrere Seiten oder Ansichten transportieren möchten und dabei der Weg über die GET- oder POST-Parameter nicht sinnvoll oder empfehlenswert ist. TYPO3 bietet Ihnen ein komfortables Session-Management, mit dem Sie die gewünschten Daten in einer speziellen Datenbanktabelle ablegen und wieder auslesen können. In Rezept 18.5 erfahren Sie, wie Sie diese Funktionen effektiv bei der Entwicklung von eigenen Extensions nutzen können.
Links
Wenn Sie umfangreichere Frontend-Applikationen entwickeln, kann es vorkommen, dass Sie weitere CSS- und JavaScript-Dateien in Ihre Webseite einbinden müssen. In Rezept 18.6 erfahren Sie, wie Sie externe CSS- und JavaScript-Bibliotheken über Ihr FrontendPlugin in die Webseite integrieren. Diese JavaScript-Bibliotheken können Sie zum Beispiel nutzen, um JavaScript-Frameworks zu integrieren und auf deren Ajax-Funktionalitäten zurückzugreifen. In Rezept 18.7 geht es darum, schnelle asynchrone Verarbeitungen über Ajax auf Ihrer Webseite zu ermöglichen. In diesem Rezept erfahren Sie, wie Sie Ajax-Schnittstellen in TYPO3 integrieren und mit Ihrem Frontend-Plugin nutzen, um Ihren Besuchern eine intuitivere Oberfläche anzubieten. Lizensiert für Markus Mueller
18.1 TypoScript in eigenen Frontend-Plugins verwenden Problem Um Ihr Frontend-Plugin möglichst flexibel zu halten, möchten Sie das TypoScript-Setup zur Konfiguration nutzen. Damit wollen Sie ermöglichen, dass das Verhalten Ihrer Extension auch ohne Modifikationen des PHP-Codes angepasst werden kann. Oder Sie möchten einfach ein TypoScript-Objekt oder eine der TypoScript-Funktionen in Ihrem FrontendPlugin nutzen.
Lösung Wenn Ihr Frontend-Plugin bereits vom Kickstarter eingebunden und erzeugt wurde, können Sie beliebige eigene TypoScript-Eigenschaften im TypoScript-Setup unterhalb Ihres Plugin-Objekts plugin.tx_extkey_pi1 definieren, die dann von TYPO3 automatisch an den PHP-Code Ihres Plugins übergeben werden. In Ihrem PHP-Code können Sie die übergebene TypoScript-Konfiguration dann auswerten und die Ausgabe dadurch anpassen. Als Beispiel soll dieses zusätzliche TypoScript-Setup dienen:
Max. Linie
plugin { tx_extkey_pi1 { introMessage = Die Ausgabe meines Frontend-Plugins renderFieldList = bodytext,header finalWrap = | } }
792 | Kapitel 18: Frontend-Plugins weiter entwickeln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
So könnte der Rumpf einer solchen Klasse und Methode aussehen, die die im Beispiel verwendeten TypoScript-Eigenschaften auswertet: class tx_extkey_pi1 extends tslib_pibase { // [...] function main($content,$conf){ $content = ''; // zur Sicherheit setzen wir $content auf einen leeren String // wir werden $content auch als Rückgabewert verwenden $content = $conf['introMessage']; $fieldArray = t3lib_div::trimExplode(',',$conf['renderFieldList']); if (!strstr($fieldArray[0],',')) { foreach ($fieldArray as $fieldName) { $content .= $this->cObj->data[$fieldName]; } } return $this->cObj->wrap($content,$conf['finalWrap']); } // end function } // end class
Lizensiert für Markus Mueller
An die entsprechende Methode main() der PHP-Klasse tx_extkey_pi1 werden zwei Parameter übergeben, die typischerweise als $content und $conf bezeichnet werden. Als Rückgabewert erwartet TYPO3 eine Zeichenkette von Ihrer Funktion, die dann als Inhalt in den weiteren Verarbeitungsprozess der aufrufenden Stelle zurückgegeben wird. Die übergebene Variable $content ist bei einem USER- oder USER_INT-Objekt leer. Die zweite Variable $conf enthält als Array alle TypoScript-Werte, die unterhalb des entsprechenden Objektpfads plugin. vorhanden sind. In unserem Beispiel verwenden wir zunächst die Eigenschaft introMessage, deren Wert wir als Erstes in unserer zurückzugebenden Zeichenkette speichern. Danach wandeln wir die in der Eigenschaft renderFieldList übergebenen Werte mit dem Komma als Trennzeichen in das PHP-Array $fieldArray. Falls diese Eigenschaft leer ist, erhalten wir ein Array mit einem Element zurück, das unser Trennzeichen Komma enthält. Aus diesem Grund stellen wir vor der Abarbeitung des Arrays $fieldArray sicher, dass das erste Element nicht dem Trennzeichen Komma entspricht. Danach fügen Sie über eine foreach-Schleife entsprechend Werte dem Ausgabe-String $content hinzu. Dabei nutzen wir aus, dass in einer Klasse, die als USER oder USER_INT eingebunden wird, prinzipiell immer die Instanz der aufrufenden TypoScript-Basisklasse als Klassenvariable $this->cObj zur Verfügung steht, dazu gleich noch mehr im Detail. Hier ist wichtig, dass in $this->cObj->data ein Array mit den Feldwerten des aktuell geladenen Datensatzes zur Verfügung steht. Wir können somit also nun in unserem TypoScript eine Liste mit Feldern anlegen, deren Werte dann von unserem PHP-Plugin in die Ausgabe eingebunden werden. Als letzte Funktion verwenden wir die an unser Plugin übergebene TypoScript-Eigenschaft finalWrap. Diese verwenden wir, um vor der Rückgabe noch einen Wrap auf unsere Ausgabe anzuwenden. Dabei nutzen wir die Methode $this->cObj->wrap($content,$wrap).
Max. Linie
Max. Linie 18.1 TypoScript in eigenen Frontend-Plugins verwenden | 793 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Links In Ihrer Extension haben Sie über $this->cObj Zugriff auf die Instanz der aufrufenden TypoScript-Basisklasse tslib_cObj. Diese Klasse implementiert die ganzen Ihnen bereits bekannten TypoScript-Objekte und -Eigenschaften. Somit können Sie über $this->cObj ganz einfach aus Ihrem PHP-Code heraus auf die von TypoScript bekannten Funktionen zurückgreifen. Schauen Sie doch einmal in die API der Klasse tslib_cObj. Wenn Sie bereits etwas mit TypoScript vertraut sind, werden Ihnen viele Methoden bekannt vorkommen. Achtung, der Dateiname weicht leicht von Klassennamen ab, die Klasse ist in der Datei typo3/sysext/cms/tslib/class.tslib_content.php implementiert.
Diskussion
Lizensiert für Markus Mueller
Sie können im Rahmen einer userFunc beliebige eigene TypoScript-Eigenschaften übergeben und auswerten. Natürlich können später für Ihr Plugin nur TypoScript-Eigenschaften verwendet werden, die Sie auch in Ihrer Methode auswerten. Aus diesem Grund ist es sehr wichtig, dass Sie alle möglichen Optionen von Anfang an dokumentieren. Dabei sollten Sie sich auch Gedanken um sinnvolle Namen machen; es kann nützlich sein, sich an den Bezeichnungen der regulären TypoScript-Eigenschaften zu orientieren. In jedem Fall sollten Sie nach Möglichkeit die TYPO3-Konventionen berücksichtigen und die camelCase-Schreibweise für die Eigenschaften verwenden. Bei camelCase werden einzelne Bestandteile zusammengesetzter Wörter mit einem Großbuchstaben zusammengesetzt, ein Beispiel dafür ist: diesIstCamelCase = wert
Ausliefern von TypoScript-Standard-Templates mit der Extension Das TypoScript kann natürlich wie üblich selbstständig von den Anwendern in einem TypoScript-Template festgelegt werden. Es ist jedoch oft auch sinnvoll, bereits eine entsprechende Konfiguration mit der Extension auszuliefern. Dazu können Sie die Funktion Static TypoScript code im Kickstarter nutzen. Es gibt grundsätzlich zwei Wege, solches TypoScript mit der Extension auszuliefern: • Im Hauptverzeichnis Ihrer Extension können Sie die Dateien ext_typoscript_setup. txt, ext_typoscript_constants.txt und ext_typoscript_editorcfg.txt (für den als Extension verfügbaren CSS-Editor) anlegen und den entsprechenden Code dort ablegen. Dieser Code wird dann automatisch bereits durch die reine Installation der Extension aktiviert. Der Kickstarter verwendet diese Dateien, wenn Sie beim Anlegen eines Frontend-Plugins das Kontrollkästchen Enable this option if you want the TypoScript code to be set by default... wählen. Dieses Vorgehen wird jedoch nicht empfohlen. • Sinnvoller ist es, wenn Sie für das TypoScript Ihrer Extension innerhalb des Ordners static die Dateien setup.txt, constants.txt bzw. editorcfg.txt anlegen. Dann fügen Sie zusätzlich in der Datei ext_tables.php den folgenden API-Aufruf ein:
Max. Linie
t3lib_extMgm::addStaticFile($_EXTKEY,'static/','Description of this TS-Setup');
794 | Kapitel 18: Frontend-Plugins weiter entwickeln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Damit hat der Anwender die Möglichkeit, im Template-Datensatz dieses TypoScript unter Include static (from extensions) einzubinden. Die Dateinamen müssen eingehalten werden. Der Ordnername ist frei wählbar und wird als zweiter Parameter im API-Aufruf übergeben. Verwenden Sie verschiedene Unterordner, z.B. static/cssbased/ und static/ htmlbased/, wenn Sie verschiedene Vorkonfigurationen zur Verfügung stellen möchten.
Der dritte Parameter description of this TS-Setup wird als Bezeichnung im Auswahlfeld verwendet, TYPO3 fügt als Hilfestellung im Auswahlfeld dann noch zusätzlich den Extension-Key hinten in Klammern hinzu. Beachten Sie, dass Sie bei der Bearbeitung dieser Dateien das Caching temporär deaktivieren können. Um das Caching im Frontend zu deaktivieren, verwenden Sie folgendes TypoScript-Setup: config.no_cache=1
Lizensiert für Markus Mueller
Im Install-Tool können Sie die Variable [EXT][extCache] = 0 setzen, um die Template-Dateien bei jedem Aufruf neu einlesen zu lassen. Vergessen Sie keinesfalls, diese Einstellungen für den späteren Produktivbetrieb rückgängig zu machen.
Im Übrigen fügt der Kickstarter unabhängig davon, ob Sie zusätzliches TypoScript einbinden, einige kleinere TypoScript-Schnipsel über einen Aufruf der Methode t3lib_extMgm:: addPItoST43 in den TypoScript-Baum ein. Dadurch wird zum einen ein USER- bzw. USRINT-Objekt im Pfad plugin.tx_extkey_pi1 erzeugt. Ein mit dem Kickstarter erstelltes Plugin wird wie folgt als USER oder USER_INT im TypoScript-Setup registriert: includeLibs { tx_extkey_pi1 = = tpo3conf/ext/extkey/pi1/class.tx_extkey_pi1.php } plugin { tx_extkey_pi1 = USER tx_extkey_pi1 { userFunc = tx_extkey_pi1->main } }
oder
Max. Linie
plugin { tx_extkey_pi1 = USER_INT tx_extkey_pi1 { userFunc = tx_extkey_pi1->main includeLibs = tpo3conf/ext/extkey/pi1/class.tx_extkey_pi1.php } }
18.1 TypoScript in eigenen Frontend-Plugins verwenden | 795 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Zusätzlich wird von diesem API-Aufruf, je nach Art des gewählten Plugins, eine Referenz auf diese Objekte erzeugt:
Links
// Add to 'Insert Plugin' list in Content Element' tt_content.list.20.ext_key_pi1 =< plugin.tx_extkey_pi1 // Add as a 'Menu/Sitemap' item tt_content.menu.20.ext_key_pi1 =< plugin.tx_extkey_pi1 // Add as a 'Textbox' type // Achtung: in css_styled_content ist dieses Inhaltselement standardmäßig nicht mehr verfügbar tt_content.splash.ext_key_pi1 =< plugin.tx_extkey_pi1 // Add as a totally new Content Element type tt_content.ext_key_pi1 = COA tt_content.ext_key_pi1 { 10 =< lib.stdheader 20 =< plugin.tx_extkey_pi1 } // Add as a new header type lib.stdheader.10.ext_key_pi1 =< plugin.tx_extkey_pi1 // Just include library // sofern das Kontrollkästchen "Provide TypoScript example for USER cObject // in 'page.1000'" aktiviert wurde page.1000 =< plugin.tx_extkey_pi1 Lizensiert für Markus Mueller
Versuchen Sie ruhig einmal, den TypoScript-Object-Browser oder die optionale Extension WebTemplate, View default TS (tstemplate_viewdefault) zu verwenden, um die eben gezeigten Codebeispiele nachzuvollziehen.
Zusätzliche Hinweise zur Verarbeitung von TypoScript in einer Extension Natürlich können Sie auch verschachtelte TypoScript-Eigenschaften auswerten. Als Beispiel verwenden wir folgendes TypoScript-Setup: plugin { tx_extkey_pi1 { listView = 1 listView { renderObj = TEMPLATE renderObj { // gewöhnliche TS-Eigenschaften des TEMPLATE-Objekts // subparts // marks } } }
Zur Auswertung könnte der folgende PHP-Code genutzt werden:
Max. Linie
class tx_extkey_pi1 extends tslib_pibase { // [...] function main($content,$conf) {
796 | Kapitel 18: Frontend-Plugins weiter entwickeln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
$content = '';
// zur Sicherheit setzen wir $content auf einen leeren String // wir werden $content auch als Rückgabewert verwenden if ($conf[listView'] && isset($conf[listView.']['renderObj']) && is_array($conf[listView.']['renderObj.'])) { $content .= $this->cObj->cObjGetSingle( $conf['listView.']['renderObj'], $conf['listView.']['renderObj.'] ); } $content = $this->cObj->wrap($content,$conf['finalWrap']); return $content; } }
Lizensiert für Markus Mueller
Zunächst schalten wir eine if-Abfrage vor, um zu testen, ob die Eigenschaften überhaupt entsprechend gesetzt sind. Als Erstes prüfen wir dabei über $conf['listView'], ob die Eigenschaft listView selbst gesetzt ist. Als zweite Prüfung können Sie erkennen, dass wir auf die TypoScript-Eigenschaft listView.renderObj zugreifen, indem wir die Variable $conf['listView.']['renderObj'] prüfen. Achten Sie dabei auf den Punkt beim Schlüssel listView. Untergeordnete TypoScript-Eigenschaften liegen immer als Array in einem Schlüssel, der aus der Bezeichnung der übergeordneten Eigenschaft mit einem angehängten Punkt besteht. Auf TypoScript-Eigenschaften unterhalb listView { eigenschaft1 = wert1 eigenschaft2 = wert2 }
wird mit $conf['listView.']['eigenschaft1'] usw. zugegriffen.
Als letzte Abfrage prüfen wir, ob auch unterhalb von renderObj noch eine Konfiguration vorhanden ist. Nur wenn diese Bedingungen alle erfüllt sind, wird der folgende API-Aufruf ausgeführt. Dieser Funktionsaufruf $this->cObj->cObjGetSingle($name,$conf) ist eine Möglichkeit, jedes beliebige TypoScript-Objekt aus PHP heraus zu nutzen. Als erster Parameter wird dabei die Bezeichnung des TypoScript-Objekts erwartet (CONTENT, FILE, HMENU, TEMPLATE, GIFBUILDER, ...), der zweite Parameter ist ein Array mit TypoScript-Eigenschaften. Wir machen uns das zu Nutze und übergeben als Erstes den Wert $conf['listView.']['renderObj'] als gewünschtes TypoScript-Objekt und als Konfiguration mit $conf['listView.']['renderObj.'] alle darunter befindlichen definierten Eigenschaften.
Max. Linie
Max. Linie 18.1 TypoScript in eigenen Frontend-Plugins verwenden | 797 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Links Die Variable $conf hat prinzipbedingt nur einen lokalen Geltungsbereich innerhalb der Methode function main($content,$conf). Da in Plugins typischerweise aus mehreren verschiedenen Methoden auf die TypoScript-Konfiguration zugegriffen werden soll, wird die Variable $conf in der Regel zu Beginn der Methode main wie folgt in eine Klassenvariable kopiert: $this->conf = $conf;
Damit steht das übergebene TypoScript-Array dann über $this->conf in allen Methoden der Klasse zur Verfügung.
Siehe auch Die Rezepte 16.4, 16.5 und 16.6 zeigen, wie Sie verschiedene Arten eigener FrontendPlugins mit dem Kickstarter anlegen, und geben weitere Tipps zur jeweiligen Umsetzung. Das Rezept 17.1 gibt Ihnen einige Tipps dazu, wie Sie den Einstieg zur Verwendung verschiedener weiterer Methoden aus der TYPO3-API finden.
18.2 Werte aus Flexform-Feldern auswerten Lizensiert für Markus Mueller
Problem Sie möchten die Werte aus einem Flexform-Feld auslesen und damit Ihr Plugin parametrisieren.
Lösung Binden Sie folgenden Code in die Funktion main() Ihrer Extension ein: $flexformWerte = $this->pi_initPIflexForm();
Dadurch wird die XML-Struktur aus dem Datenbankfeld pi_flexform des aktuellen Datensatzes ausgelesen und in ein PHP-Array umgewandelt. Auf dieses Array haben Sie über die Funktion pi_getFFvalue() Zugriff auf die in der XML-Struktur gespeicherten Werte: $cObjData = $this->cObj->data['pi_flexform']; $flexformWert = $this->pi_getFFvalue($cObjData, 'feldname');
Über diese API-Funktionen können Sie bequem auf die Werte zugreifen, die Sie in der Flexform-Struktur ablegen.
Diskussion
Max. Linie
Durch die Funktion pi_initPIflexForm() wird standardmäßig das Feld pi_flexform des aktuellen Datensatzes ausgelesen und in ein PHP-Array umgewandelt. Auf dieses PHPArray könnten Sie dann über die Array-Syntax zugreifen:
798 | Kapitel 18: Frontend-Plugins weiter entwickeln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
$flexformWert = $this->cObj->data['pi_flexform'][...];
Jedoch ist der direkte Zugriff auf die Flexform-Struktur nicht zu empfehlen. Abgesehen von der umständlichen Schreibweise können Sie auch wichtige Features wie etwa die Handhabung mehrsprachiger Flexforms nicht ohne weitere Programmierarbeit nutzen. Um die Zugriffe auf die Array-Struktur zu vereinfachen, gibt es die Funktion pi_getFFvalue(), die alle wesentlichen Features für Sie bereits implementiert. Dabei werden immer nur die Werte aus dem Standardsheet sDEF ausgelesen. Wenn Sie mehrere Sheets in Ihrer XML-Struktur eingebunden haben, müssen Sie als dritten Parameter den Sheetnamen angeben: $flexformWert = $this->pi_getFFvalue($cObjData, 'feldname', 'sheetname');
Sie können auch anstelle des Felds pi_flexform andere Flexform-Felder einbinden und deren Konfiguration auswerten. Übergeben Sie dafür einfach den Feldnamen als Funktionsparameter: $feldname = 'flexform_feld'; $flexformWerte = $this->pi_initPIflexForm($feldname);
Selbstverständlich können Sie ebenfalls auf diese Weise mehrere Flexform-Felder auslesen: Lizensiert für Markus Mueller
$flexformWerte1 = $this->pi_initPIflexForm('feldname1'); $flexformWerte2 = $this->pi_initPIflexForm('feldname2');
Somit haben Sie mit wenigen Methoden einen bequemen Zugriff auf Ihre Konfigurationsparameter, die Sie in den Flexform-Feldern ablegen, ohne sich über die verwendete XMLStruktur Gedanken machen zu müssen.
Siehe auch In Rezept 19.2 erfahren Sie, wie Sie Flexform-Felder in die Eingabemasken Ihres Plugins einbinden, um die Einstellungen bequem über das TYPO3-Backend vorzunehmen.
18.3 Hyperlinks erzeugen Problem Sie möchten in Ihrem Frontend-Plugin Verknüpfungen zu Webseiten, E-Mail-Adressen oder Dateien erstellen.
Lösung
Max. Linie
Verwenden Sie die Funktion pi_linkToPage(), die Sie in Frontend-Plugins direkt über $this-> pi_linkToPage() ansprechen können.
18.3 Hyperlinks erzeugen | 799 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Dieser Funktion übergeben Sie zwei Parameter: Mit dem ersten Wert geben Sie den Text an, den Sie verlinken möchten. Als zweiten Wert legen Sie das Ziel der Verknüpfung fest, mit dem der Text verknüpft werden soll:
Links
$this->pi_linkToPage($link_text, $ziel);
Als Ziel können Sie eine Seiten-ID, eine HTTP-Adresse, eine Datei oder eine E-MailAdresse angeben. Die Seiten-ID wird dabei automatisch in die richtige URL für Ihre TYPO3-Installation umgewandelt. Mit folgendem Code erstellen Sie einen Hyperlink zur Seite mit der ID 1 in Ihrer TYPO3-Installation: $this->pi_linkToPage('Startseite', 1);
Das Ergebnis dieses Funktionsaufrufs wäre der HTML-Code Startseite.
Zusätzlich zu diesen beiden Parametern gibt es noch zwei weitere optionale Parameter, mit denen Sie das Linkverhalten anpassen können. Mit dem dritten Parameter definieren Sie ein Zielfenster. Falls Sie zusätzliche GET-Parameter mit dem Link transportieren möchten, können Sie diese über den vierten Parameter definieren. Mit dem folgenden Code erzeugen Sie zum Beispiel einen Hyperlink, der die Seite mit der ID 1 als Seitentyp 98 in einem neuen Fenster aufruft: Lizensiert für Markus Mueller
$query_string = array( 'type' => '98', ); $this->pi_linkToPage('Startseite', 1, '_blank', $query_string);
Der Parameter type wird dabei automatisch in den entsprechenden Query-String umgewandelt. Wenn Sie lediglich die Adresse des Hyperlinks benötigen, können Sie diese mit folgender Funktion ermitteln: $this->pi_getPageLink(1, '_blank', $query_string);
Als Ergebnis erhalten Sie hier den Wert index.php?id=1&type=98 zurück. Beachten Sie, dass Sie die GET-Parameter nur an interne Seiten weitergeben können. Wenn Sie als Ziel eine externe Seite angeben, wird der vierte Parameter für den Query-String ignoriert.
Diskussion
Max. Linie
Mit den oben genannten Funktionen lassen sich sehr leicht einfache Hyperlinks erzeugen. Ein großer Vorteil der Verwendung dieser Funktionen ist, dass Sie sich um die eigentliche Verlinkung nicht mehr kümmern müssen und sich eine Menge Schreibarbeit sparen. Außerdem werden Verknüpfungen zu internen Seiten automatisch auf ihre Gültigkeit hin überprüft und ausgeblendet, wenn die entsprechende Seite nicht sichtbar ist oder der aktuelle Benutzer nicht über die nötigen Rechte verfügt, diese zu sehen. Solche Kontrollmechanismen von Hand zu implementieren, wäre sehr aufwendig und unnötig.
800 | Kapitel 18: Frontend-Plugins weiter entwickeln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Vermeiden Sie daher die direkte Verwendung von Hyperlinks und greifen Sie so oft wie möglich auf die Funktionen von TYPO3 zurück. Zudem wertet TYPO3 automatisch die nötigen Einstellungen für die jeweiligen Rendering-Methoden für Hyperlinks aus. So ist sichergestellt, dass Ihre Hyperlinks wie alle anderen Hyperlinks dargestellt werden. Mehr über diese Rendering-Mechanismen erfahren Sie in Rezept 9.7.
Wenn Sie in Ihrem Frontend-Plugin mit umfangreichen Query-Strings arbeiten müssen, kann die oben genannte Methode schnell unhandlich werden. TYPO3 bietet Ihnen für diesen Fall zwei weitere Funktionen an, mit denen Sie automatisch einen Query-String aus den aktuell gesetzten Plugin-Variablen (den sogenannten piVars) generieren können. Diese beiden Funktionen generieren automatisch einen Hyperlink zur aktuellen Seite und fügen der Adresse einen Query-String aus den jeweiligen Plugin-Variablen an. Im folgenden Beispiel verknüpfen Sie über den Funktionsaufruf pi_linkTP_keepPIvars die Wörter TYPO3 Kochbuch mit einem Hyperlink auf die aktuelle Seite. TYPO3 hängt diesem Hyperlink automatisch den Wert der Plugin-Variablen t3kb als GET-Parameter an: $this->piVars['t3kb'] = 'TYPO3-Rezepte'; $this->pi_linkTP_keepPIvars('TYPO3 Kochbuch'); Lizensiert für Markus Mueller
Auch diese Funktion unterstützt weitere Parameter, mit denen Sie das Linkverhalten sehr flexibel beeinflussen können: Falls Sie eine Variable im Query-String ausblenden oder für diesen Link ändern möchten, können Sie über den zweiten Parameter ein Array angeben, in dem Sie die Anpassungen vornehmen: $this->piVars['t3kb'] = 'TYPO3-Rezepte'; $this->pi_linkTP_keepPIvars( 'TYPO3 Kochbuch', array( 't3kb' => 'Spezielles TYPO3-Rezept' ) );
Außerdem werden Sie feststellen, dass TYPO3 der Linkadresse automatisch einen weiteren Parameter no_cache anfügt. Dieser Parameter dient dazu, dass die aufgerufene Seite direkt ausgelesen bzw. von TYPO3 neu erzeugt wird, sodass die Parameter beim Erstellen der Seite berücksichtigt werden können. Andernfalls würde die Seite aus dem Cache gelesen, und der Parameter würde nicht interpretiert werden. Dieses Standardverhalten können Sie weiter optimieren, indem Sie den dritten Parameter auf 1 setzen. TYPO3 berücksichtigt dann bei der Erzeugung des Hyperlinks die angegebenen Parameter und fügt zusätzlich einen sogenannten cHash-Parameter hinzu (cHash bedeutet Cache-Hash und besteht aus einer Prüfsumme der übergebenen GET-Parameter).
Max. Linie
Dieser cHash-Parameter wird dabei dynamisch aus den aktuellen Query-String-Parametern erzeugt und stellt eine Prüfsumme dar, anhand deren TYPO3 kontrolliert, ob die aufgerufene Adresse mitsamt ihrer Parameter gültig ist. Wenn sie gültig ist, wird die so
18.3 Hyperlinks erzeugen | 801 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
aufgerufene Seite im Seiten-Cache zwischengespeichert und kann dadurch beim nächsten Aufruf (mit identischen Parametern) schneller ausgelesen werden. Stimmt die Prüfsumme nicht mit den überlieferten Angaben im Query-String überein, wird die Seite nicht gecacht ausgegeben. Ist ein cHash-Parameter vorhanden, wird der Parameter no_ cache ausgeblendet.
Links
Diese beiden Objektvariablen sind im Zusammenhang mit dem Caching wichtig: $pi_USER_INT_obj = FALSE;
Falls Sie diesen cHash in der Adresse nicht entdecken, haben Sie sehr wahrscheinlich bei der Erstellung des Frontend-Plugins USER_INT ausgewählt. USER_INT-Objekte werden standardmäßig nicht im Cache gespeichert. Daher kann hier dieser GET-Parameter entfallen. Achten Sie darauf, dass Sie bei USER_INT-Objekten die Plugin-Variable pi_USER_INT_obj mit $this->pi_USER_INT_obj = 1 aktivieren. Dadurch wird der cHashParameter nicht erzeugt, und die Seite wird bei jedem Aufruf neu generiert. $pi_checkCHash = TRUE;
Die verlinkte Seite wird nur dann im Cache gespeichert, wenn bei ihrem Aufruf ein gültiger cHash-Parameter übergeben wurde. Wenn der cHash-Parameter nicht mit den übermittelten Parametern übereinstimmt, legt TYPO3 die Seite nicht im Cache ab und generiert sie vollständig neu. Lizensiert für Markus Mueller
Eine weitere hilfreiche Option bietet der vierte Parameter. Damit können Sie die automatische Übernahme der Klassenvariablen (piVars) in der URL deaktivieren. Der Vorteil gegenüber der in der Lösung gezeigten Funktion pi_linkToPage besteht darin, dass Sie nun mit dem zweiten Parameter automatisch auf komfortable Art und Weise neue piVars erzeugen können, die so nicht zwingend vorher in Ihrem Skript definiert worden sein müssen. Abschließend können Sie noch eine alternative Zieladresse angeben, beispielsweise wenn Sie Ihr Frontend-Plugin über unterschiedliche Seiten verteilt haben. Mit dem folgenden Funktionsaufruf erweitern Sie den zuvor erzeugten Hyperlink, indem Sie die Cache-Einstellungen anpassen und eine alternative Seiten-ID angeben: $this->piVars['t3kb'] = 'TYPO3-Rezepte'; $this->pi_linkTP_keepPIvars('TYPO3 Kochbuch', array(), 1, 0, 2);
Wenn Sie nur die URL benötigen, können Sie folgende Funktion verwenden. Diese ist – bis auf die Angabe des verlinkten Texts – identisch mit dem oben genannten Funktionsaufruf: $this->pi_linkTP_keepPIvars_url(array(), 1, 0, 2);
Sollten Sie sich wundern, woher die Sonderzeichen in Ihrer URL kommen: TYPO3 erzeugt den Hyperlink XHTML-konform. Das bedeutet, dass sämtliche Sonderzeichen in HTML-Entities umgewandelt werden (beispielsweise steht »&« für das ursprüngliche &-Zeichen, durch das die Parameter voneinander getrennt werden. Leerzeichen werden mit »%20« kodiert.
Max. Linie
Max. Linie 802 | Kapitel 18: Frontend-Plugins weiter entwickeln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Siehe auch Eine andere Art, Hyperlinks im Frontend zu erzeugen, bieten die sogenannten Tags. In Rezept 16.6 erfahren Sie, wie Sie Tags im Frontend effektiv einsetzen können. Mehr über die technischen Hintergründe des cHash-Parameters erfahren Sie unter der Adresse http:// typo3.org/development/articles/the-mysteries-of-chash/.
18.4 Eigene Datensätze mit individuellen Linkfunktionen verlinken Problem Sie möchten Hyperlinks zu eigenen Datensätzen genauso komfortabel einpflegen, wie dies mit Links zu TYPO3-Seiten möglich ist. Zum Beispiel möchten Sie Hyperlinks auf einzelne Adressen oder News setzen, die dann auf eine spezielle Detailseite zeigen und dort die Detailansicht des Datensatzes ausgeben.
Lösung Lizensiert für Markus Mueller
Erstellen Sie eine neue Extension und erweitern Sie die TYPO3-Linkfunktionen um einen eigenen Link-Handler. Link-Handler legen fest, wie Werte aus dem Linkfeld von TYPO3 auf der Webseite ausgegeben werden. Ihren Link definieren Sie wie gewohnt über die TYPO3-Linkfelder. Jedoch müssen Sie hierbei ein Schlüsselwort definieren, anhand dessen TYPO3 erkennt, dass der Link über Ihr Skript verarbeitet werden soll. Ein solches Schlüsselwort kann zum Beispiel benutzer sein. Alle Links, die mit diesem Schlüsselwort erzeugt werden, führen dann auf eine Seite mit dem Benutzerprofil der übergebenen ID. Zum Beispiel würde dann benutzer:11 auf das Benutzerprofil des Benutzers mit der ID 11 zeigen. Um dieses Linkverhalten zu implementieren, erstellen Sie einen eigenen Link-Handler, der die Links dann über ein eigenes PHP-Skript nach Ihren Wünschen auflöst. Im PHP-Skript können Sie die Link-Logik – analog zu den Typolink-Einstellungen im TypoScript-Setup – festlegen. Gehen Sie dabei so vor: 1. Erstellen Sie die Datei class.linkHandler.php im Extension-Verzeichnis. 2. Fügen Sie das PHP-Grundgerüst in die Datei ein.
Max. Linie
Die Datei class.linkHandler.php enthält eine Klasse tx_linkHandler. Das Präfix tx_ ist sehr wichtig, damit TYPO3 die Klasse verarbeiten kann. In dieser Klasse definieren Sie eine Funktion mit dem Namen main(). Diese Funktion enthält später die vollständige Logik dazu, wie der Link von TYPO3 zusammengesetzt wird. Die
18.4 Eigene Datensätze mit individuellen Linkfunktionen verlinken | 803 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Funktion erwartet zahlreiche Übergabeparameter. Unter anderem wird auch das aufrufende Objekt im Parameter $pObj übergeben, sodass Ihnen im Link-Handler alle Informationen über dieses Objekt zur Verfügung stehen. 3. Implementieren Sie die Logik des Link-Handlers.
Links
Erweitern Sie nun das Grundgerüst der Funktion main() um die eigentliche Programmlogik. Der Code ist wie folgt aufgebaut (zur besseren Übersicht haben wir den Code eingerückt): function main( $linktxt, $conf, $linkHandlerKeyword, $linkHandlerValue, $link_param, &$pObj ) { $lconf = array(); $lconf['parameter'] = seiten_id; $lconf['additionalParams'] = '&tx_extkey[showUid]='.intval($linkHandlerValue); $content = $pObj->typoLink($linktxt, $lconf); return $content; Lizensiert für Markus Mueller
}
Bevor diese Funktion von TYPO3 aufgerufen wird, wird der Wert, mit dem der Link aufgerufen wird, analysiert und aufgeteilt. Der Name des Link-Handlers wird im Wert $linkHandlerKeyword gespeichert. Den Wert, mit dem der Link-Handler aufgerufen wird, finden Sie in $linkHandlerValue. In unserem Beispiel wird dieser Wert zuerst zur Sicherheit in einen Zahlenwert umgewandelt und dann als GET-Parameter showUid an den endgültigen Link gehängt. Die Syntax des GET-Parameters zeigt wiederum den Standardwert für eine Detailansicht in einem Frontend-Plugin, das Sie mit dem Kickstarter erstellt haben. Die anderen Parameter können Sie für diesen Anwendungsfall ignorieren. Als Parameter geben Sie eine ID des Datensatzes an, auf dessen Detailseite Sie verlinken möchten. Auf der Seite sollte ein Frontend-Plugin den GET-Parameter daher sinnvoll weiterverarbeiten. Andernfalls wird der Wert von TYPO3 ignoriert. Ebenfalls sollte die Zielseite erreichbar sein. TYPO3 wird den Link nicht erzeugen, wenn die Seite unsichtbar ist oder vom aktuellen Frontend-Benutzer nicht gesehen werden darf. 4. Registrieren Sie den Link-Handler in der Datei ext_localconf.php. Abschließend registrieren Sie den Link an der TYPO3-API:
Max. Linie
$TYPO3_CONF_VARS['SC_OPTIONS'] ['tslib/class.tslib_content.php'] ['typolinkLinkHandler'] ['link_handler_name'] = 'EXT:ext_key/class.linkHandler.php:&tx_linkHandler';
804 | Kapitel 18: Frontend-Plugins weiter entwickeln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Mit diesem Code registrieren Sie Ihre PHP-Funktion an der Typolink-Funktion von TYPO3. Achten Sie darauf, dass Sie die hervorgehobenen Werte an Ihre Einstellungen anpassen. In unserem Beispiel wäre link_handler_name der Wert benutzer. Besonders wichtig ist, dass der hervorgehobene Parameter tx_linkHandler mit dem Klassennamen des Link-Handlers in der Datei class.linkHandler.php übereinstimmt. Leeren Sie abschließend den Extension-Cache über das Backend, damit die neuen Extension-Eigenschaften von TYPO3 übernommen werden, und testen Sie Ihren Link-Handler. Geben Sie dazu in ein Linkfeld einen passenden Wert nach dem Muster benutzer: benutzer_id ein und prüfen Sie das Ergebnis im Frontend. Der Link sollte nach diesem Muster umgesetzt sein:
Durch dieses Vorgehen ist es sehr leicht möglich, Links zu eigenen Datensätzen zu formulieren, ohne auf die gewohnten Eingabemethoden zu verzichten.
Diskussion
Lizensiert für Markus Mueller
Selbstverständlich können Sie auch mehrere Link-Handler registrieren, indem Sie weitere Dateien in der Datei ext_localconf.php nacheinander registrieren. Die Link-Handler werden dann von TYPO3 in dieser Reihenfolge nacheinander abgearbeitet. Die so registrierten Link-Handler werden wie normale -Tags verwendet. Normalerweise geben Sie die Seiten-ID in das Eingabefeld ein, oder Sie erzeugen die Links mit dem -Tag nach dem Muster Linkbeschreibung. Mit der hier beschriebenen Methode können Sie diese Methoden weiterhin nutzen und müssen nur anstatt der normalen Seiten-ID den Linkhandler mit der ID des Datensatzes angeben: Linkbeschreibung
Wenn Sie sich die Funktion main() im Link-Handler genauer betrachten, werden Sie feststellen, dass wir keine Links mit dem a-Tag erzeugen und an TYPO3 zurückgeben – was theoretisch auch möglich wäre. Stattdessen nutzen wir die Typolink-Funktionen von TYPO3 und stellen somit sicher, dass die Links, unabhängig vom verwendeten RenderMechanismus für die Hyperlinks, korrekt ausgegeben werden. Die so erzeugten Links sind dadurch vollständig standardkonform und werden wie normale Hyperlinks in TYPO3 auch unabhängig von der Render-Methode ausgegeben (in Rezept 8.7 erfahren Sie mehr über diese Render-Methoden). Alle Typolink-Eigenschaften werden in der Variablen $lconf gespeichert und an die Typolink-Funktion übergeben. Indem Sie diese Parameter angeben bzw. anpassen, nehmen Sie direkt Einfluss auf die Generierung des Hyperlinks.
Max. Linie
Im folgenden Beispiel erzeugen wir über die Typolink-Eigenschaft useCacheHash = 1 automatisch den passenden cHash-Parameter für die verwendeten Parameter des Hyperlinks.
18.4 Eigene Datensätze mit individuellen Linkfunktionen verlinken | 805 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
TYPO3 erzeugt für alle GET-Parameter des erzeugten Links einen cHash, sodass die aufgerufene Seite gecacht werden kann:
Links
function main( ... $lconf = array(); $lconf['useCacheHash'] = 1; $lconf['parameter'] = seiten_id; $lconf['additionalParams'] = '&tx_extkey[showUid]='.intval($linkHandlerValue); $content = $pObj->typoLink($linktxt, $lconf); return $content;
Dadurch, dass Sie die Typolink-Funktionen von TYPO3 verwenden, haben Sie auch automatisch Zugriff auf die Typolink-Eigenschaften, was weitere individuelle Einstellungen sehr leicht ermöglicht.
Siehe auch
Lizensiert für Markus Mueller
Alle Typolink-Parameter werden in der TypoScript-Referenz beschrieben, die Sie unter der Adresse http://typo3.org/documentation/document-library/references/doc_core_tsref/ finden. Eine alternative Möglichkeit, eigene Link-Methoden in TYPO3 zu implementieren, finden Sie in Rezept 16.6. Der Unterschied zur dort beschriebenen Methode ist, dass Sie mit der hier gezeigten Methode die gewohnten Linkfelder normal weiterverwenden können. Eigene Tags können Sie nur in Fließtexten verwenden. Rezept 17.3 geht auf die Grundprinzipien von Hooks ein.
18.5 Benutzerdaten in Sessions speichern Problem Sie möchten Benutzereingaben seitenübergreifend speichern, beispielsweise um diese seitenübergreifend darzustellen und Ihre Webseite ansprechender zu gestalten.
Lösung Verwalten Sie die gewünschten Session-Daten mit den beiden Methoden setKey und getKey über das Frontend-Benutzerobjekt.
Max. Linie
Mit dem Funktionsaufruf setKey speichern Sie den Inhalt einer beliebigen Variablen in der aktuellen Session eines Benutzers. Die Variable $var wird dabei unter dem SessionNamen variablen_name registriert. Über diesen Session-Namen können Sie den Wert der Variablen anschließend an anderer Stelle wieder auslesen. Abschließend müssen Sie diesen Wert noch mit dem Befehl storeSessionData in der Datenbank abspeichern. Der
806 | Kapitel 18: Frontend-Plugins weiter entwickeln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Variableninhalt wird dadurch serialisiert in der Session-Tabelle fe_session_data gespeichert. Die beiden Funktionsaufrufe sind dabei stets nach folgendem Muster aufgebaut: $var = 'T3KB'; $GLOBALS['TSFE']->fe_user->setKey('ses', 'session_name', $var); $GLOBALS['TSFE']->storeSessionData();
Um den Wert zu einem anderen Zeitpunkt wieder auszulesen, verwenden Sie die Methode getKey. Dort ermitteln Sie anhand des Session-Namens erneut den gewünschten Wert: $var = $GLOBALS['TSFE']->fe_user->getKey('ses','session_name');
Die so gespeicherten Werte stehen Ihnen so lange zur Verfügung, bis der Besucher das Browserfenster schließt und die Session somit beendet.
Diskussion
Lizensiert für Markus Mueller
TYPO3 erstellt für jeden Besucher standardmäßig automatisch ein Cookie, in dem ein eindeutiger Hash-Wert gespeichert wird, mit dem der Besucher eindeutig einer Session zugewiesen werden kann, wenn Sie mit der anfangs beschriebenen Funktion Daten in der Session speichern. Mit diesen genannten Methoden können Sie bequem auf diese Session zugreifen und Werte zwischenspeichern, sodass diese auch bei verteilten Seitenaufrufen zur Verfügung stehen und ausgewertet werden können. Wenn der Besucher Ihre Website wieder verlässt und das Browserfenster schließt, kann die Session nicht mehr aufrechterhalten werden und zerfällt. Was aber, wenn Sie die Daten eines angemeldeten Benutzers auch dann noch speichern möchten, wenn er das Browserfenster geschlossen hat? Um die Werte über diese Grenze hinaus an den Nutzer zu binden, muss dieser dem System, etwa als ein gültiger Frontend-Nutzer, bekannt sein, da es sonst keine verlässliche Möglichkeit gibt, einen Besucher eindeutig zuzuordnen. Für registrierte Frontend-Nutzer stellt TYPO3 Ihnen einen speziellen Namensraum zur Verfügung, in dem die Session-Werte nicht wie bei anonymen Besuchern in der Tabelle fe_ session_data gespeichert werden, sondern direkt in dem Benutzerdatensatz in der Tabelle fe_users im Feld uc (uc bedeutet hier User Configuration bzw. Benutzereinstellungen). Um die Werte für den jeweiligen Nutzer zu speichern, ersetzen Sie in den anfangs gezeigten Funktionsaufrufen den Wert ses durch den Wert user, sodass Sie am Ende folgenden Code erhalten: $var = 'T3KB'; $GLOBALS['TSFE']->fe_user->setKey('user', 'session_name', $var); $GLOBALS['TSFE']->storeSessionData();
Mit dem Key 'user' binden Sie die Session-Daten an einen speziellen registrierten Frontend-Benutzer. Somit wird es möglich, die Inhalte auch noch aufrechtzuerhalten, wenn das Browserfenster des Besuchers geschlossen wurde. So können Sie beispielsweise mit
Max. Linie
Max. Linie 18.5 Benutzerdaten in Sessions speichern | 807 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
dem folgenden Funktionsaufruf den Inhalt der Variablen ausgeben, wenn sich der Benutzer erneut anmeldet:
Links
$var = $GLOBALS['TSFE']->fe_user->getKey('user','session_name');
Seien Sie sich darüber im Klaren, dass die Session-ID auch durch eine unsichere HTTP-Verbindung ausspioniert und die Session dann durch den Angreifer übernommen werden kann. Ein solcher Vorgang wird auch als Session-Hijacking bezeichnet. Achten Sie darauf, dass Sie zumindest die Anmeldung eines Frontend-Benutzers über eine HTTPS-Verbindung absichern.
18.6 CSS- und JavaScript-Dateien einbinden Problem Sie möchten über Ihr Frontend-Plugin CSS- oder JavaScript-Dateien oder ganze Bibliotheken im -Bereich Ihrer Webseiten einbinden, sodass die Dateien für die Darstellung der Webseiten genutzt werden können. Die Dateien sollen aus Performancegründen nur dann eingebunden werden, wenn das Plugin auf der Webseite eingebunden ist. Lizensiert für Markus Mueller
Lösung Weisen Sie in Ihrem Frontend-Plugin über die beiden Eigenschaften des PAGE-Objekts $GLOBALS['TSFE']->additionalCSS[] beziehungsweise $GLOBALS['TSFE']->additionalJavaScript[] die gewünschten Dateien oder auch Code zu. Eine solche Zuweisung definieren Sie nach diesem Muster: $jsDatei = 'Dateipfad'; $GLOBALS['TSFE']->additionalJavaScript[] = $jsDatei;
Die Zuweisung für CSS ist sehr ähnlich. Verwenden Sie dazu folgenden Code: $cssDatei = 'Dateipfad'; $GLOBALS['TSFE']->additionalCSS[] = $cssDatei;
Nachdem Sie den Frontend-Cache geleert haben, bindet TYPO3 Ihre Angaben dann beim nächsten Aufruf der Seite ein, auf dem das Plugin liegt.
Diskussion Mit den gezeigten Funktionen können Sie ressourcenschonend externe JavaScript- oder CSS-Dateien einbinden. TYPO3 berücksichtigt die Daten nur, wenn das jeweilige Plugin auf der Seite eingebunden ist, sodass sich die Ladeseiten der Webseiten zum Teil erheblich verbessern können.
Max. Linie
Als Schlüsselwert sollten Sie einen eindeutigen Wert nehmen. Hierfür hat sich der Extension-Key bewährt, da er eindeutig ist und so einen sicheren Namensraum für Ihre Anpas-
808 | Kapitel 18: Frontend-Plugins weiter entwickeln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
sungen bietet. Dadurch verhindern Sie Nebeneffekte mit anderen Extensions. Es steht Ihnen jedoch frei, auch andere Werte zu nutzen oder den Schlüsselwert – wie in der Lösung gezeigt – ganz leer lassen, damit PHP automatisch einen numerischen Schlüsselwert generiert. Um die Beispiele hier nachvollziehbarer zu halten, verwenden wir nun den Extension-Key: $GLOBALS['TSFE']->additionalJavaScript[$this->extKey] = $jsDatei;
beziehungsweise: $GLOBALS['TSFE']->additionalCSS[$this->extKey] = $cssDatei;
Folgende Schlüsselwerte sollten Sie unbedingt vermeiden, da sie von TYPO3 für interne Prozesse reserviert sind: JSFormValidate JSincludeFormupdate JSMenuCode JSMenuCode_menu JSCode JSImgCode
Um die Pfade zu den Dateien zu ermitteln, sollten Sie die passende API-Funktion von TYPO3 verwenden: Lizensiert für Markus Mueller
$pfad = t3lib_extMgm::siteRelPath($this->extKey);
Über den Wert $this->extKey erhalten Sie automatisch den Link zur aktuellen Extension. Details zu diesen API-Funktionen finden Sie in Rezept 16.3. Wenn Sie es vorziehen, den JavaScript-Code direkt anzugeben, sollten Sie den Code noch mit der API-Funktion t3lib_div::wrapJS() für die Ausgabe im Browser maskieren: $jsCode = 'JS-Code'; $jsCode = t3lib_div::wrapJS($jsCode); $GLOBALS['TSFE']->additionalHeaderData[$this->extKey] = $jsCode;
Aus Performancegründen sollten Sie jedoch auf Inline-Code verzichten. Weitere Daten können Sie mit der allgemeinen Funktion angeben: $GLOBALS['TSFE']->additionalHeaderData[$this->extKey] = $jsCode;
Max. Linie
Ein häufiger Stolperstein ist, dass mehrere Extensions externe JavaScript- oder CSSDateien bzw. -Bibliotheken einbinden, die sich gegenseitig beeinflussen oder überlagern, wodurch es zu massiven Nebeneffekten kommen kann. Prüfen Sie daher vor der Installation einer Extension, ob die oben genannten PAGE-Eigenschaften erweitert werden. Machen Sie sich frühzeitig ein Bild davon, ob die Extension das Seitenobjekt manipuliert bzw. erweitert. Die Einstellungen am Seitenobjekt können sich massiv auf die Performance Ihrer Website auswirken und sind im Produktivbetrieb einer Website meist schwer zu finden und zu ändern. Sie sollten daher stets darüber im Bilde sein, welche Extension welche Modifikation vornimmt.
18.6 CSS- und JavaScript-Dateien einbinden | 809 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Siehe auch
Links
Das Rezept 17.3 geht detailliert auf die Generierung von Pfaden innerhalb von TYPO3 ein. Beachten Sie, dass TYPO3 bereits mit umfangreichen JavaScript-Bibliotheken ausgeliefert wird, die Sie auch in Ihren Extensions nutzen können. Die beiden Rezepte 18.7 und 19.7 befassen sich mit diesen Möglichkeiten jeweils für Frontend-Plugins und Backend-Module. Rezept 9.2 zeigt Ihnen, wie Sie ohne eine eigene Extension CSS-Styles in den Seitenkopf einbinden können.
18.7 Schnelle Ajax-Schnittstellen per eID-Tag ermöglichen Problem Sie möchten in Ihrem Frontend-Plugin Ajax-Funktionen nutzen und Ihre Responses und Requests möglichst schnell abarbeiten.
Lösung Lizensiert für Markus Mueller
Nutzen Sie für Ihre Ajax-Kommunikation die eID-Schnittstelle von TYPO3. Darüber können Sie den regulären Renderprozess für Seiten umgehen und so erheblich schnellere Antwortzeiten erreichen als über normale TYPO3-Seiten. Öffnen Sie dazu die Datei ext_localconf.php in Ihrem Extension-Verzeichnis und registrieren Sie das PHP-Skript, das Ihren Ajax-Request verarbeitet, über folgende Syntax: $TYPO3_CONF_VARS['FE']['eID_include']['tx_extkey_pi1'] = 'EXT:ext_key/pi1/ajax.php';
Passen Sie die hervorgehobenen Werte an Ihre Bedürfnisse an. Der Parameter tx_extkey_ pi1 sorgt dafür, dass Ihre Dateireferenz in dem globalen Array $TYPO3_CONF_VARS eindeutig aufgelöst werden kann. Dadurch dass Sie den Extension-Key im Schlüsselwert verwenden, sorgen Sie dafür, dass der Wert nicht aus Versehen von anderen Extensions überschrieben wird. Der Wert EXT:ext_key/pi1/ajax.php gibt den Pfad zu Ihrem PHP-Skript an, das in dem Extension-Verzeichnis Ihrer Extension ext_key liegt. Selbstverständlich können Sie hier auch andere Pfade und Dateinamen angeben (in Rezept 18.2 finden Sie nützliche Tipps dazu, wie Sie Pfadangaben in TYPO3 bequem auflösen können). Die beiden ersten Schlüsselwerte werden so von TYPO3 erwartet und dürfen daher nicht angepasst werden. Der Wert FE zeigt an, dass die Einstellung von TYPO3 nur im Frontend ausgewertet wird. Im zweiten Parameter wird der Hookname angegeben.
Max. Linie
Wenn Sie diese Einstellungen gespeichert haben, können Sie den Ajax-Request in Ihrem JavaScript-Code über folgende Adresse aufrufen: http://www.example.com/?eID=tx_extkey_pi1
810 | Kapitel 18: Frontend-Plugins weiter entwickeln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Hierdurch wird der Inhalt Ihres PHP-Skripts direkt an den Browser zurückgegeben, den Sie dann über JavaScript weiterverarbeiten können.
Diskussion TYPO3 leitet den Request direkt nach dem Aufruf zu Ihrem PHP-Skript, ohne weitere TYPO3-Funktionen zu initiieren. Dadurch werden Ihre Requests genauso schnell beantwortet, als würden Sie das Skript direkt aufrufen. Wenn der GET-Parameter eID (Extension-ID) beim Request vorhanden ist, prüft TYPO3 vor dem Renderprozess der Seiten, ob das angegebene Skript lesbar ist, und bindet dann die nötigen Dateien ein, um eine möglichst komfortable Entwicklung zu ermöglichen. Selbstverständlich können Sie den Parameter eID auch mit weiteren GET- oder POSTParametern an das Skript senden und dort weiterverarbeiten: http://www.example.com/?eID=tx_extkey_pi1¶m=TYPO3 Kochbuch
Somit haben Sie zahlreiche Möglichkeiten, von außen auf das Skript einzuwirken. Um Ihr Skript gegen unbefugten Zugriff von außen abzusichern, können Sie am Anfang Ihrer PHP-Datei diese Sicherheitsabfrage einbinden: Lizensiert für Markus Mueller
Die Abfrage prüft mit einem Bit-Operator, ob die Konstante TYPO3_REQUESTTYPE dem Wert der Konstanten TYPO3_REQUESTTYPE_FE entspricht. Die Konstante TYPO3_REQUESTTYPE wird nur dann auf den Wert von TYPO3_REQUESTTYPE_FE gesetzt, wenn der Request im Frontend stattfindet. Dadurch können Sie verlässlich prüfen, ob das Skript direkt über den Browser oder wie gewünscht im TYPO3-Frontend aufgerufen wurde. Häufig kommt es vor, dass Sie in Ihrem Skript auch TYPO3-Einstellungen und Datensätze abfragen möchten. Wie schon erwähnt, werden bei der oben genannten Lösung bewusst alle TYPO3-Renderfunktionen umgangen, um die Antwortzeiten möglichst kurz zu halten. Dennoch besteht die Möglichkeit, weitere TYPO3-Funktionen in Ihr PHP-Skript nachzuladen und anschließend zu nutzen. TYPO3 bindet vor dem Aufruf Ihres Skripts auch die PHP-Klasse tslib_eidtools ein. Diese Klasse enthält statische Methoden, über die Sie Frontend-Benutzer und eine Datenbankverbindung herstellen können, wenn Sie diese Funktionalitäten benötigen. Hierzu können Sie diese statischen Methoden der Klasse tslib_eidtools nutzen:
Max. Linie
tslib_eidtools::initFeUser() Über diese Funktion erstellen Sie ein Frontend-User-Objekt, in dem Sie dann zum Beispiel Session-Daten ablegen können (Details dazu finden Sie in Rezept 18.5).
18.7 Schnelle Ajax-Schnittstellen per eID-Tag ermöglichen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 811
Max. Linie
tslib_eidtools::connectDB(); Über diese Funktion initiieren Sie das globale Datenbankobjekt, mit dem Sie dann über die gewohnten API-Funktionen Daten abfragen können. In Rezept 16.5 gehen wir näher auf diese Funktionen ein.
Links
Damit können Sie Ihre Skripten mit den gewohnten TYPO3-Funktionen erweitern. Die hier gezeigten Einstellungen eignen sich hervorragend, um schnelle Ajax-Requests in TYPO3 zu implementieren. Sobald Sie interaktive Webseiten mit Ajax entwickeln, sollten Sie diese Möglichkeiten nutzen, um die bestmögliche Performance und auch Benutzbarkeit für Ihre Besucher zu erreichen. Wenn Sie mehr Funktionen und Werte nutzen möchten oder müssen, sollten Sie abwägen, ob der hier gezeigte Ansatz wirklich die passende Lösung darstellt. Es kann mitunter sehr umständlich sein, alle nötigen Bibliotheken einzeln einzubinden und die Objekte richtig zu konfigurieren.
Lizensiert für Markus Mueller
Sollten Sie mit der oben gezeigten Lösung an Ihre Grenzen stoßen, können Sie auch überlegen, den gewohnten Weg über das TYPO3-Rendering zu gehen und für Ihre AjaxResponse einen eigenen Seitentyp anzulegen. Die Eigenschaften der Response können Sie dann sehr bequem über TypoScript konfigurieren und dabei gleichzeitig aus dem vollen Umfang des TYPO3-Frameworks schöpfen, ohne weitere Bibliotheken einbinden zu müssen. Ihr Response-Skript wird dabei wie ein normales PHP-Skript per TypoScript integriert: ajax_response = PAGE ajax_response { typeNum = 500 disableAllHeaderCode = 1 10 = USER_INT 10.includeLibs = EXT:ext_key/pi1/ajax.php }
In diesem Beispiel legen Sie mit dem Parameter typeNum den Seitentyp auf 500. Selbstverständlich können Sie den Seitenparameter an Ihre Bedürfnisse anpassen. Essenziell wichtig ist die Einstellung disableAllHeaderCode. Hierdurch wird sämtlicher HTML-Code von TYPO3 ausgeblendet. Über das USER_INT-Objekt binden Sie Ihr PHP-Skript ein und sorgen gleichzeitig dafür, dass die Ausgabe von TYPO3 nicht gecacht wird. Nachdem Sie das TypoScript-Template abgespeichert haben, können Sie über diese Adresse die Ausgabe Ihres PHP-Skripts betrachten: http://www.example.com/?type=500
Max. Linie
Die Ausgabe sollte identisch mit der anfangs genannten Lösung sein. Jedoch sind die Antwortzeiten dieses Skripts etwas langsamer als bei der ersten Lösung, da hier sehr viel mehr Bibliotheken und Funktionen abgearbeitet werden, bevor der eigentliche Inhalt an den Browser zurückgegeben wird. Dies kann sich vor allem bei häufigen und umfangreichen Ajax-Abfragen deutlich auf die Performance Ihrer JavaScript-Applikation auswirken.
812 | Kapitel 18: Frontend-Plugins weiter entwickeln This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Sie sollten daher genau prüfen, welche Daten Sie in Ihrem PHP-Skript verarbeiten müssen, bevor Sie sich für eine dieser Lösungen entscheiden. Wenn Sie Geschwindigkeit vorziehen, sollten Sie unbedingt die erste Lösung verwenden. Ist Ihnen mehr Komfort beim Entwickeln wichtig und die Geschwindigkeit eher nebensächlich, sollten Sie die zweite Lösung prüfen.
Siehe auch Der hier beschriebene Prozess verwendet eine bestimmte Form von Hooks. Das Rezept 17.13 beschreibt diesen Hooktyp im Detail, sodass Sie dieses Rezept besser nachvollziehen können. Die Einsatzmöglichkeiten von unterschiedlichen Seitentypen werden in Kapitel 9 näher beleuchtet. Wie Sie Ajax-Funktionalitäten im Backend einsetzen, erfahren Sie in Rezept 19.7. Eine Einführung in Ajax erhalten Sie im Buch Ajax von Kopf bis Fuß von Brett D. McLaughlin, O’Reilly Verlag. Weitere Informationen zu Bit-Operatoren finden Sie im PHP-Handbuch unter der Adresse http://www.php.net/manual/de/language. operators.bitwise.php.
Lizensiert für Markus Mueller
Max. Linie
Max. Linie 18.7 Schnelle Ajax-Schnittstellen per eID-Tag ermöglichen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 813
Vakat Lizensiert für Markus Mueller
First
Kapitel 19B
KAPITEL 19
Backend-Erweiterungen verfeinern
19.0 Einführung In diesem Kapitel gehen wir auf die Weiterentwicklung von Extensions ein, mit denen Sie das TYPO3-Backend beeinflussen können. Wenn Sie die Backend-Erweiterung mit dem Kickstarter erstellt haben, liegt die Rohfassung vor, die Sie mit diesen Rezepten ausbauen können. Lizensiert für Markus Mueller
Max. Linie
Im Großen und Ganzen dreht sich im Backend alles um die Eingabe und die Verwaltung von Daten bzw. Datensätzen, die in der TYPO3-Datenbank liegen. Wenn Sie BackendModule entwickeln, möchten Sie Parameter, die sich häufig ändern, konfigurierbar machen. Im Backend gibt es hierfür TSconfig. Wie Sie diese Konfigurationssprache für Ihre Zwecke nutzen, steht in Rezept 19.1. Häufig müssen auch Frontend-Plugins über das Backend mit unterschiedlichen Parametern versehen werden, zum Beispiel um die maximale Anzahl von Datensätzen auf der Webseite festzulegen. Um diese Parameter zu pflegen, benötigen Sie entweder für jeden Parameter ein eigenes Feld in der Datenbanktabelle oder eine bestimmte Konfigurationssprache, aus der Sie die Parameter dann auslösen. Beide Vorgehensweisen wurden in früheren TYPO3-Versionen genutzt und sind heute nicht mehr zeitgemäß, da sich große Nachteile in der Praxis zeigen. TYPO3 bietet für solche Fälle eine flexible Konfiguration über das Backend über sogenannte Flexform-Felder. Diese Felder können im Gegensatz zu normalen Formularfeldern beliebig erweitert werden, ohne Änderungen an der Datenbankstruktur zu erfordern. Wenn Sie planen, Ihr Frontend-Plugin über Parameter konfigurierbar zu machen, oder noch nicht genau wissen, welche Parameter erforderlich sein werden, sind Flexforms der optimale Weg, die Konfiguration zu ermöglichen. Die dafür nötigen Schritte werden in Rezept 19.2 erläutert. Wenn Sie zahlreiche Backend-Module erstellen, sollten Sie diese in eine Gruppe zusammenfassen, um die Übersichtlichkeit im Backend zu erhöhen. Eine genaue Anleitung, wie Sie solche Gruppen anlegen, erhalten Sie in Rezept 19.3.
| 815 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Ebenso ist eine möglichst eindeutige Darstellung der Inhalte für den Benutzer sehr wichtig, um einen schnellen Einblick in die vorliegenden Dateneigenschaften zu erhalten. In Rezept 19.4 erfahren Sie, wie Sie die Icons Ihrer Datensätze je nach Typ und Status des Datensatzes unterschiedlich darstellen können (ein möglicher Status wäre etwa versteckt oder sichtbar ab morgen). Das Rezept 19.5 geht darauf ein, wie Sie die Vorschau eines Plugins im Seitenmodul optimieren. Dadurch, dass Backend-Benutzer die wesentlichen Informationen des Plugins direkt sehen, können sie die Einstellungen schneller erfassen und beurteilen, ob das Plugin richtig eingestellt ist. Dadurch kann unter Umständen das Öffnen des Datensatzes entfallen, was die Arbeit im Backend erheblich beschleunigen kann.
Links
Ebenso muss die Funktionsweise eines Backend-Formulars möglichst schnell fassbar sein. In Rezept 19.6 erfahren Sie, wie Sie Ihr Backend-Formular mit einer kontextsensitiven Hilfe ausstatten. Diese Hilfefunktion ist direkt in die Benutzeroberflächen des TYPO3Backends integriert und kann vom Benutzer unmittelbar auf ein bestimmtes Objekt im aktiven Fenster bezogen ist. Wie Sie die Arbeit mit diesen Backend-Formularen angenehmer gestalten können, wird in Rezept 19.7 näher beleuchtet. Dort erfahren Sie, wie Sie mit modernen Ajax-Funktionalitäten die Eingabe der Inhalte beschleunigen können. Lizensiert für Markus Mueller
Diese Rezepte behandeln spezielle Einstellungen, die vor allem dann sinnvoll sind, wenn Sie die Extension anderen Benutzern zur Verfügung stellen möchten. Mit dem Wissen aus diesen Rezepten geben Sie Ihrer Extension den letzten Schliff und erleichtern die Verwendung auch ungeübten Benutzern.
19.1 TSconfig-Optionen in eigenen Backend-Modulen nutzen und auswerten Problem Sie möchten TSconfig-Code in Ihrem Backend-Modul nutzen und damit Einstellungen in Ihrem Code konfigurierbar halten.
Lösung Fragen Sie den TSconfig-Inhalt der aktuellen Seite, die Sie gerade im Seitenbaum gewählt haben, mit der TYPO3-API-Funktion getPagesTSconfig() ab. Diese Funktion erwartet die ID der aktuellen Seite als Übergabeparameter. Sie erhalten ein Array mit allen verfügbaren TSconfig-Parametern zurück, die Sie dann individuell auswerten können.
Max. Linie
Im folgenden Beispiel fragen wir die ID der aktuell im Seitenbaum gewählte Seite in einem Submodul ab und ermitteln anhand der TYPO3-API-Funktion getPagesTSconfig()
816 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
den TSconfig-Code, den wir anschließend als Text mit der Funktion debug() im Browser ausgeben: $PageTSconfig = t3lib_BEfunc::getPagesTSconfig($this->pObj->id); debug($PageTSconfig);
Beachten Sie, dass die Seiten-ID nur in Submodulen mit $this->pObj->id abgefragt werden kann. In Hauptmodulen greifen Sie auf die ID mit $this->id zu. Die in dem Array gespeicherten Werte können Sie dann zum Beispiel über diese Syntax auslesen: $websiteID = $PageTSconfig['TSFE.']['constants.']['websiteConfig.']['id'];
So können Sie TSconfig-Einstellungen nach eigenen Wünschen auswerten.
Diskussion
Lizensiert für Markus Mueller
Wenn Sie eigene Backend-Module konfigurieren möchten, stehen Ihnen praktisch alle Möglichkeiten von TSconfig zur Verfügung. Die Funktion getPagesTSconfig() ermittelt immer den aktuellen Wert für die gewählte Seite. Sie sollten also einmal im Seitenbaum Standardwerte definieren und diese dann für einzelne Seiten modifizieren. Ihre Änderungen werden für die gewählte Seite dann automatisch richtig ausgelesen. Die TSconfigWerte werden ebenfalls auf alle Unterseiten vererbt. Wir empfehlen daher, immer einen dynamischen Parameter für die Seiten-ID zu verwenden. Ist der Wert leer, liest TYPO3 nur die Standard-TSconfig-Einstellungen aus der Wurzelseite mit der ID 0. Alternativ können Sie auch auf TSconfig-Code zugreifen, der von TYPO3 in den Moduleigenschaften gespeichert wird. Jedes Backend-Modul hat automatisch einen eigenen Namensraum, in dem individuelles TSconfig für dieses Modul angegeben werden kann. Der Namensraum leitet sich aus dem Modulnamen ab. Der Modulname wird in der Datei conf.php festgelegt und ist nach diesem Muster aufgebaut: tx<extkey><modulname>
Nach dem Präfix tx folgt der Extension-Key ohne Unterstriche und danach der Modulname. Die eckigen Klammern haben wir der Übersichtlichkeit eingefügt. Alle Eigenschaften von Modulen werden wiederum im globalen Namensraum mod. abgelegt. Standardmäßig sind im Namensraum neuer Module keine Werte angegeben. Wenn Sie neue Hauptmodule erstellt haben, stehen Ihnen keine Seiteneigenschaften zur Verfügung. Daher öffnen Sie nun den Datensatz Ihres Backend-Benutzers über das Listenmodul und geben im Bereich Optionen diesen Code in das Feld TSconfig ein: mod.tx<extkey><modulname> { beispielEigenschaft = TYPO3 Kochbuch }
Max. Linie
Wechseln Sie nun in die Datei index.php Ihres Backend-Moduls und fügen Sie am Ende der Methode init() diese Zeile ein: debug($this->modTSconfig, '$this->modTSconfig');
19.1 TSconfig-Optionen in eigenen Backend-Modulen nutzen und auswerten This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 817
Max. Linie
Der PHP-Code sollte danach so aussehen:
Links
function init() { parent::init(); // Debug-Ausgabe debug($this->modTSconfig, '$this->modTSconfig'); }
Speichern Sie nun die Datei und rufen Sie Ihr Backend-Modul auf. Sie erhalten daraufhin die Ausgabe des TSconfig-Arrays, auf dessen Werte Sie nun zugreifen können. Die Syntax ist dabei immer identisch mit dem gewohnten TypoScript. Die einzelnen Parameter und deren Schreibweise können Sie jedoch auch völlig frei vergeben.
Siehe auch In Rezept 17.4 erfahren Sie mehr über die Funktion debug() und die weiteren Einsatzmöglichkeiten dieser Funktion.
19.2 Flexform-Felder einbinden und konfigurieren Lizensiert für Markus Mueller
Problem Sie benötigen für ein Plugin mehrere zusätzliche Eingabefelder, für die Sie jedoch nicht jeweils einzelne Datenbankfelder in der Datenbank anlegen möchten.
Lösung Legen Sie ein Feld als sogenanntes Flexform-Feld an. In einem Flexform-Feld können Sie dann über eine XML-Struktur beliebig viele Felder hinzufügen. Für eine Erweiterung der Eingabemaske brauchen Sie nicht mehr die Datenbankstruktur anzupassen, sondern ändern lediglich diese XML-Struktur. Damit bleiben Sie sehr flexibel in der Gestaltung Ihrer Eingabemaske (daher auch der Name Flexform). In einem Flexform-Feld stehen Ihnen dabei prinzipiell alle von $TCA gewohnten Formularfelder zur Verfügung, allerdings werden diese nicht mehr wie bei $TCA in einem PHP-Array angelegt, sondern mithilfe von XML. Das Format dieser XML-Struktur wird als bezeichnet. Es handelt sich dabei um sogenanntes wohlgeformtes XML, das auch mit einem XML-Editor bearbeitet werden kann. Legen Sie in Ihrem Extension-Ordner eine Datei flexform_default.xml nach dem folgenden Muster an:
Max. Linie
<meta> 1
818 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
array <el> LLL:EXT:ext_key/locallang_db.xml:flexform.field_one input <max>34
Mit dieser definieren Sie ein einfaches Eingabefeld field_one, das maximal 34 Zeichen aufnimmt. Weitere Felder fügen Sie einfach analog zu field_one innerhalb des <el>-Tags ein. Die Bezeichnung des Tags entspicht dabei dem Feldnamen. Innerhalb des -Tags legen Sie die Konfiguration des Felds fest. Dabei stehen Ihnen die bekannten Schlüssel aus $TCA zur Verfügung. Sie werden hier lediglich innerhalb eines Tags als XML-Tags statt als PHP-Arrays angelegt. Lizensiert für Markus Mueller
Wenn Sie Ihre in einer Datei abgelegt haben, müssen Sie diese natürlich noch entsprechend in das $TCA einbinden. Das Feld $TCA['tt_content']['columns'] ['pi_flexform'] ist bereits als Flexform-Feld konfiguriert und für die Verwendung mit einem typischen Frontend-Plugin vorgesehen. Allerdings wird das Feld pi_flexform für ein mit dem Kickstarter erzeugtes Frontend-Plugin nicht angezeigt. Sie können das durch den folgenden Eintrag in der Datei ext_tables.php Ihrer Extension ändern: [...] $TCA['tt_content']['types']['list']['subtypes_addlist'][$_EXTKEY.'_pi1']='pi_flexform'; $TCA['tt_content']['types']['list']['subtypes_excludelist'][$_EXTKEY.'_pi1'] = 'layout'; t3lib_extMgm::addPiFlexFormValue($_EXTKEY.'_pi1','FILE:EXT:ext_key/flexform_default. xml'); [...]
Wir nutzen hier die $TCA-Eigenschaften subtypes_addlist und subtypes_excludelist. Damit ist es möglich, speziell für das Frontend-Plugin einer Extension zusätzliche Felder in dem Bearbeitungsformular für Inhaltselemente anzuzeigen oder auszublenden. Gleichzeitig sorgen wir in der dritten Zeile mit dem Aufruf der API-Methode aus t3lib_ extMgm dafür, dass Ihre in der $TCA-Konfiguration des Felds pi_flexform unter $TCA['tt_content']['columns']['pi_flexform']['config']['ds'] registriert wird. Lesen Sie dazu auch das Rezept 18.2, um zu erfahren, wie Sie Werte aus einer solchen Flexform in einem Frontend-Plugin auslesen können.
Max. Linie
Max. Linie 19.2 Flexform-Felder einbinden und konfigurieren | 819 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Links
Diskussion Der in der Lösung gezeigte Weg eignet sich ausschließlich für Frontend-Plugins, die als Inhaltselement vom Typ Plugin angelegt sind. Es ist ebenfalls möglich, weiteren oder auch allen Inhaltselementen eine zusätzliche Flexform zur Verfügung zu stellen, um diese Elemente nahezu unbeschränkt mit weiteren Eingabeoptionen zu versehen: Fügen Sie dazu zunächst mit dem Kickstarter ein neues Feld der Tabelle tt_content hinzu. Falls Sie den Kickstarter nicht verwenden wollen, können Sie die entsprechende Datei ext_tables.sql auch manuell analog zur folgenden SQL-Definition erzeugen: # # Tabellenstruktur für die Tabelle 'tt_content' # CREATE TABLE tt_content ( tx_extkey_feldname mediumtext NOT NULL );
Anschließend müssen Sie im $TCA dieses Feld als ['columns']['feldname']['config'] = 'flex' festlegen. Ändern Sie dazu den Code in der Datei ext_tables.php wie folgt:
Lizensiert für Markus Mueller
$tempColumns = array( 'tx_extkey_feldname' => array( 'exclude' => 0, 'label' => 'LLL:EXT:ext_key/locallang_db.xml:tt_content.tx_extkey_feldname', 'config' => array( 'type' => 'flex', 'ds' => array( 'default' => 'FILE:EXT:ext_key/flexform_default.xml', ) ) ), ); t3lib_div::loadTCA('tt_content'); t3lib_extMgm::addTCAcolumns('tt_content',$tempColumns,1); t3lib_extMgm::addToAllTCAtypes('tt_content','tx_extkey_feldname;;;;1-1-1');
In der Diskussion von Rezept 6.9 können Sie nachlesen, wie Sie den Aufruf der Methode t3lib_extMgm::addToAllTCAtypes anpassen können, um das Feld an einer anderen Position oder nur für bestimmte Inhaltselemente einzubinden.
Hiermit steht Ihnen nun in allen Inhaltselementen ein zusätzliches Flexform-Feld zur Verfügung, mit dem Sie der Bearbeitungsmaske nach Belieben mehrere und komplexe Eingabeoptionen hinzufügen können. Willkommen in der Welt der Flexforms.
Max. Linie
Mit dem Einbinden eines Flexform-Felds in die Eingabemasken haben Sie nun den ersten Teil der Lösung geschafft. Natürlich möchten Sie aber die Werte auch bei der Ausgabe verwenden. Wenn Sie dieses Feld beispielsweise mit dem folgenden TypoScript bei Inhaltselementen vom Typ text zusätzlich ausgeben, werden Sie eine interessante Entdeckung machen:
820 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
tt_content.text.30 = TEXT tt_content.text.30 { field = tx_extkey_feldname htmlSpecialChars = 1 wrap = <pre>| }
Im Fall eines Flexform-Felds erhalten Sie als Ergebnis wiederum eine XML-Struktur. Um diese deutlich sichtbar zu machen, haben wir auch direkt die stdWrap-Funktion htmlSpecialChars = 1 genutzt und den Inhalt mit einem <pre> gewrappt, sonst stehen die XMLTags zwar im Quelltext, sind aber in der Ansicht Ihres Browsers nicht gleich zu erkennen. Die Ausgabe sieht bei diesem (sehr) einfachen Beispiel wie folgt aus:
Lizensiert für Markus Mueller
<sheet index="sDEF"> Beispieltext in einem Input innerhalb von Flexform
Das Auslesen von Werten aus Flexform-Feldern ist derzeit nur in Extensions bzw. mit PHP-Code möglich. Es gibt keinen einfachen Weg, die Daten nur mithilfe von TypoScript auszuwerten. Das Rezept 18.2 zeigt Ihnen, wie Sie die Werte innerhalb Ihrer Extension auslesen könne.
Richtig interessant wird das Flexform-Feld dadurch, dass es auch möglich ist, verschiedene Flexform-Konfigurationen in einem Feld abzubilden. Dazu modifizieren wir unsere $TCA-Definition wie folgt:
Max. Linie
$tempColumns = array( 'tx_extkey_feldname' => array( [...] 'config' => array( 'type' => 'flex', 'ds_pointerField' => 'CType' 'ds' => array( 'default' => 'FILE:EXT:ext_key/flexform_default.xml', 'text' => 'FILE:EXT:ext_key/flexform_text.xml', ) ) ), ); [...]
19.2 Flexform-Felder einbinden und konfigurieren | 821 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Wir binden damit verschiedene -Flexform-Definitionen ein. Über den Schlüssel ds_pointerField teilen wir TYPO3 mit, dass es das Flexform-Feld abhängig vom Wert im Feld CType auswählen soll. Voilà, so kann jedes Inhaltselement mit einem eigenen Flexform versorgt werden.
Links
Richtig interessant an Flexforms ist, dass diese nicht nur beliebig viele der Standardfeldtypen in einem Feld aufnehmen können, sondern über die Verwendung von Sheets diese auch im Bearbeitungsformular auf verschiedene Register aufteilen können. Damit werden je nach gewählter Registerkarte nur bestimmte Optionen aus dem Flexform angezeigt. Hier sehen Sie ein Beispiel für eine komplexere Flexform-Definition:
Lizensiert für Markus Mueller
Max. Linie
<meta> 1 <sheets> <sDEF> <sheetTitle>LLL:EXT:ext_key/locallang_db.xml:flexform.sheet_default array <el> LLL:EXT:ext_key/locallang_db.xml:flexform.field_one input <max>34 <sheet_two> <sheetTitle>LLL:EXT:ext_key/locallang_db.xml:flexform.sheet_two array <el> LLL:EXT:ext_key/locallang_db.xml:flexform.field_two group file
822 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
tmpl,html,htm <max_size>100 uploads/tx_ext_key <maxitems>1 <size>1 <selectedListStyle>width:180px LLL:EXT:ext_key/locallang_db.xml:flexform.field_three check
Lizensiert für Markus Mueller
Sie sehen, dass das ROOT-Element nun um eine Ebene verschoben ist. Als oberstes Element wird jetzt das erwähnte Sheet-Element verwendet. Die Bezeichnung <sDEF> steht dabei für das Standard-Sheet und ist fest vorgegeben, die Bezeichnungen der anderen Sheets (im Beispiel <sheet_two>) können frei gewählt werden. Im Beispiel sehen Sie auch, wie im zweiten Sheet zwei Felder eingebunden werden. Bei der Verwendung von Sheets müssen Sie darauf achten, dass Sie beim Aufruf von $this->pi_getFFvalue als dritten Parameter die Bezeichnung des Sheets übergeben müssen, wenn das Feld nicht im Default-Sheet enthalten ist. Hier noch mal in Kurzform, die Details entnehmen Sie bitte Rezept 18.2: $dataFieldtwo = $this->pi_getFFvalue( $this->cObj->data[$flexFieldName], $field_twoInFlexForm, $sheet_twoName );
Max. Linie
Flexforms sind wirklich sehr mächtig, allerdings darf ein Nachteil nicht verschwiegen werden. Dadurch, dass die Daten in Form von XML gespeichert werden, ist eine gezielte Suche bzw. Abfrage mithilfe von SQL sehr aufwendig. Um die Daten zu verarbeiten, müssen zunächst immer zusätzlich die XML-Strukturen aufgelöst werden. Flexforms sind vor allem sinnvoll bei vielen selten genutzten Eingabeoptionen, die auch typischerweise nicht unbedingt als Suchschlüssel in Abfragen verwendet werden. Eine Abfrage wie »gib mir alle Textelemente, bei denen das Feld xy den Wert foobar hat« ist mit Flexforms nur eingeschränkt möglich bzw. sehr aufwendig.
19.2 Flexform-Felder einbinden und konfigurieren | 823 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Siehe auch
Links
In Rezept 18.1 erfahren Sie, wie Sie weitere Konfigurationsparameter an Ihre Extension weitergeben können. Rezept 16.3 zeigt Ihnen, wie Sie bestehenden Tabellen eigene Datenbankfelder hinzufügen. Rezept 18.2 erklärt Ihnen Details dazu, wie Sie in Ihrer Extension Werte aus Flexform-Feldern auslesen. Die Referenz zu finden Sie auf typo3.org unter http://typo3.org/documentation/document-library/core-documentation/doc_core_api/current/view/7/1/.
19.3 Backend-Module individuell gruppieren Problem Sie möchten eine eigene Modulgruppe erstellen, um darunter eine Sammlung eigener Backend-Module aufzulisten.
Lösung Geben Sie folgenden Code in die Datei ext_tables.php der jeweiligen Extension ein: Lizensiert für Markus Mueller
$ext_pfad = t3lib_extMgm::extPath($_EXTKEY); t3lib_extMgm::addModule('modul_1', '', '', $ext_pfad.'mod1/'); t3lib_extMgm::addModule('modul_2', 'modul_1', '', ''); t3lib_extMgm::addModule('modul_1', 'modul_2', '', $ext_pfad.'mod2/');
Mit dem Befehl t3lib_extMgm::extPath($_EXTKEY) legen Sie den Pfad zum Ordner der jeweiligen Extension fest. Danach registrieren Sie mit dem Befehl t3lib_extMgm::addModule() das Backend-Modul mod_1 als Hauptmodul. Dieses Hauptmodul beinhaltet später die anderen Backend-Module. Passen Sie nun den Platzhalter modul_1 an den Namen des Hauptmoduls an. Den Modulnamen finden Sie im jeweiligen Modulverzeichnis Ihrer Extension in der Datei conf.php. Ändern Sie dann den Platzhalter modul_2 in den Modulnamen des zweiten Moduls. Dadurch bilden Sie die gewünschte Hierarchie zwischen den beiden Modulen.
Diskussion
Max. Linie
Achten Sie darauf, dass das Hauptmodul dabei nur als Container für die Backend-Module dient und sich daher von regulären Backend-Modulen unterscheidet. Zum Beispiel dient der Modultitel als Überschrift für den Bereich und erscheint im Modul-Frame standardmäßig hinterlegt. Außerdem wird der Titel nicht mit der Datei index.php verknüpft, sodass Sie mit dem Hauptmodul selbst keine Funktionalität erzeugen können. Achten Sie daher auf die korrekte Modulhierarchie, wenn Sie solche Modulstrukturen planen, denn nachträgliche Änderungen können viel Zeit in Anspruch nehmen.
824 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Um die Backend-Module nun innerhalb dieses Hauptmoduls aufzulisten, erweitern Sie den oben angegebenen Code mit den folgenden hervorgehobenen Zeilen: $ext_pfad = t3lib_extMgm::extPath($_EXTKEY); t3lib_extMgm::addModule('modul_1', '', '', $ext_pfad.'mod1/'); t3lib_extMgm::addModule('modul_2', 'modul_1', '', ''); t3lib_extMgm::addModule('modul_1', 'modul_2', '', $ext_pfad.'mod2/'); t3lib_extMgm::addModule('modul_3', 'modul_1', '', ''); t3lib_extMgm::addModule('modul_1', 'modul_3', '', $ext_pfad.'mod3/');
Mit dem dritten Parameter nehmen Sie Einfluss auf die Anordnung der Backend-Module. Möchten Sie beispielsweise das dritte Modul über dem ersten Eintrag anzeigen, geben Sie folgenden Code ein: t3lib_extMgm::addModule('modul_3', 'modul_1', '', ''); t3lib_extMgm::addModule('modul_1', 'modul_3', 'before:modul_2', $ext_pfad.'mod3/');
Weitere Positionen sind after, before oder top. Die Sortierung mit after und before ist immer abhängig vom angegebenen Untermodul.
Lizensiert für Markus Mueller
Wenn Sie zusätzlich noch die Position Ihrer Modulgruppe im linken Frame anpassen möchten, beispielsweise um Ihre Modulgruppe unterhalb von dem Modul Dokumente zu platzieren, gehen Sie wie folgt vor: Ändern Sie die Standardanordnung der Hauptmodule, indem Sie über eine foreach-Schleife jeden vorhandenen Modul-Eintrag durchlaufen. Mit einer if-Abfrage ermitteln Sie dann den Wert des Moduls, unter dem Sie Ihre Modulgruppe platzieren möchten. In dieser Abfrage nehmen Sie auch die Wertzuweisung für Ihre Modulgruppe vor, sodass diese unterhalb des gewünschten Moduls einsortiert wird. Abschließend definieren Sie – wie schon eingangs beschrieben – Ihr Hauptmodul mit dessen Untermodulen. Fügen Sie nun den hervorgehobenen Code oberhalb Ihrer ModulEinstellungen ein: // Die Modulgruppe unterhalb von 'Dokumente' anzeigen if (!isset($TBE_MODULES['modul_1'])) { $temp_TBE_MODULES = array(); foreach($TBE_MODULES AS $key => $val) { if ($key == 'doc') { $temp_TBE_MODULES[$key] = $val; $temp_TBE_MODULES['modul_1'] = $val; } else { $temp_TBE_MODULES[$key] = $val; } } $TBE_MODULES = $temp_TBE_MODULES; }
Max. Linie
$ext_pfad = t3lib_extMgm::extPath($_EXTKEY); t3lib_extMgm::addModule('modul_1', '', '', $ext_pfad.'mod1/'); t3lib_extMgm::addModule('mod_2', 'modul_1', '', ''); t3lib_extMgm::addModule('modul_1', 'mod_2', '', $ext_pfad.'mod2/');
19.3 Backend-Module individuell gruppieren | 825 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
t3lib_extMgm::addModule('modul_3', 'modul_1', '', ''); t3lib_extMgm::addModule('modul_1', 'modul_3', '', $ext_pfad.'mod3/');
Links
Anstatt des $key-Werts doc können Sie auch folgende Werte verwenden und die Position entsprechend anpassen: • web bewirkt, dass Ihre Modulgruppe unterhalb vom Modul Web angezeigt wird. • file bewirkt, dass Ihre Modulgruppe unterhalb vom Modul Datei angezeigt wird. • doc bewirkt, dass Ihre Modulgruppe unterhalb vom Modul Dokumente angezeigt wird. • user bewirkt, dass Ihre Modulgruppe unterhalb vom Modul Benutzerwerkzeuge angezeigt wird. • tools bewirkt, dass Ihre Modulgruppe unterhalb vom Modul Admin-Werkzeuge angezeigt wird. Achten Sie darauf, dass dieses Modul nur Administratoren zur Verfügung steht. • help bewirkt, dass Ihre Modulgruppe unterhalb vom Modul Hilfe angezeigt wird.
Siehe auch In Rezept 16.7 erfahren Sie, wie Sie eigene Backend-Module erstellen. Lizensiert für Markus Mueller
19.4 Unterschiedliche Icons je nach Zustand des Datensatzes anzeigen Problem Sie möchten den Zustand Ihrer Datensätze mit unterschiedlichen Icons darstellen, etwa um versteckte oder geschützte Datensätze entsprechend zu kennzeichnen.
Lösung Durch das Ändern der Sichtbarkeitseinstellungen von Datensätzen passt TYPO3 auch das entsprechende Icon des Datensatzes an. Wenn Sie beispielsweise einen Datensatz ausblenden, wird das jeweilige Icon etwas heller gezeichnet und mit einem roten X am oberen rechten Rand markiert. Haben Sie Datensätze nur für bestimmte Benutzergruppen freigeben, wird in das Icon ein kleiner Kopf eingearbeitet.
Max. Linie
Für jeden möglichen Zustand ändert TYPO3 die Icon-Grafik. Bei eigenen Datensätzen sollten Sie daher für jeden dieser Zustände eine entsprechende Grafik anfertigen. Die Grafiken sollten sich dabei stets von der Standardgrafik ableiten, die Sie über die ctrl-Einstellung iconfile angegeben haben. Die entsprechenden Grafiken werden anhand eines speziellen Suffixes im Dateinamen von TYPO3 automatisch dem jeweiligen Zustand des Datensatzes zugeordnet. Folgende Suffixe können Sie verwenden:
826 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
grafik_name__f.gif Zeitbeschränkung über die Felder Start und/oder Stopp ist aktiviert. grafik_name__h.gif Der Datensatz ist momentan ausgeblendet. grafik_name__ht.gif Der Datensatz ist ausgeblendet und unterliegt zusätzlich einer Zeitbeschränkung. grafik_name__hu.gif Der Datensatz ist ausgeblendet und nur für bestimmte Nutzer sichtbar. grafik_name__tu.gif Der Datensatz wird zeitgesteuert veröffentlicht und nur für bestimmte Nutzer sichtbar sein. grafik_name__t.gif Der Datensatz wird zeitgesteuert veröffentlicht. grafik_name__u.gif Der Datensatz wird nur für bestimmte Nutzer sichtbar sein.
Lizensiert für Markus Mueller
grafik_name__x.gif Der Datensatz hat einen Zustand, für den es kein Icon gibt. Dieses Icon definiert die allgemeine Ausnahme für Datensätze und sollte sicherheitshalber Ihrer Extension immer beiliegen. Fehlt dieses Icon, greift TYPO3 automatisch auf ein neutrales Standard-Icon zurück.
Diskussion Unabhängig vom Zustand des Datensatzes können Sie das Icon auch je nach Inhalt anpassen. Verwenden Sie dazu die Möglichkeit, Datensätze einer Tabelle in unterschiedlichen Typen zu speichern. Jedem dieser Typen weisen Sie dann ein eigenes Icon zu. Richten Sie dazu zunächst eine eigene Spalte in Ihrer Tabelle ein, in dem TYPO3 den Formulartyp speichern kann. Anschließend registrieren Sie dieses Feld über die Eigenschaft typeicon_column im ctrl-Bereich der jeweiligen Tabelle, damit der Wert dieses Felds von TYPO3 auch entsprechend als Typ interpretiert wird. Die unterschiedlichen Icons geben Sie dann ebenfalls im ctrl-Bereich der Tabelle über die Eigenschaft typeicons an. Dadurch werden die Grafiken mit dem jeweiligen Feldwert verknüpft. Abschließend können Sie noch verschiedene Eingabeformulare für die definierten Typen erstellen.
Max. Linie
Wir empfehlen Ihnen, die Erzeugung des Datenbankfelds sowie die nötigen Einstellungen über den Kickstarter vorzunehmen (in Rezept 16.3 erfahren Sie, wie Sie weitere Datenbankfelder zu einer Tabelle hinzufügen). Erstellen Sie dort unter dem Menüpunkt New Database Tables ein neues Feld vom Typ Selectorbox, über das später der entsprechende Formulartyp ausgewählt werden kann. Definieren Sie für dieses Feld im Abschnitt Define values die gewünschten Werte für die Typen. Die Werte können dabei numerisch oder als normale Zeichenketten angeben werden.
19.4 Unterschiedliche Icons je nach Zustand des Datensatzes anzeigen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 827
Max. Linie
Wählen Sie dieses neue Feld nun unter dem Menüpunkt Type-field, if any als Feld für den Formulartyp aus, in dem der jeweilige Formulartyp gespeichert werden soll. Bestätigen Sie Ihre Änderungen über den Button Update und wechseln Sie anschließend über View result in die Dateiübersicht. Dort können Sie die Extension mithilfe des Buttons Write neu schreiben und Ihre Änderungen aktivieren.
Links
Im nächsten Schritt passen Sie die ctrl-Einstellungen der jeweiligen Tabelle an. Wechseln Sie dazu in die Datei ext_tables.php, die sich im Wurzelverzeichnis der Extension befindet. Dort finden Sie die Eigenschaft type, mit der der gewünschte Feldname als Speicherort für den Formulartyp definiert wird. Ergänzen Sie diese Einstellung nun um die beiden Werte typeicon_column und typeicons, damit auch die jeweiligen Icons je nach Formulartyp dargestellt werden. Über den Wert typeicon_column geben Sie den Feldnamen der jeweiligen Spalte an, die TYPO3 dafür verwenden soll, die unterschiedlichen Typen zu analysieren. Dies sollte die gleiche Spalte sein, die auch über type als Formulartyp angegeben wurde. Mit dem Wert typeicons legen Sie das Icon für den jeweiligen Datensatztyp an. Als Standardwert dient immer das Icon, das über die Eigenschaft iconfile angegeben wurde. Ergänzen Sie nun den vorhandenen Code um folgende Zeilen (zur besseren Orientierung sind hier zusätzlich die jeweiligen Array-Definitionen mit angegeben): Lizensiert für Markus Mueller
$TCA['tabellen_name'] = array( 'ctrl' => array( 'type' => 'feld_name', 'typeicon_column' => 'feld_name', 'typeicons' => array( '1' => 'type_1.gif', '2' => 'type_2.gif', '3' => 'type_3.gif', ), 'iconfile' => 'ext_icon.gif', ) );
Achten Sie darauf, dass Sie die hervorgehobenen Werte an Ihre Einstellungen anpassen und den vorhandenen Code in der Datei ext_tables.php damit ergänzen. Abschließend können Sie über den TCA-Eintrag types der jeweiligen Tabelle für jeden dieser Typen ein unterschiedliches Eingabeformular erzeugen. Wichtig dabei ist vor allem, dass die Werte der Formulartypen identisch mit den Werten sind, die Sie anfangs in der Auswahlliste definiert haben. Wenn Sie die Extension mit dem Kickstarter erstellt haben, finden Sie die nötigen TCAEingaben in der Datei tca.php. Erweitern Sie dort das Array types nach folgendem Muster:
Max. Linie
... 'types' => array( '0' => array('showitem' '1' => array('showitem' '2' => array('showitem' '3' => array('showitem' ), ...
=> => => =>
'...'), '...'), '...'), '...'),
828 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Wenn Sie den entsprechenden Formulartyp über die Auswahlliste wählen, wechselt TYPO3 standardmäßig in die entsprechende Eingabemaske. Ist ein Formulartyp nicht konfiguriert, verwendet TYPO3 stets den Typ 0 als Standardformular (in Rezept 6.9 erfahren Sie, wie Sie die jeweiligen Eingabeformulare über den Wert showitem gestalten können). Möchten Sie für einen Datensatz mehrere Typen angeben, bedeutet dies jedoch auch, dass Sie für jeden Typ eigene Sichtbarkeitssymbole erstellen müssen, was ziemlich zeitaufwendig ist. TYPO3 bietet Ihnen daher die Möglichkeit, die anfangs genannten Grafiken automatisch zu generieren. Sie können die Icons auch dynamisch generieren lassen, indem Sie im Install-Tool die Option noIconProc deaktivieren oder folgenden Code in die Datei localconf.php eingeben: $TYPO3_CONF_VARS['GFX']['noIconProc'] = '0';
TYPO3 legt dann je nach Typ und Zustand des Datensatzes ein entsprechendes Icon über die Grafik des Datensatzes. Wenn Sie Ihre Extension über das TER veröffentlichen möchten, sollten Sie darauf achten, dass Sie alle relevanten Icons als Grafiken mitliefern, denn Sie können nicht davon ausgehen, dass jeder Benutzer Ihrer Extension die benötigten Softwarepakete für diese Funktion installiert oder aktiviert hat. Lizensiert für Markus Mueller
19.5 Vorschautexte von Plugins anpassen Problem Sie möchten über die Vorschau im Seitenmodul schneller an relevante Informationen des Frontend-Plugins gelangen, etwa indem Sie wichtige Plugin-Einstellungen schon in der Vorschau ausgeben. Momentan erscheinen in der Übersicht nur die Wörter Plug-In und CODE.
Lösung Erstellen Sie eine neue Extension und erweitern Sie die Vorschau über den Hook list_ type_Info um eigene Feldausgaben oder andere Informationen. Die Darstellung können Sie völlig frei über ein eigenes PHP-Skript steuern. Um den Hook ordnungsgemäß anzusprechen, gehen Sie so vor: 1. Erstellen Sie die Datei class.backendPreview.php im Extension-Verzeichnis. 2. Fügen Sie das PHP-Grundgerüst in die Datei ein.
Max. Linie
Die Datei class.backendPreview.php enthält eine Klasse tx_backendPreview. Das Präfix tx_ ist sehr wichtig, damit TYPO3 die Klasse verarbeiten kann. In dieser Klasse definieren Sie eine Funktion mit dem Namen main(). Diese Funktion enthält später
19.5 Vorschautexte von Plugins anpassen | 829 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
die vollständige Logik dazu, wie die Vorschauinhalte erzeugt werden. Die Funktion erwartet die zwei Übergabeparameter $conf und $pObj und gibt einen String zurück. 3. Implementieren Sie die Details der Vorschau.
Links
Erweitern Sie nun das Grundgerüst der Funktion main() um die eigentliche Programmlogik. Der Code ist wie folgt aufgebaut (zur besseren Übersicht haben wir den Code eingerückt): function main($conf, &$pObj) { $content = 'TYPO3 Kochbuch'; return $content; }
Das Array $conf enthält die drei Unterbereiche pObj, row und infoArr, mit denen Sie Informationen aus dem TYPO3-Kontext heraus verarbeiten können. In $conf['pObj'] finden Sie eine Referenz auf die Klasse tx_cms_layout. In $conf['row'] sind alle Werte des jeweiligen Datensatzes gespeichert, für den Sie die Vorschau umsetzen möchten. Den Wert $conf['infoArr'] können Sie ignorieren, da er keinen Wert enthält. 4. Registrieren Sie Ihre Vorschaufunktion in der Datei ext_localconf.php. Geben Sie dort diese Zeile ein, um Ihre Vorschaufunktion an der TYPO3-API zu registrieren: Lizensiert für Markus Mueller
$TYPO3_CONF_VARS['SC_OPTIONS'] ['cms/layout/class.tx_cms_layout.php'] ['list_type_Info']['plugin_name'] = 'EXT:ext_key/class.backendPreview.php';
Mit diesem Code registrieren Sie Ihre individuelle Vorschaufunktion an der Layoutklasse class.tx_cms_layout.php von TYPO3. Achten Sie darauf, dass Sie die hervorgehobenen Werte an Ihre Einstellungen anpassen. Ganz besonders wichtig ist es, dass der Wert plugin_name mit dem list-type-Wert des jeweiligen Plugins übereinstimmen muss, dessen Vorschau Sie anpassen möchten. Leeren Sie abschließend den Extension-Cache über das Backend, damit die neuen Extension-Eigenschaften von TYPO3 übernommen werden, und testen Sie Ihre Vorschaufunktion, indem Sie in das Seitenmodul wechseln und eine Seite auswählen, auf der das Plugin eingebunden wird. Somit stehen Ihnen sehr flexible Möglichkeiten offen, die Vorschau nach Ihren Wünschen anzupassen.
Diskussion
Max. Linie
Durch dieses Vorgehen ist es sehr leicht möglich, weitere Daten in der Vorschau für eigene Datensätze zu implementieren und so zum Beispiel die wichtigsten Parameter des Plugins schon in der Übersicht zu sehen, ohne es öffnen zu müssen. Gerade bei zahlreichen Plugin-Parametern können Sie so erheblich schneller einen Überblick erhalten. Querverbindungen zu anderen Tabellen werden standardmäßig nicht direkt ausgegeben. Wenn Sie zum Beispiel in Ihren Plugin-Einstellungen eine oder mehrere Seiten als Aus830 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
gangspunkt definiert haben und den Inhalt des Felds pages ausgeben, erhalten Sie lediglich die IDs der jeweiligen Seiten. Den Seitentitel können Sie nicht direkt ausgeben. Jedoch können Sie über Ihr PHP-Skript nun leicht die nötigen Datenbankabfragen absetzen, um die gewünschten Daten auszulesen und schließlich in der Vorschau anzuzeigen. Folgendes Beispiel verdeutlicht die dafür nötigen Schritte. Die hervorgehobenen Zeilen sind für die Datenbankabfrage und die Ausgabe der einzelnen Werte zuständig: function main($params, &$pObj) { $row = $params['row']; $content = 'TYPO3 Kochbuch'; if ($row['pages']) { $pages = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows( 'uid,title', 'pages', 'uid IN ('. $row['pages'] .') '); $content.= 'Aktuelle Seitenauswahl:';
Lizensiert für Markus Mueller
foreach($pages AS $page) { $content.= $page['title'] . '
'; } } else { $content = 'Keine Seitenauswahl'; } return $content; }
Die jeweiligen Seitentitel werden untereinander ausgegeben, sofern Seiten in der Auswahl vorhanden sind. Ansonsten erscheint nur ein entsprechender Hinweis in der Vorschau. Beachten Sie außerdem, dass Sie über die Variable $pObj Zugriff auf zahlreiche Funktionen der Klasse tx_cms_layout haben, die Ihnen nützliche Hilfestellungen bei der Entwicklung geben. Wir empfehlen Ihnen daher, sich näher mit dem Quellcode der Klasse zu beschäftigen. Sie finden diese Datei im Verzeichnis typo3/sysext/cms/layout/. Beispielsweise können Sie die Werte in der Vorschau so verknüpfen, dass sich beim Klick automatisch die Bearbeitungsmaske öffnet. Bei Inhaltselementen vom Typ Text ist diese Funktion etwa bei der Vorschau von Fließtext implementiert. Um diese Funktionalität in Ihr Skript zu integrieren, müssen Sie lediglich die foreachSchleife im Beispielcode in der hervorgehobenen Zeile anpassen:
Max. Linie
foreach($pages AS $page) { $content.= $pObj->linkEditContent( $page['title'], $row ) .'
'; }
19.5 Vorschautexte von Plugins anpassen | 831 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Der vollständige Code sieht dann so aus:
Links
function main($params, &$pObj) { $row = $params['row']; $content = 'TYPO3 Kochbuch'; if ($row['pages']) { $pages = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows( 'uid,title', 'pages', 'uid IN ('. $row['pages'] .') '); $content.= 'Aktuelle Seitenauswahl:';
Lizensiert für Markus Mueller
foreach($pages AS $page) { $content.= $pObj->linkEditContent( $page['title'], $row ) . '
'; } } else { $content = 'Keine Seitenauswahl'; } return $content; }
Mit diesen Funktionen können Sie sehr bequem komfortable Vorschauen entwickeln. Mit einer individuellen Vorschau der Plugin-Einstellungen gelangen Sie wesentlich schneller an relevante Informationen und können so erfahrungsgemäß den Arbeitsprozess im Backend beschleunigen.
Siehe auch Weitere nützliche Funktionen für den Backend-Kontext finden Sie in der Datei class. t3lib_befunc.php im Verzeichnis t3lib/. Mehr über Hooks erfahren Sie in Rezept 17.13.
19.6 Backend-Formulare mit einer kontextsensitiven Hilfe ausstatten Problem
Max. Linie
Sie möchten selbst entworfene Backend-Formulare mit einer kontextsensitiven Hilfe ausstatten, um damit Anwendern eine Hilfestellung bei der Verwendung geben zu können.
832 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lösung Integrieren Sie die kontextsensitive Hilfe (Context Sensitive Help, CSH) von TYPO3. Legen Sie dazu eine XML-Sprachdatei in Ihr Extension-Verzeichnis. Der Dateiname sollte nach diesem Muster aufgebaut sein: locallang_csh_tabellenname.xml
Durch das Präfix locallang_ erkennt TYPO3, dass es sich um eine Sprachdatei handelt. Der Tabellenname zeigt, zu welchen Datensätzen die Beschreibungen gehören. Wichtig ist hierbei, dass der Tabellenname ohne Unterstriche angegeben wird. Diese Datei füllen Sie anschließend mit einer speziellen XML-Struktur (die hervorgehobenen Stellen markieren Platzhaltertexte und müssen von Ihnen angepasst werden):
Lizensiert für Markus Mueller
<meta type="array"> <description>Allgemeine Beschreibung der Hilfedatei CSH xEXT_ext_key EXT:ext_key/locallang_csh_tabellenname.xml Beschreibung Erweiterte Beschreibung
Mit diesen Angaben definieren Sie eine Basisbeschreibung. Sie erscheint, sobald ein Benutzer einen neuen Datensatz für die angegebene Tabelle im Backend anlegt. Die XML-Tags im Bereich meta werden von TYPO3 nur intern bei Übersetzungsvorgängen genutzt. Im Abschnitt data werden unterhalb des jeweiligen Sprachabschnitts alle relevanten Texte angegeben. Über das Tag mit dem Index .description geben Sie eine kurze Beschreibung für die Tabelle an. Die Beschreibung ist zwingend notwendig. Eine tiefer gehende Beschreibung mit weiteren Details geben Sie mit dem Index .details an (wenn Sie möchten, können Sie Wörter im Text auch mit den HTML-Tags <strong> fett und <em> kursiv setzen – alle anderen HTML-Tags werden aus Sicherheitsgründen entfernt). Im nächsten Schritt werden wir diese Texte im Backend einbinden, sodass sie bei der gewünschten Tabelle erscheinen.
Max. Linie
Beachten Sie, dass wir der Einfachheit halber in unseren Beispielen alle Texte in der Default-Sprache einarbeiten. Sie sollten die Inhalte im jeweiligen Abschnitt für die Sprache vornehmen – auf jeden Fall aber die Default-Sprache berücksichtigen:
19.6 Backend-Formulare mit einer kontextsensitiven Hilfe ausstatten | 833 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
...
Links
Speichern Sie dazu die XML-Datei und öffnen Sie anschließend die Datei ext_tables.php. Geben Sie dort am Dateiende folgenden Code ein: // Kontextsensitive-Hilfe (CSH) aktivieren t3lib_extMgm::addLLrefForTCAdescr( 'tabellen_name', 'EXT:ext_key/locallang_csh_tabellenname.xml' );
Lizensiert für Markus Mueller
Hiermit weisen Sie TYPO3 an, die Beschreibungen aus der XML-Datei bei der Darstellung der Tabelle zu berücksichtigen. Um das Ergebnis zu prüfen, speichern Sie die Datei und wechseln in das TYPO3-Backend. Leeren Sie dort über die entsprechende Funktion den Extension-Cache, um sicherzustellen, dass die Extension-Dateien neu geladen werden, und aktivieren Sie anschließend das Listenmodul. Wählen Sie dann einen SysOrdner aus und legen Sie dort über den Link Neuen Datensatz erstellen einen neuen Datensatz an. In der folgenden Liste erhalten Sie eine Übersicht über die möglichen Datensätze, die Sie anlegen können. Suchen Sie den Titel Ihrer Tabelle. Am rechten Rand der Liste erscheinen Icons, über die Sie die Hilfe aufrufen können. Bei der soeben verwendeten Tabelle sollte nun auch ein Icon dargestellt werden. Klicken Sie auf das Icon, und es öffnet sich ein Pop-up-Fenster, in dem die Beschreibung steht. Nun erweitern Sie die Hilfe für die einzelnen Felder. Fügen Sie hierzu oberhalb des XMLTags diesen Code ein: ... Beschreibung "feldname"
Wiederholen Sie das Beschreibungsmuster für jedes Feld. Der Inhalt der XML-Datei sollte anschließend so aussehen:
Max. Linie
<meta type="array"> <description>Allgemeine Beschreibung der Hilfedatei CSH xEXT_ext_key EXT:ext_key/locallang_csh_tabellenname.xml
834 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Beschreibung Erweiterte Beschreibung Beschreibung "feldname"
Auf diese Weise können Sie für die Tabelle und alle vorhandenen Felder eine Beschreibung angeben, die dem Endbenutzer hilft, deren Verwendungsweise besser zu verstehen.
Diskussion Mit der oben gezeigten Methode können Sie grundlegende Informationen über Ihre Datensätze und deren Eingabemöglichkeiten einbinden. Sie benötigen dazu lediglich eine Sprachdatei, in der Sie die Texte speichern. Anschließend binden Sie diese Sprachdatei über eine TYPO3-Funktion im Backend ein. Hat ein Backend-Benutzer die kontextsensitive Hilfe aktiviert (was standardmäßig der Fall ist), erscheint im Backend-Formular neben dem Feld ein Hilfe-Icon, mit dem der Benutzer Ihre Beschreibung für das gewünschte Eingabefeld aufrufen kann. Lizensiert für Markus Mueller
In obigem Beispiel fügen wir der Tabelle tabellenname zuerst eine recht allgemein gehaltene Hilfe hinzu. Ein Teil dieser Beschreibung erscheint zum Beispiel auf der Übersichtsseite im Content-Wizard. Damit können Benutzer leichter die richtige Tabelle finden. Außerdem wird bei dem Tabellentitel ein Hilfe-Icon erscheinen, über das eine erweiterte Beschreibung für diese Tabelle eingesehen werden kann. Anschließend wird die Hilfe auf die einzelnen Formularfelder im Backend-Formular ausgebaut. Benutzer können dadurch direkt bei der Dateneingabe die Hilfe aufrufen. Die Beschreibung wird nach einem Klick auf das Hilfe-Icon sichtbar, das TYPO3 beim Rendern des Felds automatisch einfügt. Nach dem Klick öffnet sich standardmäßig ein Pop-up-Fenster, in dem der Text dann erscheint (hat ein Benutzer in seinen Einstellungen unter Kontextabhängige Hilfe die Option Kompletten Text anzeigen aktiviert, erscheint der Text direkt über dem Eingabefeld). Aufbauend auf diesen Hilfefunktionen, bietet Ihnen TYPO3 noch weitere Möglichkeiten, Ihre Hilfestellungen visuell aufzubereiten und mit Querverknüpfungen auszubauen. Zum Beispiel erscheint im Pop-up standardmäßig der Titel der Datenbank, so wie Sie ihn im TCA angegeben haben. Wenn Sie diesen Wert ändern möchten, können Sie über folgende Angabe einen sprechenderen Titel für die Hilfe verwenden: Neuer Seitentitel
Max. Linie
Wenn Sie die Verarbeitung des Felds oder ein Codebeispiel anfügen möchten, können Sie auf die Angabe in .syntax zurückgreifen. Hierüber können Sie Beispielcode visuell hervorheben und den Benutzern zur Verfügung stellen: Beschreibung zur Syntax (TypoScript-Code)
19.6 Backend-Formulare mit einer kontextsensitiven Hilfe ausstatten | 835 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Bei manchen Anwendungsfällen ist es oft schwierig, die Ein- und Ausgabe eines Datenfelds textlich zu beschreiben. Wenn Text allein zum Beschreiben des Vorgangs nicht ausreicht, können Sie Bilder einfügen, anhand deren Sie dann die Funktion erläutern.
Links
Wenn Sie Bilder für Ihre Hilfe planen, sollten Sie diese in einem Unterverzeichnis mit dem Namen cshimages unterhalb Ihrer Extension ablegen. Damit ist gewährleistet, dass die Bilder von TYPO3 immer gefunden werden (zudem werden die Bilder optimal im TYPO3-Übersetzungsworkflow berücksichtigt. Details zum Übersetzungsprozess finden Sie in Rezept 17.4). Legen Sie dazu im ersten Schritt ein Unterverzeichnis cshimages in Ihrem Extension-Verzeichnis an. Fügen Sie dort die Bilddateien ein, die später in der Hilfe angezeigt werden sollen. Achten Sie darauf, dass diese Bilder webtauglich sind. Ergänzen Sie anschließend die XML-Struktur um die folgenden beiden Zeilen: EXT:ext_key/cshimages/tabellenname_1.png Bildbeschreibung 1
Die Angabe EXT:ext_key wandelt TYPO3 in den jeweiligen Extension-Pfad um; dadurch wird Ihre Pfadangabe unabhängig vom Installationstyp. Selbstverständlich können Sie auch absolute Pfade angeben.
Lizensiert für Markus Mueller
Wenn Sie mehrere Bilder einbinden möchten, trennen Sie die einzelnen Dateireferenzen jeweils mit einem Komma. Weitere Beschreibungen geben Sie in eine neue Zeile ein. Das folgende Beispiel verdeutlicht diese Erweiterungen: EXT:ext_key/cshimages/tabellenname_1.png, EXT:ext_key/res/csh/ tabellenname_2.png Bildbeschreibung 1 Bildbeschreibung 2 in neuer Zeile
Hierdurch können Sie komplexe Formulare und Zusammenhänge mithilfe von Grafiken visuelisieren. Doch gerade bei umfangreichen Beschreibungen komplizierterer Formulare mit mehreren Bildern und langen Erklärungen oder voneinander abhängigen Datensätzen ist es sinnvoll, Beschreibungen auszulagern und sie sinnvoll mit Links zu verknüpfen. Die Zusammenhänge der Daten werden so meist sehr viel verständlicher. Hierfür können die relevanten Inhalte aus den jeweils passenden Quellen miteinander verlinkt werden. Lange Erklärungen können so zum Beispiel in einzelne Abschnitte aufgeteilt werden. Die TYPO3-CSH erlaubt Ihnen, Inhalte miteinander zu verlinken und so die Navigation durch die Hilfe zu erleichtern. Die Verlinkungen können dabei sowohl auf andere Felder in der aktuellen Hilfedatei also auch auf externe Beschreibungen oder Ressourcen gesetzt werden. Die Syntax der Verlinkung sieht dabei wie folgt aus: tabellenname:feldname
oder für externe Quellen:
Max. Linie
Linkbeschreibung:http://www.example.com
836 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Für die internen Verlinkungen müssen Sie immer den exakten Tabellen- und Feldnamen angeben. In Rezept 1.5 erfahren Sie, wie Sie schnell über das TYPO3-Backend an diese Informationen herankommen können.
Siehe auch Der grundlegende Aufbau der Sprachdateien wird in Rezept 17.7 behandelt. Dort erhalten Sie weitere Informationen zur XML-Struktur. Mit der Extension llxmltranslate können Sie die Inhalte von XML-Dateien komfortabel anpassen und übersetzen. Weitere Informationen zu dieser Extension finden Sie unter dieser Adresse: http://typo3.org/documentation/ document-library/extension-manuals/llxmltranslate/current/. Das Rezept 20.4 beschreibt diese Extension genauer.
19.7 Bearbeitungsfelder mit Ajax-Funktionalität versehen Problem Lizensiert für Markus Mueller
Sie möchten ein Bearbeitungsformular durch eine individuelle Funktionalität erweitern.
Lösung Nutzen Sie die Möglichkeit, über eine eigene Funktion ein individuelles Feld im Bearbeitungsformular einzubinden. Damit die Verarbeitung völlig flexibel und ohne Nebenwirkungen bei der restlichen Formularfunktionalität erfolgen kann, binden Sie Ihr Feld an eine Ajax-Funktion. Ab Version 4.2 bietet TYPO3 eine vereinheitlichte Schnittstelle für Ajax im Backend und bringt entsprechende externe Bibliotheken mit. In unserem Beispiel versehen wir jedes Inhaltselement mit einem Button zum Versand einer E-Mail.
Grundgerüst mit dem Kickstarter erstellen 1. Erstellen Sie mit dem Kickstarter das Grundgerüst für eine Extension. Gehen Sie dabei wie in Rezept 16.2 beschrieben vor. Unser Beispiel verwendet den ExtensionKey t3kbbeajax. 2. Fügen Sie mit dem Kickstarter über die Funktion Extend existing Tables ein Feld einer bereits bestehenden Datenbanktabelle hinzu. Im Beispiel dieser Extension haben wir die Funktionalität der Tabelle tt_content hinzugefügt und dafür das Feld actionone angelegt. Damit steht die Funktionalität dann in den Bearbeitungsformularen von Inhaltselementen zur Verfügung.
Max. Linie
3. Speichern Sie die Extension. In Ihrer Extension sollten Sie nun die folgenden Dateien vorliegen haben: ChangeLog
19.7 Bearbeitungsfelder mit Ajax-Funktionalität versehen | 837 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
ext_emconf.php ext_icon.gif ext_tables.php ext_tables.sql locallang_db.xml README.txt
Links
Im weiteren Verlauf der Lösung werden wir weitere Dateien hinzufügen bzw. die erzeugten bearbeiten.
Über $TCA ein benutzerdefiniertes Feld einbinden Im $TCA ermöglicht der Feldtyp user, Felder des Bearbeitungsformulars mit einer individuellen Funktion erzeugen zu lassen. Bearbeiten Sie die vom Kickstarter erstellte Datei ext_tables.php, sodass sie dem folgenden Muster entspricht:
Wir haben zunächst das verwendete Sprachlabel auf ...locallang_db.xml:label angepasst. Eine weitere wichtige Änderung ist, dass Sie den Schlüssel ["config"]["type"] auf user setzen und in ["config"]["userFunc"] mit tx_t3kbbeajax_field->getInitialfield den Aufruf einer Methode in einer Klasse festlegen.
Max. Linie
Damit die Methode aufgerufen werden kann, sorgen Sie bereits in der vierten Zeile mit dem neu eingefügten Aufruf von require_once dafür, dass die entsprechende Klassendatei eingebunden wird. Diese werden wir im nächsten Schritt erstellen.
838 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Das benutzerdefinierte Feld erzeugen Erstellen Sie nun die entsprechende Klasse tx_t3kbbeajax_field mit der Methode getInitialField($PA,$fObj), die den initialen Formularinhalt erzeugt, wenn das Bearbeitungsformular im Backend aufgerufen wird. Hier der Inhalt der entsprechenden Methode, die Einrückungen und Kommentare haben wir aus Platzgründen gekürzt: class tx_t3kbbeajax_field { function getInitialField($PA, $fObj) { // Lokalisierung global $LANG; $LANG->includeLLFile('EXT:t3kbbeajax/locallang_db.xml'); // JavaScript einbinden $fObj->additionalCode_pre[] = '<script type="text/javascript" src="' . t3lib_extMgm::extRelPath('t3kbbeajax') . 'res/JavaScript/t3kbbeajax.js'. '">';
Lizensiert für Markus Mueller
// BE-Benutzer mit Mailadresse $editorWithMail = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows ( 'uid,username,email', 'be_users', 'email!=""', '', 'username' ); foreach($editorWithMail as $editor) { $options .= '' . $editor['username'] . ' (' . $editor['email'] . '). '; } $select = '<select '. 'id="t3kbbeajaxeditor_' . $PA['row']['uid'] .'">' . $options . ''; // Button/A-Tag bauen $buttonAction = 't3kbbeajax.sendMail(' . $PA['row']['uid'] . ');return false'; $buttonStyle = 'display:block; width: 200px;'. 'border: 1px solid red;'. 'padding: 3px'; $button = '' . $LANG->getLL('actionone') . '';
Max. Linie
Max. Linie 19.7 Bearbeitungsfelder mit Ajax-Funktionalität versehen | 839 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
// Ausgabe zusammenbauen $xhtml = ''. ''. $select . $button . ''. ''; return $xhtml; } }
Links
Die Methode bekommt zwei Parameter übergeben, die wir in $PA und $fObj übernehmen. $PA enthält damit das Array mit den Feldinformationen aus $TCA sowie den Datensatz, $fObj enthält die aufrufende Instanz von t3lib_TCEforms. Die Funktion liest zunächst die entsprechenden Sprachlabels ein. Danach trägt sie über den Aufruf $fObj->additionalCode_pre[]= dafür Sorge, dass eine kleine, spezifische JavaScript-Datei eingebunden wird, die wir später noch vorstellen werden.
Lizensiert für Markus Mueller
Anschließend werden über die TYPO3-Datenbank-API alle Backend-Benutzer ausgelesen, die eine E-Mail-Adresse eingetragen haben. Für jeden Datensatz wird ein entsprechendes -Tag erstellt. Das entsprechende <select>-Tag erhält ein eindeutiges id-Attribut, damit der selektierte Eintrag später möglichst einfach via JavaScript ausgelesen werden kann, und nimmt alle -Elemente auf. Hierauf gehen wir noch mal genauer in der Diskussion ein. Als Kernfunktion wird anschließend mithilfe einen -Tags ein Button erstellt, der mit einem onClick-JavaScript-Funktionsaufruf versehen wird. Bei einem Klick auf den Button soll die JavaScript-Funktion t3kbebeajax.sendMail() aufgerufen werden, die die uid des aktuellen Datensatzes erwartet. Unsere Funktion trägt deswegen über $PA['row']['uid'] die uid des aktuellen Datensatzes in den onClick-JavaScript-Funktionsaufruf ein. Abschließend werden die einzelnen Teile noch in der Variablen $xhtml zusammengebaut und, wie von dort erwartet, an die aufrufende Instanz zurückgegeben.
Die JavaScript-Datei Hier der Inhalt der im Pfad res/JavaScript/t3kbbeajax.js zu erstellenden JavaScript-Datei: /* ------------------------------------------ */ /* a simple JS-Library for t3kbbeajax */ /* ------------------------------------------ */ var t3kbbeajax = {
Max. Linie
sendMail: function(recUid) { var fieldId = 't3kbbeajaxeditor_'+recUid; var editorMail = $F(fieldId); var params = {'mailRecipient': editorMail, 'recUid': recUid}; this.ajaxRequest('sendMail', params); },
840 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
ajaxRequest: function(callFunc, addParams) { var addReqStr = ''; if(addParams) { addReqStr = '&'+this.implodeParams(addParams); } new Ajax.Request('ajax.php', { method: 'get', parameters: 'ajaxID=tx_t3kbbeajax::'+callFunc+addReqStr, // evalJSON: true, // evalJS: true, onComplete: this.ajaxResponse }); }, ajaxResponse: function(xhr, json) { if(json==false) { alert(xhr.responseText); } else { alert(xhr.responseText); } },
Lizensiert für Markus Mueller
implodeParams: function(myObj) { var myArray = new Array(); var i = 0; for(name in myObj) { myArray[i] = name+'='+myObj[name]; i += 1; } return myArray.join('&'); } };
Diese JavaScript-Datei erzeugt ein Objekt t3kbbeajax, das über die folgenden vier Funktionen verfügt: sendMail Diese Funktion wird über unseren Button aufgerufen. In der Funktion wird die übergebene uid ausgewertet und mit der festen Zeichenkette t3kbbeajaxeditor_. zusammen in der Variablen fieldId abgelegt. Diese Variable entspricht dem idAttribut des <select>-Tags mit den Mailadressen der Backend-Benutzer. Wir benutzen sie, um anschließend über die Funktion $F den vom Benutzer ausgewählten Wert auszulesen. Bei der Funktion $F handelt es sich um eine nützliche, vom Prototype-JavaScript-Framework bereitgestellte Funktion, die den sonst notwendigen Funktionsaufruf document.forms.FORMULARNAME.elements.ELEMENTNAME.value vereinfacht. Prototype ist Bestandteil aktueller TYPO3-Versionen und wird auch innerhalb des TYPO3-Kerns verwendet.
Max. Linie
ajaxRequest Diese Funktion führt den Ajax-Request aus. Hier wird zunächst die URL für den Request mit den entsprechenden Parametern zusammengesetzt. Der eigentliche
19.7 Bearbeitungsfelder mit Ajax-Funktionalität versehen | 841 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Ajax-Request erfolgt über das Objekt Ajax.Request, das auch vom JavaScript-Framework Prototype zur Verfügung gestellt wird. Mit dem Parameter onComplete: this. ajaxResponse wird festgelegt, dass die Methode ajaxResponse aufgerufen wird, nachdem der Ajax-Request abgearbeitet wurde.
Links
Ein von dieser Methode erzeugter Request entspricht in unserem Beispiel dem folgenden Muster: http://TYPO3SITE/typo3/ajax.php?ajaxID=tx_ t3kbbeajax%3A%3AsendMail&mailRecipient=FOO%40EXAMPLE.COM&recUid=999
Eine Erläuterung hierzu erfolgt im nächsten Schritt der Lösung. ajaxResponse Diese Funktion wird aufgerufen, nachdem der Ajax-Request abgearbeitet wurde. Dabei werden zwei Parameter übergeben. xhr enthält das Ajax-Response-Objekt, json enthält einen Boolean-Wert, der entsprechend dem Header der HTTP-Rückantwort gesetzt wird. Die Ajax-Schnittstelle von TYPO3 setzt den json-Header der Antwort bei einem Fehler auf false. Damit eignet sich die Variable sehr gut, um den Erfolgsstatus eines Ajax-Requests abzufragen. In unserem Beispiel wird die Antwort des AjaxRequests lediglich mithilfe der nativen JavaScript-Funktion alert() in einem Pop-up ausgegeben. Lizensiert für Markus Mueller
implodeParams Diese Funktion ist nur eine kleine Hilfsfunktion, um einen JavaScript-Array in einen entsprechenden String für eine HTTP-GET-Anfrage umzuwandeln.
Eine BE-Funktion als Ajax-Funktion registrieren In diesem Schritt registrieren wir die Funktion als Ajax-Schnittstelle im TYPO3-Backend. Erstellen Sie dazu eine Datei ext_localconf.php in Ihrem Extension-Ordner. Der Inhalt der Datei sollte wie folgt aussehen: $TYPO3_CONF_VARS['BE']['AJAX']['tx_t3kbbeajax::sendMail'] = 'EXT:t3kbbeajax/mod_ajax/ class.t3kbbeajax_example.php:t3kbbeajax_example->sendMail';
In $TYPO3_CONF_VARS['BE']['AJAX'] werden alle Skripten, die via Ajax genutzt werden sollen, unter einem eindeutigen Schlüssel registriert. In unserem Fall verwenden wir tx_ t3kbbeajax::sendMail als eindeutigen Schlüssel. Der Wert entspricht dem Pfad zu einer Datei und einem Funktionsaufruf in einer Klasse. Eine auf diese Weise registrierte Funktion kann wie folgt über das Ajax-Skript ajax.php des TYPO3-Backends aufgerufen werden: typo3/ajax.php?ajaxID=t3kbbeajax%3A%3AsendMail
Die Doppelpunkte sind im Funktionsaufruf URL-enkodiert.
Max. Linie
Im nächsten und letzten Schritt müssen wir lediglich noch die entsprechende Klasse mit der Funktion anlegen.
842 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Die Funktion für die TYPO3-Backend-Ajax-API erstellen Erstellen Sie den Ordner mod_ajax, und in diesem Ordner eine Datei mit dem Namen class.t3kbbeajax_example.php. Im Folgenden sehen Sie den Inhalt der entsprechenden Datei, wieder verzichten wir aus Gründen der Übersichtlichkeit auf Kommentare und auf eine Einrückung des Klassen- und Methodenrumpfs: class t3kbbeajax_example { function sendMail($emptyArray=array(),$ajaxObj) {
Lizensiert für Markus Mueller
$uid = (int)t3lib_div::_GP('recUid'); // Record-UID $mailRec = t3lib_div::_GP('mailRecipient'); // gültige Mailadresse if($uid!=0 && t3lib_div::validEmail($mailRec)) { $subject = 'Testmail per Ajax'; $body = 'Datensatz "'. $uid . '" wurde uebergeben.'; if (mail($mailRec,$subject,$body)) { $ajaxObj->setContent(array('Mailversand erfolgreich')); } else { t3lib_div::sysLog ( 'Mail could not be sent to: "' . $mailRec .'"','t3kbbeajax',4 ); $ajaxObj->setError ('Fehler: Mailversand fehlgeschlagen'); } } else { t3lib_div::sysLog ( 'Params "recUid" or "mailRecipient" not valid','t3kbbeajax',4 ); $ajaxObj->setError ( 'Fehler: Parameter "recUid" oder "mailRecipient" ungueltig' ); } } }
In der Methode sendMail() übernehmen wir die beiden Parameter $emptyArray und $ajaxObj. Ersterer entspricht dabei genau seinem Namen, dieser Parameter ist lediglich aufgrund des Aufbaus der TYPO3-Schnittstelle für Benutzerfunktionen erforderlich und wird im Weiteren einfach ignoriert. Der zweite Parameter ist entscheidend, hier wird eine Instanz der Klasse TYPO3AJAX übergeben. Diese wurde in Version 4.2 neu eingeführt und bietet einen einfachen Zugriff auf bei der Programmierung mit Ajax nützliche Methoden. In der Funktion werden zunächst die GET-Variablen aus der Anfrage-URL ausgelesen und einer Prüfung unterzogen. Falls die Prüfung erfolgreich verläuft, wird eine entsprechende Mail über die PHP-eigene-Funktion mail() versendet.
Max. Linie
Über die Funktionen setContent() oder setError() geben wir der übergebenen Instanz von TYPO3AJAX je nach Ergebnis der Prüfungen entsprechende Inhalte. Die Klasse setzt je nach verwendeter Funktion intern automatisch entsprechende Werte, um den Status der Antwort aufseiten von JavaScript, wie oben beschrieben, einfach mit einer Prüfung
19.7 Bearbeitungsfelder mit Ajax-Funktionalität versehen | 843 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
des json-Headers auszuwerten. Ansonsten können Sie hier auch eine Anwendung des in Rezept 2.11 beschriebenen SysLog-Mechanismus sehen, mit dem die Funktion gegebenenfalls auftretende Fehler protokolliert.
Links
Sprachdatei anpassen Sollten Sie den Code jetzt ausprobieren, werden Sie feststellen, dass einige Bezeichnungen nicht ausgegeben werden. Passen Sie in der Übersetzungsdatei locallang_db.xml die folgenden Schlüssel in jeder der gewünschten Übersetzungen an: T3KB Ajax Wizard send mail
Damit sollten Sie nun alle Bausteine für einen erfolgreichen Mailversand an einen Ihrer Redakteure aus einem Inhaltselement heraus zusammenhaben. Schicken Sie die Mail doch zunächst einmal an sich selbst, natürlich nur, sofern Sie in Ihrem Benutzerprofil eine Mailadresse hinterlegt haben. Ansonsten rufen Sie unter Benutzerwerkzeuge die Funktion Einstellungen auf und tragen sie dort noch ein.
Diskussion Lizensiert für Markus Mueller
Wir haben für dieses Beispiel ein Datenbankfeld der Tabelle tt_content hinzugefügt, das wir bisher in keiner Weise verwendet haben. Theoretisch könnten wir dieses Feld in der Datenbank löschen, indem wir die Datei ext_tables.sql entfernen. In der Praxis führt dies jedoch an einigen Stellen in TYPO3 möglicherweise zu einer unschönen Fehlermeldung. So versucht beispielsweise das Listenmodul, das entsprechende Feld zu laden, wenn es im erweiterten Modus vom Benutzer zur Anzeige ausgewählt wurde. Ein Ausweg aus diesem Dilemma wäre, statt des Hinzufügens eines benutzerdefinierten Felds einen der Hooks aus t3lib_TCEforms zu nehmen und den Button zusätzlich hinter einem bestehenden Feld auszugeben. Falls Sie diesen Ansatz verfolgen wollen, bietet Ihnen das Rezept 17.13 eine Hilfestellung zur Verwendung von Hooks. Oft wird eine praktische Funktionalität aber erfordern, Daten zu speichern. In diesem Fall können Sie das Feld auch direkt dafür nutzen. Eine Möglichkeit, Daten in diesem Feld zu speichern, besteht darin, Daten innerhalb der Ajax-Funktion aufzubereiten und in dem Datenbankfeld abzulegen. So kann man dazu beispielsweise ein Objekt mit komplexen Eigenschaften anlegen und das Objekt mit der PHP-Funktion serialize() in einen speicherbaren String umwandeln. Umgekehrt kann ein solches Objekt über unserialize() wieder in ein Objekt überführt werden, wenn der serialisierte Stream zur Verfügung steht. Da dem Skript die uid des Datensatzes bekannt ist, lässt sich das recht einfach in die Ajax-Funktion integrieren.
Max. Linie
Alternativ kann man auch beim Speichern des Formulars Werte direkt über t3lib_TCEmain verarbeiten lassen. Dazu muss nur ein Formularfeld mit einer Bezeichnung nach dem folgenden Muster vorhanden sein, UID und FELDNAME müssen dabei angepasst werden: data[tt_content][UID][FELDNAME]
844 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
In unserem Beispiel könnten wir in getInitialField() folgenden Code benutzen, um ein solches Feld zu erzeugen: $textinput = '';
Wenn dieses dann ausgegeben wird, wird der darin enthaltene Wert beim Speichern des Formulars automatisch in die Datenbank übernommen. Wandeln wir das Feld noch in ein verstecktes Formularfeld um, können wir dort wiederum komplexe Strukturen speichern, die möglicherweise mittels JavaScript dynamisch dort gesetzt werden. Falls Sie sich im Übrigen in der Lösung gefragt haben, warum wir aufwendig die uid des Datensatzes in das id-Attribut des <select>-Tags eincodieren, ist hier die noch geschuldete Erklärung. Das hat etwas damit zu tun, dass innerhalb eines TYPO3-Bearbeitungsformulars durchaus mehrere Datensätze gleichzeitig bearbeitet werden können. In diesem Fall muss jeder dieser Datensätze ein individuelles Auswahlfeld bekommen. Damit ist die Lösung auch mit diesem Anwendungsszenario kompatibel, ohne dass hierbei möglicherweise unerklärliche Fehler auftreten.
Lizensiert für Markus Mueller
In einem per ajaxID eingebundenen Skript sind die folgenden Funktionen aus der übergebenen Instanz der Klasse TYPO3AJAX verfügbar: setContentFormat($format) Die Funktion setzt entsprechende Header für das gewählte Ausgabeformat. Zur Verfügung stehen: plain, xml, json, jsonhead, jsonbody. Die Inhalte sollten in einem entsprechenden Format zur Verfügung gestellt werden. Die Default-Einstellung ist plain. setContent($content) Die Funktion erwartet ein Array mit Inhalten. Diese sollten zum gewählten Ausgabeformat passend aufbereitet sein. addContent($key,$content) Mit dieser Funktion können weitere Inhalte hinzugefügt werden. Dabei sollte als erster Parameter ein key übergeben werden, über den der Inhalt identifiziert werden kann. setError($errorMsg='') Die Funktion ermöglicht, einen Inhalt festzulegen und dabei gleichzeitig die interne Fehlervariable auf true zu setzen. Damit werden in der Antwort automatisch entsprechende Header gesetzt. isError() Die Funktion ermöglicht, den internen Fehlerstatus abzufragen.
Max. Linie
getContent($key = '') Die Funktion ermöglicht, entweder den gesamten Inhalt oder auch nur einen unter einem bestimmten Schlüssel abgelegten Teil davon abzufragen.
19.7 Bearbeitungsfelder mit Ajax-Funktionalität versehen | 845 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
getAjaxID( ) Die Funktion gibt die ajaxID des Aufrufs zurück.
Links
render( ) Diese Funktion gibt den gesamten Inhalt aus und erzeugt entsprechende HTTP-Header. Die Funktion wird automatisch von der TYPO3-Ajax-API ausgeführt und sollte nicht manuell aufgerufen werden! Grundsätzlich lassen sich benutzerdefinierte Aktionen auch über Hooks in t3lib_TCEmain ausführen. Der große Nachteil ist, dass diese Hooks bei jeder Speicheroperation ausgeführt werden. Die hier geschilderte Lösung hat den großen Vorteil, dass die Funktionalität nur bei Bedarf und gut isoliert einzeln ausgeführt wird. Damit bietet sie sehr weitreichende Flexibilität, um mannigfaltige Aktionen anzustoßen. So ist es damit beispielsweise möglich, ein Auswahlfeld mit Datensätzen völlig TYPO3-fremder Datenbanken zu füllen und das Ergebnis zu verarbeiten oder auch Daten als XML an Fremdsysteme auszuspielen. Die Lösung zeigt ein flexibles Grundgerüst für alle diese Anwendungsfälle, das nach Bedarf weiter ausgebaut werden kann.
Siehe auch Lizensiert für Markus Mueller
Das Rezept 17.13 bietet Ihnen Hilfestellung zur Verwendung von Hooks. Das Rezept 16. 3 beinhaltet eine Übersicht zu $TCA und zum Hinzufügen eigener Felder in TYPO3. http://prototypejs.org/learn gibt Ihnen Hilfestellung bei der Verwendung des PrototypeFrameworks, das auch in TYPO3 zur Verfügung steht und im TYPO3-Kern Verwendung findet.
Max. Linie
Max. Linie 846 | Kapitel 19: Backend-Erweiterungen verfeinern This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
First
Kapitel 20
KAPITEL 20
TYPO3 erleben
20.0 Einführung In diesem Kapitel erfahren Sie mehr darüber, was sich um das Projekt TYPO3 so tut – wie es entstanden ist, wie und wodurch es wächst und wer bestimmt, wohin es wächst. In Rezept 20.1 erfahren Sie zunächst etwas über den Erfinder von TYPO3 und wie man seinen dänischen Namen ausspricht. Lizensiert für Markus Mueller
Die Rezepte 20.2, 20.3 und 20.4 erläutern, wie Sie sich aktiv an der Entwicklung des Projekts beteiligen können – auch wenn Sie im Umgang mit TYPO3 noch ungeübt sind oder befürchten, nichts beitragen zu können. Diese Rezepte sollen Sie dazu ermutigen, die vorhandenen Kommunikationsplattformen zu nutzen und sich mit anderen TYPO3-Benutzern auszutauschen (wenn Sie die Rezepte aus dem TYPO3 Kochbuch durchgearbeitet und verstanden haben, sollten Sie dort problemlos mitreden können). Wenn Sie nach Möglichkeiten suchen, das TYPO3-Projekt zu unterstützen, finden Sie in Rezept 20.2 Anregungen. Beispielsweise finden Sie dort eine Übersicht über die TYPO3-Teams, die sich auf unterschiedliche Gebiete in der Weiterentwicklung von TYPO3 spezialisiert haben. In Rezept 20.3 haben wir die wesentlichen Punkte zusammengefasst, die Sie beachten sollten, wenn Sie neue oder vorhandene Extensions dokumentieren möchten. Dies ist vor allem dann wichtig, wenn Sie eine Extension veröffentlichen oder bestehende Dokumentationen in eine bestimmte Sprache übersetzen möchten. In Rezept 20.4 wird der Übersetzungsvorgang für einzelne Sprachwerte im Backend oder in Extensions genauer behandelt. Wenn Sie beispielsweise Vorschläge für eine vorhandene Übersetzung oder gänzlich neue Übersetzungen im TYPO3-Backend oder einer Extension in einer bestimmten Sprache einbringen möchten, erfahren Sie in diesem Rezept, welche Schritte dafür nötig sind.
Max. Linie
Als Grundlage für diese Rezepte ist es notwendig, einen Account auf typo3.org zu erstellen. Erst dadurch können Sie Extensions und Übersetzungen im TYPO3 Extension Repository einspielen und veröffentlichen. Zudem wird mit Ihrem TYPO3-Zugang automatisch ein Benutzerprofil erstellt, über das Sie persönliche Referenzen oder Anmerkungen zu Ihrer Person und Ihrem Bezug zu TYPO3 angeben können. Der Anmeldevorgang ist in wenigen Schritten vollzogen: Wechseln Sie auf die Website typo3.org und klicken Sie auf | 847 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
den Punkt Login/Status. Geben Sie in die dortige Anmeldemaske Ihren gewünschten Benutzernamen und das Passwort ein. Alternativ können Sie auch folgende Adresse verwenden:
Links
http://typo3.org/community/your-account/loginlogout/user-account/
Lizensiert für Markus Mueller
TYPO3 ist Open Source – und Open Source lebt vom aktiven Handeln eines jeden in der Community. In Rezept 20.5 und 20.6 erfahren Sie, wie Sie das TYPO3-Projekt mit neuen Ideen und Anregungen unterstützen können. Kommen Sie in Kontakt mit der Community – melden Sie sich mit Ihrem Newsread an, lesen Sie die Newsgroups und beteiligen Sie sich sachlich an den Diskussionen. Oder äußern Sie Ihre Meinung, um neue Impulse zu geben. Um Ihrer Meinung Nachdruck zu verleihen, sollten Sie ein paar grundlegende Regeln beachten. Mitspracherecht erfordert auch gewisse Verhaltensregeln für die Kommunikation mit der TYPO3-Gemeinschaft. Diese Regeln werden in Rezept 20.6 beschrieben. In Rezept 20.5 erfahren Sie mehr darüber, wie Sie entscheidend zur Verbesserung von TYPO3 beitragen können, indem Sie Fehlverhalten oder neue Ideen und Wünsche in einer zentralen Verwaltungsoberfläche, einem sogenannten Bugtracker, von TYPO3 melden, zur Bearbeitung bekannt geben und eigenes Know-how zur Beseitigung dieses Fehlers mit einbringen können. In Rezept 20.6 werden die öffentlichen Newsgroups näher beleuchtet. Dort erfahren Sie, wie Sie diese wichtige Kommunikationsplattform nutzen können, um Fragen zu stellen oder Ihr Wissen über TYPO3 zu teilen. Wenn Sie einen allgemeinen Überblick über die aktuellen Aktivitäten im TYPO3-Projekt erhalten möchten, sollten Sie Rezept 20.7 lesen. Mit den dort genannten Quellen bleiben Sie auf dem Laufenden. Wir haben im TYPO3 Kochbuch zahlreiche Themen behandelt, und es gibt noch viele andere Bereiche, die Sie erkunden können. So gibt es auf der offiziellen TYPO3-Entwickler-Website weitere Adressen, über die Sie Ihr Wissen vertiefen können. In Rezept 20.8 erfahren Sie, welche zusätzlichen Ressourcen Ihnen diese Website zur Verfügung stellt und wie Sie darüber hinaus mehr über TYPO3 erfahren.
20.1 Skårhøj richtig aussprechen Problem Sie möchten sich nicht blamieren, wenn Sie den Namen des TYPO3-Entwicklers aussprechen.
Lösung Sprechen Sie Skårhøj wie Skorhöj aus. Als Unterstützung bei der Aussprache können Sie sich an die Lautschrift nach dem internationalen phonetischen Alphabet (IPA) halten:
Max. Linie
Max. Linie 848 | Kapitel 20: TYPO3 erleben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Der Buchstabe Ø entspricht dem deutschen Ö. Der Buchstabe å bzw. Å kann im Deutschen keinem bestimmten Buchstaben zugewiesen werden. Der Kreis auf dem Å kann als O verstanden werden, was verdeutlichen soll, dass es sich hier ursprünglich um einen ALaut handelte, der, wenn er kurz ausgesprochen wird, sehr stark zum Buchstaben O tendiert (zum Beispiel wird die Stadt Ålborg wie Ollborg ausgesprochen). Handelt es sich um ein langes Å, wird es wie ein U in Untergang oder und gesprochen, etwa wie Ångstrøm, das Ungström ausgesprochen wird. Allen, denen diese Ausspracheregeln zu kompliziert erscheinen, sei zur Beruhigung gesagt: Herr Skårhøj wird in der Entwicklergemeinde schlicht Kasper genannt.
Diskussion Wenn Sie jetzt schon mehr über den Erfinder von TYPO3 wissen, möchten Sie vielleicht im Gespräch mit anderen TYPO3-Entwicklern mit sagenhaftem Insiderwissen glänzen. Denn weniger klar als die Aussprache des Nachnamens des Entwicklers ist die Herleitung des Produktnamens seiner Erfindung, um dessen Entstehung sich zahlreiche Geschichten und Mythen ranken.
Lizensiert für Markus Mueller
Auch unsere intensive Recherche ergab keine eindeutigen Ergebnisse, sodass die Entstehung des Produktnamens womöglich für immer ein gut gehütetes Geheimnis von Kasper bleiben wird. Eine mögliche Erklärung ist, dass Kasper bei der Korrektur eines Typo, also eines kleinen Schreibfehlers im Programmcode, die Arbeit einer gesamten Woche zunichte machte. Als bleibende Erinnerung für dieses Erlebnis arbeitete er diese Erfahrung in den Projektnamen ein. Die 3 diente dann als Versionsinfo. Eine andere Erklärung ist, dass TYPO für den geschriebenen Code steht, der sich in seiner Gesamtheit zu einer großen Botschaft zusammenfügt. Die 3 verdeutlicht Kaspers dritten Anlauf, sein CMS zu veröffentlichen. Diese Geschichten haben keinen fundierten oder Marketing-technischen Hintergrund (und spiegeln womöglich lediglich die Fantasie mancher TYPO3-Nutzer wider). Eindeutig belegbar ist jedoch, dass TYPO3 eine aktive Community hat, die keiner mythischen Erklärung bedarf: Zahlreiche Menschen arbeiten Tag und Nacht an der Verbesserung des Systems und sorgen dafür, dass TYPO3 ein lebendiges Projekt bleibt. Dabei ist es letztendlich auch gleichgültig, wie der Name entstanden ist – ausschlaggebend ist, für was er steht: Et ess ne Jeföhl (wie der Kölner sagt).
Siehe auch
Max. Linie
Erfahren Sie mehr über die Geschichte von TYPO3 auf der Webseite http://typo3.com/ History.1268.0.html. Die dänische Sprache wird unter folgender Adresse genauer analysiert: http://de.wikipedia.org/wiki/Dänische_Sprache#Ausfall_von_Konsonanten. Mehr Informationen über IPA gibt es unter http://de.wikipedia.org/wiki/Internationales_Phonetisches_Alphabet. Auf folgender Website finden Sie persönliche Hintergrundinformationen zu Kasper: http://typo3.org/community/people/kasper-s-korner/.
20.1 Skårhøj richtig aussprechen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 849
Max. Linie
20.2 Das TYPO3-Projekt unterstützen
Links
Problem Sie möchten das TYPO3-Projekt unterstützen, etwa um neue Features einzubringen oder TYPO3 bekannter zu machen.
Lösung Sie können TYPO3 mit ganz unterschiedlichen Vorgehensweisen unterstützen. Stellen Sie Ihre Zeit und Geduld zur Verfügung, um Ihr Wissen zu teilen oder Ihre Ideen kundzutun. Hierzu ein paar Anregungen – die Reihenfolge stellt keine Gewichtung dar: • Entwickeln Sie sinnvolle neue Extensions, die TYPO3 bereichern (das nötige Grundwissen dazu erhalten Sie in Kapitel 16). • Erstellen Sie neue Dokumentationen, Kommentare, Beispiele, Tutorials, FAQ-Einträge (Anregungen gibt’s in Rezept 20.3). • Helfen Sie bei der Übersetzung von Backend-Labels und Extensions. Einen Einblick in den Übersetzungs-Workflow erhalten Sie in Rezept 20.4. Lizensiert für Markus Mueller
• Beteiligen Sie sich an den Diskussionen in den Newsgroups. Beantworten Sie Fragen und helfen Sie bei Installationsproblemen. So erleichtern Sie anderen TYPO3-Nutzern die Handhabung des Systems. • Entwickeln Sie neue Ideen, Vorschläge und Anregungen, die in TYPO3 integriert werden könnten, etwa indem Sie die Usability des Backends analysieren oder sich an der Qualitätssicherung von bestehenden Extensions und Funktionen im Backend beteiligen. Damit helfen Sie, TYPO3 zu verbessern.
Diskussion Ein solch umfangreiches Open Source-Projekt wie TYPO3 kann ohne tatkräftige Unterstützung der Community nicht effektiv weiterentwickelt werden. Es gibt daher zahlreiche Arbeitsgruppen, die sich auf spezielle Bereiche im TYPO3-Kern, System-Extensions oder organisatorische Aufgaben konzentrieren. Unter folgender Adresse erhalten Sie eine Liste der aktuellen Arbeitsgruppen und können sich einen Überblick über deren Schwerpunkte verschaffen – außerdem finden Sie auf den jeweiligen Detailseiten des Teams Kontaktadressen für Ansprechpartner sowie weitere, detailliertere Informationen: http://typo3.org/teams/ Eine Teilnahme ist für jeden möglich, der sich ernsthaft und gewissenhaft einbringen möchte. Die Teams sind in folgende Hauptbereiche aufgeteilt:
Max. Linie
Core Dieses Team führt Machbarkeitsstudien für aktuelle und zukünftige Entwicklungen im und um den TYPO3-Kern durch. 850 | Kapitel 20: TYPO3 erleben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Extension Coordination Team Dieses Team widmet sich der Qualitätssicherung von Extensions, koordiniert die Entwicklung neuer Extensions und entwickelt neue Ansätze bezüglich der Extension-Entwicklung. Content Rendering Dieses Team entwickelt Herangehensweisen, wie die Inhaltsausgabe von TYPO3 optimiert werden kann, um eine standardkonforme XHTML-Ausgabe der Inhalte sicherzustellen. Zudem werden wichtige Punkte bezüglich Barrierefreiheit und Zugänglichkeit der Inhalte berücksichtigt. Design Dieses Team kümmert sich um ein einheitliches Erscheinungsbild von TYPO3. Unter dem Projektnamen T3BRAND werden neue Designanforderungen entworfen, geprüft und umgesetzt. Security Dieses Team führt kontinuierliche Sicherheitstests und Optimierungen bezüglich Sicherheit am TYPO3-Kern durch und stellt so einen wichtigen Grundpfeiler für das TYPO3-Projekt dar.
Lizensiert für Markus Mueller
TYPO3.org Dieses Team sammelt und verwaltet Inhalte und kümmert sich um die Strukturierung der offiziellen TYPO3-Websites. Dabei ist dieses Team wiederum in weitere Untergruppen aufgeteilt, die sich beispielsweise um das Hosting der Website, die Aktualisierung der Inhalte oder das Design der Site kümmern. Außerdem gibt es eine Gruppe, die sich um die Qualitätssicherung der Extensions kümmert. Neben der aktiven Mitarbeit ist auch eine finanzielle Unterstützung möglich. Dadurch können beispielsweise bestimmte Projekte realisiert oder ausgebaut werden. Eine solche Unterstützung wird auch als Sponsoring bezeichnet. Seit November 2004 gibt es die TYPO3-Association, mit deren Hilfe die Weiterentwicklung von TYPO3 zentral koordiniert wird. Indem Sie dieser Association beitreten, ermöglichen Sie automatisch die langfristige Finanzierung des TYPO3-Projekts. Weitere Details finden Sie auf der offiziellen Website der TYPO3-Association: http://association.typo3.org/
Siehe auch Unter der Adresse http://typo3.org/about/supporting-typo3/ finden Sie weitere Hinweise und Informationsquellen dazu, wie Sie TYPO3 unterstützen können. Mehr Hintergrundinformationen über die TYPO3-Association finden Sie auf der Website http://typo3.com/ Association.1354.0.html.
Max. Linie
Max. Linie 20.2 Das TYPO3-Projekt unterstützen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
| 851
20.3 Handbücher schreiben
Links
Problem Sie möchten zu einer Extension oder einem bestimmten Thema Dokumentationen anlegen, die ausgedruckt oder auf der TYPO3-Website angezeigt werden können sollen.
Lösung Verwenden Sie die offizielle Dokumentenvorlage von folgender Adresse: http://typo3.org/documentation/document-library/core-documentation/doc_template/ current/ Klicken Sie dort auf den Link Open Office Writer 1.0 file (.sxw) und laden Sie die Datei auf Ihre Festplatte. Durch die Verwendung dieser Vorlage stellen Sie sicher, dass Ihr Handbuch den aktuellen TYPO3-Dokumentationsstandards entspricht und beispielsweise auf der Website typo3.org optimal weiterverarbeitet werden kann.
Lizensiert für Markus Mueller
Diese Dokumentenvorlage liegt als OpenOffice-Writer-Datei vor. Daher benötigen Sie OpenOffice, um das Dokument zu bearbeiten. OpenOffice ist – wie TYPO3 auch – Open Source-Software und daher kostenfrei unter folgender Adresse erhältlich: http://de.openoffice.org/downloads/quick.html Diese Vorlage können und sollten Sie für sämtliche Dokumentationen im Zusammenhang mit TYPO3 verwenden. Wenn Sie ein Handbuch für Ihre Extension schreiben, sollten Sie dieses direkt in das Extension-Verzeichnis integrieren. Erstellen Sie dafür ein neues Unterverzeichnis doc, in das Sie dann das Handbuch legen. Der Dateiname des Handbuchs muss dabei manual.sxw lauten, damit es von typo3.org automatisch erkannt und weiterverarbeitet wird. Zudem finden andere Benutzer Ihrer Extension so schnell Zugang zum Handbuch. Beachten Sie, dass Sie ein Handbuch für Ihre Extension erstellen müssen, wenn Sie diese öffentlich über das TYPO3 Extension Repository (TER) anbieten möchten.
Diskussion
Max. Linie
Die Erstellung von TYPO3-Handbüchern ist durch die oben erwähnte Vorlage sehr einfach. Indem Sie diese Vorlage verwenden, stellen Sie sicher, dass Ihr Handbuch den aktuellen TYPO3-Dokumentationsstandards entspricht und problemlos in die offizielle TYPO3-Website typo3.org eingebunden werden kann. Da das OpenOffice-Format auf XML basiert, können weitere Ausgabeformate wie HTML oder PDF automatisch aus Ihrem ursprünglichen Dokument generiert werden. Wenn Sie also ein Handbuch im OpenOffice-Format auf typo3.org bereitstellen, wird automatisch eine HTML- und PDFVersion erzeugt und in der Dokumentationsmatrix erfasst.
852 | Kapitel 20: TYPO3 erleben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Nachdem Sie das Dokument geöffnet haben, sollten Sie folgende Schritte unternehmen: • Ändern Sie als Erstes über die Dokumenteigenschaften den Titel und die Informationen über den Autor (Name und E-Mail-Adresse). Dann passen Sie den ExtensionKey an die jeweilige Extension an, für die Sie ein Handbuch schreiben möchten (in Rezept 15.4 erfahren Sie, wie Sie den Extension-Key einer Extension ermitteln). • Außerdem ist es für die spätere Darstellung der Inhalte wichtig, dass Sie nur Formatvorlagen verwenden, die auch auf der TYPO3-Website dargestellt werden können. • Achten Sie vor allem auf die Punkte Inserting images und Paragraph styles. • Fügen Sie Bilder immer über die Funktion Einfügen ➝ Grafik ➝ Aus Datei... ein. Damit stellen Sie sicher, dass die Bilder in das Dokument korrekt eingebettet werden und auch nach dem Upload ins TER zur Verfügung stehen. • Achten Sie darauf, dass die Screenshots möglichst klein sind – jedoch nicht heruntergerechnet wurden, da dadurch die Dateigröße erheblich zunehmen kann. Viele wichtige Anmerkungen zum Inhalt und zur Gliederung eines Handbuchs sind in der Vorlage bereits enthalten, deshalb sollen die folgenden Punkte Ihnen lediglich einen ersten Überblick darüber geben, was Sie bei der Erstellung eines Handbuchs unbedingt beachten sollten:
Lizensiert für Markus Mueller
• Schreiben Sie eine verständliche Einleitung, anhand derer die Benutzer schnell den Sinn und Zweck der Extension begreifen können. Die Einleitung wird auch als Vorschautext verwendet, der direkt angezeigt wird, wenn jemand auf die ExtensionDetails klickt. Sind hier alle wesentlichen Kernpunkte aus dem Handbuch zusammengefasst? Ist die Einleitung hilfreich? Bekommt der Leser einen Eindruck davon, welche Funktion die Extension bereitstellt beziehungsweise für welchen Zweck sie entwickelt wurde? • Sind die Installationsanleitungen deutlich und vollständig? Welche besonderen Punkte muss der Nutzer beachten, wenn er Ihre Extension installieren möchte? Gibt es Hinweise für Administratoren, wenn die Installation besondere administrative Eingriffe erfordert? • Gibt es eine leicht verständliche Anleitung, die Schritt für Schritt die nötigen Handgriffe erläutert und anhand deren Ihre Extension verwendet werden kann? Dies soll vor allem unerfahreneren Benutzern helfen, mit der Extension zurechtzukommen.
Siehe auch
Max. Linie
In Rezept 15.9 erfahren Sie, wie Sie Extensions über das TYPO3 Extension Repository (TER) veröffentlichen. Nutzer von Mac OS X finden unter folgender Adresse NeoOffice – die offizielle Alternative zu OpenOffice: http://www.neooffice.org/. Im Gegensatz zu OpenOffice benötigt NeoOffice keinen X11-Server. Zudem werden zahlreiche native Funktionen und Tastaturkürzel vom Mac unterstützt, was die Handhabung erleichtert.
20.3 Handbücher schreiben | 853 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
20.4 Übersetzungen anfertigen
Links
Problem Sie möchten Sprachwerte von Extensions übersetzen oder bestehende Übersetzungen korrigieren.
Lösung Installieren Sie sich die Extension locallang-XML translation tool (llxmltranslate) und editieren Sie die Sprachwerte über die Bearbeitungsoberfläche dieser Extension. Damit können Sie bequem über das TYPO3-Backend bestehende Sprachwerte korrigieren oder neue Übersetzungen anlegen.
Lizensiert für Markus Mueller
Laden Sie dafür die Extension mit dem Extension-Key llxmltranslate aus dem TYPO3 Extension Repository (Rezept 15.5 behandelt die dafür nötigen Schritte). Nachdem Sie die Extension aktiviert haben, erscheint ein neues Modul mit dem Titel ll-XML in der linken Menüliste. Das ll steht hierbei für locallang. XML verdeutlicht, dass für die Verwaltung der Sprachwerte XML-Dateien verwendet werden. Klicken Sie nun auf den Modultitel, um in die Moduloberfläche zu gelangen. Hier können Sie über die Option Settings die grundlegenden Einstellungen für die Extension vornehmen. Entscheidend ist hier, dass Sie die jeweilige Sprache in der Auswahlliste Select language you want to edit wählen. Später können Sie die Sprachwerte dieser Sprache anpassen. Haben Sie Ihre Auswahl vorgenommen, werden Ihre Einstellungen automatisch gespeichert und übernommen. Wählen Sie danach Translate files, um in die eigentliche Bearbeitungsmaske zu wechseln. Über die Auswahl Select file wählen Sie die passende Sprachdatei aus. Unter Language finden Sie Ihre gewünschte Sprache, die Sie unter Settings gewählt haben. Die Sprachdateien sind dabei automatisch in bestimmte Bereiche aufgeteilt. Zu Anfang finden Sie sämtliche System-Extensions, die Ihnen standardmäßig in jeder TYPO3-Installation zur Verfügung stehen. Danach folgen die Sprachdateien der globalen Extensions. Zum Schluss erscheinen die Sprachdateien der lokal installierten Extensions. Im Abschnitt CSH finden Sie sämtliche Sprachdateien, die das Hilfesystem von TYPO3 bilden. Die Sortierung erfolgt hierbei analog zur zuvor beschriebenen Struktur: zuerst System-, dann globale, dann lokale Extensions. Falls eine Sprachdatei einer installierten Extension nicht in der Auswahlliste auftaucht, sollten Sie die Option Re-generate cached information auswählen. TYPO3 liest daraufhin sämtliche Sprachdateien erneut ein, sodass sie anschließend in der Auswahlliste zur Verfügung stehen.
Max. Linie
Max. Linie 854 | Kapitel 20: TYPO3 erleben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Rechts
Sobald Sie eine Sprachdatei gewählt haben, erscheinen die jeweiligen Bearbeitungsfelder. In der Spalte Key werden die Sprachschlüssel aufgelistet. In der Spalte Default finden Sie sämtliche Standardwerte des Felds in englischer Sprache. In den weiteren Spalten folgen die Felder für die Sprache, in die Sie die Standardwerte übersetzen können. Nachdem Sie die Werte übersetzt haben, können Sie Ihre Angaben mit dem Button Save in der ursprünglichen Sprachdatei überschreiben. Ihre Änderungen werden umgehend im Backend aktiv. Achten Sie darauf, dass der Webserver die Datei in dem gewünschten Verzeichnis überschreiben darf. Setzen Sie dazu die entsprechenden Schreibrechte.
Diskussion Sämtliche Übersetzungen werden in sogenannten locallang-Dateien gespeichert. Die Dateien, die TYPO3 als Grundlage für die Kernübersetzungen verwendet, sind XMLDateien, aus denen TYPO3 dann – je nach den Benutzereinstellungen – die jeweiligen Sprachwerte ausliest (die Dateien werden daher auch oft einfach llXML-Dateien genannt). Lizensiert für Markus Mueller
Max. Linie
In früheren TYPO3-Versionen kamen auch normale PHP-Dateien als Speicher für Sprachwerte zum Einsatz. Dieser Ansatz gilt ab Version 4.0 als veraltet. Verwenden Sie stattdessen immer XML-Dateien. Dadurch kommen Sie neben den anfangs gezeigten Übersetzungsmöglichkeiten zusätzlich in den Genuss, die Übersetzungen nun unabhängig vom jeweiligen Zeichensatz erstellen zu können, da sie in der XML-Datei im UTF-8Zeichensatz gespeichert werden. Wenn Sie solche Dateien in Ihrer Extension verwenden, können Sie diese leicht mit der Extension Extension Development Evaluator (extdeveval) konvertieren (in Rezept 15.5 erfahren Sie, welche Schritte zur Installation dieser Extension nötig sind). Nachdem Sie die Extension installiert haben, sollten Sie das Frameset des Backends aktualisieren, um den neuen Menüeintrag im linken Menü zu sehen. Klicken Sie dort nun auf den Eintrag ExtDevEval und wählen Sie in der rechten oberen Ecke über die erste Auswahlliste, ob Sie die Konvertierung der Sprachdateien auf lokal oder global installierte Extensions anwenden möchten (die Option System können Sie für die Konvertierung ignorieren, da sämtliche Sprachdateien der System-Extensions bereits konvertiert wurden). Sobald die Seite neu geladen ist, wählen Sie im nächsten Schritt die Option Convert locallang.php files to XML format. Dadurch wird das Konvertierungsmodul geladen. Über die Auswahlliste Select Local Extension können Sie nun die gewünschte Extension auswählen, deren Sprachdateien Sie konvertieren möchten. Anschließend erscheint eine weitere Auswahlliste, aus der Sie dann die jeweilige Sprachdatei wählen können. Achten Sie hierbei darauf, dass die Datei mit locallang beginnt, da TYPO3 ausschließlich solche Dateien konvertiert und die Konvertierung bei anderen Dateien mit einer entsprechenden Meldung abbricht.
20.4 Übersetzungen anfertigen | 855 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Nachdem Sie die Sprachdatei ausgewählt haben, erscheinen weitere Formularfelder, mit denen Sie Eigenschaften der XML-Datei beeinflussen können. Diese Eigenschaften werden zum Beispiel bei der Übersetzung mit der anfangs genannten Extension als Beschreibung angezeigt. Bestätigen Sie die Auswahl mit dem Button Convert, um aus der bestehenden PHP-Datei eine XML-Datei zu erzeugen. Daraufhin wird die gewünschte Datei im jeweiligen Extension-Verzeichnis mit der Dateiendung .xml abgelegt und von TYPO3 umgehend als neue Sprachdatei genutzt (die ursprüngliche PHP-Datei bleibt als Sicherungskopie weiterhin bestehen, wird jedoch von TYPO3 ignoriert und kann daher auch entfernt werden). Wenn Sie die Sprachdateien von Extensions konvertieren, sollten Sie darauf achten, dass Sie diese auch über die entsprechenden Funktionen in Ihre Skripten einbinden. Dies wird in der Regel automatisch von TYPO3 durchgeführt – sicherheitshalber sollten Sie jedoch Ihren Quellcode nach locallang-Dateien mit der Endung .php durchsuchen und diese Dateiendung durch .xml ersetzen. Ein solcher Codeabschnitt tritt hauptsächlich bei der Initialisierung des TYPO3-Sprachobjekts auf und könnte zum Beispiel so aussehen:
Links
include(t3lib_extMgm::extPath('ext_key').'locallang.php'); return $LOCAL_LANG;
Ersetzen Sie diesen Abschnitt mit folgendem Code:
Lizensiert für Markus Mueller
$llFile = t3lib_extMgm::extPath('ext_key').'locallang.xml'; $LOCAL_LANG = t3lib_div::readLLXMLfile($llFile, $GLOBALS['LANG']->lang); return $LOCAL_LANG;
Mit der ersten Zeile erzeugen Sie den Pfad zur jeweiligen Sprachdatei der gewünschten Extension. Diese Datei konvertiert TYPO3 nun anhand der Funktion t3lib_div::readLLXMLfile in ein Array, das die jeweiligen Sprachwerte speichert. Somit werden die neuen XML-Dateien korrekt eingebunden, und Sie können die jeweiligen Sprachwerte über die entsprechenden Funktionen für Mehrsprachigkeit auslesen oder über den anfangs genannten Weg übersetzen (in Rezept 17.7 erfahren Sie mehr über die Verwendung von Mehrsprachigkeit in Extensions). Wenn Sie Sprachdateien zwischen unterschiedlichen TYPO3-Installationen austauschen möchten, wählen Sie die Option Export. Daraufhin können Sie die gewünschten Sprachdateien auswählen und über den Button Export auf Ihre Festplatte laden. Um diese Dateien wieder in Ihre TYPO3-Installation zu importieren, wählen Sie die Option Merge (natürlich muss in dieser TYPO3-Installation auch die Extension llxmltranslate zur Verfügung stehen). So können Sie Ihre Übersetzung sehr komfortabel über mehrere TYPO3-Installationen austauschen und verwalten.
Max. Linie
Wenn Sie eine Sprache vermissen, in die Sie gern übersetzen würden, muss diese Sprache zuerst grundlegend eingerichtet werden. Melden Sie sich dazu bei der offiziellen Newsgroup für Übersetzer an und bringen Sie dort Ihr Vorhaben ein. Die weiteren Schritte werden dann von den verantwortlichen Entwicklern eingeleitet. Alle relevanten Informationen finden Sie unter folgendem Link: http://typo3.org/extensions/translators/
856 | Kapitel 20: TYPO3 erleben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Siehe auch In Rezept 17.7 erfahren Sie, wie Sie Ihre Extensions effektiv für den mehrsprachigen Gebrauch einrichten. In Rezept 15.10 lernen Sie, wie Sie Sprachpakete in TYPO3 installieren und so die Oberfläche vom TYPO3-Backend in weiteren Sprachen zur Verfügung stellen können. Wenn Sie helfen möchten, TYPO3 zu übersetzen, sollten Sie sich unbedingt an der Mailingliste für Übersetzer unter folgender Adresse anmelden: lists.netfielders.de/ cgi-bin/mailman/listinfo/typo3-translators.
20.5 Bugs melden oder neue Features vorschlagen Problem Sie haben einen Fehler in TYPO3 oder einer Extension entdeckt und möchten diesen den Entwicklern mitteilen oder haben eine Idee, wie TYPO3 weiter verbessert werden kann.
Lösung Lizensiert für Markus Mueller
Nutzen Sie den TYPO3-Bugtracker. Dort werden sämtliche Bugs und Feature-Wünsche gesammelt, kategorisiert und im Entwicklerteam koordiniert. Wenn Sie eine Meldung im Bugtracker speichern möchten, sollten Sie sicherstellen, dass Ihre Beschreibung auch von Außenstehenden eindeutig nachvollzogen werden kann. Den Bugtracker finden Sie unter folgender Adresse: http://bugs.typo3.org/ Erstellen Sie über den Link Signup for a new account ein Benutzerkonto. Nachdem Sie sich am Bugtracker angemeldet haben, können Sie unter dem Menüpunkt My Account Ihre Benutzereinstellungen ändern. Der Unterpunkt Preferences bietet mit dem Auswahlmenü Language am Formularende die Möglichkeit, die Sprache des Bugtrackers auf Deutsch umzustellen, was in den nächsten Schritten zur Vereinfachung vorausgesetzt wird. Wählen Sie nun im Auswahlmenü Projekt rechts oben das passende Projekt für Ihre Meldung aus. Hier stehen Ihnen mehrere Auswahloptionen zur Verfügung. So können Sie zum Beispiel Ihre Meldung mit der Auswahl TYPO3 Core dem TYPO3-Kern zuweisen, etwa wenn Sie ein Fehlverhalten beim Verschieben einer Seite im Seitenbaum feststellen (unterhalb dieser Auswahlmöglichkeit werden die System-Extensions aufgelistet, die fest im TYPO3-Kern eingebunden sind). Zusätzlich können Sie über den jeweiligen Extension-Key eine bestimmte Extension auswählen.
Max. Linie
Nachdem Sie das gewünschte Projekt aktiviert haben, klicken Sie auf den Menüpunkt Probleme eingeben, um zur Eingabemaske für die jeweilige Meldung zu gelangen. Je nachdem, welche Kategorie Sie gewählt haben, können Sie im Formular mit Kategorie eine
20.5 Bugs melden oder neue Features vorschlagen | 857 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Unterkategorie wählen, mit der Sie die Meldung noch feiner spezifizieren können. Dies ist zum Beispiel beim Projekt TYPO3 Core der Fall: Dort können Sie – je nachdem, wo das Phänomen auftritt – zwischen den Unterkategorien Frontend, Backend und Install Tool wählen. In den Eingabefeldern Zusammenfassung und Beschreibung können Sie nun Ihre Angaben so detailliert und präzise wie möglich vornehmen.
Links
Stufen Sie Ihre Meldung bei Auswirkung nicht schwerwiegender ein, als sie tatsächlich ist. Die Bearbeitungszeit wird sich durch solche Angaben garantiert nicht verkürzen.
Nachdem Sie Ihre Meldung versendet haben, erhalten sämtliche Entwickler des gewählten Projekts automatisch eine Benachrichtigung über Ihren Eintrag. Zudem wird Ihre Meldung mit einer sogenannten Issue oder Bug-ID versehen, unter der im weiteren Verlauf sämtliche Bearbeitungsschritte zusammengefasst werden. Wenn Sie in Ihrem Benutzerprofil eine gültige E-Mail-Adresse eingetragen haben, erhalten Sie nun automatisch per E-Mail eine Nachricht, wenn sich der Status Ihrer Fehlermeldung ändert oder Kommentare hinzufügt werden.
Lizensiert für Markus Mueller
Max. Linie
Diskussion Für die Entwicklung und Qualitätssicherung eines so umfangreichen Projekts wie TYPO3 ist die strukturierte Erfassung von Fehlern und Feature-Wünschen unbedingt notwendig. Ein geeignetes Werkzeug für diese Aufgabe ist der sogenannte Bugtracker. Damit lassen sich Fehler kategorisieren und nach der Auswirkung des Fehlers erfassen, gewichten sowie entsprechende Zuständigkeiten im Entwicklerteam koordinieren. Andere Benutzer haben die Möglichkeit, die Fehlermeldungen zu kommentieren und so auch den Entwicklern die Arbeit zu erleichtern. Nachdem Sie einen Eintrag gespeichert haben, erhält jeder Entwickler des jeweiligen Projekts eine Benachrichtigung per E-Mail. Je nach Dringlichkeit und Schweregrad der Meldung wird der Eintrag geprüft und einem bestimmten Entwickler zugewiesen, der sich dann näher darum kümmert. Dieser entscheidet nun, wie mit dem Eintrag weiter verfahren wird. Der Bugtracker ist nicht dafür gedacht, Hilfe bei Problemen mit TYPO3 zu erhalten, sondern um bestehende Features oder Extensions zu verbessern. Nutzen Sie die TYPO3Newsgroups, um Fragen und Hilfestellungen zu bekommen. Wenn Sie Fehler in Ihrer TYPO3-Installation feststellen, sollten Sie zuerst Rezept 1.5 lesen. Dort erfahren Sie, wie Sie die wesentlichen Systemeinstellungen ermitteln, die anderen Entwicklern helfen, Ihr Problem nachzuvollziehen. Außerdem erfahren Sie in Rezept 17.4, welche Funktionen Ihnen TYPO3 bietet, um Fehler in eigenen Skripten zu analysieren. Nutzen Sie zuerst diese Möglichkeiten, um den Fehler genau zu analysieren, bevor Sie eine Meldung im offiziellen TYPO3-Bugtracker machen. Die folgende Herangehensweise hat sich dabei in der Praxis bewährt und soll Ihnen als kleine Hilfe dienen:
858 | Kapitel 20: TYPO3 erleben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
• Überprüfen Sie, ob Sie den Fehler auf unterschiedlichen TYPO3-Installationen und Betriebssystemen reproduzieren können. Stellen Sie sicher, dass Sie eine aktuelle und stabile TYPO3-Version installiert haben und der Fehler dort ebenfalls reproduzierbar ist. • Vergewissern Sie sich, dass der Fehler nicht bereits gemeldet wurde. Mehrfachmeldungen erschweren durch den unnötigen organisatorischen Aufwand die Arbeit. • Stellen Sie die Fehlermeldung in der richtigen Kategorie und dem richtigen Projekt ein. Nur so ist sichergestellt, dass Ihre Meldung den richtigen Adressaten findet. • Machen Sie genaue Angaben über Ihre Serverumgebung (Betriebssystem, PHP, Datenbank, Webserver), Ihren Browser und vor allem die verwendete TYPO3-Version. Die phpinfo-Seite des Install-Tools hilft Ihnen bei der Zusammenstellung dieser Informationen. Allerdings sollten Sie nur die für das Problem relevanten Informationen weitergeben, die Liste ist ansonsten sehr lang und unübersichtlich. • Dokumentieren Sie den Fehler – vor allem in der Darstellung – mit Screenshots, die Sie später an den Bug-Report anhängen.
Lizensiert für Markus Mueller
• Notieren Sie Ihre Arbeitsschritte, um den Zeitpunkt des Bugs eindeutig benennen zu können. Somit werden auch mögliche Abhängigkeiten zu anderen Extensions oder zu Programmcode nachvollziehbar. Tritt das Phänomen jedes Mal an der gleichen Stelle auf, oder ist es nicht eindeutig lokalisierbar? • Wenn Sie eine Extension installiert haben: Ermitteln Sie die Version der verwendeten Extension (Rezept 15.4 beschreibt, wie Sie detaillierte Informationen über eine Extension erhalten). • Bugs mit Lösungsvorschlägen werden bevorzugt behandelt und in der Regel schneller behoben. Bitte stellen Sie Patches nur im unified-diff-Format bereit, um die Unterschiede zweier Dateien darzustellen. Der Patch kann dadurch schneller eingearbeitet werden. Unter Unix können Sie dazu einfach das Kommando diff -ub benutzen. Der Funktionsaufruf erfolgt dabei nach folgendem Muster: diff -ub alte_datei neue_datei > patch_datei.diff
• Sind die Fehler durch Rezepte aus dem TYPO3 Kochbuch entstanden? Schreiben Sie uns unter [email protected] – nicht den TYPO3-Entwicklern.
Max. Linie
Bei Änderungen, die den TYPO3-Kern betreffen, müssen Sie zusätzlich zu Ihrem Eintrag im Bugtracker noch eine E-Mail an die Core-Newsgroup (typo3.core) schreiben und Ihren Patch dort veröffentlichen. Ihre Änderung wird dann von den Kernentwicklern einem Review unterzogen. Erst wenn mindestens zwei Entwickler ihr Okay für diese Änderung gegeben haben, wird der Patch einfließen. Als Okay wird ein +1 gewertet. Ein –1 signalisiert, dass die Änderung nicht akzeptiert wurde. Besonders wichtig ist, dass Ihre E-Mail eine bestimmte Form einhalten muss. Eine solche Beispiel-E-Mail sowie der genaue Ablauf für die Handhabung von Core-Patches wird auf dieser Seite im Detail beschrieben: http://typo3.org/teams/core/core-mailinglist-rules/
20.5 Bugs melden oder neue Features vorschlagen | 859 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Siehe auch
Links
Ein offizielles Regelwerk für den Umgang mit dem Bugtracker wurde vom TYPO3-Entwicklerteam ausgearbeitet und kann unter folgender Adresse eingesehen werden: http:// typo3.org/teams/bug-fixing/guidelines/. Weitere nützliche Adressen für Hilfestellungen rund um TYPO3-Probleme finden Sie in Rezept 20.6 und 20.8. Informationen zu Ihrer TYPO3- und PHP-Version erhalten Sie über das Install-Tool im Modul Installation. In Rezept 2.2 erfahren Sie, wie Sie die aktuell verwendete TYPO3-Version ermitteln.
20.6 Die TYPO3-Newsgroups nutzen Problem Sie möchten die Newsgroups von TYPO3 nutzen, beispielsweise um Antworten auf spezielle Fragen zu finden oder sich mit anderen TYPO3-Benutzern auszutauschen.
Lösung Lizensiert für Markus Mueller
Installieren Sie einen Newsreader oder aktivieren Sie ein Newsgruppenkonto in Ihrem E-Mail-Programm, sofern das Programm dies unterstützt. Richten Sie Ihr Konto so ein, dass Ihr richtiger Vor- und Nachname als Absender erscheint und die E-Mail-Adresse gültig ist. Gerade bei Neulingen wirkt es unhöflich, mit einem Fantasienamen und einer Pseudoadresse aufzutreten. Verwenden Sie als News-Server diese Adresse news.netfielders.de Nach dem Speichern können Sie dann die vorhandenen Gruppen abonnieren und nutzen.
Diskussion Newsgroups sind virtuelle Diskussionsforen, die Sie über Ihr E-Mail-Programm oder spezielle Newsreader-Programme nutzen können. Indem Sie Fragen per E-Mail an die gewünschte Gruppe senden, können sie von anderen Mitlesern beantwortet werden. Diese Antworten erscheinen dann automatisch in dem entsprechenden Gruppenordner. Bei TYPO3 gibt es zahlreiche solcher Gruppen, in denen unterschiedliche Themenbereiche behandelt werden. Die folgende Übersicht einer Auswahl vorhandener Newsgroups soll Ihnen die Orientierung erleichtern: typo3.core In dieser Liste werden Patches für den TYPO3-Kern diskutiert und abgestimmt.
Max. Linie
typo3.design In dieser Liste werden Themen behandelt, die das Erscheinungsbild von TYPO3 betreffen.
860 | Kapitel 20: TYPO3 erleben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
typo3.dev Die Hauptgruppe für TYPO3-Entwickler. Der Schwerpunkt dieser Liste liegt bei Diskussionen rund um die Kernentwicklungen von TYPO3 sowie der Entwicklung von Extensions. typo3.english Allgemeine Gruppe für den englischsprachigen Raum. typo3.german Diskussionen um allgemeine TYPO3-Fragen in deutscher Sprache. typo3.install.general Hilfe bei Schwierigkeiten mit der Installation von TYPO3. typo3.install.debian / typo3.install.linux / typo3.install.windows Fragen und Antworten zu Installationsproblemen auf den jeweiligen Betriebssystemen Debian, Linux oder Windows. typo3.off-topic Für diverse Plaudereien um allgemeine Themen, die nur am Rande etwas mit TYPO3 zu tun haben.
Lizensiert für Markus Mueller
typo3.projects Gruppen, die sich mit speziellen TYPO3-Projekten befassen. Wenn Sie Näheres über ein bestimmtes TYPO3-Projekt wissen oder sich dort einbringen möchten, sollten Sie einer dieser Gruppen beitreten (eine Übersicht weiterer Arbeitsgruppen finden Sie in Rezept 20.2). typo3.showroom Der Laufsteg für neue TYPO3-Projekte – hier können Sie andere TYPO3-Nutzer über Ihre neue TYPO3-Website informieren. typo3.tycon3 Die Liste für Themen rund um die jährlich stattfindende TYPO3-Konferenz TYCON. typo3.ug.* Die Listen der Usergroups in unterschiedlichsten Städten der ganzen Welt (eine Übersicht der vorhandenen Usergroups finden Sie unter der Adresse http://typo3.org/ community/typo3-user-groups/). Wenn Ihnen der Umgang mit Newsgroups noch neu ist, hilft Ihnen folgende Anleitung sicher weiter. Dort werden die nötigen Schritte erklärt, die auf jedes moderne Newsprogramm übertragbar sind: http://typo3.org/community/mailing-lists/use-a-news-reader/ Bei der Teilnahme an den Mailinglisten gilt es, ein paar Regeln zu beachten, um die Kommunikation zu vereinfachen. Grundsätzlich sollten Sie vor Ihrem ersten Beitrag in einer Newsgroup die Seite Mailing list rules & guidelines durchlesen:
Max. Linie
http://typo3.org/community/mailing-lists/mailing-list-rules-guidelines/
20.6 Die TYPO3-Newsgroups nutzen | 861 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Wenn Ihnen die Verwendung von E-Mails als Kommunikationsweg zu langsam und zu umständlich ist, können Sie auch den offiziellen TYPO3-Chatraum betreten. Der Channel ist rund um die Uhr offen und bietet Ihnen die Möglichkeit, direkt mit anderen TYPO3-Nutzern über TYPO3-Themen zu plaudern. Wenn Sie bereits ein IRC-Programm installiert haben, können Sie folgende Adressdaten für den TYPO3-Channel verwenden:
Links
Server: irc.freenode.org Channel: #typo3
Auf der folgenden Seite erhalten Sie weitere Hilfestellungen und Hinweise zum TYPO3 im IRC: http://typo3.org/community/irc-chat/
Siehe auch Weitere nützliche Tipps rund um IRC erhalten Sie unter der Adresse http://news.typo3. org/news/article/typo3-help-in-irc/. Wenn Sie in persönlichen Kontakt mit der Community kommen möchten, sollten Sie die sogenannten Usergroups besuchen. In zahlreichen größeren Städten gibt es auch TYPO3-Stammtische, zu denen sich TYPO3-Anwender in lockerer Atmosphäre treffen. Eine Übersicht der aktuellen Usergroups finden Sie auf folgender Webseite: http://typo3.org/community/typo3-user-groups/. Lizensiert für Markus Mueller
20.7 Den aktuellen Projektfortschritt verfolgen Problem Sie möchten einen Einblick in die aktuelle Entwicklung des TYPO3-Projekts erhalten.
Lösung Öffnen Sie die Website forge.typo3.org. Dort finden Sie aktuelle Meldungen, Roadmaps sowie Zeitpläne, die Ihnen einen Überblick über momentane Entwicklungen rund um TYPO3 ermöglichen.
Diskussion TYPO3 hat sich zu einem sehr großen Projekt mit zahlreichen Unterprojekten entwickelt. Um die damit zusammenhängenden Aktivitäten zu kanalisieren und die Zusammenarbeit der Entwickler zu vereinfachen, gibt es nun die zentrale Plattform forge.typo3.org.
Max. Linie
Als registrierter Benutzer haben Sie die Möglichkeit, sich an Projekten zu beteiligen oder neue Projekte zu starten. Die Website schafft dabei mit Tools wie zum Beispiel einem Wiki, Projektplaner, Issue-Tracker und der nahtlosen SVN-Integration eine optimale Infrastruktur für ein erfolgreiches Projekt bzw. Projektmanagement. Über ein Newssystem können Sie aktuelle Meldungen veröffentlichen. 862 | Kapitel 20: TYPO3 erleben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Für allgemeinere Meldungen rund um das TYPO3-Projekt können Sie die Adresse news. typo3.org nutzen. Auf buzz.typo3.org finden Sie Blogs rund um das Thema TYPO3. Eine weitere – sehr kurzweilige – Informationsquelle sind die TYPO3-Podcasts, die in unregelmäßigen Abständen über TYPO3-Themen berichten: http://typo3.org/podcasts/.
Siehe auch Weitere Informationen zu forge.typo3.org finden Sie unter der Adresse http://forge.typo3. org/start/about/.
20.8 Weiterführende Quellen Problem Sie suchen Antworten, Quellen oder Hinweise zu Themen, die im TYPO3 Kochbuch nicht behandelt wurden.
Lösung Lizensiert für Markus Mueller
Besuchen Sie das offizielle TYPO3-Wiki unter der folgenden Adresse: wiki.typo3.org Das TYPO3-Wiki stellt neben der offiziellen Entwicklerwebsite typo3.org und den Newsgroups eine weitere wichtige Anlaufstelle für Informationen rund um TYPO3 dar. Zum Beispiel finden Sie dort zahlreiche Anleitungen und Hilfestellungen zu TYPO3-Fragen, die von engagierten TYPO3-Nutzern auch ständig ausgebaut werden. Außerdem erhalten Sie dort viele weiterführende Hyperlinks auf externe Websites wie Internetforen und aktuelle Dokumente. Um das TYPO3-Wiki in deutscher Sprache zu verwenden, können Sie im Abschnitt Other languages über die entsprechende Flagge die Sprache wechseln. Wenn Sie Inhalte editieren oder ergänzen möchten, benötigen Sie einen BenutzerAccount, den Sie in wenigen Schritten über den Link Create an account or log in erstellen können. Diesen Link finden Sie in der rechten oberen Ecke. Falls Sie schon einen Account auf typo3.org erstellt haben, können Sie sich damit auch am Wiki anmelden.
Diskussion Sollten Sie den Umgang mit Wikis nicht mögen, können Sie auch eine klassische Linksammlung auf typo3.org nutzen. Dort finden Sie zahlreiche weitere Adressen zu nützlichen Websites rund um TYPO3:
Max. Linie
http://typo3.org/documentation/other-resources/
20.8 Weiterführende Quellen This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie | 863
Siehe auch
Links
In Rezept 20.6 erfahren Sie, wie Sie Zugang zu einem riesigen Wissensspeicher erhalten: zu den TYPO3-Newsgroups. Eine weitere wichtige Quelle stellt die Website http://typo3. org dar. Dort finden Sie aktuelle Nachrichten rund um TYPO3 sowie Ankündigungen und Hintergrundinformationen über Neuentwicklungen.
Lizensiert für Markus Mueller
Max. Linie
Max. Linie 864 | Kapitel 20: TYPO3 erleben This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
First
Index
A
Lizensiert für Markus Mueller
Max. Linie
Å 848 Abkürzungen, einbinden 719 Abschnittsübersicht 430 Abstand, hinzufügen 393 accessibility 575 Acronyme, einbinden 719 ACT 478 ACTIFSUB 478 Add as a totally new Content Element type 708 additionalParams 398 addQueryString 399 addToList 288 Admin-Panel 109, 131, 264, 317 cache 133 Cache freischalten 133 edit 134 Eingabe freischalten 134 info 136 Info freischalten 136 preview 133 publish 134 tsdebug 135 TypoScript freischalten 135 Veröffentlichen freischalten 134 Vorschau freischalten 133 Admin-Werkzeuge, DB-Überprüfung 58 admPanel 109, 131 ADODB-Bibliothek 753 after 518 age 372, 373 Ajax Ajax.Request 842 ajaxID 842
Backend 837 Backend-API 842 Benutzerdaten speichern 811 Datenbank-Abfragen durchführen 811 eID (Extension ID) 810 eID_include 810 eID-Alternativen 812 eID-Prinzip / Ablauf 811 in Bearbeitungsformular nutzen 837 Response-Objekt 842 schnelle Antwortzeiten ermöglichen 810 tslib_eidtools 811 TYPO3AJAX 843 TYPO3AJAX-API 845 Aktionen, automatisieren 166 Allowed excludefields 125 allowedTables 129 allWrap 481, 530 Alter, berechnen 372, 373 alternativeSortingField 519 altUrl 556 alwaysActivePIDlist 512 Änderungen, Zeitpunkt ermitteln 441 Änderungsverlauf anzeigen/Rückgängig 181 Anmeldeformular aktuelle Nachrichten anzeigen 99 anpassen 95 Backend, anpassen 96 eigene Bilder darstellen 95 Feldbezeichnungen umbenennen 93 loginNews 99 Tipp des Tages anzeigen 105 Anmeldung sichere 88 typo3.org 847
| 865 This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Links
Lizensiert für Markus Mueller
Anordnung von Eingabefeldern anpassen 220 Ansicht, erweiterte 240 Antworten finden 863 in Newsgroups 860 API (Application Programming Interface) 735 Dokumentation 737 Möglichkeiten 735 Struktur verstehen 735 t3lib_div 736 verwenden 735 appearance useCombination 769 append 390, 438, 518 append, postCObject 389 Applikationen, sichern 739 applyTotalH 534 applyTotalW 534 apppendString 288 Arbeitsschritte, rückgängig machen 181 Arbeitsumgebung (siehe Workspace) Aspell 149 Association, TYPO3 851 ATagBeforeWrap 399 ATagParams 401 Attribute 770 Ausgabe korrekt formatierter Inhalte 387 für Suche indexieren 303 für Validierung aufbereiten 302 Ausrichtung 445 Aussprache Kasper Skårhøj 848
B
Max. Linie
Backend adminOnly 92 Ajax 837 ajax.php 842 Anmeldung 81, 84 absichern 89 sperren 92 Anmeldung erneuern 84 anpassen 81 Ansicht anpassen 201 Backend-Module erstellen 719 Benutzer anlegen 167 Browsereinstellungen optimieren 82 die Ajax-Schnittstelle nutzen 837 enabledBeUserIPLock 91 Feldbeschreibung 202
866 | Index
Hilfesystem 202 IPmaskList 91 lockToIP 91 Mehrsprachigkeit 686 Passwort ändern 85 wieder herstellen 86 schmale Bildschirme (optimieren für) 201 sperren 92 sperren (adminOnly) 50 Backend-Benutzer simulieren 112 Backend-Formulare --div-- 227 Eingabefelder mehrspaltig darstellen 225 eval 219 formevals 219 mehrspaltig 225 --palette-- 225 Paletten, anwenden 225 überprüfen 217 Backend-Module erstellen 719 erweitern 719 Skinning unterstützen 725 Backend-Skins 725 Backup 63 Datenbank 64 Ordner und Dateien 63 Sicherheitskopie des Seitenbaums erstellen 184 badMess 584 barrierefrei 446, 452, 458 Basis-Template 258 bedingtes Anpassen 278 Bedingungen abfragen 365 Befehl anlegen 166, 233 Create Backend User 167 Edit records 167 erstellen 166 New Record 167 Record list 167 SQL-Query 167 before 518 begin 510 Benutzereinstellungen aktivieren 113 erzwingen 116 prüfen 112 vorbelegen 113
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Benutzerpasswort zurücksetzen 113 Benutzerrolle wechseln 112 Benutzer-TSconfig 200 Beschreibung einer Funktion ermitteln 735 Beschreibungen für Tabellen anlegen 834 Bezeichner, verschiedene 590 Bildbearbeitung 411, 443, 446, 452, 457, 554 Bildblock Gesamtbreite 441 rendern 598, 601 Spaltenbreite 439 Zeilenbreite 440 Bilddatei Bemaßung 440 Listenposition ermitteln 440 Pfad zum Original 440 Bildelemente 550 Bilder anzeigen 548 Blättermenü 500 Blätternavigation 653 body-Tag ändern 300 borderschemes 226 br 373, 377 Breadcrumb-Menü 487, 653 Brotkrumen-Navigation 487, 653 Browser Cache 83 Cookies akzeptieren 83 Einstellungen optimieren 82 JavaScript 82 Pop-Up-Fenster 82 Pop-Ups freischalten 82 brTag 373, 377 Bugfix-Version 44 Bugs (Programmfehler) 857 Bugtracker 857 Byteangaben formatieren 372, 374 bytes 374
C
Max. Linie
Cache Dateien 14 löschen 58 deaktivieren 414 cache 133 _CACHEFILE 19 canNotCollapse 226
CASE 435, 541, 545, 608 default 573, 608 key 573, 608 cObject 610 case 372, 374 changeCompatibilityVersion 48 ChangeLog Datei 16 nutzen 732 char 372, 375 Charactercodes verwenden 372, 375 cHash (Parameter) 805 cHash/Caching Objektvariablen 802 CHECK.layout 582 class.t3lib_* 735 CLASS/FUNCTION INDEX of SCRIPT 737 clear.gif, Grafik-Datei 15 COA 411, 417, 431, 433, 638 COA_INT 413, 415, 628 includeLibs 413 cObj 351 parentRecordNumber 611 COBJ_ARRAY 413 cObjectGetSingle 797 cObjects 338, 411, 422, 518, 603, 797 CASE 435 COA 411, 417, 431, 433 COA_INT 413, 415 COBJ_ARRAY 413 CONTENT renderObj 431, 433 select 433 GMENU 442, 453 HMENU 442, 453, 457 IMG_RESOURCE 446, 457 LOAD_REGISTER 411, 420, 424, 431, 436 RESTORE_REGISTER 411, 420, 436 TEXT 417 USER 412, 461, 463 USER_INT 412, 436, 461, 463 Coding Guidelines 738 colorschemes 226 colPos 202 columns, TCA 21, 211 columnwidth 439 COMMENT.layout 582 commentWrap 582 Community, TYPO3 847
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Index |
867
Max. Linie
Links
Lizensiert für Markus Mueller
Max. Linie
Compat-Mode 48 compatVersion 48, 49 Conditions 278, 574, 657 häufig verwendete 280 treeLevel 657 $conf 461 conf, tt_content 569 CONFIG additionalHeaders 301 baseURL 296 disableAllHeaderCode 299 disableCharsetHeader 300 doctype 297 headerComment 297 htmlTag_langKey 299 index_enable 303 language 313 linkVars 322 locale_all 312 metaCharset 298 noPageTitle 299 renderCharset 298 simulateStatic 324 sys_language_mode 314 Optionen 314 sys_language_overlay 315 sys_language_softMergeIfNotBlank 315 sys_language_uid 311 xhtml_cleaning 302 xmlprologue 298 config locale_all 71 metaCharset 74 renderCharset 74 Constant Editor eigene Bearbeitungsmaske anlegen 273 eigene Werte einstellen 273 Konstanten bearbeiten 273 CONTENT 545, 612, 614, 628, 649 renderObj 431, 433, 560 select 433, 559 table 559 Content Objects 411 ContextMenu 148 copyAfterDuplFields 124 count_HMENU_MENUOBJ 439, 539 count_menuItems 439 count_MENUOBJ 439 crop 373, 375 csConv 373, 376
868 | Index
CSH (siehe Hilfe) 833 CSS aus Extensions 306 Conditional Comments 305 Datei dynamisch erzeugen 307 einbinden 307 einbinden 304, 808 CSS-styled-content 440, 441 ctrl, TCA 21 CUR 478 CURIFSUB 478 current 338, 340, 351, 429
D dänische Aussprache 848 data 348, 421, 574 cObj 351 current: 351 date: 352 DB: 353 debug: 354 fullRootLine: 355 getenv: 356 getIndpEnv: 356 GPVar: 357 levelfield: 358 levelmedia: 358 leveltitle: 358 leveluid: 358 LLL: 360 page: 361 parameters: 362 path: 363 register: 363 TSFE: 364 dataArray 574, 578 label 574, 578 required 578 specialEval 578 EMAIL 578 EREG 578, 584 type 578 value 574, 578 Database Abstraction Layer (DBAL) 744, 748 Database Analyser 52 Compare 52 Database Error (Datenbankfehler) 34 dataWrap 348, 421, 428
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Max. Linie
date 352, 373, 376 Dateiliste _recycler_ 180 ausgeben 341 Dateien löschen 178 verwalten 178 Ordner löschen 178 verwalten 178 Dateinamen suchen 80 Dateipfade absolute Pfade zu einer Extension erzeugen 741 ermitteln 741 nachvollziehen 80 relative Pfade erzeugen 741 relative Pfade zu einer Extension erzeugen 741 wichtige Konstanten 741 Dateisystem durchsuchen 80 Daten aus der Rootline auslesen 358 aus Extension einfügen 303 importieren 187 Datenbank Abfragen durchführen 167, 745 Abstraktionsschicht 744 anlegen 30 Dump 55 Inhalt überprüfen 58 Inhaltsobjekt Datenbankfelder, mögliche 710 Objekt 745 Prüfung 52 Schema erweitern 700 ext_tables.php 701 ext_tables.sql 701, 707 locallang_db.xml 708 tca.php 701, 705 Schema modifizieren 700 Schnittstelle (DBAL) 744 sichern 52 Standardtabellen 55 Struktur überprüfen 58 überprüfen 58, 234 Verbindungsparamter 30 Wartung 52 Datenbank-API mehrere Datenbanken abfragen 748
Datenbankschema, prüfen 52 Datenbankverbindung no_pconnect 752 persistente Verbindungen verhindern 752 Datensätze aktualisieren 188 Änderungsverlauf anzeigen/Rückgängig 164 Ansicht, erweiterte 164 Auswahlbegrenzung 167 Auswahlliste 167 bearbeiten, direkt 167 direkt ansteuern 353 eigene auflisten 241 entfernen 175 gleichzeitig editieren 768 Informationen anzeigen 164 kopieren 168, 193 löschen 165, 175, 180 delete 177 nach oben verschieben 165 nach unten verschieben 165 neue anlegen 167 neue einfügen 165 Seite, neue anlegen 165 verbergen 165 verschieben 171 Versionierung 165 Datensicherung 63 Datenübertragung 63 Datum, ausgeben 352, 373, 376 DB: 353 DBAL 744 DB-Überprüfung 79, 80 debug 354, 402, 743 debugData 402, 403 debugFunc 402, 403 default 573 delete = 0 177 devIPmask 743 directReturn 369 disableDelete 183 disableItems 183 delete 183 displayErrors 34 --div-- 130, 227 Doctype, korrekten ausgeben 297 doktype 128 Dokumentation 852 doc_core_api 213 doc_template 852 Dokumentvorlage 852
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Index |
869
Max. Linie
Links Handbücher erstellen 852 Richtlinien 852 Standards 852 TYPO3 Core APIs 213 Domain Records 27 Domains (mehrere) in einer TYPO3Installation 27 doNotCheckReferer 84 doNotLinkIt 479, 516, 539 dontMd5FieldNames 575 doubleBrTag 373, 377 Dummy-Package 5, 6 dynamischer Wrap 599, 603 dynamisches CSS einbinden 306
E
Lizensiert für Markus Mueller
Max. Linie
edit 134 editFieldsAtATime 174 editIcons 402, 404 EDITPANEL 318 editPanel 402, 404 eID(siehe auch Ajax) Schnittstelle 810 einfaches Menü 513, 529 Eingabefelder anpassen 211 Eingabeformular flexform 818 Eingabemaske eigene erzeugen 700 im Erweiterungs-Manager 786 Eingabemodus Schnelleingabe 120 eingeloggt bleiben 330 Einzelansicht 173 emailMess 584 entryLevel 471 Entwicklerversion 8 Entwicklerversionen, herunterladen 8 equals 368 Error 37 error_log( ) 742 ErrorDocument 333 erweiterte Ansicht, verwenden 164 erweiterte Menüeigenschaften 507 Erweiterungs-Manager Ansichten 667 Extensions deinstallieren 681 Funktionen Import extensions 664 Install 664
870 | Index
Install extension 664 Loaded extensions 664 Settings 664 Settings 682 eval-Funktionen 213 allgemein 215 Datum und Uhrzeit 215 weitere Feldeigenschaften 217 Zeichenketten filtern 216 Zeichenketten verarbeiten 216 evaluateFieldValue 218 excludeDoktypes 511 excludeUidList 511 exec_DELETEquery 747 exec_INSERTquery 746 exec_SELECT_mm_query 746 exec_SELECTgetRows 746 exec_SELECTquery 746 exec_UPDATEquery 747 expAll 481 Export 184 beschleunigen 185 Datensätze, lokal sichern 184 nur bestimmte Datensätze austauschen 185 Seiteninhalte 184 ext_tables.php 701 ext_tables.sql 701, 707 extCache 83, 743 $_EXTCONF 785 extConf 785 Extensions 307 Abhängigkeiten 670 aktualisieren 672 als Datei speichern 680 Änderungen am Code protokollieren 731 Änderungen dokumentieren 740 Aufbau 693, 738 Backend-Module erstellen 690, 719 Backup 680 bestimmte Versionen importieren 679 ChangeLog 696 class.ext_update.php 698 cm*/ 699 Copyright 690 CSS 306 css_styled_content 307 Dateigröße des Handbuchs 684 deinstallieren 681 doc/ 699 Download 680
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Max. Linie
eigene, Notwendigkeit prüfen 738 einbinden 670 Entwicklerversion 674 Entwicklung Coding Guidelines 738 Erstellung 689 Coding Guidelines 738 Grundgerüst 693 Kickstarter 693 TypoScript einbinden 792 exportieren 680, 684 ext_conf_template.txt 698 ext_emconf.php 697 ext_icon.gif 698 ext_localconf.php 697 ext_tables.php 697 ext_tables.sql 697 ext_tables_static+adt.sql 697 ext_typoscript_constants.txt 698 ext_typoscript_editorcfg.txt 698 ext_typoscript_setup.txt 698 Extension Development Evaluator 737 Extension Keys 663, 684, 689, 692 Extension Kickstarter Add as a new header type 715 Backend Modules 695 Clickmenu items 696 Extend existing Tables 695 Frontend Plugins 695 Integrate in existing Modules 695 New Database Tables 695 Services 696 Static TypoScript code 696 TSconfig 696 Felder und Tabellen hinzufügen 700 felogin 327 Frontend-Plugins 715 eigene Inhaltselemente 708 eigene PHP-Skripten einbinden 689 eigene Tags 716 eigene Überschrift 715 eigenes Frontend-Plugin 708 Funktionsumfang beschreiben 740 gruppieren 667 Handbücher, erstellen 740 htmlArea 137 Icon anpassen 730 importieren 677 Informationen zu aktiven Extensions 678
Informationen zu 666 Installationstyp wählen 679 installieren 670 installierte ermitteln 666 Konfigurationsoptionen im Install-Tool 679 konfigurieren 670, 689 Listendarstellung, Auswahl 667 llxmltranslate 854 locallang*.xml 698 löschen 682 mehrsprachig anlegen 754 Mehrsprachigkeit in Backend-Modulen 755 in Frontend-Plugins 755 mod*/ 698 Notwendigkeit prüfen (eigene) 738 nutzen 663 Ordner und Dateien 696 Parameter verwalten 785 Feldtypen 787 Gruppierung 789 PHPDoc (JavaDoc) 740 pi*/ 698 Programmcode Fehleranalyse 742 Programmcode, Fehleranalyse 742 Qualität/Sicherheit 675 README.txt 697 Recherche 675, 738 Qualitätskriterien 675 Repository 664, 675 Zugriff konfigurieren 682 res/ 699 rtehtmlarea 142 sichern 680 Standards 739 static 699 sv*/ 699 sys_action 233 TER 692 tstemplate_viewdefault (Default-TypoScript ausgeben) 796 Typen Global 664, 668, 679 Local 664, 668, 679 System 664, 668, 678, 679 TYPO3 erweitern 690 TYPO3-Standards 739
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie Index |
871
Links TypoScript-Standard-Templates ausliefern 794 übersetzen 854 Übersetzungen korrigieren 854 unsupported 683 Updates 673 Verarbeitung von TypoScript 796 Versionsnummer 676 verwalten und austauschen 692 Verzeichnisnamen umbenennen 726 Voraussetzungen definieren 727 Voraussetzungen im Code abfragen 729 Zeitstempel 669 Extension-Templates 278 externalBlocks 388 extTarget 397
F
Lizensiert für Markus Mueller
Max. Linie
Farbwerte 443, 444, 450, 455, 457 Fatal Error 34 fe_groups 328 fe_users 328 FE-Editing (Frontend Editing) 131 Fehleranalyse 858 Fehlerinformationen, ausgeben 354 Fehlermeldungen beim Seitenaufruf 32 besondere 38 Cannot connect to the current database 35 Could not set logfile path 38 Datenbankfehler 34 Kein Zugriff auf TYPO3 mehr möglich 681 No database selected 35 No pages are found on the rootlevel! 36 No template found! 36 Page is being generated 35 Page is not available in default language 38 Page is not available in the requested language 37 Page shortcuts were looping in uids 39 PHP 39 Preview of workspace 39 PREVIEW! 39 Seitenkonfiguration 35 sprachbezogen 37 The page is not configured! 37 The requested page didn’t have a proper connection to the tree-root! 37
872 | Index
The requested page does not exist! 36 This page is temporarily unavailable. 37 feInterface, TCA 21 Felder, auslesen 353, 354 field 338, 340, 354 fieldOrder 120 fieldPrefix 583 fieldRequired 365 fieldWrap 582 file, import 551 fileadmin 12, 187 filelist 338, 341 Flexforms einbinden und konfigurieren 818 mehrere Flexform-Felder auslesen 799 Sheets 822 Werte auslesen 798 FORM 574, 584, 660 accessibility 575 badMess 584 CHECK.layout 582 COMMENT.layout 582 commentWrap 582 data 574 dataArray 574, 578, 660 dontMd5FieldNames 575 emailMess 584 fieldPrefix 583 fieldWrap 582 formname 575 goodMess 584 hiddenFields 581 image 582 LABEL.layout 582 labelWrap 582 layout 575 method 580 no_cache 580 noValueInsert 580 noWrapAttr 583 params 582 RADIO.layout 582 radioWrap 582 recipient 580 redirect 580 REQ 582 required 577 type 580 wrapFieldName 583
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Max. Linie
Formatierung von Texten außerhalb von Typotags 386 formname 575 Formulare 574 Layout festlegen 581 Meldungen 583 überprüfen 217 Verhalten festlegen 579 Formularelemente fieldset 587 gruppieren 584 Formularfelder 574 vorbelegen 578 Form-Wizard 575 Frontend Admin-Panel 131 Editing 109, 317 Inhaltseingabe 109 mehrsprachige Labels 686 mehrsprachige Websites 311 redirect 110 Frontend Editing (FE-Editing) 131 Frontend-Benutzer, FE-User 327 Frontend-Plugin, Vorschau im Seitenmodul optimieren 829 fullRootLine: 355 Funktionsübersicht (CLASS/FUNCTION INDEX of SCRIPT) 737
mask 635, 640 mehrzeilig 457 niceText 635, 638 SCALE 452, 456, 458 TEXT 442, 452, 458, 639 transparentBackground 446, 450 transparentColor 446 XY 442, 446, 456, 458 GMENU 442, 453, 467, 642 applyTotalH 534 applyTotalW 534 useLargestItemX 534 useLargestItemY 534 GMENUITEM 467 allWrap 530 IFSUBRO 535 RO 535 goodMess 584 GPL.txt, Datei 16 GPvar: 357 Grafiken erzeugen 441, 446, 452, 457 verarbeiten 441, 446, 452, 457 Grafikmenü 529, 531 Großschreibung, erzwingen 372, 374 Gruppenrechte Allowed excludefields 125
H
G $GLOBALS abfragen 356 $GLOBALS['TYPO3_DB'] 745 gdlib1 443, 446, 452 gdlib2 443, 446, 452 gefährlichen HTML Code entfernen 373, 379 GET/POST-Parameter ajaxID 842 GET/POST-Variablen auswerten 281 durchschleifen 312 verwenden 357 getenv: 356 getIndpEnv: 356 getText, levelmedia 306 GIFBUILDER 411, 442, 446, 556, 635 backColor 446 BOX 442, 452, 639 Ebenen 443, 455 EFFECT 452, 639
Handbücher, erstellen 740, 852 Hauptmodul 199 Admin-Werkzeuge 200 Benutzerwerkzeuge 199 Datei 199 Hilfe 200 Web 199 headerdata 305 hidden 125 hiddenFields 581 hierarchische Nummerierung 524 hierarchische Übersicht 430 Hilfe Bilder integrieren 836 Icon 835 kontext-sensitiv (CSH) 833 Querverknüpfungen einbinden 835 HMENU 442, 453, 457, 467, 612, 620, 642, 655 alternativeSortingField 655 alwaysActivePIDlist 508, 512
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Index |
873
Max. Linie
Links
Lizensiert für Markus Mueller
begin 508, 510 entryLevel 471, 655 excludeDoktypes 508, 511 excludeUidList 508, 511 includeNotInMenu 508, 512 maxItems 508, 510, 655 minItems 508, 510 optionSplit 482 protectLvar 509, 512 showAccessRestrictedPages 476 special 473, 653, 654, 656, 659, 660 Hooks 772 anwenden 773 Beispiele 783 finden 779 Kritikpunkte 785 list_type_Info 829 Typen 782 Verarbeitungsmethoden 782 .htaccess 324 _.htaccess 15 Datei 15 htmlArea 137 Funktionsübersicht 138 mögliche Optionen 137 Rechtschreibprüfung 138, 149 Standard-WYSIWYG-Editor 137 HTML-Code entfernen 373, 381 HTMLparser 146 HTML-Tags unabhängig vom Text formatieren 388 HTML-Vorlage 589 Bezeichner, verschiedene 590 Zeichensatz konvertieren 71 HTTP Header senden 297 Hyperlinks erzeugen 799
I
Max. Linie
ICON_REL_PATH 439 iconfile 828 Icons Dateipfad 439 für eigene Datensätze 826 mögliche Zustände, Kennzeichnungen 826 if 365, 417 directReturn 369 equals 368, 434 isFalse 366 isGreaterThan 367, 434
874 | Index
isInList 368 isLessThan 368 isPositive 366 isTrue 366 negate 369 ifEmpty 365, 370 IFSUB 478 IFSUBRO 535 IMAGE 545 altText 550 file, import 550 imageLinkWrap 519, 551, 556 image 582 Image Replacement 449, 452, 457 IMAGE_NUM 440 IMAGE_NUM_CURRENT 440 imageLinkWrap 519, 551 JSwindow altUrl 556 ImageMagick 443, 446, 452 IMG_RESOURCE 446, 458, 551, 556 imgResource 300 Import 184 Daten einspielen 187 Datensätze 184, 187 Datensätze aktualisieren 188 Seiteninhalte 184, 187 Import extensions 664 Include Basis Template 257 INCLUDE_TYPOSCRIPT 269 includeNotInMenu 512 index.php, Datei 16 Index-Suche allgemeine Eigenschaften 191 Cache-Einstellungen prüfen 191 Index füllen 191 installieren 191 info 136 Inhalt anderer Seiten 566, 568 anhängen 390 Anzeigeoptionen 572 ausgeben 284 bereinigen 373, 382 eingeben 117 hinzufügen 390 lokal sichern 184 löschen 175 manuell zuweisen 347 mit Trennstring aufteilen 373, 379
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Max. Linie
organisieren 163 übergeben 351 überschreiben 371 unbereinigt verpacken 392 von Unterseiten 558 verpacken 391, 394 verwalten 163 voranstellen 392 zeitabhängige Wiedergabe 571 zeitversetzt anzeigen 572 zusammenfassen 412 Inhaltseingabe beschränken 129 Eingabe beschleunigen 120 über das Frontend 109, 131 Inhaltselemente alphabetisches Verzeichnis 612 Änderungsverlauf anzeigen/Rückgängig 164 Bild 551 Darstellung ändern 431 Datensatz einfügen 165, 170 löschen 165 verbergen 165 eigene erstellen 708 Informationen anzeigen 164 komplexe Menüstrukturen erstellen 562 Menü/Sitemap 431 nach oben verschieben 165 nach unten verschieben 165 Seite, neue anlegen 165 Suche 189 Text mit Bild 551 verankern 566 verankerte Elemente rendern 567 Versionierung 165 Inhalts-Objekt (cObj) 712 Inhaltsspalten erhöhen 202 reduzieren 203 umbenennen 204 inline 760 appearance 766, 769 collapseAll 766 expandSingle 766 newRecordLinkAddTitle 766 newRecordLinkPosition 766 useCombination 766 useSortable 766 asymmetrisch 764
Attribute 770 Auswahlboxen beschränken 767 autoSizeMax 767 foreign_default_sortby 762 foreign_field 761 foreign_label 761 foreign_selector 762, 769 foreign_sortby 762 foreign_table 760, 761 foreign_table_field 762 foreign_unique 762 Intermediate-Tabellen 763 maxitems 767 minitems 767 MM 762 Parameter für das optische Verhalten 766 size 767 symmetric_field 764 symmetric_label 764 symmetric_sortby 764 symmetrisch 764 Verknüpfungsparameter 761 Inline Relational Record Editing (siehe IRRE) 193, 195, 760, 768 Inline-CSS-Deklarationen 306 innerWrap 389, 391 innerWrap2 389, 391 insertData 348 Install extension 664 INSTALL.txt, Datei 16 Installation 1-2-3-Modus 6 Dummy 6 forceCharset 298 Ordnerstruktur 10 Quickstart 7 Source 5 Testsite 7 Installationspakete 5 Installer-Pakete 7 Installierte 666 Install-Tool 22, 52 About 23 All configuration 23 Basic Configuration 22 Clean up database 23 Database Analyzer 22 Edit files in typo3conf/ 23 Image Processing 23 Optionen einstellen 23
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Index |
Max. Linie 875
Links
Lizensiert für Markus Mueller
phpinfo( ) 23 typo3temp/ 23 Update Wizard 22 interface, TCA 21 interfaces 109 Intermediate Tabellen, Attribute 770 Internationales Phonetisches Alphabet (IPA) 848 Internationalisierung Auszeichnung der Sprache der Inhalte 298 Sprachpakete 685 Internet Relay Chat (IRC) 862 intval 373, 377 IPA (Internationales Phonetisches Alphabet) 848 iProcFunc 527 IRC (Internet Relay Chat) 862 IRRE 193, 195, 760, 768 Attribute bearbeiten 196 aufgeklappte Ansicht 193 Create new 195 Drag & Drop 195 Hauptelement zuweisen 196 Hauptelemente bearbeiten 193 Intermediate-Tabellen bearbeiten 196 kopieren 196 Unterelemente bearbeiten 193 verknüpfen 196 zusammengeklappten 193 isFalse 366 isGreaterThan 367 isInList 368 isLessThan 368 isPositive 366 Issue-Tracking 858 isTrue 366
J JavaDoc 740 JavaScript aktivieren 82 Dateien einbinden 808 Menü 536 onClick 840 Prototype-Framework 841 JSMENU 467 JSwindow 556 JSwindow_params 399 Jumpmenu 536
Max. Linie 876 | Index
K Kasper Skårhøj 848 Key 807 key 573 cObject 610 Keyword-Listen erzeugen 373, 378 Kickstarter 684, 759 Kleinschreibung erzwingen 372, 374 Klick vergrößern 551 Kommentare, in den Header einfügen 297 Kompatibilitätsmodus 48 Konfiguration 17 HTTPS im Anmeldeformular erzwingen 88 lockSSL 88 Mehrsprachigkeit 311 kontextsensitive Hilfe (Context Sensitive Help) 833
L l10n (Localization) 14 LABEL.layout 582 labelWrap 582 lang 338, 343 lastUpdated 490 layout 575 Layout, zweispaltig 418 leeren Inhalt, überschreiben 370 levelfield: 358 levelmedia 358 leveltitle: 358 leveluid: 358 lib.parseFunc 383, 385 lib.parseFunc_RTE 383, 385, 387 lib.stdheader 446, 449, 454 LICENSE.txt, Datei 16 lifetime 330 Link-Handler 803 Logik implementieren 804 Links als Fußnoten darstellen 424 an PHP-Funktion übergeben 401 auf Anker 396 auf Dateien 396 auf externe Seiten 397 auf interne Seiten 397 auf Seiten 396 auf spezielle Seitentypen 396
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
automatisch erzeugen 395 in Pop-up-Fenster öffnen 396 Sprungziel festlegen 400 linkVars 322 Listenmenü 513, 515, 530, 531 Listen-Modul, erweiterte Ansicht 240 listNum 338, 343 LLL: 360 LLL-Marker 205 ln -s 43 LOAD_REGISTER 411, 420, 424, 431, 436, 518, 527, 612, 620 Loaded extensions 664 $LOCAL_LANG 756 localconf.php 12, 14 hostspezifisch modularisieren 65 locallang.php 754, 855 konvertieren (nach XML) 855 locallang.xml 754, 855 einbinden 855 locallang_*.php 754 locallang_*.xml 754 locallang_db.xml 708 locallang-Dateien, anwenden 205 lockSSL 88 Logging, das TYPO3-Syslog aktivieren 75 loginNews 99 Lokalisierung, Sprachpakete 685 Lokalisierungsansicht 152 Löschen, Inhalte 175 Lupensymbol 551
M
Max. Linie
Mailinglisten 861 Listenregeln 861 Major-Version 44 makelinks 385 Marker 589 Marker für Newsletter-Modul 303 marks 592 Maße, Objektebenen 444, 445, 454, 460 Maßnahmen bei einem Update 44 mathematische Terme berechnen 373, 378 maxFileSize 25 maxItems 510 media 15 media/scripts/ 461 mehrere Domains 27
Mehrsprachigkeit 311, 754 in Backend-Modulen 755 in Frontend-Plugins 755 Inhalte 150 Inhalte, übersetzen 150 mehrsprachige Labels, im Backend 205 Seiten aus-/einblenden 311 Standard-Übersetzung verstecken 150 Übersetzungen anlegen 150 verstecke Seite, wenn keine Übersetzung für die aktuelle Sprache existiert 150 Menü aus Select-Boxen 536 komfortables 515, 531 mehrseitiges erzeugen 620 per CONTENT erzeugen 600, 604 Pseudotransparenz 639 Zustände 477 Menü/Sitemap 540 Menüelemente Anzahl 439 Menüelemente, Anzahl 439 Menütypen, weitere erzeugen 541 method 580 Migration 4 minItems 510 Minor-Version 44 misc, Ordner 12 Formulartypen 828 Modul Admin-Werkzeuge 112 Anzeigen 199 Aufgaben Befehle 166 Benutzerwerkzeuge 199 Dateiliste DB-Überprüfung 79, 80, 199, 234 Dokumente 233 Einstellungen Erw-Manager 199 Export 185 Funktionen Handbuch 199 Hauptmodule erstellen 824 Info 204 Installation 199 Konfiguration 17, 199, 211, 212 verwenden und Werte ermitteln 210 Werte von Eingabefeldern ermitteln 211, 212
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Index |
877
Max. Linie
Links
Lizensiert für Markus Mueller
Liste Datensätze effektiv verwalten 164 Einzelansicht 173 erweiterte Ansicht 240 mehr als 20 Datensätze auflisten 240 Log 199 organisieren 824 Seite 200, 241 erzeugen 118 Standardausgabe anpassen function init( ) 722 function main( ) 722 function menuConfig( ) 722 function moduleContent( ) 722 function printContent( ) 722 Funktionen 722 mod1/clear.gif 721 mod1/conf.php 721 mod1/index.php 721 mod1/locallang.xml 721 mod1/locallang_mod.xml 721 mod1/moduleicon.gif 722 Template Über Module 199 Über TYPO3 199 Untermodule erstellen 824 Verwaltung 112, 113 Workspace Zugriff MySQL character_set_client 68 character_set_connection 68 character_set_database 73 character_set_result 68 character_set_server 73 character_set_system 73 mysql_* 745 mysql_query 745 mysqldump 64
N
Max. Linie
Namensschema, von Tabellen 55 Navframe erweitern 237 negate 369 New Database Tables 695 News 651 ohne Extension 651 Newsgroups Adressen 860 Anmeldung 860
878 | Index
Newsreader 860 nützliche Programme 861 Regeln 861 Übersicht 860 NO 478 no_cache 398, 414, 580 noIconProc 245, 829 nonTypoTagStdWrap 385, 386 nonTypoTagStdWrap.encapsLines 388 noTrimWrap 285, 389, 392, 430, 552 noValueInsert 580 noWrapAttr 583 nummeriertes Menü 524 numRows 338, 345, 417, 518
O Ø 848 Oberfläche anpassen 244 Objekt Eigenschaft hinzufügen 262 Löschen/Zurücksetzen 262 Wert ändern 262 onlyAllowedTables 129 Operator := Kernfunktionen 288 optionSplit 602 außerhalb von Menüs 563, 588 first 483 last 483 middle 483 Ordner typo3 umbenennen 89 Ordnerstruktur 10 ORIG_FILENAME 440 outerWrap 417, 564, 603, 619 cObjects 603 override 365, 371, 518
P Package.txt 16 PAGE 656 body-Tag 297 body-Tag ändern 300 body-Tag setzen 295 config.additionalHeaders 301 config.baseURL 296 config.disableAllHeaderCode 299 config.disableCharsetHeader 300 config.doctype 297 config.headerComment 297
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Max. Linie
config.htmlTag_langKey 299 config.metaCharset 298 config.noPageTitle 299 config.renderCharset 298 config.xmlprologue 298 Daten in -Bereich aufnehmen 296 headerData 296 Hintergrundbild 306 HTTP-Protokoll-Header beeinflussen 300 includeCSS 296 Kommentare entfernen 301 korrekten Doctype ausgeben 297 lang-Attribut 299 meta 294 Metaangaben 294 Seitentitel 299 shortCutIcon 297 stdWrap-Baukasten mit PAGE-Objekt nutzen 302 page: 361 pageNotFound_handling 331 PAGE-Objekt nutzen 294 $PAGES_TYPES 128, 244 Page-TSconfig 200 pageUnavailable_force 50 pageUnavailable_handling 50 --palette-- 225 palettes, TCA 21 Papierkorb 175, 177, 184 Parameter auflisten 362 durchschleifen 322 für symmetrische Verknüpfungen 764 per COA erzeugen 600, 605 parameters: 362 params 582 parseFunc 384, 426, 718 Abkürzungen, einbinden 719 Acronyme, erklären 719 lib.parseFunc makelinks 385 nonTypoTagStdWrap 386 tags 386 lib.parseFunc_RTE 387 externalBlocks 388 nonTypoTagStdWrap.encapsLines 388 link 424, 426 makelinks 385 nonTypoTagStdWrap 385 short 719 tags 385, 719
Patch level releases 44 path: 363 PATH_t3lib 736 permalogin 330 PHP 461 Fehlermeldungen 39 Funktionen, einbinden 412, 461 Ressourceneinstellungen 39 PHPDoc 740 phpDoc-Kommentare 735 pi_base 799 pi_getPageLink( ) 800 pi_linkToPage( ) 799 pi_linkTP() 801 pi_linkTP_keepPIvars( ) 801 pi_linkTP_keepPIvars_url( ) 801 pi_list_linkSingle( ) 799 pidInList per HMENU erzeugen 599, 603 pidInList, cObject 599 Platzhalter 416 Plugins 711 CSS 306 in COA einbetten 648 per CONTENT ausgeben 649 Positionen abfragen 343 Positionsangaben 446, 449, 454, 460 postCObject 390 postUserFunc 402, 404 postUserFuncInt 402, 404 preCObject 390, 392 prefixComment 402, 405 preIfEmptyListNum 338 prepend 390, 392, 552 prependString( ) 288 preUserFunc 402, 404 preview 133 prioriCalc 373, 378, 428, 573 Programmcode Fehleranalyse 742 kommentieren 739 sichern 739 Programmfehler analysieren 742 (Bugs) melden 857 Projektmanagement 2 protectLvar 512 Protokoll-Header beeinflussen 300 publish 134
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Index |
Max. Linie 879
Links Q Quellcode, grundlegende Formatierungsvorgaben 739 Quelldaten austauschen 42 Quellen 863 Query-Strings, erzeugen 800 quoteStr 747
R
Lizensiert für Markus Mueller
Max. Linie
RADIO.layout 582 radioWrap 582 README.txt, Datei 16 README-Datei erstellen 740 README-Datei, erstellen 740 Rechtschreibprüfung 138, 149 recipient 580 RECORDS 545, 573 conf 569 invidiuell formatieren 569 source 567 tables 567 _recycler_ 180 redirect 110, 580 Register 420, 431 abfragen 363 finden 436 register 363 columnwidth 439 count_HMENU_MENUOBJ 439, 539 count_menuItems 439 count_MENUOBJ 439 CSS-styled-content 436 headerClass 439 headerStyle 439 ICON_REL_PATH 439 IMAGE_NUM 440 IMAGE_NUM_CURRENT 440 imageheight 440 imagespace 440 imagewidth 440 ORIG_FILENAME 440 rowwidth 440 rowWidthPlusTextMargin 440 SPLIT_COUNT 440 SUBPART_XXX 440 SWORD_PARAMS 441 totalwidth 441 rekursives Dynamisieren 601, 607
880 | Index
RELEASE_NOTES.txt, Datei 16 Releasezyklus 46 removeBadHTML 373, 379 removeFromList 288 removeString 288 renderCharset 32 renderObj 560 replaceString 288 repository 684 REQ 582 required 365, 371, 417, 577 Ressourceneinstellungen, PHP 39 RESTORE_REGISTER 411, 420, 436 Resultate, zählen 345 returnFieldJS 218 returnLast 400 Rewrite-Rules 326 Rich Text Editor (RTE) 142, 424, 548 Richtlinien, fürs Programmieren 738 RO 535 Rootline 487 absolut durchlaufen 355 relativ durchlaufen 358 rowwidth 440 rowWidthPlusTextMargin 440 RSS Feeds, für Entwickler 8 RTE (Rich Text Editor) 137, 424, 548 rtehtmlarea 142 rückgängig machen, Arbeitsschritte 181
S saveDocNew 118, 121 SC_OPTIONS 779 formevals 219 Schnelleingabe 120 Schreibrechte, setzen für Systemordner 11 für TYPO3-Ordner 11 schwache Entität 762 section 400 secureFormmail 580 Seite Ausgabe für Suche indexieren 303 für Validierung aufbereiten 302 Kommentare entfernen 301 bei jedem Aufruf neu auslesen 83 bewegen (auswärts) 165 bewegen (einwärts) 165
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Max. Linie
Bilder anzeigen 548 body-Tag ändern 300 body-Tag setzen 295 CSS-Deklaration ändern 306 Daten aus Extension einfügen 303 Daten in -Bereich aufnehmen 296 dynamisches Hintergrundbild per CSS 306 geschützte, einblenden 476 HTTP-Protokoll-Header beeinflussen 300 Inline-CSS-Deklarationen 306 Kopfgrafiken, einbinden 635 korrekten Doctype ausgeben 297 Marker für Newsletter-Modul 303 PAGE-Objekt, cObjects hinzufügen 295 Rewrite-Rules 326 Seiten-Icons, Zustände 244 stdWrap-Baukasten mit PAGE-Objekt nutzen 302 Versteckt-Status 244 Zugriffsrechte einstellen 165 Seiten zusammenfassen 558 Seitenbaum Breite anpassen (Navframe) 237 erweitern 237 erzeugen 628 Frontend-Navigation 628 IDs direkt anzeigen 236 längere Titel erlauben 237 variable Breite (Navframe) 237 verbreitern 236 Seitenbrowser erzeugen 620 Seitendaten, verwenden 361 Seiteneigenschaft, zeige den Inhalt dieser Seite an 170 Seitengrundgerüst 294 Seitentitel 299 Seiten-TSconfig 200 Seitentyp 37, 128, 291 Abstand 128 Backend-Benutzerbereich 128 eigene Seitentypen 244 erweitert 128 externe URL 128, 302 Icons ändern 243, 244 Mountseite 128 nicht im Menü 128 Papierkorb 128, 177, 184 Standard 128 SysOrdner 128
Übersicht der Seitenicons 244 Verweis 128 anlegen 230 für Benutzergruppen vorgeben 230 Icon 297 Template 258 select 559 orderBy 559 pidInList 559 semantische Struktur 430 serialize( ) 786 Serverpobleme abfangen 51 Service Temporarily Unavailable 50 Session-Hijacking 808 Session-Management 792, 806 Sessions 806 getKey( ) 806 ses-Session (neutrale Session) 807 setKey( ) 806 storeSessionData( ) 806 user-Session 807 setContentToCurrent 338, 346 setCurrent 338, 347 Settings 664 Setzkastenelement 411, 412, 418 Shortcut (siehe Verweis) 297 showAccessRestrictedPages addParams 476 showitem 225 showPageIdWithTitle 236 Sicherheit bei Datenbankabfragen 745 Sicherungskopie 63 simulateStaticDocuments 324 Skinning 725 slide 306 source 567 Source-Package 5, 7 space 390, 393 spaceAfter 390, 393 spaceBefore 390, 393 SPC 481 special beginAtLevel 491, 494 browse 507, 653 depth 491, 494 directory 472 excludeNoSearchPages 491, 494 home 503 index 503 items 502
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Index |
Max. Linie 881
Links
Lizensiert für Markus Mueller
Max. Linie
keywords 492, 656, 660 keywordsField 496 language 498 last 503 limit 491, 494 list 472 maxAge 491 mode 490, 494 next 503 nextsection 503 prev 503 prevsection 503 range 488 rootline 487, 653 setKeywords 495 up 503 update 654 updated 489 value 473, 490, 494, 499 SpellChecker 148 spezielle Funktionen, TypoScript 401 split 373, 379, 598 cObjNum 564, 588 Positionsnummer 440 SPLIT_COUNT 440 splitChar 394 Sponsoring 850 Sprachauswahl 497 Sprachdateien 854 locallang.xml 855 Sprachmenü 497 Sprachpakete im Backend verwalten 685 im Frontend verwalten 685 installieren 14, 685 Sprachwerte korrigieren 854 übersetzen 854 sprechende URLs 324 SQL-Befehle erzeugen 167 SQL-Injections 745 Standard-Setup, zuweisen 540 Standardwerte festlegen 122 Standard-WYSIWYG-Editor 137 statische Daten, importieren 53 statische HTML-Dateien simulieren 324 stdWrap 338, 348, 412 age 372, 373 append 390, 438, 446, 450, 518 postCObject 389 Baukasten 335
882 | Index
br 373, 377, 635 brTag 373, 377 bytes 372, 374 case 372, 374 char 372, 375 cObject 338, 422, 518, 622 crop 373, 375, 613, 618 csConv 373, 376 current 338, 340, 424, 429, 446 das Prinzip 335 data 348, 421 dataWrap 348, 421, 428, 460 date 373, 376 debug 402 debugData 402, 403 debugFunc 402, 403 doubleBrTag 373, 377 editIcons 320, 402, 404 editPanel 318, 402, 404 field 338, 340 fieldRequired 365 filelist 338, 341 Funktionen 335 if 365, 417, 628 ifEmpty 365, 370 innerWrap 389, 391, 450, 628, 634 innerWrap2 389, 391 insertData 348 intval 373, 377 keywords 373, 378 lang 338, 343 listNum 338, 343 noTrimWrap 285, 389, 392, 430, 552 numRows 338, 345, 417, 518 outerWrap 389, 417, 458, 564, 603, 628, 638 override 365, 371, 518, 623, 625 parseFunc 384, 424, 426 lib.parseFunc 385 lib.parseFunc_RTE 387 parseFunc.link 424, 426 postCObject 390 postUserFunc 402, 404 postUserFuncInt 402, 404 preCObject 390, 392 prefixComment 402, 405 preIfEmptyListNum 338, 343 prepend 390, 392, 446, 450, 527, 552 preUserFunc 402, 404 prioriCalc 373, 378, 424, 428, 573 rekursiv aufrufen 348 removeBadHTML 373, 379
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Max. Linie
required 365, 371, 412, 417 setContentToCurrent 338, 346 setCurrent 338, 347 space 390, 393 spaceAfter 390, 393 spaceBefore 390, 393 split 373, 379, 563, 587, 598, 628, 633 stdWrap 338, 348 strftime 373, 381 stripHtml 373, 381 substring 373, 382 trim 373, 382, 424, 429 typolink 395, 424, 517, 551, 622 wrap 390, 394, 413 wrap2 390, 394 wrap3 390, 394 stdWrap.split 440 strftime 373, 381 strictFormmail 580 stripHtml 373, 381 styles.content.get 417, 449 styles.content.getRight 417 styleschemes 226 Stylesheets, verschiedene 281 Submodule 724 SUBPART_XXX 440 subparts 592 substring 373, 382 Subversion 8, 9 Suchbegriffe, Ablage 441 Suchen nach Webseiten-Links, E-Mail-Adressen 385 Suchfunktion Eigenschaften 189 Index füllen 191 Index-Suche integrieren 190 Index-Suche, TypoScript-Setup 190 integrieren 188 unterschiedliche Suchmechanismen 190 superadmin.php 12 SWORD_PARAMS 441 Symlinks 5 sys_language_uid 311 SysLog, Anwendungsbeispiel 844 SysOrdner 127, 244 Systemordner umbenennen 89 typo3/ 89 Systemparameter anpassen 22 Systemtabellen, leeren 54
T $TCA 819, 820 benutzerdefiniertes Feld einbinden 838 ds_pointerField 822 subtypes_addlist 819 subtypes_excludelist 819 $TCA["extkey_tabelle"] 706 Schlüssel columns 706 feInterface 706 interface 706 palettes 707 types 707 $TYPO3_CONF_VARS 30, 69 T3DataStructure (Flexform) 818 t3editor 271 t3lib, Ordner 12 t3lib/interfaces/, Ordner 12 t3lib/stddb/, Ordner 12 t3lib_BEfunc 736 t3lib_div 736 callUserFunction( ) 783 compat_version( ) 49 debug( ) 744 getUserObj( ) 783 loadTCA 211, 221 makeInstance( ) 776 t3lib_extMgm 736 addPiFlexFormValue 819 t3lib_TCEForms additionalCode_pre 839 t3lib_TCEmain Konvention Feldnamen 844 Tabellenfeld, t3lib_div::loadTCA 130 Tabelleninhalte nur bei Bedarf anzeigen 238 table 559 tables 567 tags 385, 386 target 397 $TBE_STYLES TYPO3-Backend-Styles 18 TCA 17, 20, 123 l10n_mode 316 addToAllTCAtypes 221 columns 21 ctrl 21 Eingabeformulare umstrukturieren 220 feInterface 21 interface 21
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Index |
Max. Linie 883
Links
Lizensiert für Markus Mueller
Max. Linie
palettes 21 umsortieren 221 showItem, umsortieren 220 types 21 tca.php 701, 705 TCAdefaults 125 Standardwerte für Formularfelder festlegen 122 TCE (TYPO3 Core Engine) 178 TCEFORM 540 addItems 541 Änderungen auf bestimmte Eingabemasken beschränken, mit der typesBegrenzung 208 Auswahloptionen anpassen 206 ausblenden, mit removeItems 206 erweitern, mit addItems 206 umbenennen, mit altLabels 206 disabled 209 Eingabefelder ausblenden 209 Teams, TYPO3 850 temp_CACHED_* 14 TEMPLATE 545 marks 592 subparts 592 suparts 440 template 593 workOnSubpart 592 template 593 Template-Analyzer 261 Template-Klasse 723 TER (TYPO3 Extension Repository) 664, 675, 684, 692 eigenes Respository verwenden 683 Erweiterungs-Manager Settings Einstellungsmöglichkeiten 682 Extensions, veröffentlichen 684 Mirror auswählen 683 Zugriff konfigurieren 682 TEXT 417, 545 value 548 Text, beschneiden 373, 375 Textbausteine 547 Textbereich ausschneiden 373, 382 Textmenü 513, 515 Textverarbeitungsfunktionen 383 themenverwandte Seiten 492
884 | Index
$this->cObj 712, 736, 793 $this->cObj->data 712 $this->cObj->parentRecord[’data’] 712 $this->doc 722 $this->pi_* 736 Thumbnail, Feld 242 Titellänge 237 TMENU 467 ACT 478 ACTIFSUB 478 alternativeSortingField 519 CUR 478 CURIFSUB 478 doNotShowLink 615 expAll 481 IFSUB 478 NO 478 SPC 481 USERDEF1 481 USERDEF2 481 USR 481 TMENUITEM 467 after 518 allWrap 481 before 518 doNotLinkIt 479, 516, 539 stdWrap 538 wrapItemAndSub 481, 514, 516 TODO.txt, Datei 16 totalwidth 441 Trennzeichen, festlegen 394 trim 373, 382, 429 TS-Config 540 TSconfig Benutzer-TSconfig 119, 121 Code für eigene Backend-Module 817 Eigenschaften 200 Kurzreferenz 113 mod. 120 Operatoren 286 Seiten-TSconfig 120 Syntax 286 tsdebug 135 TSFE (TypoScript-Frontend-Engine) 735 auslesen 364 register 436 registerStack 436 tslib 14 tslib_eidtools 811
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts
Lizensiert für Markus Mueller
Max. Linie
TSOB 437 tt_content 709, 713 image 439, 440, 441 textpic 439, 440, 441 tt_content.image 551 tt_content.mailform 584 tt_content.menu 541 tt_content-Felder 709 type 580 typeicon_column 827 typeicons 827 typeNum 37 types 828 types, TCA 21 TYPO3 803 aktualisieren 42 ältere Version simulieren 47 Applikationen, sichern 739 Association 851 Beispielprojekte 7 Benutzer-Account 847 Chatraum 862 Coding Guidelines 738 Community 847 Core Engine 178 Einstellungen für eigene Extensions verwenden 17 kontrollieren 17 Entstehung 848 Erfinder 848 Fatal Error 34 Framework 735 Frontend Admin-Panel 131 Handbücher Dokumentvorlage 852 erstellen 852 HTML-Vorlage 589 Bezeichner, verschiedene 590 Installationspakete 5 IRC (Internet Relay Chat) 862 konfigurieren 17 Linkliste 863 Mailinglisten 861 Listenregeln 861 neue Features vorschlagen 850, 857 Newsgroups 860 Adressen 860 Newsreader 860
Regeln 861 Übersicht 860 Programmcode Fehleranalyse 742 kommentieren 739 sichern 739 Quellcode, grundlegende Formatierungsvorgaben 739 README-Datei erstellen 740 Ressourcen 863 Textverarbeitungsfunktionen 383 Version 45 Versionsunterschiede 44 Website (typo3.org) 847 Wiki 863 Zustand des Datensatzes Icon-Grafiken 826 TYPO3 aktualisieren Shared Hosts-Installation 43 Symlink austauschen 43 unter Linux / Unix 43 Windows 43 TYPO3 Extension Repository 738 typo3, Ordner 13 typo3.org 847 typo3/classes, Ordner 13 typo3/contrib, Ordner 13 typo3/css, Ordner 13 typo3/ext, Ordner 13 typo3/gfx/, Ordner 13 typo3/install/, Ordner 13 typo3/interfaces/, Ordner 13 typo3/js/, Ordner 14 typo3/sysext, Ordner 14 $TYPO3_CONF_VARS 17, 18, 24, 785 $TYPO3_CONF_VARS['EXT']['extConf'] [$_EXTKEY] 785 TYPO3_DB 745 $TYPO3_LOADED_EXT 17 TYPO3_MODE 777 TYPO3_version 45 TYPO3AJAX 843 TYPO3-API 735 TYPO3-Backend-Styles 18 typo3conf, Ordner 14 typo3conf/ext, Ordner 14 typo3conf/l10n, Ordner 14 TYPO3-Funktionsbibliothek 735
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Index |
Max. Linie 885
Links
Lizensiert für Markus Mueller
Max. Linie
TYPO3-Packages 5, 6 TYPO3-Projekt Datenbankdienst 4 Entwicklung verfolgen 862 Know-how und Beratung 3 Open Source 3 PHP-Skriptinterpreter 4 Sponsoring 851 Teams, Übersicht 850 Teilnahme 850 Überlegungen zum laufenden Betrieb 4 Unterstützung 850 Vorgehen 2 Webserver 4 Zeitplanung 2 TYPO3-Skins 725 TYPO3-Teams 850 typo3temp/, Ordner 15, 58 typolink 395, 424, 517, 518, 551 additionalParams 398 addQueryString 399 ATagBeforeWrap 399 ATagParams 401 cHash-Parameter 805 extTarget 397 JSwindow_params 399 no_cache 398 parameter 395, 600, 605 returnLast 400 section 400 target 397 useCacheHash 398, 805 userFunc 401 wrap 399 typolinkLinkHandler 804 TypoScript 247, 273, 335, 545 := (Operator) 286, 288 _CSS_DEFAULT_STYLE 306 _LOCAL_LANG 316 auskommentieren 259 Basis-Template 258 bearbeiten 259, 271 in einem externen Editor 269 Syntax-Highlighting 269 Conditions 278, 574 häufig verwendete 280 Constant Editor eigene Bearbeitungsmaske anlegen 273 eigene Werte einstellen 273 Konstanten bearbeiten 273
886 | Index
Constants 273 Debugger 264, 414 durchsuchen 259 edit 271 effektiv arbeiten 255 Einstellungen anpassen 278 Einstellungen simulieren 259 Extension-Templates 278 Fehlermeldungen 266 Fehlersuche 264 funktionale Gruppen 255 GET/POST-Variablen auswerten 281 headerData 309 Hierarchie 406 in eigenen Extensions verwenden 792 Include Basis Template 257 Klammern 247 mit PHP kombinieren 792 Operatoren 247, 286 Parser 286, 287 resources 282 Shortcut-Template 258 spezielle Funktionen 401 Stylesheets, verschiedene 281 Syntax 247, 286, 287 TEMPLATE 308 Templates 255 Dateien verwenden 282 Tools 260, 264, 271 Template-Analyzer 261 TypoScript-Object-Browser (TSOB) 260 Vorteile 252 Werte ändern 287 berechnen 574 dynamisch ändern 286 suchen 321 Wraps 285 TypoScript Frontends 436 TypoScript statt PHP 251 TypoScript-Debugger Admin-Panel Tabelle 265 Ausgabeoptionen Baumdarstellung 267 Erkläre SELECT Anweisung 268 Erzwinge TS Rendering 268 Inhalte anzeigen 268 Nachrichten anzeigen 267
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Max. Linie
Rechts Rendering-Zeiten anzeigen 267 Verfolge Rendering der Inhalte 267 Tabelle Optionen 265 TypoScript-Editor 271 TypoScript-Frontend-Array, auslesen 364 TypoScript-Konstanten, verwalten 272 Kategorien definieren 273 Feldtypen festlegen 275 gruppieren 274 TypoScript-Object-Browser 437 Objekt löschen/zurücksetzen 262 Objekteigenschaft hinzufügen 262 Objektwert ändern 262 suchen 321 Typotags definieren 386
U
Lizensiert für Markus Mueller
Max. Linie
Überschriften eigene 715 Pseudotransparenz 639 Styles 439 Übersetzungen 686 anlegen 754, 854 einfügen 343, 360 korrigieren 854 Umgebungsvariablen anzeigen 356 unserialize( ) 786 Update Wizard 48 Update,TYPO3 42, 52 uploads, Ordner 15 URL, sprechende 324 URL-Parameter anhängen 398, 399 hinzufügen 398 useCacheHash 398 useColumnsForDefaultValues 123 useLargestItemX 534 useLargestItemY 534 USER 412, 461, 463, 714 USER_INT 412, 436, 461, 463, 714 USERDEF1 481 USERDEF2 481 userFunc 401, 709, 714 User-TSconfig 200 USR 481
UTF-8 66 Konvertierung 66 Prüfung und Umstellung 66 Standard-Zeichensatz 29 ux_ (Präfix) 775 UX-Klasse 777
V 404-Fehler abfangen 331 Variablen, übergeben 322 Verarbeitung einzelner Textzeilen 388 Verarbeitung und Aufbereitung von Texten 384 veröffentlichen, Extensions über das TER 684 Veröffentlichung von Inhalten kontrollieren 157 Versionierung von TYPO3 45 versionsabhängig programmieren 45 Versionsnummer, Aufbau 46 Versteckt, Seitenstatus 244 Verweis anlegen 230 für Benutzergruppen vorgeben 230 Icon 297 Template 258 Verweis (siehe Shortcuts) Vier-Augen-Prinzip 154 Vorteile von TypoScript 252
W Wartung, Dateisystem 58 Wartungsarbeiten durchführen 49 Website-Benutzer 328 Website-Benutzergruppe 327 Websites mehrsprachige 311 nützliche 863 Werte auf Webseiten speichern 806 Wiederherstellen von gelöschten Datensätzen 180 Wiki 863 Workflow Benachrichtigungseinstellungen 160 einfacher 125 hinterfragen 160 integrieren 157 Vier-Augen-Prinzip 157 Workspaces nutzen 157 workOnSubpart 592
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Index |
Max. Linie 887
Links
Lizensiert für Markus Mueller
Workspace (Live-) Umgebung 154 Aktionen zum Veröffentlichen von Inhalten 156 Benachrichtigungseinstellungen 160 Datenbankstruktur eigener Tabellen anpassen 758 eigene Datensätze versionierbar machen 758 Entwurfs-Workspace 155 Flush 156 Inhalte austauschen 156 Lebenszyklus 156 Live-Workspace 155 mehrere Änderungen gleichzeitig veröffentlichen 156 Protokoll zeigen 156 Publish 156 Schaltflächen zur Veröffentlichung von Inhalten 155 sperren 161 Swap 156 wrap 390, 394, 399, 413 das Prinzip 406 Hierarchie 406 splitChar 394 wrap2 390, 394 wrap3 390, 394 wrapFieldName 583 wrapItemAndSub 481, 514, 516 Wraps, das Prinzip 285
X XClass 772 anwenden 772 Definition 776 Einschränkungen bei statischen Klassen 772 Klassen anpassen 774 PHP-Klassen anpassen 774 XML-Sprachdatei 833 XML-Sprachdateien einbinden 856
Z Zahlenwerte, verarbeiten 373, 377 Zeichensatz Ausgabe konvertieren 298 cp1252 74 Datenbank 67 ISO 8859-1 74 konvertieren 66, 373, 376 korrekte Auszeichnung 298 latin1 74 mysqldump 70 recode 71 TYPO3 69 überprüfen 66 UTF-8 29 Verbindung 68 Zeige den Inhalt dieser Seite an 170 Zeilenschaltungen, verarbeiten 373, 377 Zeitangaben, formatieren 373, 381 Zoom 551 zugänglich 452 Formatierung 458 Header 446 Listenmenü 513, 515, 530, 531 Zugriff 329 Zugriffe auf Webseiten begrenzen 327 Zugriffsrechte prüfen 112 Zwischenablage 411, 420 Ebenen 172 einrichten 171 Einträge speichern 173 erweitern 172 verwenden 171 zzz_deleted* 53
Max. Linie
Max. Linie 888 | Index
This is the Title of the Book, eMatter Edition Copyright © 2008 O’Reilly & Associates, Inc. All rights reserved.
Über die Autoren Christian Trabold ist ausgebildeter Multimedia Producer mit den Schwerpunkten Webentwicklung und Gestaltung. Seit 2007 ist er bei der Frankfurter Agentur d.k.d als Softwareentwickler für die Konzeption und Umsetzung von TYPO3-Projekten verantwortlich. In seiner Freizeit widmet er sich mit Leidenschaft seiner Plattensammlung, schaltet beim Rennrad- und Mountainbikefahren ab oder betrachtet die Welt beim Tauchen gerne mal aus einer anderen Perspektive. Jo Hasenau begann seine Laufbahn 1987 als Grafiker und Druckvorlagenhersteller. Ersten Arbeiten an DTP-Systemen folgte 1991 der Schritt in die Selbständigkeit. Seither hat er als bekennender Autodidakt sein Wissensspektrum stetig erweitert. So war er unter anderem als Produktionsleiter für Großformatdrucke, Ausbilder für Mediengestalter, Dozent an verschiedenen Fachschulen sowie als Trainer und Coach für Grafiksysteme tätig. Seit 1997 beschäftigt er sich unter dem Label cybercr@ft mit Gestaltung und Programmierung von Internetauftritten. TYPO3 gehört dabei seit 2002 zu seinen bevorzugten Werkzeugen, und er ist bekannt als Supporter in den TYPO3-Newsgroups. Sein Spezialgebiet ist TypoScript, weswegen ein großer Teil der Rezepte zu diesem Thema im TYPO3 Kochbuch aus seiner Feder stammt. Jo lebt mit seiner Frau Petra und seinen beiden Kindern Colin und Fiona in Düsseldorf.
Vakat
Lizensiert für Markus Mueller
Peter Niederlag ist diplomierter Wirtschaftswissenschaftler und ein überzeugter Open Source-Anhänger. Er arbeitet bereits seit 2001 intensiv mit TYPO3 und ist Mitbegründer der TYPO3-Usergroup Hannover. Mit dem TYPO3-Release 3.7.1 hat er erstmals als Maintainer aktiv an der Pflege des TYPO3-Quelltexts mitgearbeitet. Mit seiner Firma niekom netservice ist er als anerkannter TYPO3-Experte mit den Schwerpunkten Schulungen und Projektumsetzungen für Agenturen und Direktkunden tätig. In seiner Freizeit geht er seiner alten Passion für Jonglage, Gaukelei und Zirkus nach.
Kolophon Das Tier auf dem Cover des TYPO3 Kochbuchs ist eine Ameive (Ameiva ameiva). Die Ameive gehört zur Familie der Schienenechsen (Teiidae), die sich von anderen Echsenarten dadurch unterscheiden, dass sie auf der Bauchunterseite regelmäßig angeordnete Reihen von größeren Schienen bzw. Platten besitzen. Alle Ameiven-Unterarten sehen sich sehr ähnlich und sind allesamt noch wenig erforscht. Ameiven sind auf der Oberseite größtenteils blau bis braun mit weißen Flecken und Streifen. Den auffallend langen Schwanz mitgerechnet, können Ameiven-Männchen bis zu 60 cm lang werden. Die Weibchen sind allerdings deutlich kleiner. Mit ihrer gespaltenen Zunge können sie sich riechend und tastend in ihrer Umgebung orientieren. Das Verbreitungsgebiet der Ameive erstreckt sich über Südamerika östlich der Anden von Südmexiko bis Uruguay. Das tagaktive Reptil ist im offenen Grasland des tropischen und subtropischen Regenwaldes zu finden, doch wird man es kaum entdecken, da sich
das durch die Sonne aufgeheizte Tier unglaublich flink fortbewegt. Auf der Suche nach Insekten, Kerbtieren und jungen Mäusen gräbt es mit seinen langen Krallen im meist sandigen oder lehmigen Untergrund. Die Weibchen legen mehrmals im Jahr drei bis neun Eier, aus denen die Jungtiere nach 130 Tagen schlüpfen. Auch in Gefangenschaft brauchen die agilen Tiere viel Bewegung. Man sollte ihnen daher ein entsprechend großes Terrarium bieten mit dunklen, feuchten Verstecken und trockenem Sanduntergrund zum Graben. Der Umschlagsentwurf dieses Buches basiert auf dem Reihenlayout von Edie Freedman und stammt von Marcia Friedman und Michael Oreal, die hierfür einen Stich des Dover Pictorial Archive aus dem 19. Jahrhundert verwendet haben. Das Coverlayout der deutschen Ausgabe wurde von Michael Oreal mit InDesign CS3 unter Verwendung der Schriftart ITC Garamond von Adobe erstellt. Als Textschrift verwenden wir die Linotype Birka, die Überschriftenschrift ist die Adobe Myriad Condensed und die Nichtproportionalschrift für Codes ist LucasFont’s TheSans Mono Condensed. Geesche Kieckbusch hat das Kolophon geschrieben.
Vakat
Lizensiert für Markus Mueller