This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
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.
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
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.
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.
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.
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.
• 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,
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/
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.
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!
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.
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.
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
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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
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.
/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.
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.
$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.
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.
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
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.
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).
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_
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.
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'] =
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
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.
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
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.
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:
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-
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:
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:
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:
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.
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
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-
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
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:
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:
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:
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.
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.
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.
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.
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
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:
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:
$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.
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.
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.
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.
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
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.
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
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.
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.
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.
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.
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).
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.
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
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,
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
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.
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.
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
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:
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:
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
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
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.
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.
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)
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
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:
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.
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
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.
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
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
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
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.
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:
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.
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.
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.
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
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-
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:
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.
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.
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:
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-
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.
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';
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:
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.
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:
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.
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
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|
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.
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.
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:
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.
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' ); }
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');
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).
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]);
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:
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:
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.
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):
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;
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
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:
Ä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');
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.
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.
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.
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:
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.
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
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
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).
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/.
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.
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.
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.
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:
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:
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.
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.
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.
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:
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:
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:
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:
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
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.
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.
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.
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
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.
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.
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
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.
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.
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.
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
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.
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:
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
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 # # # #
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:
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
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
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 } }
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.
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!
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
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
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.
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.
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.
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 =
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 =
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 =
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
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 {
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
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 }
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.
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
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
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!
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 class="printlink">| 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,
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:
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.
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 = class="layout|" } } } 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.
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>
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
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 }
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.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
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 />
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:
<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.
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.
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
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.
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.
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: | }
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.
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.
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 =
... 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:
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.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.
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.
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 } }
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 =
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
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:
{register: linkList}
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 link>. 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@domain.tld email@domain.tld. 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.
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 { ... } }
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 (
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.
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.
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 =
{register:linkList}
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.
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 =
} } 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.
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 =
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.
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
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.
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.
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
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 }
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.
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
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.
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:
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.
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!
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!
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 >
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 =
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 = |
} } }
} Damit modifizieren Sie für sämtliche Inhaltselemente das Aussehen der Überschrift vom Typ 5 so, dass diese einen zum Menü passenden grafischen Header produziert.
Diskussion Für das bessere Verständnis dieses Rezepts empfiehlt es sich, den Code nicht komplett kopiert direkt zu 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 Ihr Ergebnis sowieso von dem unsrigen abweichen. Daher müssen Sie gegebenenfalls die verwendeten Werte für Größen- und Positionsberechnungen ein wenig anpassen.
Max. Linie
Die oben 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. Die übliche Verfahrensweise
wäre, mit drei Elementen zu arbeiten, die jeweils eine Hintergrundgrafik erhalten, eines für die linke Rundung mit Schatten, zwei weitere für den Mittelteil und die rechte Rundung und deren Schatten. Damit wäre das Problem zwar prinzipiell gelöst, jedoch würde der erzeugte HTML-Code keine sinnvolle semantische Struktur mehr aufweisen, weil zu viele Hilfselemente verwendet würden. Auch die Einschränkung auf eine feste Breite und die Verwendung nur einer Hintergrundgrafik wäre ein Lösungsansatz, der aber das Problem nicht 100%ig löst. In eben diesem Bereich liegen die Stärken der Grafikfunktionalität von TYPO3. Mithilfe des GIFBUILDER können Sie die Aufgabe elegant, dynamisch, flexibel und mit einem Minimum an HTML-Code lösen. Wir haben in unserem Beispiel das GMENU aus Rezept 12.15 verwendet. Für den grafischen Header stammt der Code aus Rezept 11.9. Konzentrieren Sie sich aber in diesem Rezept auf den Bereich innerhalb von temp.gifBuilderSetup.
Lizensiert für Markus Mueller
Laden Sie als Erstes zwei Schriftarten in das Verzeichnis fileamdin/fonts. Wenn Sie ein anderes Verzeichnis verwenden wollen, müssen Sie dies später im TS-Setup anpassen. Die erste Schriftart ist die vorgesehene Hausschrift des Kunden. Nennen Sie diese einfach hausschrift.ttf oder passen Sie auch hier das TS-Setup an. Die zweite Schriftart benötigen Sie für einen grafischen Trick, mit dem Sie die Funktionalität des GIFBUILDER erweitern. Dieser besitzt von Hause aus ebenso wenig die Fähigkeit zum Erzeugen von runden Objekten wie ein Stylesheet. Jedoch kann er beliebige Schriftarten vom Typ TrueType oder PostScript verarbeiten, also auch Symbolschriften. In unserem Beispiel haben wir die bekannte Zapf Dingbats verwendet, Sie können aber auch eigene Schriften hochladen. Damit können Sie theoretisch gesehen jede beliebige mit Vektoren darstellbare Form im GIFBUILDER verwenden. Nennen Sie die zweite Schriftart symbolschrift.ttf oder passen Sie das TS-Setup an. Erzeugen Sie ein temporäres Objekt namens temp.gifBuilderSetup und definieren Sie darin sämtliche erforderlichen Ebenen, damit Sie das Objekt später durch simples Kopieren sowohl für das Menü als auch für den grafischen Header verwenden können.
Max. Linie
Sie sollten nun zunächst die GIFBUILDER-Ebene einsetzen, die den eigentlichen Text enthalten wird, denn daran orientieren sich die Größen- und Positionsberechnungen der anderen Elemente. In unserem Beispiel ist dies der Bereich 80. Darin enthalten sind Angaben für die Schriftdatei, -farbe und -größe sowie der Parameter text, mit dessen Hilfe der Inhalt der Grafik aus dem Feld title ausgelesen wird. Zusätzlich wird der Text durch den Parameter offset nach rechts und unten verschoben. Mit diesen Werten müssen Sie später im Notfall ein wenig experimentieren, bis Sie eine optisch ansprechende Position gefunden haben. Auch negative Werte sind dabei erlaubt.
Wir haben bewusst eine recht große Darstellung gewählt, weil dies das Arbeiten und speziell das Positionieren mit dem GIFBUILDER erleichtert und später durch eine Verkleinerung mithilfe von SCALE eine Art Antialiasing-Effekt erzielt wird.
Links
Geben Sie nun den Parameter XY ein. Mithilfe der eckigen Klammern und der darin enthaltenen Angaben sorgen Sie dafür, dass die Arbeitsfläche der Gesamtgrafik immer 65 Pixel hoch und 65 Pixel breiter als der Text im Bereich 80 sein wird. w steht dabei immer für die Breite des Elements, auf das Sie sich beziehen, h für die Höhe. Sonstige Werte können Sie mit den üblichen Rechenoperatoren hinzufügen. Jetzt sollten Sie das Setup speichern und sich das Ergebnis im Frontend anschauen. Vermutlich werden Sie weiße Rechtecke sehen, deren Größe variiert. Ein Text sollte noch nicht erkennbar sein, weil dieser ebenfalls weiß ist.
In den nächsten vier Ebenen erzeugen Sie den Schatten der Grafik. Er besteht aus je einem Kreis am linken und rechten Rand, einem Rechteck und einem Weichzeichnereffekt. Da diese Ebenen numerische Werte kleiner als 80 besitzen, bleibt der Text weiterhin im Vordergrund und wird damit sichtbar.
Lizensiert für Markus Mueller
Der Kreis wird mithilfe der Symbolschriftart erzeugt, indem Sie eine TEXT-Ebene mit der Nummer 10 anlegen. In unserem Beispiel haben wir mit Zapf Dingbats gearbeitet und als Text das kleine L »l« verwendet, weil dieser Charactercode einem gefüllten Kreis entspricht. Je nach Schriftart oder gewünschter Form müssen Sie den Text und möglicherweise auch die Angaben zu Größe und Position ändern. Die Farbe des Symbols ist Dunkelgrau. Auf Ebene 20 folgt nun ein ebenfalls dunkelgraues Rechteck. Hierzu verwenden Sie das GIFBUILDER-Objekt BOX. Mithilfe des Parameters dimensions bestimmen Sie Größe und Position des Rechtecks. Die Reihenfolge hierfür ist x,y,w,h. Dabei steht x,y für die Position der linken oberen Ecke. Auch hier dürfen Sie sich wie beim Parameter XY auf andere Objekte beziehen und Rechenoperatoren verwenden. Im Beispiel ist das Rechteck exakt so breit wie die Ebene 80, 45 Pixel hoch, und es befindet sich 30 Pixel vom linken sowie 11 Pixel vom oberen Rand entfernt. Je nach dem auf den Ebenen 10 und 30 verwendeten Symbol müssen Sie auch diese Werte anpassen, um eine homogene Form zu erzielen. Ebene 30 entspricht weitestgehend der Ebene 10, jedoch wird hier die Positionierung in Abhängigkeit von Ebene 80 vorgenommen, damit der rechte Kreis sich je nach Länge des Texts an der passenden Stelle befindet. Auch hier müssen Sie notfalls ein wenig nachjustieren.
Max. Linie
Ebene 40 ist die erste Funktionsebene. Sie sorgt mithilfe des Objekts EFFECTS dafür, dass der Schatten weiche Kanten erhält. Für EFFECTS steht Ihnen eine ganze Palette verschiedener Funktionen zur Verfügung, die Sie ausführlich in der TSref beschrieben finden. Sämtliche Effekte werden innerhalb des Parameters value hintereinander geschrieben
und mithilfe eines senkrechten Strichs voneinander getrennt. Im Beispiel ist es der Effekt blur, der den maximal möglichen Wert von 90 erhält. Speichern Sie nun wieder und schauen Sie sich das Ergebnis an. Sie sollten einen weichen Schatten mit abgerundeten Enden sehen, auf dem sich ein weißer Text befindet.
In den Ebenen 50, 60 und 70 wiederholen Sie nun im Prinzip die Anordnung der drei Formen, mit denen Sie bereits den Schatten erzeugt haben. Der Unterschied besteht lediglich in einer geringfügig anderen Größe, um den Verlust durch den Weichzeichner auszugleichen, einer nach rechts oben verschobenen Position sowie einer anderen Vordergrundfarbe. Wenn Sie nun speichern und sich das Ergebnis anschauen, sollten Sie bereits eine rote Fläche mit abgerundeten Ecken, darunterliegendem Schatten und weißer Beschriftung erkennen können.
Lizensiert für Markus Mueller
Abschließend kommt auf Ebene 90 eine weitere Funktion zum Einsatz. Mithilfe von SCALE reduzieren Sie die Größe der Grafik auf die Hälfte, was den bereits erwähnten Antialiasing-Effekt zur Folge hat. Mit den beiden Parametern width und height verfahren Sie, wie bereits vom Parameter XY bekannt. Auch hier können Sie sich auf andere Ebenen beziehen sowie Rechenoperatoren verwenden. Falls Ihnen das Ergebnis zu unscharf erscheint, können Sie auf diese Ebene auch verzichten und die anderen Ebenen direkt in der Originalgröße anlegen. Kopieren Sie das Setup nun in den NO-Bereich des HMENU oder, wenn Sie einen grafischen Header erzeugen wollen, in den Bereich file der IMG_RESOURCE. Im Fall des Headers müssen Sie nun noch den Bereich file.80.text anpassen, damit dort der Wert aus dem korrekten Datenbankfeld verwendet wird.
Siehe auch Wenn Sie fortgeschrittenere Möglichkeiten des GIFBUILDER kennenlernen möchten, lesen Sie doch einfach die Rezepte 14.6 und 14.7, in denen es um wirklich komplexe Grafikberechnungen mit dynamisch erzeugten Hintergründen geht.
11.11 Grafiken mit mehrzeiligem Text erzeugen Problem
Max. Linie
Sie müssen wiederum eine Seite gemäß den Vorgaben zur Corporate Identity Ihres Kunden gestalten. Dabei sollen Sie dafür sorgen, dass die Seitentitel der jeweils aktuellen Seite als Überschriften mit der Hausschrift des Kunden erzeugt werden.
Weil diese Titel nicht selten länger sind, als es die gewählte Bildschirmbreite zulässt, möchten Sie die Überschriften mehrzeilig anlegen. Dabei soll der Redakteur mithilfe einer einfachen Zeilenschaltung eine neue Zeile in der erzeugten Grafik anlegen können. Zusätzlich möchten Sie nicht auf die zugängliche Formatierung mithilfe von h- und spanTags verzichten, wie sie in Rezept 11.9 beschrieben wird.
Links
Lösung Vergewissern Sie sich, dass das gewünschte Feld für die Ausgabe der Überschrift die Eingabe von mehrzeiligem Text zulässt. In der Regel trifft das auf Textareas und Rich TextEingaben zu. Sollte für die Eingabe nur ein einzeiliges Input-Feld zur Verfügung stehen, modifizieren Sie dessen Erscheinungsbild im Backend, indem Sie den entsprechenden TCA-Eintrag anpassen. Wenn Sie hierzu weitere Informationen benötigen, lesen Sie dazu Rezept 6.7. Verwenden Sie IMG_RESOURCE und erzeugen Sie die Grafik mithilfe von GIFBUILDER. Verpacken Sie die erzeugte Grafik mit outerWrap.cObject und konstruieren Sie den Wrap darin mit COA und LOAD_REGISTER.
Beim doppelten Einsatz des span-Tags handelt es sich in diesem Fall nicht um einen Tippfehler, Sie benötigen wirklich zwei separate Tags, um sowohl die Breite als auch die Höhe bei gleichzeitiger Unsichtbarkeit steuern zu können.
Diskussion Dieses Rezept macht sich zwei wenig bekannte Tatsachen zu Nutze: • Innerhalb von GIFBUILDER TEXT-Objekten werden Zeilenschaltungen erkannt und als solche gerendert. Lizensiert für Markus Mueller
• Der Feldtyp eines Datenbankfelds hat selbst keinerlei Einfluss auf das Aussehen des Eingabefelds innerhalb eines Backend-Formulars. Die Formulare werden ausschließlich über TCA-Einträge formatiert. Für das konkrete Problem bedeutet das, dass Sie sich nicht mit einzeiligen Eingabefeldern für Überschriften abfinden müssen. Und es gibt auch keinen Grund, spezielle Trennzeichen in ein solches Eingabefeld einzufügen, um eine Zeilenschaltung zu simulieren. Sorgen Sie einfach dafür, dass im TCA-Eintrag für das gewünschte Feld mindestens eine Formatierung als Textarea oder sogar als Textarea mit RTE vorhanden ist. Wie Sie das erreichen können, wird in Rezept 6.7 eingehend beschrieben. Danach können Sie beim Editieren des Felds die gewünschten Zeilenschaltungen direkt mit eingeben, und diese werden vom GIFBUILDER einwandfrei erkannt und gerendert. Dennoch ist die Aufgabe nicht ganz so einfach, wie sie sich zunächst darstellen mag. Schließlich geht es darum, die auf diese Art und Weise erzeugte Grafik wie in Rezept 11.9 für zugängliche grafische Header beschrieben als Hintergrund in ein h1-Tag einzubauen, das wiederum einen unsichtbaren Text enthalten muss, um für Screenreader lesbar zu bleiben.
Max. Linie
Das eigentliche Problem liegt dabei darin, dass der unsichtbare Text sich innerhalb eines span-Tags befindet, das eine Kantenlänge von 1 px und die Eigenschaft overflow:hidden besitzt. Damit die mehrzeilige Grafik vollständig sichtbar wird, muss dieses span-Tag das umschließende h1-Tag entsprechend ausdehnen. Hierzu würde es zunächst ausreichen, dem span keine feste Höhe zuzuweisen, damit es sich der Schriftgröße anpassen kann. Der unerwünschte Nebeneffekt ist, dass in diesem Fall bedingt durch die Breite von nur 1 px neben den echten Zeilenschaltungen weitere automatische Zeilenumbrüche erfolgen
könnten, die die Höhe drastisch vergrößern würden. Eine größere Breite für dieses spanTag zu verwenden entfällt, weil damit der Text sichtbar und die Grafik überlagert würde.
Links
Die Lösung ist denkbar einfach: Ein zweites span-Tag muss herhalten, damit die Breite ebenfalls simuliert werden kann, ohne den Text sichtbar werden zu lassen. Dieses erhält ebenfalls die Eigenschaft overflow:hidden. In unserem Beispiel befindet sich ein span-Tag mit 1.000 px Breite innerhalb eines span-Tags mit nur 1 px Breite. Durch den Einsatz von overflow:hidden wird erreicht, dass das innere Tag zwar die Höhe des äußeren Tags beeinflusst, der darin enthaltene Text aber dennoch nicht sichtbar wird. h1 { position:relative; display:block; width:280px; margin-bottom:13px; }
Damit nun der Text die erforderlichen Zeilenschaltungen erhält, müssen Sie ein wenig anders vorgehen als bei der Lösung für den einzeiligen grafischen Header. Verwenden Sie hierzu die stdWrap-Funktion br. Im Prinzip handelt es sich dabei um einen Schalter, der dafür sorgt, dass jede Zeilenschaltung durch ein br-Tag ersetzt wird. Das alles passiert innerhalb eines LOAD_REGISTER, mit dessen Hilfe Sie sich den outerWrap konstruieren, um den Text zu verpacken. Dieses Register enthält den kompletten Text, umbrochen mit br-Tags. Es wird im folgenden TEXT-Element innerhalb eines dataWrap einschließlich der Inline-Styles in den restlichen HTML-Code eingebaut. Damit die so erzeugte Textzeile trotzdem als outerWrap genutzt werden kann, müssen Sie sich
eines kleinen Tricks bedienen. Da ein Wrap immer einen senkrechten Strich | als Platzhalter für den Inhalt benötigt, weisen Sie dem TEXT-Element eben dieses Zeichen als value zu. Damit erreichen Sie, dass innerhalb des dataWrap das dortige |-Zeichen mit exakt dem gleichen Zeichen ersetzt wird. Aus diesen Zeilen:
<span><span> Erste Textzeile Zweite Textzeile Dritte Textzeile
Weil darin auch wieder ein |-Zeichen als Platzhalter vorkommt, wird dieses wiederum durch die erzeugte Grafik ersetzt. Nun müssen Sie nur noch gegebenenfalls das Stylesheet entsprechend anpassen, und schon können Sie Ihren mehrzeiligen grafischen Header verwenden.
11.12 Eigene PHP-Funktionen als TypoScript-Element einbinden Problem Lizensiert für Markus Mueller
Sie wollen eigene PHP-Funktionen verwenden, um die Ausgabe von Inhalten nach Ihren eigenen Vorstellungen zu modifizieren. Um die Flexibilität für Administratoren weitestgehend zu erhalten, sollen dabei verschiedene TypoScript-Parameter zum Einsatz kommen, die das Verhalten der PHP-Funktionen nach Bedarf verändern.
Lösung Verwenden Sie die TypoScript-Elemente USER oder USER_INT und geben Sie darin die nötigen TypoScript-Parameter vor. Erstellen Sie die nötigen Funktionen und speichern Sie diese in einer separaten Datei z.B. im Ordner fileadmin/scripts. Binden Sie die Datei über includeLibs ein und rufen Sie die gewünschten Funktionen mithilfe von userFunc auf. Achten Sie dabei darauf, dass Ihre Klassen und Funktionen immer mit dem Präfix user_ versehen sein müssen, damit Sie von TYPO3 akzeptiert werden!
So könnte Ihre PHP-Datei user_klasse.php aussehen:
Max. Linie
var $cObj; //Referenz auf die aufrufende Instanz von tslib_cObj
standardElement = COA standardElement { 10 = TEXT 10.value = Eine Textzeile } } }
Das Einbinden der PHP-Datei erfolgt bei USER-Elementen im übergeordneten PAGE-Element, während es bei USER_INT-Elementen im Element selbst vorgenommen wird!
Diskussion Bevor wir die Arbeitsweise der USER und USER_INT-Elemente genauer erläutern, sollten Sie sich mit ein paar grundlegenden Spielregeln für die Entwicklung von PHP-Code im Zusammenhang mit TYPO3 vertraut machen. • Halten Sie sich beim Erstellen des Codes unbedingt an die Coding Guidelines und verwenden Sie weitestgehend Funktionen, die Ihnen im Rahmen der TYPO3-API zur Verfügung stehen. Damit stellen Sie sicher, dass Ihr Code auch mit zukünftigen TYPO3-Versionen funktioniert. Lizensiert für Markus Mueller
• Verwenden Sie nach Möglichkeit bereit bestehende TypoScript-Elemente und werten Sie diese mit den entsprechenden Funktionen der API aus. • Wenn Sie eigene TypoScript-Parameter einführen, verwenden Sie dabei aussagekräftige Bezeichnungen, die es den Administratoren später erleichtern, die Funktionsweise des Elements nachzuvollziehen. • Notieren Sie eigene TypoScript-Parameter nach dem lowerCamelCase-Prinzip. Schreiben Sie also meinNeuerParameter und nicht mein_neuer_parameter. • Verpacken Sie auch USER oder USER_INT-Elemente immer in einem COA oder COA_INT-Element, weil es damit leichter wird, diese mithilfe von stdWrap-Funktionen anzupassen. • Verwenden Sie USER_INT-Elemente nur dort, wo Sie unbedingt sicherstellen müssen, dass die Ausgabe nicht im Cache gespeichert wird, z.B. bei einer Warenkorbfunktion. USER-Elemente sind deutlich performanter. Wie Sie an unserem Beispiel sehen, weisen USER- und USER_INT-Elemente eine Besonderheit gegenüber allen anderen TypoScript-Elementen auf: Neben der Verarbeitung von eingebundenen Standard-TypoScript-Elementen mit festgelegten Parametern bieten Sie Ihnen zusätzlich die Möglichkeit, eigene TypoScript-Parameter zu definieren.
Max. Linie
Der gesamte TypoScript-Code eines solchen Elements wird in einem Array namens $conf an die aufgerufene Funktion übergeben. Innerhalb der Funktion können Sie dieses Array beliebig verwenden, auslesen oder modifizieren. Die Ausgabe der USER-/USER_
INT-Elemente erfolgt danach über den return-Befehl der PHP-Funktion. Funktionen für USER, oder USER_INT-Elemente sollten daher immer mindestens folgenden Code enthalten
Links
function user_Funktion($content,$conf) { // // // //
Hier kommt Ihr eigener Code hin, der $content modifiziert und bei Bedarf das Array $conf ausliest und verarbeitet.
return $content; }
Um den Aufbau von $conf besser nachvollziehen zu können, empfiehlt es sich, während der Entwicklung einen debug-Befehl vorzuschalten. Sie erhalten so in der Ausgabe eine formatierte Tabelle mit sämtlichen Schlüsseln und Werten von $conf. function user_Funktion($content,$conf) { debug($conf);
Lizensiert für Markus Mueller
// // // //
Hier kommt Ihr eigener Code hin, der $content modifiziert und bei Bedarf das Array $conf ausliest und verarbeitet.
return $content; }
Im Gegensatz zu anderen TypoScript-Parametern, bei denen ebenfalls eine Funktion mit $content und $conf aufgerufen wird, ist der übergebene Parameter $content im Fall von USER und USER_INT prinzipiell leer.
Was genau nun vor der Ausgabe von $content passiert, ist Ihrer Kreativität überlassen. Denken Sie dabei aber immer an die genannten Spielregeln. Der einzige Unterschied zwischen USER- und USER_INT-Elementen besteht in deren Caching-Verhalten. Während Funktionen in USER-Elementen direkt bei der Verarbeitung des TypoScript-Templates ausgeführt und deren Ergebnis im Cache abgelegt wird, wird für USER_INT-Elemente zunächst nur ein Platzhalter gespeichert. 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 USER_INT-Element ausgeführt und der Platzhalter mit dem Resultat der PHP-Funktion ersetzt. Aus diesem Grund müssen Sie den includeLibs-Parameter bei USER_INT-Elementen innerhalb des Elements selbst setzen, damit sichergestellt ist, dass die zu verwendende Funktion ebenfalls nicht im Cache gespeichert wurde.
Rechts 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 USER_INT eingebunden wurden und wie diese gerendert und in die Ausgabe eingebaut werden.
Aus Gründen der Performance sollten Sie USER_INT-Elemente sparsam verwenden. USER-Elemente eignen sich vor allem für selbst definierte Inhaltselemente. So könnten Sie damit beispielsweise Tabellenelemente, eigene Text-/Bild-Kombinationen oder spezielle Formulare erzeugen. USER_INT-Elemente kommen immer dort zum Einsatz, wo sich der Inhalt des Elements bei jedem Aufruf ändern muss. So würden zum Beispiel Warenkörbe, Newsfeeds oder Userprofile auf einer Community-Seite mit einem USER_ INT-Element realisiert.
Lizensiert für Markus Mueller
Wollen Sie neben dem eigentlichen PHP-Code zusätzliche Tabellen in der Datenbank anlegen oder bestehende Tabellen modifizieren, oder benötigen Sie für die Eingabe von Daten für diese Elemente zusätzliche Backend-Formulare, sollten Sie auf das manuelle Erstellen eines USER- oder USER_INT-Elements verzichten. Erzeugen Sie stattdessen mithilfe des Kickstarters eine eigene Extension und installieren Sie diese im Erweiterungs-Manager. Lesen Sie dazu Kapitel 16 zum Thema Extensions, in dem wir Ihnen detailliert beschreiben, wie Sie eine solche Extension erstellen können. Wenn Sie die oben genannte Spielregel Nr. 5 beachten, können Sie auf den Einsatz von USER_INT-Elementen gegebenenfalls komplett verzichten, indem Sie stattdessen ein USER-Element in ein COA_INT-Element verpacken. Das Caching-Verhalten ist dabei identisch, jedoch werden in diesem Fall auch die Parameter des COA_INT-Elements nicht im Cache gespeichert. Das ist immer dann von Vorteil, wenn diese sich auf die Ausgabe des USER-Elements beziehen sollen.
Eine der Fähigkeiten, durch die sich TYPO3 von der Masse der Content ManagementSysteme und Frameworks abhebt, ist das automatische Erzeugen nahezu beliebiger Menüstrukturen. Die Basis für diese Funktionalität ist das Element HMENU. Es liefert die Daten, die später als Menüeinträge erscheinen sollen, und übergibt diese intern an eines von mehreren möglichen Menüelementen, den sogenannten MENU Objects. TYPO3 stellt Ihnen folgende Elemente als MENU Objects zur Verfügung: • TMENU für Menüs mit reinen Texten als Einträge • GMENU für Menüs mit grafischen Buttons • TMENU_LAYERS und GMENU_LAYERS für auf JavaScript basierende Layer-Varianten von TMENU und GMENU • GMENU_FOLDOUT für die auf JavaScript basierende Ausklapp-Variante von GMENU • IMGMENU für grafische Menüs auf Basis von Imagemaps • JSMENU für auf JavaScript basierende Menüs aus mehreren Auswahlfeldern Wir konzentrieren uns in diesem Kapitel hauptsächlich auf TMENU und GMENU. Außerdem zeigen wir Ihnen in Rezept 12.17, wie Sie anstatt eines JSMENU deutlich komfortabler mit einem TMENU arbeiten können, um das gleiche Ergebnis zu erzielen. GMENU_FOLDOUT und IMGMENU sind unserer Meinung nach eher ungebräuchlich und können bei Bedarf durch ein einfaches GMENU mit entsprechender Konfiguration abgebildet werden. TMENU_LAYERS sowie GMENU_LAYERS basieren auf Layouts und JavaScript-Code, der inzwischen nicht mehr zeitgemäß ist. Auch hier empfiehlt sich die Umsetzung eines moderneren Ansatzes mithilfe von GMENU oder TMENU.
Links Während die Nummerierung in PAGE- oder COA-Elementen frei wählbar ist und aus Gründen der Flexibilität üblicherweise in Zehnerschritten erfolgt, steht die Nummer eines Menüelements immer für die Ebene des Menüs, auf die sich dieses Element bezieht.
Um ein Menü erzeugen zu können, benötigen Sie daher immer mindestens ein Menüelement für die Ebene 1. Ohne diese Ebene wird kein Menü erzeugt, auch wenn Sie die folgenden Ebenen angegeben haben. Es können beliebig viele weitere Menüelemente folgen, die ohne Unterbrechung aufsteigend durchnummeriert werden müssen. Jedes erzeugt dabei eine weitere Ebene, die, soweit sie im Seitenbaum vorhanden ist, entsprechend ausgegeben wird. Dabei können Sie auch verschiedene Menüvarianten mischen und z.B. auf der ersten Ebene ein GMENU_LAYERS verwenden, gefolgt von einem GMENU mit einer weiteren Ebene in Form eines TMENU. Es müssen jedoch immer alle Ebenen ohne Unterbrechung im Setup vorkommen, auch wenn Sie gegebenenfalls bestimmte Ebenen gar nicht anzeigen wollen.
Lizensiert für Markus Mueller
Innerhalb eines Menüelements können Sie verschiedene Zustände nutzen, die auf bestimmte Rahmenbedingungen eines Menüeintrags angewendet werden. So können Sie z.B. eine andere Formatierung erzeugen, wenn die zum Menüeintrag gehörende Seite über Unterseiten verfügt oder wenn der Menüeintrag der aktuellen Seite entspricht. Lesen Sie hierzu Rezept 12.3, das sich ausführlich mit den jeweiligen Zuständen beschäftigt. Für die minimale Ausgabe eines Menüs ist immer mindestens der Normalzustand NO erforderlich, da ansonsten keine Ausgabe der Einträge erzeugt wird. Daraus ergibt sich folgende Minimalkonfiguration, hier am Beispiel eines TMENU: temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { 1 = TMENU 1 { NO { } } 2 < .1 3 < .1 } }
Es ist dabei ausreichend, wenn Sie den NO-Eintrag ohne weitere Parameter vornehmen. Es kann aber aus Gründen der Übersicht nicht schaden, wenn Sie zumindest den Parameter allWrap anwenden, um die einzelnen Menüeinträge mit einer Zeilenschaltung zu separieren.
Für alle Zustände innerhalb einer der verschiedenen Menüvarianten gilt: Sämtliche Parameter können durch optionSplit variiert werden. Mithilfe dieser umfangreichen Funktion können Sie Menüeinträge unabhängig von ihrem Zustand anhand der Position, die sie im Menü einnehmen, individuell formatieren. Wenn Sie das Prinzip von optionSplit und dessen Regeln kennenlernen wollen, lesen Sie Rezept 12.4. In den ersten elf Rezepten des Kapitels werden wir Ihnen zunächst grundlegende Verfahrensweisen zur Arbeit mit dem HMENU-Element erläutern, bevor wir in Rezept 12.12 mit konkreten Beispielen für die Menüvarianten beginnen. Sie sollten diese Grundlagen auf jeden Fall berücksichtigen, wenn Sie noch keinerlei Erfahrung im Umgang mit den Menüelementen haben. Eine besondere Eigenschaft von HMENU ist, dass sich der Fokus für bestimmte TypoScript-Funktionen innerhalb der Unterelemente verschiebt. Normalerweise beziehen sich sämtliche TypoScript-Anweisungen auf die aktuell dargestellte Seite. Hintergrund ist, dass das Array $cObj->data per Default den Datensatz der aktuellen Seite enthält. Zum Beispiel würden Sie mit diesem Code den Titel der aktuellen Seite auslesen:
Lizensiert für Markus Mueller
page = PAGE page { 10 = TEXT 10.field = title }
Nicht so bei einem TMENU oder anderen Menüvarianten innerhalb von HMENU. Hier bezieht sich die Anweisung immer auf die Seite, deren Menüeintrag gerade gerendert wird. NO { stdWrap.field = title }
In diesem Fall wird das Array $cObj->data mit dem Datensatz der Seite befüllt, die bei einem Klick auf den Menüeintrag aufgerufen würde. Sie würden in diesem Beispiel also deren Titel und nicht etwa den der aktuellen Seite auslesen. Dies gilt allerdings ausschließlich für die Menüelemente, nicht aber für das HMENU-Element selbst. Wenn Sie also stdWrap-Funktionen oder ähnliche TypoScript-Anweisungen verwenden, die auf Inhalte der Datenbank zurückgreifen, sollten Sie diese Tatsache immer berücksichtigen.
12.1 Startpunkt für Menüs festlegen Problem
Max. Linie
Sie wollen für Ihr Menü den Startpunkt festlegen, um sicherzustellen, welche Seiten auf der ersten Ebene gerendert werden.
Verwenden Sie die HMENU-Parameter entryLevel oder special: temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { entryLevel=1 1 = TMENU 1 { NO { allWrap = | } } } }
oder
Lizensiert für Markus Mueller
temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special = directory special.value = 1 1 = TMENU 1 { NO { allWrap = | } } } }
Bitte beachten Sie, dass wir in diesem Beispiel TMENU als Platzhalter für eine der möglichen Varianten TMENU, GMENU, TMENU_LAYERS, GMENU_LAYERS, IMGMENU und JSMENU verwendet haben. Je nach Variante müssen Sie gegebenenfalls andere Parameter setzen, um die volle Funktionalität des Menüs zu erreichen. Lesen Sie dazu bei Bedarf die entsprechenden Rezepte.
Diskussion Wie Sie bereits in der Einleitung erfahren haben, erzeugt ein HMENU ohne weitere Angaben immer ein Menü der Seiten auf der ersten Ebene. Für jedes Unterelement wird dabei in einer hierarchischen Struktur die nächste Ebene des Seitenbaums angezeigt.
Max. Linie
Dies ist nicht immer gewünscht und speziell für mehr oder weniger statische Navigationselemente eher hinderlich. Zum Beispiel verfügt eine brauchbare Internetseite üblicherweise über ein Hauptmenü, das in der Regel unabhängig vom aktuellen Aufenthaltsort des Betrachters immer die gleichen Einträge anzeigt. Gleiches gilt für eine sogenannte
Metanavigation, die zum Beispiel die rechtlich notwendigen Elemente wie Impressum, AGB und Kontaktseiten enthält. Es ist daher notwendig, für ein solches Menü eine Art Startpunkt festzulegen, der entweder absolut auf Basis der Root-Seite oder aber relativ zur aktuellen Seite berechnet wird. Dieser Startpunkt bezieht sich meist nicht auf eine konkrete Seite, sondern auf deren Ebene, die man daher als Einstiegsebene bezeichnet. Der hierfür zuständige Parameter des HMENU-Elements heißt demzufolge entryLevel. entryLevel kann als Wert sowohl positive als auch negative Zahlen erhalten. Beachten Sie, dass damit nur die Einstiegsebene markiert wird, diese Ebene aber nicht selbst im Menü enthalten ist. entryLevel = 0 startet zum Beispiel auf der ersten Menüebene mit der Anzeige von Seiten, die sich auf Level 1 befinden. Alle folgenden Menüebenen werden immer nach dem gleichen Prinzip von der Einstiegsseite aus berechnet. Sie beeinflussen also genau genommen nur die erste Ebene.
Die in der TSref verwendete Definition from behind und items from the outermost level für negative Werte ist ein wenig irreführend. Daher werden wir das Prinzip anhand eines Beispiels erklären. Lizensiert für Markus Mueller
Stellen Sie sich eine Treppe mit mehreren Stufen vor. Die unterste Ebene dieser Treppe ist der Boden selbst und wird als Level 0 bezeichnet. Wenn Sie nun diese Treppe 5 Stufen hinaufsteigen und dabei jede Stufe mitzählen, befinden Sie sich auf Level 5. Ein Menü, das erst ab dieser Ebene angezeigt werden soll, bekäme also den Parameter entryLevel = 5. Die Regel hierfür lautet: Positive Werte sind absolute Werte. Sie werden von der Root-Seite aus aufsteigend berechnet. 0 entspricht der Root-Seite selbst.
Was aber, wenn Sie keine absoluten Werte benötigen, sondern relative Werte auf Basis der aktuellen Position im Seitenbaum? Stellen Sie sich hierzu einen Freund vor, der die Treppe nur 3 Stufen hochsteigt. Würde er dort stehen bleiben, könnte man nach der eben beschriebenen Regel festlegen, dass der Parameter entryLevel = 3
lauten soll. Was aber, wenn dieser Freund nun gemeinsam mit Ihnen jeweils eine Stufe höher steigt? Sie befinden sich nun auf Level 6, der Freund auf Level 4. entryLevel = 3 würde den Freund nicht mehr berücksichtigen, weil er sich zwar immer noch zwei Stufen hinter Ihnen befindet, aber eben nicht absolut zur Root-Ebene berechnet, sondern relativ zu Ihrem Aufenthaltsort.
Max. Linie
In diesem Fall kommen die negativen Werte zum Einsatz. Leider gibt es keine mathematisch korrekte Schreibweise für –0, daher wird in diesem Fall mit –1 gestartet. –1 steht für die Stufe, auf der Sie selbst sich befänden, –2 ist die darunterliegende, und mit –3
wären Sie schon bei Ihrem Freund gelandet. Der korrekte Parameter wäre in diesem Fall entryLevel = –3.
Links
Die Regel hierfür lautet: Negative Werte sind relative Werte. Sie werden von der aktuellen Seite aus absteigend berechnet. –1 entspricht der aktuellen Seite selbst.
Wollten Sie zum Beispiel immer die Stufe direkt vor Ihrem Freund anzeigen, von dem Sie lediglich wissen, dass er sich immer zwei Stufen unter Ihnen befindet, müssten Sie als passendes entryLevel das Level seiner Stufe verwenden. Nach der eben definierten Regel wäre dies Level –3. Ihr Code müsste also ungefähr so aussehen:
Für die von Ihnen aus gesehen nächsthöhere Stufe wäre der Code: temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { entryLevel=–1 1 = xMENU 1 { NO { allWrap = | } } } }
Es leuchtet ein, dass Sie mit dieser Methode nur Einstiegsseiten verwenden können, die sich im gleichen Teilbereich des Seitenbaums befinden wie die aktuelle Seite. So können Sie beispielsweise die Elternseite und die Geschwister der aktuellen Seite als Einstieg nutzen, nicht aber die Kinder dieser Geschwister.
Max. Linie
Wenn Sie z.B. auf Seiten zugreifen wollen, die sich außerhalb dieses Teilbereichs oder sogar komplett außerhalb des Seitenbaums befinden, müssen Sie daher den Parameter special verwenden. Für die Bestimmung des Startpunkts benötigen Sie entweder special
= list oder aber special = directory. Die weiteren Möglichkeiten von special finden Sie
in den Rezepten 12.5 bis 12.9, die sich mit speziellen Menütypen beschäftigen. Im Gegensatz zu entryLevel definieren Sie mithilfe von special = list und special = directory nicht die Ebene, von der ausgehend das Menü gerendert werden soll, sondern die Einstiegsseiten selbst. Hierzu verwenden Sie für beide Varianten den Parameter special.value. Der Wert für value kann eine einzelne Zahl oder eine kommaseparierte Liste sein, mit deren Hilfe Sie die IDs einzelner Seiten angeben. Diese werden später als Einstiegspunkt verwendet. Die korrekte Schreibweise für ein Menü vom Typ list oder directory sieht folgendermaßen aus:
Lizensiert für Markus Mueller
Max. Linie
temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special = list special.value = 1,2,3 1 = xMENU 1 { NO { allWrap = | } } } }
oder temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special = directory special.value = 1,2,3 1 = xMENU 1 { NO { allWrap = | } } } }
Der Unterschied zwischen list und directory besteht in der Art und Weise, wie die unter value angegebenen IDs verarbeitet werden. Verwenden Sie den Typ list, steht jede ID für die UID der Seiten, die auf der ersten Ebene angezeigt werden sollen. Dies ist vergleichbar mit dem Inhaltselement Menü/Sitemap mit der Einstellung Menü dieser Seiten, und genau dort kommt special = list auch zum Einsatz, wenn Sie z.B. CSS-styled-content als static-Template nutzen. Verwenden Sie jedoch den Typ directory, steht jede ID für die
PID der Seiten, die auf der ersten Ebene angezeigt werden sollen. Das Äquivalent hierzu wäre Menü/Sitemap mit der Einstellung Menü der Unterseiten dieser Seiten.
Links
Hierzu ein konkretes Beispiel: Wie bereits zu Anfang der Diskussion erwähnt, gibt es in der Regel einen fest definierten Metanavigationsbereich, in dem sich Dinge wie Impressum, AGB oder Kontakt befinden. Wenn Sie diesen nun separat in einem Footer-Menü darstellen wollen, können Sie dabei hervorragend mit einer der beiden beschriebenen Techniken arbeiten. Erstellen Sie dazu zunächst eine Seite vom Typ nicht im Menü und nennen Sie diese Metanavigation. Nehmen wir an, sie hätte die ID 123. Erstellen Sie nun die drei Unterseiten und geben Sie diesen die eben genannten Namen. Nehmen wir weiterhin an, die IDs dieser Seiten wären 124, 125, 126. Wenn Sie sich für die Variante directory entscheiden, lautet der Code nun:
Lizensiert für Markus Mueller
temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special = directory special.value = 123 1 = xMENU 1 { NO { allWrap = | } } } }
Für den Fall, dass Sie doch lieber mit list arbeiten möchten, sähe er so aus: temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special = list special.value = 124,125,126 1 = xMENU 1 { NO { allWrap = | } } } }
Max. Linie
Der Vorteil der ersten Variante liegt darin, dass Sie nur die Elternseite anzugeben brauchen und danach einfach alle Unterseiten dieser Seite angezeigt werden. Das ist immer dann sinnvoll, wenn Sie nicht genau wissen, ob weitere Seiten für diesen Bereich geplant sind oder nicht.
Die zweite Variante ist restriktiver, aber auch weniger fehleranfällig, denn damit stellen Sie sicher, dass die angegebenen Seiten – und nur diese – immer im Menü erscheinen, selbst dann, wenn der Redakteur sie versehentlich an eine andere Stelle verschieben sollte. Sie wissen nun, wie man den Startpunkt eines Menüs definieren kann. Entscheiden Sie selbst, welche Variante in Ihrem Fall am sinnvollsten einzusetzen ist.
12.2 Geschützte Seiten im Menü anzeigen und auf Login-Seite umleiten Problem Sie haben einen oder mehrere Bereiche auf Ihrer Website angelegt, deren Inhalte nur nach einem erfolgreichen Login durch den Benutzer angezeigt werden sollen.
Lizensiert für Markus Mueller
Diese Seiten werden normalerweise ohne entsprechende Zugriffsrechte nicht im Menü angezeigt. Sie möchten sie aber dennoch für jeden Besucher ins Menü einbinden, damit auch ein nicht eingeloggter Benutzer bereits erkennen kann, was ihn nach dem Login erwartet.
Lösung Verwenden Sie das TypoScript-Element HMENU und innerhalb des darin verwendeten TMENU die Eigenschaft showAccessRestrictedPages sowie deren Parameter addParams. temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { 1 = TMENU 1 { showAccessRestrictedPages = 123 showAccessRestrictedPages { addParams = &return_url=###RETURN_URL###&pageId=###PAGE_ID### } NO { allWrap = | } } 2 < .1 3 < .1 4 < .1 } }
Beachten Sie, dass wir in diesem Beispiel TMENU als Platzhalter für eine der möglichen Varianten TMENU, GMENU, TMENU_LAYERS, GMENU_LAYERS, IMGMENU und JSMENU verwendet haben. Je nach Variante müssen Sie gegebenenfalls andere Parameter setzen, um die volle Funktionalität des Menüs zu erreichen. Lesen Sie dazu bei Bedarf die entsprechenden Rezepte.
Links
Die genannte Eigenschaft steht selbstverständlich auch in den anderen Menütypen zur Verfügung.
Diskussion Wenn Sie mithilfe von TypoScript Menüs erzeugen, werden normalerweise nur solche Seiten angezeigt, die nicht im Bereich Zugriff einer bestimmten Benutzergruppe zugewiesen wurden. In vielen Fällen könnte es jedoch sinnvoll sein, die geschützten Seiten zumindest im jeweiligen Menü anzuzeigen. Bei einem Klick auf den dazugehörigen Link bekommt der Benutzer jedoch nicht den Inhalt der geschützten Seite zu sehen. Stattdessen wird er auf eine zentrale Seite umgeleitet, die ein Login-Formular enthält, mit dem er sich zunächst als zugriffsberechtigt identifizieren muss. Nach erfolgreichem Login wird die ursprünglich aufgerufene geschützte Seite automatisch angezeigt, ohne dass der Benutzer sie nochmals aufrufen muss. Lizensiert für Markus Mueller
Max. Linie
Exakt dieses Verhalten können Sie mit der Menüeigenschaft showAccessRestrictedPages erreichen. Diese Eigenschaft kann in sämtlichen Menüvarianten verwendet werden. In unserem Beispiel haben wir das einfache TMENU aus der Einleitung verwendet. Die Zahl 123 steht beispielhaft für die UID der Seite, auf der sich das zentrale Login-Formular befindet. So dies nicht bereits geschehen ist, sollten Sie zunächst eine solche LoginSeite anlegen und die entsprechende UID anstatt der 123 in Ihr TS-Setup eintragen. Damit nun der Benutzer nach erfolgreichem Login automatisch auf die Seite zurückgeführt wird, die er ursprünglich aufgerufen hatte, müssen Sie den Parameter addParams verwenden. Die dort verwendeten Marker ###RETURN_URL### und ###PAGE_ ID### werden beim Parsen des TypoScript-Templates automatisch ersetzt. Mit dem ersten Marker wird dabei der eigentliche Seitenaufruf der geschützten Seite als URL zwischengespeichert und ist zwingend erforderlich. Der zweite dient als Zwischenspeicher für die Seite, auf der sich der Benutzer zum Zeitpunkt des Klicks befand. Diese Angabe können Sie beispielsweise benutzen, um je nach Ausgangspunkt festzulegen, welchen Gruppen der Benutzer angehören muss, um sich erfolgreich einloggen zu können. Speziell wenn Sie aus verschiedenen eingeschränkten Bereichen auf dasselbe Login-Formular verweisen, kann dies recht hilfreich sein. Falls Sie keinerlei Weiterleitung auf ein Login-Formular verwenden möchten, die Seiten aber dennoch angezeigt werden sollen, können Sie den Wert für showAccessRestrictedPages anstatt auf eine UID auf NONE setzen. In diesem Fall würde der Benutzer die übliche Meldung Seite nicht gefunden erhalten, wenn er auf den Link klickt.
12.3 Zustände von Menüeinträgen erkennen und individuell formatieren Problem Sie wollen ein einfaches, textbasiertes Menü mit semantisch korrektem HTML-Code erzeugen. Dabei sollen die verschiedenen Zustände der Menüeinträge berücksichtigt werden. Jeder Zustand soll eine individuelle Formatierung per CSS erhalten.
Lösung Verwenden Sie die Objekte HMENU und TMENU sowie die Parameter wrap, allWrap und wrapItemAndSub. Fügen Sie außerdem die verschiedenen Zustände NO, IFSUB, ACT, CUR und CURIFSUB ein. Dieser Code kommt in Ihr TS-Setup:
Und dieser in das TS-Setup Ihrer Seite: page = PAGE page.10 < temp.basicMenu
Diskussion Das gezeigte Menü basiert auf der Urversion des zugänglichen Listenmenüs aus Rezept 12.11 – ein TMENU, das eine verschachtelte Liste aus ul- und li-Tags erzeugt. Zusätzlich berücksichtigt diese Variante jedoch auch die verschiedenen Zustände, die ein Menüeintrag haben kann. In einem TMENU gibt es dafür folgende Möglichkeiten, die in ihrer Priorität jeweils über dem Vorgänger liegen: • NO ist der Normalzustand eines Eintrags und wird immer benötigt. Dieser Zustand wird auch dann für einen Eintrag verwendet, wenn dieser einen anderen Zustand hat, der aber nicht weiter definiert wurde. Lizensiert für Markus Mueller
• IFSUB wird immer dann aktiviert, wenn ein Menüeintrag über mindestens eine im Menü sichtbare Unterseite verfügt. Wenn dieser Zustand definiert wurde, überschreibt er den Zustand NO. • ACT steht für den Zustand Active. Dies bedeutet, dass sich der Benutzer gerade entweder auf dieser Seite selbst oder einer Seite unterhalb dieser Seite befindet. Dieser Zustand überschreibt die Zustände NO und IFSUB. • ACTIFSUB wird ebenfalls immer dann benutzt, wenn der Benutzer sich gerade entweder auf dieser Seite selbst oder einer Seite unterhalb dieser Seite befindet. Jedoch muss diese Seite zusätzlich noch mindestens eine Unterseite besitzen. Dieser Zustand überschreibt die Zustände NO, IFSUB und ACT. Er ist nur für den Fall, dass der Benutzer sich auf der aktuellen Seite befindet und Sie nicht mit den Zuständen CUR oder CURIFSUB arbeiten, identisch mit der CSS-Pseudoeigenschaft :active. • CUR steht für den Zustand Current, was bedeutet, dass der Benutzer sich im Moment auf exakt dieser Seite befindet. Genau genommen ist dies ein Zustand, der bereits durch ACT abgedeckt würde, jedoch können Sie mithilfe von CUR nochmals zwischen aktiven Seiten in der Rootline und der aktuellen Seite unterscheiden. Dieser Zustand überschreibt die Zustände NO, IFSUB, ACT und ACTIFSUB und ist identisch mit der CSSPseudoeigenschaft :active. • CURIFSUB wiederum wird verwendet, wenn sich der Benutzer auf exakt dieser Seite befindet und diese über mindestens eine Unterseite verfügt. Dieser Zustand überschreibt die Zustände NO, IFSUB, ACT, ACTIFSUB und CUR.
Rechts Sowohl für CUR als auch für CURIFSUB empfiehlt es sich, zusätzlich den Schalter doNotLinkIt auf 1 zu setzen. Damit stellen Sie sicher, dass in Ihrem Menü kein Link verwendet wird, der unnötigerweise auf die aktuelle Seite verweist.
Bezüglich der CSS-Pseudoeigenschaft :active sei noch erwähnt, dass diese selbstverständlich nur gilt, solange der Fokus sich wirklich auf dem Link selbst und nicht auf irgendeinem anderen Element befindet. Genau genommen weichen ACT und CUR von dieser Definition ab, weil sie immer Gültigkeit haben, wenn sich der Betrachter auf der Seite befindet, auch wenn der Fokus nicht mehr auf dem Link liegt. Auf eventuell in der TSref beschriebene RO-Varianten der oben genannten Zustände können Sie in der Regel verzichten, solange Sie nicht mit einer GMENU-Variante arbeiten. Diese würden einen Zustand beschreiben, bei dem sich der Benutzer mit der Maus über dem jeweiligen Eintrag befindet. Da der RollOver-Effekt in diesem Fall mithilfe von JavaScript erzeugt würde, empfiehlt es sich nicht, ihn in einem textbasierten Menü zu verwenden. Hier sollten Sie sinnvollerweise mit CSS und der Pseudoeigenschaft :hover arbeiten, die in modernen Browsern zumindest für a-Tags problemlos funktioniert.
Lizensiert für Markus Mueller
Die eben beschriebenen einzelnen Zustände werden nun ganz einfach über eine CSSKlasse innerhalb des li-Tags angesteuert. Innerhalb eines Stylesheets sollten Sie dabei immer folgende Reihenfolge einhalten, damit sich die einzelnen Zustände nicht gegenseitig überschreiben: div.bM { # Eigenschaften für den div-container } div.bM ul { # Eigenschaften für die Liste } div.bM ul li { # allgemeine Eigenschaften für Listeneinträge } div.bM ul li.bM_ACT a { # Eigenschaften für den Link im Zustand ACT } div.bM ul li.bM_ACT a:hover { # Eigenschaften für den Hover-Effekt im Zustand ACT } div.bM ul li.bM_CURIFSUB a { # Eigenschaften für den Link im Zustand CURIFSUB }
Max. Linie
div.bM ul li.bM_CURIFSUB a:hover { # Eigenschaften für den Hover-Effekt im Zustand CURIFSUB }
div.bM ul li.bM_CUR a { # Eigenschaften für den Link im Zustand CUR }
Links
div.bM ul li.bM_CUR a:hover { # Eigenschaften für den Hover-Effekt im Zustand CUR } div.bM ul li.bM_IFSUB a { # Eigenschaften für den Link im Zustand IFSUB } div.bM ul li.bM_IFSUB a:hover { # Eigenschaften für den Hover-Effekt im Zustand IFSUB } div.bM ul li.bM_NO a { # Eigenschaften für den Link im Zustand NO } div.bM ul li.bM_NO a:hover { # Eigenschaften für den Hover-Effekt im Zustand NO }
Lizensiert für Markus Mueller
Der Grund hierfür liegt in der Reihenfolge, in der die einzelnen Zustände in der Regel auftreten werden. • CURIFSUB oder CUR entsprechen ausschließlich der Seite, auf der sich der Betrachter gerade befindet. Dieser Zustand kann daher nur einmal im gesamten Menü auftauchen. • Alle Einträge, die sich auf der gleichen Ebene befinden, haben immer den Zustand NO (oder IFSUB, falls Sie diesen ebenfalls verwenden). • Alle untergeordneten Einträge können niemals den Zustand ACT besitzen, sondern nur NO (oder IFSUB, falls Sie diesen ebenfalls verwenden). • Alle übergeordneten Einträge in der Rootline haben immer den Zustand ACT (oder ACTIFSUB, falls Sie diesen ebenfalls verwenden). Da sich CSS-Eigenschaften von übergeordneten auf untergeordnete Elemente vererben, müssen die Zustände in der Reihenfolge ihres Auftretens abgearbeitet werden. • CUR überschreibt ACT. NO überschreibt CUR und ACT. Gleiches gilt für die jeweiligen IFSUB-Varianten der Zustände. • Auf die RO-(RollOver-)Varianten der Zustände können Sie vollständig verzichten, weil diese durch die CSS-Pseudoeigenschaft a:hover abgedeckt werden. Wie Sie vielleicht bemerkt haben, wurde im gezeigten Beispiel ebenfalls auf den Zustand
Max. Linie
ACTIFSUB verzichtet. Dies hat einen einfachen logischen Grund. Da wir in diesem Beispiel den Zustand CUR verwenden, ist es nach den eben beschriebenen Regeln unmöglich, dass eine Seite mit dem Zustand ACT keine Unterseiten hat.
ACT markiert in diesem Fall nämlich immer nur die aktiven Seiten in der Rootline, CUR die
aktuelle Seite. Sind mehrere Ebenen aufgeklappt, bedeutet dies, dass sich die aktuelle Seite mit dem Zustand CUR unterhalb einer aufgeklappten Seite mit dem Zustand ACT befinden muss. Nur dann kann der Zustand ACT überhaupt eintreten. Folglich haben alle als ACT markierten Seiten mindestens eine Unterseite, die entweder ebenfalls als ACT oder aber als CUR markiert wurde. Eine spezielle Unterscheidung zwischen Seiten mit oder ohne Unterseiten ist hier also unnötig, weil ACT immer über Unterseiten verfügt. Da die aktuelle Seite jedoch noch weitere nicht aufgeklappte Unterseiten besitzen könnte, macht die Verwendung des Zustands CURIFSUB zur weiteren Unterscheidung wieder Sinn. Aus dem gleichen Grund werden in diesem Beispiel auch verschiedene Varianten für den Wrap verwendet. Für den Fall, dass eine Seite keine Unterseiten besitzt, reicht es, den Parameter allWrap zu verwenden. In diesem Fall sind das die Zustände NO und CUR. Für alle weiteren Fälle, also IFSUB, ACT und CURIFSUB, gibt es Unterseiten, die gegebenenfalls angezeigt werden müssen. Daher sollten Sie in diesem Fall mit dem Parameter wrapItemAndSub arbeiten. Unter Berücksichtigung dieser Regeln können Sie verschachtelte Listenmenüs von beliebiger Tiefe erzeugen. Lizensiert für Markus Mueller
Zusätzlich zu den bereits erwähnten Zuständen gibt es noch vier weitere – USR, SPC, USERDEF1 und USERDEF2 –, die jedoch nicht als wirkliche Zustände des Eintrags selbst betrachtet werden können. Sie beziehen sich vielmehr auf die Zugriffsrechte, den Seitentyp oder eigene Funktionen zum Behandeln der Einträge. Der Vollständigkeit halber seien sie hier dennoch aufgeführt: • USR ist ein Zustand, der Seiten markiert, deren Zugriffsrechte eingeschränkt sind. Diese Seiten sind zwar nur für eingeloggte Benutzer sichtbar, dennoch kann es sinnvoll sein, sie explizit also solche zu markieren, z.B. wenn Sie wie in Rezept 12.2 beschrieben geschützte Seiten im Menü sichtbar gemacht haben. • SPC ist ein Zustand, der den Seitentyp Abstand erkennt und entsprechend eingesetzt werden kann. Im Backend wird der Typ Abstand oftmals zur besseren Übersicht verwendet, um zum Beispiel Seitengruppen optisch voneinander zu trennen. Wenn Sie diese Trennung auch im Frontend sichtbar machen möchten, müssen Sie den Zustand SPC aktivieren. • USERDEF1 und USERDEF2 dienen dazu, eigene Funktionen für die Bearbeitung von Menüeinträgen zu verwenden.
Max. Linie
Falls Sie die Untermenüs erst dann aufklappen wollen, wenn sich der Betrachter auf der entsprechenden übergeordneten Seite befindet, entfernen Sie einfach den Schalter expAll = 1. Dieses automatische Aufklappen funktioniert jedoch nicht für Menüs, die den Einstiegspunkt mit special definieren. Sie müssen für diese Automatik also in jedem Fall mit entryLevel arbeiten.
Für sämtliche Zustände können Sie den darin enthaltenen Parametern unter Zuhilfenahme von optionSplit variierende Werte zuweisen.
Links
12.4 Menüeinträge in Abhängigkeit von ihrer Position konfigurieren Problem Sie wollen für verschiedene Menüzustände festlegen, wie diese innerhalb des Menüs dargestellt werden sollen. Dabei soll die Art der Darstellung in Abhängigkeit von der Position des Eintrags im Menü variieren. So wollen Sie z.B. für die ersten beiden und den letzten Eintrag eines Menüs bestimmte CSS-Klassen verwenden, um diese besonders hervorzuheben. Gleichzeitig sollen den restlichen Einträgen weitere CSS-Klassen im Rotationsverfahren zugewiesen werden.
Lösung Lizensiert für Markus Mueller
Nutzen Sie die optionSplit-Eigenschaften der jeweiligen Menüzustände. Trennen Sie dazu die einzelnen Werte für die jeweiligen Positionen mithilfe der Zeichenkombination |*| in die Hauptbereiche first, middle und last ein. Verwenden Sie innerhalb der Bereiche die Zeichenkombination || für die weitere Unterteilung. Formatieren Sie den Code z.B. so: NO { allWrap =
|
|*|
|
||
|
|*|
|
}
Der gesamte Code für allWrap befindet sich dabei in einer Zeile.
Diskussion Das optionSplit-Konzept ist sicherlich eines der effektivsten Werkzeuge, wenn es darum geht, komplexe Menüstrukturen zu erstellen. Mit seiner Hilfe lassen sich bestimmte Abfolgen immer wiederkehrender Parameter realisieren. Diese vereinfachen es erheblich, einem einzelnen Element abhängig von seiner Position im Menü alle nur denkbaren Eigenschaften zuzuweisen. optionSplit steht dabei für das Prinzip und nicht für einen expliziten Parameter oder eine Funktion.
Max. Linie
Innerhalb von HMENU-Elementen können Sie optionSplit auf sämtliche Parameter eines der Zustände von NO bis CURIFSUB anwenden, die wir in Rezept 12.3 erläutert haben. Für jeden Wert, der mit optionSplit verarbeitet werden soll, gibt es dabei drei Hauptbereiche, die nach dem Prinzip first |*| middle |*| last
separiert werden, und für jeden dieser drei Hauptbereiche wiederum jeweils durch || abgetrennte Unterbereiche. Die Priorität dabei ist last, first, middle. first1 || first2 |*| middle1 || middle2 |*| last1 || last2
Hierfür gelten folgende Regeln: Gibt es keinen Eintrag im Bereich middle, wird der letzte Eintrag im Bereich first falls nötig wiederholt. first1 || first2 |*||*| last1 || last2
Sind sowohl middle als auch first nicht gesetzt, wird der erste Eintrag im Bereich last falls nötig wiederholt. |*||*| last1 || last2
Der komplette Bereich middle wird falls nötig wiederholt und dabei rotiert, wenn sich mehr als ein Unterbereich darin befindet. |*|middle1 || middle2 || middle3|*|
Sowohl die Wiederholung als auch das Rotieren finden selbstverständlich nur statt, wenn die Anzahl der Elemente ausreichend hoch ist. Lizensiert für Markus Mueller
Sollten Sie weniger Elemente zur Verfügung haben, als Bereiche im optionSplit angegeben sind, werden die Eigenschaften gemäß den Prioritätsvorgaben in einer bestimmten Reihenfolge ausgelassen, so sie vorhanden sind: erst die middle-Werte zwischen den beiden |*|Trennern, dann die first-Werte vor dem ersten |*| und zum Schluss die last-Werte nach dem zweiten |*|. Hierzu einige praktische Beispiele: Wir gehen davon aus, dass Sie den Menüeinträgen je nach Position verschiedene Farben geben wollen. Die ersten beiden Einträge eines Menüs sollen eine hellere Farbe erhalten als die restlichen Einträge. Der letzte Eintrag wiederum soll dunkler dargestellt werden. Die einfachste Variante bezieht sich dabei nur auf den Zustand NO. Aus Platzgründen verwenden wir lediglich die Farbbezeichnungen anstatt des kompletten Codes
|
für den Wrap. NO { allWrap = hellblau || hellblau || blau |*||*| dunkelblau }
Daraus ergibt sich folgende Darstellung für verschiedene Anzahlen von Einträgen: 1 dunkelblau 2 hellblau dunkelblau 3 hellblau hellblau dunkelblau 4 hellblau hellblau blau dunkelblau
Im nächsten Beispiel sollen nur die Einträge mit dem Zustand NO blaue Farbtöne erhalten. Für den Zustand ACT soll dagegen mit roten Farbtönen gearbeitet werden. Die Helligkeit wird dabei weiter über optionSplit geregelt, jedoch soll dabei nach dem ersten Eintrag abwechselnd der normale und der helle Farbton verwendet werden, deshalb müssen Sie den middle-Wert verwenden;
Ausgehend von einem Menü mit sechs Einträgen, ergeben sich folgende Reihen: NO
hellblau blau hellblau blau hellblau dunkelblau
ACT hellrot rot hellrot rot hellrot dunkelrot
Hat einer der Einträge in diesem Menü momentan den Zustand ACT, wird der entsprechende Wert aus der Reihe NO gegen den passenden Wert aus der Reihe ACT ausgetauscht. Angenommen, der dritte Eintrag wäre momentan aktiv, dann ergäbe sich Folgendes: Lizensiert für Markus Mueller
hellblau blau hellrot blau blau dunkelblau Bei nur drei Einträgen und aktivem dritten Eintrag sähe es dagegen so aus: hellblau blau dunkelrot Wie Sie sehen, kommt es nicht etwa darauf an, wie viele ACT-Einträge bereits vor diesem Eintrag erzeugt wurden, sondern nur auf dessen eigene Position innerhalb des Menüs. Diese grundlegende Regel trifft auf alle weiteren Zustände ebenfalls zu. Hat einer der Menüeinträge diesen Zustand und ist für ihn ein Wert mit optionSplit definiert, wird der Wert verwendet, der gemäß der Auswertung des optionSplit für seine Position vorgesehen ist. Dies gilt für die Werte sämtlicher Parameter, die innerhalb eines Zustands vorkommen. Sie haben richtig gelesen: Sämtliche Parameter eines Zustands können nach dem soeben beschriebenen Prinzip beeinflusst werden. Das heißt, dass Sie nicht nur verschiedene Wraps, sondern ganze TypoScript-Blöcke, Elemente und stdWrap-Funktionen beliebig variieren können. Hier nur ein paar Beispiele der nahezu unendlichen Möglichkeiten, die sich Ihnen dadurch eröffnen, wobei Sie dafür schon ein wenig fortgeschritten in der Arbeit mit TypoScript sein sollten. In diesem Beispiel wird dem after-Parameter eines Eintrags in einem TMENU per stdWrap.cObject ein COA-Element zugewiesen, das je nach Position verschiedene Inhalte bekommt.
wrap = <span class="after">| 10 = TEXT || 0 |*||*| 10.value = Nur beim ersten Eintrag 10.wrap = 20 = |*| 0 |*|TEXT 20.value = Nur beim letzten Eintrag 20.wrap = 30 = 0 || TEXT |*||*| 0 30.value = Bei allen anderen Einträgen 30.wrap = } }
Der Trick liegt hier in der Anwendung von optionSplit schon während der Zuweisung der TypoScript-Elemente. Je nach Position erhalten die Bereiche 10, 20, und 30 des COA entweder ein TEXT-Element oder eine 0 zugewiesen. Die 0 funktoniert hier wie ein Schalter, der dafür sorgt, dass die sonstigen Parameter wie value und wrap nicht mehr berücksichtigt werden.
Lizensiert für Markus Mueller
Max. Linie
Abschließend noch ein schönes Beispiel für ein zweispaltiges Menü, bei dem erkannt werden muss, ob der Menüeintrag sich auf einer geraden oder einer ungeraden Position befindet. Für gerade Positionen soll dem Eintrag eine CSS-Klasse namens right zugewiesen werden für ungerade Einträge die Klasse left. Beide Klassen werden später über CSS mit einem entsprechenden Wert für float versehen. Außerdem muss für eine ungerade Gesamtanzahl ein Dummy-Element mit der Klasse right angehängt werden, damit dort kein Leerraum entsteht. 1 = TMENU 1 { wrap (
|
) NO { allWrap.cObject = COA allWrap.cObject { 10 = LOAD_REGISTER 10.istUngerade = |*| 1 || 0 |*| 20 = TEXT 20.value = | 20.innerWrap = |*|
|
||
|
|*| 20.append = |*| 0 |*| TEXT 20.append { value =
In diesem Beispiel kommt optionSplit gleich auf drei verschiedene Arten zum Einsatz. Zuerst in einem LOAD_REGISTER-Element: Hier bestimmt es das Register istUngerade, das abwechselnd den Wert 1 für ungerade Positionen und 0 für gerade Positionen zugewiesen bekommt. Danach wird innerhalb von innerWrap festgelegt, dass ungerade Einträge immer die Klasse left zugewiesen bekommen, während gerade Einträge die Klasse rechts erhalten.
Links
Zuletzt wird optionSplit für den Parameter append benutzt, der nur für den letzten Eintrag ein TEXT-Element erzeugt und ansonsten eine 0 zugewiesen bekommt. Gleichzeitig wird mit einer if-Abfrage auf das Register istUngerade dafür gesorgt, dass dieses Element nur angehängt wird, wenn die Anzahl der Einträge nicht gerade ist. Wie Sie sehen, sind die Möglichkeiten vielfältig. Mithilfe von optionSplit werden Sie einige elegante Lösungen mehr entwickeln können, wenn es um die Erzeugung von Menüstrukturen geht.
Siehe auch
Lizensiert für Markus Mueller
Wenn Sie nun wissen wollen, ob nicht auch außerhalb von HMENU die Möglichkeit besteht, dieses nützliche Konzept zu verwenden, um zum Beispiel Inhaltselemente nach ähnlichen Prinzipien zu behandeln, sollten Sie Rezept 13.6 lesen. Sie werden überrascht sein ...
12.5 Spezielle Menütypen: Brotkrumen- oder RootlineNavigation Problem Sie haben spezielle Anforderungen an ein Menü, die über die simple Wiedergabe eines Seitenbaums hinausgehen. So wollen Sie zum Beispiel eine Brotkrumen-Navigation erstellen, die dem Betrachter den kompletten Pfad von der Root-Seite bis zur aktuellen Seite anzeigt.
Lösung Verwenden Sie den HMENU-Parameter special und dessen Wert rootline:
Max. Linie
temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special = rootline special.range = 1|-1 1 = TMENU
Beachten Sie, dass wir in diesem Beispiel TMENU als Platzhalter für eine der möglichen Varianten TMENU, GMENU, TMENU_LAYERS, GMENU_LAYERS, IMGMENU und JSMENU verwendet haben. Je nach Variante müssen Sie gegebenenfalls andere Parameter setzen, um die volle Funktionalität des Menüs zu erreichen. Lesen Sie dazu bei Bedarf die entsprechenden Rezepte.
Diskussion
Lizensiert für Markus Mueller
Neben den üblichen Navigationen, die im Prinzip einen kleineren oder größeren Teilbereich eines Seitenbaums wiedergeben, kommen immer öfter sogenannte BreadcrumbMenüs zum Einsatz. Die Bezeichnung bedeutet übersetzt Brotkrumen-Navigation und ist eine Metapher, die dem bekannten Märchen Hänsel und Gretel entliehen wurde. Hänsel benutzt bekanntlich Brotkrumen, um eine Spur durch den Wald zu legen, damit die beiden den Weg zurück wiederfinden können. Genau darum geht es bei einer Brotkrumen-Navigation, nämlich dem Betrachter einer Seite den Weg zurück zur Root-Seite zu zeigen. Genau genommen handelt es sich auch hier um einen Teilbereich eines Seitenbaums, jedoch nur um den gerade aktiven Ast, oder, um den offiziellen TYPO3-Terminus zu benutzen, die Rootline. Der entsprechende Typ, den Sie dem HMENU mithilfe von special zuweisen müssen, heißt demzufolge rootline. Die Ausgabe eines solchen Rootline-Menüs könnte zum Beispiel so aussehen: Sie befinden sich hier: Ebene 1.1 > Ebene 2.1 > Ebene 3.4 > Ebene 4.2 > aktuelle Seite Dabei sollten Sie den Link für die aktuelle Seite auf jeden Fall abschalten, um Verwirrung beim Betrachter zu vermeiden. Alle anderen Seiten sollten prinzipiell verlinkt sein, damit der Betrachter jederzeit ohne großen Aufwand zu einer beliebigen Stelle der Rootline zurückgelangen kann. Dies ist der Code für das eben gezeigte Beispiel: temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special=rootline special.range = 1|-1
Der Parameter range besteht immer aus zwei durch ein Pipe-Symbol getrennten Werten. Der erste Wert steht dabei für die Startebene, der zweite für die Endebene. Es empfiehlt sich, wie in Rezept 12.1 beschrieben, für den ersten Wert eine positive Angabe zu machen, weil die Startebene in der Regel absolut gewählt wird. Der zweite Wert hingegen sollte ein negativer Wert sein, weil er relativ zur aktuellen Seite bestimmt wird. Üblicherweise wird dafür –1 oder –2 verwendet, je nachdem, ob Sie die aktuelle Seite mit anzeigen oder das Menü bereits nach deren Elternseite beenden wollen. Wie Sie sehen, kommt in unserem Beispiel gleich zweimal ein optionSplit zum Einsatz. Mit dessen Hilfe legen Sie für den Parameter doNotLinkIt zunächst fest, dass er für alle Einträge bis auf den letzten abgeschaltet sein soll. Beim Parameter allWrap sorgen Sie dann dafür, dass der letzte Eintrag kein > angehängt bekommt. Lizensiert für Markus Mueller
Sie hätten zu diesem Zweck zwar auch den Zustand CUR verwenden können, weil der letzte Eintrag im Menü der aktuellen Seite entspricht, aber da Sie in diesem Fall keine speziellen zusätzlichen Formatierungen erzeugen müssen, ist die Lösung über optionSplit kürzer und komfortabler.
Siehe auch Wenn Sie weitere Varianten des Parameters special kennenlernen wollen, schauen Sie sich einfach die Rezepte 12.1, 12.6, 12.7, 12.8 und 12.9 an. Wenn Sie wissen wollen, welche Parameter sonst noch Einfluss auf Ihr Menü haben können, lesen Sie weiter in Rezept 12.10.
12.6 Spezielle Menütypen: Liste zuletzt aktualisierter Seiten Problem
Max. Linie
Sie haben spezielle Anforderungen an ein Menü, die über die simple Wiedergabe eines Seitenbaums hinausgehen. So wollen Sie zum Beispiel die Seiten basierend auf dem Datum der letzten Änderung auflisten, um den Betrachter regelmäßig mit aktuellen Informationen zu versorgen.
Lösung Verwenden Sie den HMENU-Parameter special und dessen Wert updated: temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special = updated special.value = 123,124,125 1 = TMENU 1 { NO { allWrap = | } } } }
Beachten Sie, dass wir in diesem Beispiel TMENU als Platzhalter für eine der möglichen Varianten TMENU, GMENU, TMENU_LAYERS, GMENU_LAYERS, IMGMENU und JSMENU verwendet haben. Je nach Variante müssen Sie gegebenenfalls andere Parameter setzen, um die volle Funktionalität des Menüs zu erreichen. Lesen Sie dazu bei Bedarf die entsprechenden Rezepte. Lizensiert für Markus Mueller
Diskussion Eine weitere Navigationsvariante, die ebenfalls recht häufig zum Einsatz kommt, ist eine Liste von Seiten, bei denen entweder die Seite selbst oder deren Inhalt innerhalb eines bestimmten Zeitraums geändert wurde. Ein solches Menü wird zum Beispiel anstatt eines separat erstellten Newsbereichs verwendet, damit der Betrachter schnell und komfortabel die aktuellsten Bereiche Ihrer Site aufsuchen kann. Verwenden Sie dazu den Parameter special=updated. Die Ausgabe eines solchen updatedMenüs könnte zum Beispiel so aussehen: Die 5 neuesten Beiträge der letzten Woche finden Sie hier: Beitrag 1 Beitrag 2 Beitrag 3 Beitrag 4 Beitrag 5 Auch hier sollten Sie den Link für die aktuelle Seite auf jeden Fall abschalten, um Verwirrung beim Betrachter zu vermeiden. Der Code für dieses Beispiel sieht so aus:
Max. Linie
temp.beispielmenu = COA temp.beispielmenu { 5 = TEXT
5.value = Die 5 neuesten Beiträge der letzten Woche finden Sie hier: 5.wrap = | 10 = HMENU 10 { special=updated special.value = 123,124,125 special { mode = manual beginAtLevel = 1 depth = 3 limit = 5 excludeNoSearchPages = 1 maxAge = 3600*24*7 } 1 = TMENU 1 { wrap =
|
NO = 1 NO { allWrap =
|
} CUR < .NO CUR { doNotLinkIt = 1 allWrap =
|
} } }
Links
}
Der Parameter value wird hier genau so verwendet, wie Sie es bereits aus Rezept 12.1 kennen. Damit teilen Sie dem System mit, welche Teilbereiche des Seitenbaums nach neuen Einträgen durchsucht werden sollen. In der folgenden Klammer befinden sich in unserem Beispiel sechs weitere Parameter. Die ersten fünf kommen in dieser Kombination nur bei den Menütypen updated und keywords vor, der letzte nur beim Typ updated. Wenn Sie diese Parameter nicht explizit angeben, werden deren Default-Werte verwendet. Mit dem ersten Parameter mode legen Sie fest, welches Feld für die Ermittlung des Zeitpunkts der Aktualisierung verwendet werden soll. Zulässig sind für diesen Parameter die folgenden Werte: mode = manual mode = lastUpdated
Damit wird wie in unserem Beispiel das Feld lastUpdated verwendet, das vom Redakteur manuell gepflegt werden muss, wenn er den Seiteneintrag bearbeitet. mode = tstamp
Max. Linie
Hier kommt das Feld tstamp zum Einsatz, das sich automatisch ändert, wenn der Seiteneintrag gespeichert wird. mode = crdate
In diesem Fall wird das Feld crdate verwendet, das beim Anlegen eines Seiteneintrags erzeugt wird. mode = starttime
Hier wird wieder ein manuell zu bearbeitendes Feld verwendet. Es ist das Feld starttime, das sich im Bereich Allgemeine Optionen eines Seiteneintrags befindet. Wenn dabei irgendeines dieser Felder den Wert 0 hat, wird es nicht berücksichtigt. Falls Sie den Parameter mode komplett auslassen, wird per Default das Feld SYS_LASTCHANGED verwendet, das immer dann neu geschrieben wird, wenn sich der Inhalt der Seite geändert hat. Diese Einstellung ist jedoch mit Vorsicht zu genießen, weil sie zur Folge hat, dass auch geringfügige Änderungen, z.B. durch die Korrektur von Rechtschreibfehlern in einem Inhaltselement, die Seite wieder im Menü der neuesten Beiträge erscheinen lassen. Wir empfehlen daher, auf die Disziplin Ihrer Redakteure zu setzen und mit mode = manual zu arbeiten.
Die nächsten drei Parameter beginAtLevel, depth und limit dürfen ausschließlich numerische Werte erhalten und bestimmen den Umfang des Menüs. Lizensiert für Markus Mueller
beginAtLevel dient dazu, den eigentlichen Beginn der Suche innerhalb der vorher definierten Teilbereiche festzulegen. Die Startpunkte der Teilbereiche selbst sind die unter value
aufgelisteten Seiten. Unabhängig von seiner wirklichen Position innerhalb des Seitenbaums wird jeder Startpunkt in diesem Fall als Level 0 betrachtet. Wenn Sie also beginAtLevel nicht verwenden, werden die Startpunkte und alle darunterliegenden Seiten durchsucht. Setzen Sie den Wert auf 1, werden die Startpunkte selbst ausgelassen. Für Werte von 2 oder mehr werden entsprechend viele der nachfolgenden Ebenen ausgelassen. depth legt dabei fest, wie tief die Suchfunktion maximal innerhalb der festgelegten Teilbereiche des Seitenbaums in die Ebenenstruktur vordringen soll. Lassen Sie diesen Parameter aus, wird als Default mit einer Tiefe von 20 gearbeitet.
Mithilfe von limit sorgen Sie dafür, dass eine maximale Anzahl von Einträgen nicht überschritten wird. Der höchste zulässige Wert hierfür ist 100, was zwar unserer Meinung nach nicht wirklich sinnvoll, aber in der Regel ausreichend ist. Wird der Parameter nicht verwendet, ist sein Default-Wert 10. Mithilfe des Parameters excludeNoSearchPages können Sie festlegen, dass alle Seiten, die mit dem Kontrollkästchen Nicht suchen markiert sind, bei der Suche ausgelassen werden. Setzen Sie ihn dazu einfach auf 1. Ohne diesen Parameter werden alle Seiten in die Suche mit einbezogen.
Max. Linie
Der letzte Parameter maxAge bestimmt das maximale Alter eines Eintrags in Sekunden. Ältere Einträge werden in jedem Fall ignoriert. Hier dürfen Sie anstatt mit rein numerischen Werten auch mit den Rechenoperatoren +, –, * und / arbeiten, um den gewünschten Wert einfacher verändern zu können. Ist dieser Parameter nicht gesetzt, wird als Default not used verwendet.
Wenn Sie weitere Varianten des Parameters special kennenlernen wollen, schauen Sie sich einfach die Rezepte 12.1, 12.5, 12.7, 12.8 und 12.9 an. Möchten Sie wissen, welche Parameter sonst noch Einfluss auf Ihr Menü haben können, lesen Sie weiter in Rezept 12.10.
12.7 Spezielle Menütypen: Liste themenverwandter Seiten Problem Sie haben spezielle Anforderungen an ein Menü, die über die simple Wiedergabe eines Seitenbaums hinausgehen. So wollen Sie zum Beispiel Seiten nach Schlüsselwörtern auflisten, um Ihrem Betrachter die Möglichkeit zu geben, schnell auf Seiten mit themenverwandten Inhalten zuzugreifen.
Lösung Lizensiert für Markus Mueller
Verwenden Sie den HMENU-Parameter special und dessen Wert keywords: temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special = keywords special.value = 123 1 = TMENU 1 { NO { allWrap = | } } } }
Beachten Sie, dass wir in diesem Beispiel TMENU als Platzhalter für eine der möglichen Varianten TMENU, GMENU, TMENU_LAYERS, GMENU_LAYERS, IMGMENU und JSMENU verwendet haben. Je nach Variante müssen Sie gegebenenfalls andere Parameter setzen, um die volle Funktionalität des Menüs zu erreichen. Lesen Sie dazu bei Bedarf die entsprechenden Rezepte.
Diskussion
Max. Linie
Eine Menüvariante, die besonders bei datenbankbasierten Systemen zum Einsatz kommt, ist das Keyword-Menü. Lassen sich Menüs aus kürzlich aktualisierten Seiten oder Inhalten
noch relativ einfach per Hand einpflegen und aktualisieren, so kommt man bei der Volltextsuche nach Schlüsselwörtern an einer Datenbank und entsprechenden PHP-Funktionen nicht mehr vorbei. Hier liegen die eigentlichen Vorteile von Content Management-Systemen wie TYPO3, weil Sie damit selbst in umfangreichen Installationen mit mehreren 1.000 Seiten Inhalt ohne Probleme solche inhaltlichen Verknüpfungen aufspüren und darstellen können. Die Ausgabe eines solchen Keyword-Menüs könnte zum Beispiel so aussehen: Hier finden Sie weitere Beiträge zu ähnlichen Themen: • Beitrag 1 • Beitrag 2 • Beitrag 3 • Beitrag 4 • Beitrag 5 Hier sollten Sie ebenfalls den Link für die aktuelle Seite auf jeden Fall abschalten, um den Betrachter nicht zu verwirren. Der Code für dieses Beispiel sieht so aus:
Lizensiert für Markus Mueller
Max. Linie
temp.beispielmenu = COA temp.beispielmenu { 5 = TEXT 5.value = Hier finden Sie weitere Beiträge zu ähnlichen Themen: 5.wrap = | 10 = HMENU 10 { special=keywords special.value.data = TSFE:id special { entryLevel = 1 mode = manual beginAtLevel = 0 depth = 10 limit = 5 excludeNoSearchPages = 1 } 1 = TMENU 1 { wrap =
Der Parameter value wird hier genau so verwendet, wie Sie es bereits von Rezept 12.1 kennen. Damit teilen Sie dem System mit, welche Seite die Keywords liefern soll, nach denen gesucht wird. Damit hier der Aufgabenstellung entsprechend die aktuelle Seite als Quelle verwendet wird, müssen Sie anstatt eines statischen Werts das Feld angeben, dessen Wert verwendet werden soll. In diesem Fall ist es die ID der Seite, auf der sich der Betrachter im Moment befindet, die Sie über das globale Array TSFE auslesen können. Diese Methode ist Angaben wie field = uid oder data = field:uid vorzuziehen, weil sie sich immer auf die Tabelle pages und nicht z.B. auf tt_content oder andere Tabellen bezieht.
Mithilfe von entryLevel legen Sie fest, auf welcher Ebene die Suche nach den Schlüsselwörtern beginnen soll. entryLevel wird genau so verwendet wie in Rezept 12.1. Sie können daher positive, also absolute, sowie negative, also relative Werte verwenden. Lizensiert für Markus Mueller
In der gleichen Klammer befinden sich in unserem Beispiel fünf weitere Parameter, die in dieser Kombination nur bei den Menütypen updated und keywords vorkommen. Wenn Sie diese Parameter nicht explizit angeben, werden deren Default-Werte verwendet. Mit dem ersten Parameter mode legen Sie entgegen der Verwendung beim Typ updated fest, welches Feld für die Ermittlung der Sortierreihenfolge verwendet werden soll. Zulässig sind für diesen Parameter zwar die gleichen Werte, jedoch bleibt dieses Feld bei der Suche selbst unberücksichtigt. Beachten Sie dennoch auch hier, dass es am sinnvollsten sein dürfte, mit dem Wert manual zu arbeiten.
Die nächsten vier Parameter beginAtLevel, depth, limit und excludeNoSearchPages werden exakt so verwendet, wie bereits beim Typ updated in Rezept 12.6 beschrieben. Im ursprünglichen Beispiel werden die Suchwörter zunächst aus dem Feld keywords der aktuellen Seite ausgelesen. Danach wird beginnend auf Ebene 1 mit einer Tiefe von 10 Ebenen nach Seiten gesucht, in deren Feld keyword mindestens eines der ausgelesenen Suchwörter vorkommt. Das Ergebnis wird nun auf Basis des Felds lastUpdated sortiert. Zum Schluss werden die ersten fünf Einträge ausgegeben.
Max. Linie
Was aber, wenn Sie die Suchwörter aus einem anderen Feld auslesen wollen? Vielleicht möchten Sie auch gar keine Suchwörter aus der Datenbank auslesen, sondern den Benutzer nach gewünschten Suchwörtern fragen. Oder Sie möchten die Suche nicht im Feld keywords stattfinden lassen, sondern den Titel durchsuchen. Für diese Anforderungen gibt es für den Typ keywords drei weitere Parameter, die wir in den folgenden beiden Beispielen kurz vorstellen werden.
Im ersten Beispiel nehmen wir an, Sie hätten ein Suchformular auf Ihrer Seite platziert. Der Benutzer kann in ein Textfeld die gewünschten Suchwörter eingeben, und diese werden mit der Methode POST im Parameter meinSuchwort übergeben.
Lizensiert für Markus Mueller
temp.beispielmenu = COA temp.beispielmenu { 5 = TEXT 5.value = Hier finden Sie weitere Beiträge zu den gesuchten Wörtern: 5.wrap = | 10 = HMENU 10 { special=keywords special { entryLevel = 1 mode = manual setKeywords.data = GPvar:meinSuchwort } 1 = TMENU 1 { wrap =
|
NO = 1 NO { allWrap =
|
} CUR < .NO CUR { doNotLinkIt = 1 allWrap =
|
} } } }
In diesem Beispiel kommt der Parameter setKeywords zum Einsatz. Damit bestimmen Sie, welche Suchwörter bei der Suche nach entsprechenden Seiten verwendet werden sollen. Dabei können Sie entweder die Wörter statisch von Hand eintragen: setKeywords = Wort,Wort2,Wort3
oder diese per stdWrap-Parameter von beliebiger Stelle einlesen lassen: setKeywords.dataWrap = {page:keywords},Wort,Wort2
oder beide Varianten miteinander kombinieren:
Max. Linie
setKeywords.cObject = COA setKeywords.cObject { 10 = TEXT 10.data = page:keywords 10.wrap = |, 20 = TEXT 20.value = Wort,Wort2 }
Sie sehen, durch den Einsatz von stdWrap können Sie äußerst flexibel agieren und auch komplexere Konstrukte zur Erzeugung der Suchwortliste verwenden. In unserem Beispiel verwenden wir den stdWrap-Parameter data, mit dessen Hilfe Sie unter anderem auf das Array der GET-/POST-Parameter namens GPvar zugreifen können, und lesen den POST-Parameter meinSuchwort aus. Der Parameter special.value kann in diesem Fall ausgelassen werden, weil die Quelle der Schlüsselwörter nicht über eine Seite erreicht wird, sondern über setKeywords selbst.
Links
Im nun folgenden Beispiel geht es darum, die Suchwörter zwar schon aus der Datenbank zu beziehen, jedoch aus einem individuell festgelegten Feld. Außerdem soll die Suche ebenfalls in einem individuellen Feld stattfinden.
Lizensiert für Markus Mueller
temp.beispielmenu = COA temp.beispielmenu { 5 = TEXT 5.value = Hier finden Sie weitere Beiträge zu ähnlichen Themen: 5.wrap = | 10 = HMENU 10 { special=keywords special.value.data = TSFE:id special { entryLevel = 1 mode = manual keywordsField = abstract keywordsField.sourceField = nav_title } 1 = TMENU 1 { wrap =
|
NO = 1 NO { allWrap =
|
} CUR < .NO CUR { doNotLinkIt = 1 allWrap =
|
} } } }
Da die verwendeten Parameter gern verwechselt werden, hier nochmals zur Verdeutlichung: Mit keywordsField legen Sie fest, in welchem Feld gesucht wird, während dessen Unterparameter sourceField für das Feld zuständig ist, aus dem Sie die Wörter vor der eigentlichen Suche auslesen wollen.
Im gezeigten Beispiel würden also alle Seiten angezeigt, in deren Kurzbeschreibung der Navigationstitel der aktuellen Seite vorkommt. – Ob dies die passende Vorgehensweise für ein Menü vom Typ keyword ist, können Sie selbst entscheiden. Experimentieren Sie gegebenenfalls einfach mit anderen Feldkombinationen.
Siehe auch Wenn Sie weitere Varianten des Parameters special kennenlernen wollen, schauen Sie sich einfach die Rezepte 12.1, 12.5, 12.6, 12.8 und 12.9 an. Möchten Sie wissen, welche Parameter sonst noch Einfluss auf Ihr Menü haben können, lesen Sie weiter in Rezept 12.10.
12.8 Spezielle Menütypen: Sprachauswahl Problem
Lizensiert für Markus Mueller
Max. Linie
Sie haben spezielle Anforderungen an ein Menü, die über die simple Wiedergabe eines Seitenbaums hinausgehen. So wollen Sie zum Beispiel eine Sprachnavigation verwenden, die Ihrem Betrachter die Möglichkeit gibt, auf Übersetzungen der Inhalte in der gewünschten Sprache zuzugreifen. Außerdem soll das Menü die aktuell gewählte Sprache sowie nicht vorhandene Übersetzungen kenntlich machen.
Lösung Verwenden Sie den HMENU-Parameter special und dessen Wert language: temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special = language special.value = 1,2,3,4 1 = TMENU 1 { NO { allWrap = | } } } }
Beachten Sie, dass wir in diesem Beispiel TMENU als Platzhalter für eine der möglichen Varianten TMENU, GMENU, TMENU_LAYERS, GMENU_LAYERS, IMGMENU und JSMENU verwendet haben. Je nach Variante müssen Sie gegebenenfalls andere Parameter setzen, um die volle Funktionalität des Menüs zu erreichen. Lesen Sie dazu bei Bedarf die entsprechenden Rezepte.
Wenn Sie mit mehrsprachigen Inhalten arbeiten, speziell aber wenn Sie sich für das sogenannte One-Tree-Konzept entschieden haben, benötigen Sie ein Menü, mit dessen Hilfe der Betrachter jederzeit die gewünschte Seitensprache auswählen kann. Dies ist deutlich komfortabler als eine einzelne Sprachauswahl am Anfang der Site, zu der ein Betrachter immer wieder zurückspringen muss, um eine Auswahl treffen zu können. Bei Verwendung des Many-Tree-Konzepts würde es reichen ein einfaches hierarchisches Menü zu erzeugen, mit dessen Hilfe der Betrachter in den anderen Sprachbereich wechseln kann. Beim One-Tree-Konzept muss dagegen eine wirkliche Umschaltung erfolgen. Die ID der Sprache wird dabei als GET-Parameter an die jeweilige URL angehängt und bei allen folgenden Linkaufrufen mit verarbeitet. Um einen solchen GET-Parameter erstmalig zu erzeugen, ihn zwischendurch mit einem anderen Wert zu versehen oder aber auf den Ursprungswert zurückzusetzen, benötigen Sie ein Menü vom Typ language. Die Ausgabe eines solchen language-Menüs könnte zum Beispiel so aussehen: Sprachauswahl: • Deutsch • Englisch Lizensiert für Markus Mueller
Max. Linie
• Italienisch Sie sollten den Link für die aktuelle Sprache auf jeden Fall als aktiv markieren und gleichzeitig deaktivieren, um Verwirrung beim Betrachter zu vermeiden. Außerdem ist es sinnvoll, nicht vorhandene Übersetzungen ebenfalls kenntlich zu machen. Hier der Code für das gezeigte Beispiel: temp.beispielmenu = COA temp.beispielmenu { 5 = TEXT 5.value = Sprachauswahl: 5.lang.en = Language Selection: 5.lang.it = Selezione lingua: 5.wrap = | 10 = HMENU 10 { special=language special.value = 0,1,2 1 = TMENU 1 { wrap =
|
NO = 1 NO { stdWrap.cObject = TEXT stdWrap.cObject { value = Deutsch || English || Italiano } allWrap =
Der Parameter value dient in diesem Fall dazu, eine kommaseparierte Liste der verwendeten Sprachen anzugeben. Die Zahl entspricht dabei der sogenannten sys_language_uid.
Lizensiert für Markus Mueller
Beachten Sie dabei, dass die Werte für Ihre Konfiguration abweichen können, je nachdem, in welcher Reihenfolge Sie die Sprachen angelegt haben. In unserem Beispiel steht 0 für Deutsch, 1 für Englisch und 2 für Italienisch.
Die Zustände NO, ACT, USERDEF1 und USERDEF2 kommen hier ein wenig anders zum Einsatz als bei den übrigen Menütypen. • NO wird in jedem Fall benötigt und steht für die einzelnen möglichen Sprachen. • ACT markiert eine Sprache, sobald sie ausgewählt ist. Wurden auch die Zustände USERDEF1 und USERDEF2 gewählt, steht ACT für die ausgewählte Sprache, wenn für die aktuelle Seite eine Übersetzung in dieser Sprache vorliegt. • USERDEF1 markiert eine nicht vorhandene Übersetzung der aktuellen Seite. • USERDEF2 markiert die ausgewählte Sprache, wenn für die aktuelle Seite keine Übersetzung in dieser Sprache vorliegt. Die letzten drei Zustände werden sinnvollerweise nicht verlinkt, um zu verhindern, dass der Betrachter versucht, eine Sprache aufzurufen, deren Übersetzung für die aktuelle Seite entweder bereits aufgerufen wurde oder überhaupt nicht vorliegt. USERDEF2 kommt im Prinzip nur zum Tragen, wenn Sie bei Ihren allgemeinen Sprach-
einstellungen auf die Möglichkeit verzichtet haben, nicht übersetzte Inhalte zumindest in der Originalsprache anzuzeigen.
Max. Linie
Zusätzlich zu diesen etwas abgewandelten Zuständen kommt im language-Menü nur ein weiterer Parameter vor. Mithilfe von normalWhenNoLanguage = 1 schalten Sie die Sonderbehandlung für nicht vorhandene Übersetzungen ab. In diesem Fall wird unabhängig
vom Vorhandensein einer Übersetzung in jedem Fall eine Auswahl für alle Sprachen angezeigt.
Links
Falls Sie sich fragen, warum in diesem Beispiel keine Übersetzungen vorkommen, damit zum Beispiel ein englischsprachiger Betrachter eine Auswahl German, English, Italian zu sehen bekommt, gibt es hier noch die passende Lösung. NO { stdWrap.cObject = TEXT stdWrap.cObject { value = Deutsch || Englisch || Italienisch lang.en = German || English || Italian lang.it = Tedesco || Inglese || Italiano } allWrap =
|
}
Unserer Meinung nach ist es jedoch sinnvoller, die jeweilige Sprache nur in eben dieser Sprache anzuzeigen, weil damit sichergestellt ist, dass der Betrachter diese erkennen und anklicken kann.
Siehe auch Lizensiert für Markus Mueller
Wenn Sie weitere Varianten des Parameters special kennenlernen wollen, schauen Sie sich einfach die Rezepte 12.1, 12.5, 12.6, 12.7 und 12.9 an. Möchten Sie wissen, welche Parameter sonst noch Einfluss auf Ihr Menü haben können, lesen Sie weiter in Rezept 12.10.
12.9 Spezielle Menütypen: Blätternavigation Problem Sie haben spezielle Anforderungen an ein Menü, die über die simple Wiedergabe eines Seitenbaums hinausgehen. So wollen Sie zum Beispiel eine Navigation zum Durchblättern der Seiten erzeugen. Hierbei soll sich der Betrachter innerhalb der gesamten Ebene nach vorn und nach hinten bewegen können. Gegebenenfalls soll er die Ebene wechseln und dort nach dem gleichen Prinzip verfahren können.
Lösung Verwenden Sie den HMENU-Parameter special und dessen Wert browse für eine Blätternavigation.
Max. Linie
temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special = browse
special{ items = prev | next prev.fields.title = « zurück prev.fields.nav_title = « zurück next.fields.title = weiter » next.fields.nav_title = weiter » } 1 = TMENU 1 { NO { allWrap = | } } } }
Beachten Sie, dass wir in diesem Beispiel TMENU als Platzhalter für eine der möglichen Varianten TMENU, GMENU, TMENU_LAYERS, GMENU_LAYERS, IMGMENU und JSMENU verwendet haben. Je nach Variante müssen Sie gegebenenfalls andere Parameter setzen, um die volle Funktionalität des Menüs zu erreichen. Lesen Sie dazu bei Bedarf die entsprechenden Rezepte.
Lizensiert für Markus Mueller
Diskussion Wenn Sie umfangreiche Sites verwalten, deren Inhalte sich oft über mehrere Seiten erstrecken, kann es sinnvoll sein, zusätzlich zur üblichen Navigation in Form einer Baumstruktur eine sogenannte Blätternavigation anzubieten. Hierbei steht dem Betrachter eine Auswahl immer gleicher Schalter zur Verfügung, die ihn aus Sicht seiner aktuellen Position im Seitenbaum in bestimmte Richtungen weiterspringen lassen. Die vorstellbaren Richtungen wären dabei: • nach links – auf der gleichen Ebene zum vorhergehenden Element • nach rechts – auf der gleichen Ebene zum folgenden Element • nach oben – zur Elternseite • nach unten – zur ersten Unterseite TYPO3 bietet Ihnen drei davon, nämlich links, rechts und oben. Auf die Richtung unten wurde verzichtet, dafür gibt es aber weiterführende Schalter, die Schritte von größerer Länge in die anderen drei Richtungen ermöglichen. Die Schalter, die Sie verwenden möchten, werden im Parameter items festgelegt. Sie können dabei auch eigene Schalter festlegen, die allerdings immer mit einer festen ID verknüpft sein müssen und daher eher selten zum Einsatz kommen.
Max. Linie
Im folgenden Codebeispiel haben wir alle möglichen Schalter sowie einen eigenen definiert. Für Ihre persönliche Blätternavigation werden Sie vermutlich nicht alle davon benötigen. Ein schönes Praxisbeispiel für eine Blätternavigation ist eine Ahnengalerie bestehend aus einem Stammvater, dessen Söhnen, Enkeln und Urenkeln.
temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special=browse special { items ( home | index | up | prevsection | prevsection_last | first | prev | next | last | nextsection | nextsection_last ) items.prevnextToSection = 0 home.uid = 123 home.fields.title = Ahnengalerie home.fields.nav_title = Ahnengalerie index.fields.title = Großvater index.fields.nav_title = Großvater up.fields.title = Vater up.fields.nav_title = Vater prevsection.fields.title = ältester Sohn des älteren Onkels prevsection.fields.nav_title = ältester Sohn des älteren Onkels prevsection_last.fields.title = jüngster Sohn des älteren Onkels prevsection_last.fields.nav_title = jüngster Sohn des älteren Onkels first.fields.title = ältester der Brüder first.fields.nav_title = ältester der Brüder prev.fields.title = älterer Bruder prev.fields.nav_title = älterer Bruder next.fields.title = jüngerer Bruder next.fields.nav_title = jüngerer Bruder last.fields.title = jüngster der Brüder last.fields.nav_title = jüngster der Brüder nextsection.fields.title = ältester Sohn des jüngeren Onkels nextsection.fields.nav_title = ältester Sohn des jüngeren Onkels nextsection_last.fields.title = jüngster Sohn des jüngeren Onkels nextsection_last.fields.nav_title = jüngster Sohn des jüngeren Onkels } 1 = TMENU 1 { wrap =
|
NO = 1 NO { allWrap =
|
} } } }
Links
Für jeden der unter items aufgelisteten Parameter müssen Sie mithilfe von fields.[feldname] einen Text festlegen, der anstatt des üblichen Feldinhalts angezeigt werden soll.
Rechts Da der Menütyp browse sowohl das Feld title als auch nav_title berücksichtigt, müssen Sie beide überschreiben. Dies erklärt, warum sämtliche Beschriftungen im vorigen Codebeispiel doppelt verwendet werden.
Eine Seitenstruktur, um eine solche Ahnengalerie abzubilden, sähe ungefähr so aus: 1: Startseite 2: Karl 3: Ulrich 7: Joachim 15: Colin 16: Marvin 17: Dennis 8: Christian 9: Stefan 10: Markus 4: Georg Lizensiert für Markus Mueller
11: Dirk 18: Jan 19: Lukas 12: Manuel 13: Karsten 5: Wolf 14: Oliver 6: Klaus Die Namen sind innerhalb ihrer Ebene jeweils absteigend nach Alter sortiert. Das angezeigte Menü würde in unserem Beispiel wie folgt aussehen: Ahnengalerie (home) Großvater (index) Vater (up) ältester Sohn des älteren Onkels (prevsection) jüngster Sohn des älteren Onkels (prevsection_last) ältester der Brüder (first) älterer Bruder (prev)
jüngster Sohn des jüngeren Onkels (nextsection_last) Für das gezeigte Codebeispiel sollten Sie zunächst davon ausgehen, dass Sie sich auf der Ebene der Enkel auf der Position von Manuel, also auf Seite 12, befinden. Die Namen, die über die eben aufgeführten Links zu erreichen wären, sind folgende: 1: Startseite (home) 2: Karl (index) 4: Georg (up) 7: Joachim (prevsection) 10: Markus (prevsection_last) 11: Dirk (first) 11: Dirk (prev) 13: Karsten (next) 13: Karsten (last) 14: Oliver (nextsection) 14: Oliver (nextsection_last) Lizensiert für Markus Mueller
Wechseln Sie zur Position von Christian, also auf Seite 8, stellt sich die Namensliste wie folgt dar: 1: Startseite (home) 2: Karl (index) 3: Ulrich (up) nicht verfügbar (prevsection) nicht verfügbar (prevsection_last) 7: Joachim (first) 7: Joachim (prev) 9: Stefan (next) 10: Markus (last) 11: Dirk (nextsection) 13: Karsten (nextsection_last)
Max. Linie
Zum Schluss wollen wir Ihnen noch demonstrieren, wie Sie den eigentlich nicht vorhandenen Parameter down simulieren können. Im Zusammenhang mit der gezeigten Ahnengalerie macht es nämlich durchaus Sinn, Links auf die jeweiligen Seiten der Söhne zu erzeugen. Ansonsten bestünde für den Betrachter keinerlei Möglichkeit, auch auf die Seiten der Urenkel zu gelangen. Auch dabei sollte es die Möglichkeit geben, den ältesten und den jüngsten Sohn separat auszuwählen. Vergleichbare Bezeichnungen wären downfirst und downlast.
Rechts Der Parameter items.prevnextToSection=1 würde bei den Schaltern prev und next dafür sorgen, dass diese jeweils zur nächstgelegenen Sektion auf der gleichen Ebene springen, wenn der Betrachter am jeweiligen Ende der aktuellen Sektion angelangt ist. Für unser Beispiel würde das bedeuten, dass die Links jüngerer Bruder bzw. älterer Bruder auf die nächste Familie, sprich auf den älteren bzw. den jüngeren Cousin verweisen würden. Für eine Ahnengalerie ist das nicht wirklich sinnvoll, daher haben wir den Parameter deaktiviert. In anderen Szenarien kann dieser Parameter aber durchaus komfortabel eingesetzt werden.
Hier der passende Code, bei dem wir das Menü in drei Teile zerlegt haben:
Lizensiert für Markus Mueller
Max. Linie
temp.beispielmenu = COA temp.beispielmenu { 10 = HMENU 10 { special=browse special { items ( home | index | up | prevsection | prevsection_last | first | prev ) items.prevnextToSection = 0 home.uid = 123 home.fields.title = Ahnengalerie home.fields.nav_title = Ahnengalerie index.fields.title = Großvater index.fields.nav_title = Großvater up.fields.title = Vater up.fields.nav_title = Vater prevsection.fields.title = ältester Sohn des älteren Onkels prevsection.fields.nav_title = ältester Sohn des älteren Onkels prevsection_last.fields.title = jüngster Sohn des älteren Onkels prevsection_last.fields.nav_title = jüngster Sohn des älteren Onkels first.fields.title = ältester der Brüder first.fields.nav_title = ältester der Brüder prev.fields.title = älterer Bruder prev.fields.nav_title = älterer Bruder } 1 = TMENU 1 { NO { allWrap =
} } } 40 = HMENU 40 { special=browse special { items ( next | last | nextsection | nextsection_last ) items.prevnextToSection = 0 next.fields.title = jüngerer Bruder next.fields.nav_title = jüngerer Bruder last.fields.title = jüngster der Brüder last.fields.nav_title = jüngster der Brüder nextsection.fields.title = ältester Sohn des jüngeren Onkels nextsection.fields.nav_title = ältester Sohn des jüngeren Onkels nextsection_last.fields.title = jüngster Sohn des jüngeren Onkels nextsection_last.fields.nav_title = jüngster Sohn des jüngeren Onkels } 1 = TMENU 1 { NO { allWrap =
Im ersten Teil werden die Einträge im vorderen Bereich mit der bereits beschriebenen Einstellung special=browse abgearbeitet. Danach folgt ein Menü, das die Unterseiten der aktuellen Seite auf herkömmliche Weise anzeigt. Den Schluss bildet wieder ein Menü vom Typ browse. Und hier das Ergebnis für den Fall, dass der Betrachter sich auf der Seite von Joachim befindet: 1: Startseite (home) 2: Karl (index) 3: Ulrich (up) nicht verfügbar (prevsection) nicht verfügbar (prevsection_last) 7: Joachim (first) nicht verfügbar (prev) 15: Colin (downfirst) 17: Dennis (downlast) 9: Stefan (next)
Lizensiert für Markus Mueller
10: Markus (last) 11: Dirk (nextsection) 13: Karsten (nextsection_last)
Siehe auch Wenn Sie weitere Varianten des Parameters special kennenlernen wollen, schauen Sie sich einfach die Rezepte 12.1, 12.5, 12.6, 12.7 und 12.8 an. Möchten Sie wissen, was die weiterführenden Parameter maxItems und alternativeSortinField zu bedeuten haben und welche Parameter sonst noch Einfluss auf Ihr Menü haben können, lesen Sie weiter in Rezept 12.10.
12.10 Erweiterte Menüeigenschaften individuell anpassen Problem
Max. Linie
Sie wollen die automatisch erzeugten Menüs und deren Elemente weitergehend beeinflussen. Sie wollen zum Beispiel die maximale Anzahl der Einträge begrenzen, bestimmte Seiten oder auch Seitentypen von der Darstellung im Menü ausschließen oder genau festgelegte Sektionen des Menüs immer aufgeklappt darstellen.
Beachten Sie, dass wir in diesen Beispielen TMENU als Platzhalter für eine der möglichen Varianten TMENU, GMENU, TMENU_LAYERS, GMENU_LAYERS, IMGMENU und JSMENU verwendet haben. Je nach Variante müssen Sie gegebenenfalls andere Parameter setzen, um die volle Funktionalität des Menüs zu erreichen. Lesen Sie dazu bei Bedarf die entsprechenden Rezepte.
Diskussion Wenn Sie im Rahmen Ihrer TYPO3-Site mit umfangreichen Seitenbäumen arbeiten, stoßen Sie oftmals an die Grenzen des dafür vorgesehenen HTML-Layouts. Speziell horizontale Darstellungen eines Menüs sind nur innerhalb eines bestimmten Rahmens sinnvoll, weil bei einer zu großen Anzahl entweder mehrere Zeilen oder schlimmstenfalls horizontale Scrollbalken angezeigt werden. Dies gilt es selbstverständlich zu vermeiden, damit die Benutzerfreundlichkeit der Site erhalten bleibt.
Max. Linie
Natürlich können Sie viele dieser Probleme schon im Vorfeld ausschalten, indem Sie eine möglichst sinnvolle Aufteilung der Navigation in verschiedene Teilbereiche vornehmen. Jedoch kommen Sie auch dabei nicht umhin, den Redakteuren, die später die Seiten einpflegen, gewisse Grenzen zu setzen.
Hierzu bietet Ihnen TYPO3 im Bereich HMENU verschiedene Parameter, mit deren Hilfe Sie genau festlegen können, welche Seiten oder Seitentypen im Menü erscheinen dürfen, in welchem Rahmen sich die Anzahl der Einträge bewegen darf und wie mit den Einträgen bei mehrsprachigen Auftritten verfahren werden soll.
Links
Solange Sie keinen dieser Parameter verwenden, gelten folgende Grundeinstellungen: • Es gibt keine Einschränkungen hinsichtlich der Anzahl der Menüeinträge. • Die Seitentypen Standard, Erweitert, Externe URL, Verweis, Mountseite und Abstand werden angezeigt, alle anderen nicht. • Alle Seiten unterhalb der gewählten Einstiegspunkte werden berücksichtigt. • Nur ausgewählte Seiten und deren Rootline sind automatisch aktiv und damit aufgeklappt. Einige Seitentypen sind seit TYPO3 Version 4.2 nicht mehr vorhanden. So wurde zum Beispiel der Seitentyp Erweitert komplett in den Seitentyp Standard übernommen. Die jeweiligen zusätzlichen Einstellungen befinden sich nun in separaten Reitern.
Lizensiert für Markus Mueller
Nun gilt es, diese Einstellungen der gewünschten Ausgabe anzupassen. Im obigen Beispiel haben wir damit begonnen, die Anzahl der angezeigten Einträge zu beschränken. Dies ist z.B. notwendig, weil im Menü immer eine bestimmte Anzahl von Einträgen zu sehen sein soll, die aber ein bestimmtes Maß nicht überschreiten darf. Speziell bei Verwendung von grafischen Menüs kommt diese Anforderung häufig vor, damit die verwendeten Hintergrundbilder ins restliche Layout passen, ohne dieses zu überlagern oder gegebenenfalls Lücken zu hinterlassen. Im gezeigten Beispiel soll die Anzahl der Einträge mindestens 5 betragen und den Wert 10 nicht überschreiten. Außerdem soll der erste Eintrag übersprungen werden, weil es sich hierbei z.B. um die Seite Home handelt, die mit einem separaten Link auf das Firmenlogo belegt werden soll. Hierzu verwenden Sie drei Parameter. Zunächst wird mithilfe von begin = 2 festgelegt, dass der erste Eintrag nicht berücksichtigt wird. Danach erzeugen Sie durch den Einsatz von minItems = 5 eine Mindestanzahl von 5 Einträgen. In der konkreten Anwendung bedeutet dies, dass bei einer Anzahl von unter 5 Einträgen für jeden fehlenden Eintrag ein sogenannter Dummylink erzeugt wird, der einfach auf die aktuelle Seite verlinkt und mit drei Punkten als Linktext gefüllt wird. Damit das Menü keinen solchen Dummylink anzeigt, benötigen Sie in diesem Fall also mindesten den ersten Eintrag plus fünf weitere, insgesamt also sechs.
auch automatisch geschehen, wenn Sie zum Beispiel ein Menü der zuletzt geänderten Seiten erzeugen. Dort kommt speziell der Parameter maxItems größtenteils zum Einsatz, um zum Beispiel nur die Top 10 der aktuellen Seiten anzuzeigen. Im nächsten Beispiel kommen drei weitere Parameter zum Einsatz, die sich weniger auf die Anzahl der Einträge als auf die jeweiligen Seiten selbst beziehen. So kann es zum Beispiel vorkommen, dass Sie als Administrator festlegen müssen, welche Seiten im Menü erscheinen dürfen und welche nicht. Normalerweise kann der Redakteur dies selbst entscheiden, indem er zum Beispiel den Seitentyp Nicht im Menü verwendet oder aber bei der Bearbeitung der Seite das Kontrollkästchen Im Menü verstecken anklickt. Damit Sie nun sicherstellen können, dass nicht einfach irgendein Redakteur eine Seite im Menü erscheinen lässt, die eigentlich nicht öffentlich angezeigt werden soll, müssen Sie diese Einstellungen überschreiben können. TYPO3 bietet Ihnen dazu den Parameter excludeUidList. Hier tragen Sie einfach die UID der jeweiligen Seiten in eine kommaseparierte Liste ein. Damit sind diese Seiten unabhängig von weiteren Kriterien auf jeden Fall von der Darstellung im Menü ausgenommen.
Lizensiert für Markus Mueller
Dabei sollten Sie allerdings beachten, dass der komplette Teilbereich des Seitenbaums beginnend ab der jeweiligen Seite ebenfalls ausgespart wird. Außerdem sollten Sie wissen, dass seit TYPO3 Version 4.2 die Möglichkeit besteht, den Seitentyp Nicht im Menü komplett zu entfernen. Er wird dann durch das bisher parallel existierende Kontrollkästchen Im Menü verstecken vollständig ersetzt. Bestimmte TypoScript-Tricks, die mit beiden Eigenschaften gearbeitet haben, um Seiten in verschiedenen Menüs sowohl ein- als auch auszublenden, funktionieren damit leider nicht mehr!
Der nächste Parameter excludeDoktypes bezieht sich nicht auf eine konkrete Seite, sondern nur auf Seitentypen im Allgemeinen. Auch hier können Sie eine kommaseparierte Liste von Zahlenwerten verwenden. Jede Zahl steht hierbei für einen der verfügbaren Seitentypen, wobei die mit einem Sternchen markierten Typen in Version 4.2 entfernt wurden. Wenn Sie keinerlei sonstige Modifikationen vorgenommen haben, sind dies: 1 Standard 2 Erweitert * 3 Externe URL 4 Verweis 5 Nicht im Menü * 6 Backend Benutzer Bereich 7 Mount Seite 199 Abstand
Im gezeigten Beispiel haben wir als Wert 3,5,6 eingetragen. Dies hätte zur Folge, dass nicht nur die Seitentypen Nicht im Menü und Backend Benutzer Bereich, sondern auch Externe URL von der Anzeige im Menü ausgenommen sind. Wenn Sie den Parameter nicht verwenden, gilt als Default der Wert 5,6.
Links
Können Sie mit diesen beiden Parametern verhindern, dass bestimmte Seiten oder Seitentypen angezeigt werden, so erreichen Sie mit dem Schalter includeNotInMenu das genaue Gegenteil. Setzen Sie diesen Schalter auf 1, werden auch solche Seiten im Menü aufgelistet, die vom Redakteur als Nicht im Menü gekennzeichnet wurden. In Rezept 12.2 erfahren Sie, wie Sie sogar geschützte Seiten im Menü einblenden und bei Bedarf auf eine passende Login-Seite verweisen. Im folgenden Beispiel finden Sie einen weiteren nützlichen Parameter, der bei besonders wichtigen Bereichen des Menüs zum Einsatz kommt. Diese sollen selbst dann aktiv sein, wenn sich der Benutzer gerade nicht in diesem Bereich des Seitenbaums befindet. Mit aktiv wird in diesem Fall der aufgeklappte Zustand eines Teilbereichs bezeichnet. Der Parameter heißt demzufolge alwaysActivePIDlist und wird ebenfalls mit einer kommaseparierten Liste von Seiten-IDs gefüllt. Beachten Sie jedoch, dass dieser Parameter im Zusammenhang mit Menüs vom Typ special nicht funktioniert. Lizensiert für Markus Mueller
Im letzten Beispiel sehen Sie einen besonderen Parameter namens protectLvar, der nur im Zusammenhang mit mehrsprachigen Seiten nach dem One-Tree-Konzept zum Einsatz kommt. Genau genommen handelt es sich um einen Schalter, der aber neben dem Wert 1 zusätzlich noch den Wert all bekommen kann. Setzen Sie ihn lediglich auf 1, wird immer dann, wenn keine Übersetzung der angeklickten Seite vorliegt, automatisch auf die Default-Sprache zurückgestellt – dies allerdings nur dann, wenn für die jeweilige Seite das Kontrollkästchen Verstecke Seite wenn keine Übersetzung für die aktuelle Sprache existiert aktiviert ist. Wenn Sie dieses Verhalten unabhängig von diesem Kontrollkästchen erzwingen wollen, müssen Sie den Wert all verwenden.
12.11 Ein einfaches Textmenü auf Basis einer ungeordneten Liste erstellen Problem Sie wollen ein einfaches, textbasiertes Menü mit semantisch korrektem HTML-Code erzeugen.
Lösung
Max. Linie
Verwenden Sie die Objekte HMENU und TMENU sowie die Parameter wrap und wrapItemAndSub.
Dieser Code kommt in Ihr TS-Setup: temp.basicMenu = HMENU temp.basicMenu { wrap =
|
entryLevel = 0 1 = TMENU 1 { expAll = 1 wrap =
|
NO = 1 NO { wrapItemAndSub =
|
} } 2 < .1 3 < .1 }
Und dieser in das TS-Setup Ihrer Seite: page = PAGE page.10 < temp.basicMenu
Lizensiert für Markus Mueller
Diskussion Das gezeigte Menü ist sozusagen die Urversion des zugänglichen Listenmenüs – ein TMENU, das eine verschachtelte Liste aus ul- und li-Tags erzeugt. Hierzu benötigen Sie immer mindestens den Normalzustand NO innerhalb des TMENU, damit das Menü erzeugt werden kann. Weitere Zustände für aktive Einträge, Einträge mit Unterseiten oder sonstige besondere Eigenschaften werden für diese Urversion nicht benötigt. Sie finden diese im nächsten Rezept. Sie fragen sich vielleicht, welchen Sinn eine solche Strukturierung haben soll. Schließlich könnte man auch mit einfachen br-Tags oder div-Containern eine horizontale oder vertikale Anordnung der Einträge erreichen, so wie wir es zum Beispiel im Code der Einleitung dieses Kapitels gezeigt haben. Die Antwort hierauf erhalten Sie spätestens dann, wenn Sie den HTML-Code nach den Guidelines der Web Accessibility Initiative – kurz WAI – zu validieren versuchen. Die Fehlermeldung lautet üblicherweise: Separate adjacent links with more than whitespace – mit anderen Worten: Leerraum oder Zeilenumbrüche sind nicht ausreichend, um Links semantisch voneinander zu trennen und z.B. einem Screenreader deutlich zu machen, dass es sich um unterschiedliche Elemente handelt.
Max. Linie
Eine ungeordnete Liste bietet sich hier nicht nur aus Gründen der deutlicheren Trennung an, sie bringt noch eine weitere Eigenschaft mit, die sich hervorragend für Menüs eignet – sie kann hierarchisch verschachtelt werden. Die Regel hierfür lautet: Eine untergeordnete Liste muss sich als Ganzes immer innerhalb eines Listeneintrags der übergeordneten Liste befinden.
Der HTML-Code hierzu sieht daher gemäß W3C-Richtlinie aus wie der folgende Block:
Links
Ebene 1 Element 1
Ebene 2 Element 1
Ebene 2 Element 2
Ebene 3 Element 1
Ebene 3 Element 2
Ebene 2 Element 3
Ebene 1 Element 2
und nicht etwa so, wie er oft fälschlich zum Einsatz kommt: Dieser Code ist falsch und dient nur als Beispiel dafür, wie man es nicht machen sollte!
Lizensiert für Markus Mueller
Ebene 1 Element 1
Ebene 2 Element 1
Ebene 2 Element 2
Ebene 3 Element 1
Ebene 3 Element 2
Ebene 2 Element 3
Ebene 1 Element 2
Beachten Sie, dass im ersten Beispiel das schließende li-Tag in beiden Fällen erst nach der darin enthaltenen ul-Liste eingesetzt wird. Um diesen Code zu erzeugen, benötigen Sie einen Wrap, der sowohl den Menüeintrag, auch Menuitem genannt, als auch das dazugehörige Submenü umschließt. Sinnigerweise heißt eben dieser Parameter wrapItemAndSub. Es reicht also völlig aus, das Menü selbst in ul-Tags zu verpacken, während wrapItemAndSub die passenden li-Tags liefert. Unter Berücksichtigung dieser Regeln können Sie verschachtelte Listenmenüs von beliebiger Tiefe erzeugen.
Max. Linie
Falls Sie die Untermenüs erst dann aufklappen wollen, wenn sich der Betrachter auf der entsprechenden übergeordneten Seite befindet, entfernen Sie einfach den Schalter expAll = 1. Dies funktioniert jedoch nur für Menüs, die entryLevel für die Definition des Startpunkts benutzen. Menüs vom Typ special können die Unterebenen nicht automatisch öffnen.
12.12 Ein Textmenü mit komfortablen Erweiterungen erzeugen Problem Sie wollen ein textbasiertes Menü so komfortabel wie möglich gestalten. • Seiten ohne Inhalt sollen nicht verlinkt werden. • Die Links sollen auf dem jeweiligen Seitentyp basierende CSS-Klassen erhalten. • Das Sprungziel soll über config oder das Feld target im Seiten-Header wählbar bleiben. • Sämtliche Original-Features von TMENUITEMS sollen erhalten bleiben. • Das Menü soll Links TYPO3-kompatibel erzeugen und sie XHTML-konform in eine ul-Liste einbauen. Lizensiert für Markus Mueller
Max. Linie
Lösung Deaktivieren Sie die automatische Verlinkung und erzeugen Sie die Links mithilfe von COA, LOAD_REGISTER, typolink und dataWrap selbst. Dieser Code kommt in Ihr TS-Setup: temp.comfortMenu = HMENU temp.comfortMenu { wrap =
|
entryLevel = 0 1 = TMENU 1 { expAll = 1 wrap =
|
NO = 1 NO { doNotLinkIt = 1 wrapItemAndSub =
|
stdWrap.cObject = COA stdWrap.cObject { 10 = LOAD_REGISTER 10 { Ziel = _top Ziel.override.dataWrap = {field:target // TSFE:intTarget} } 20 = TEXT 20 { field = nav_title // title
Und dieser in das TS-Setup Ihrer Seite: page = PAGE page.10 < temp.comfortMenu
Diskussion Aus dem vorhergehenden Rezept kennen Sie bereits die Urversion des zugänglichen Listenmenüs: ein TMENU, das per wrapItemAndSub eine verschachtelte Liste aus ul- und li-Tags erzeugt. Was aber, wenn Sie bei einem solchen TMENU höhere Anforderungen an die Flexibilität stellen? Wie verhindern Sie z.B. das Verlinken von Seiten ohne Inhalt? Wie berücksichtigen Sie verschiedene Seitentypen bei der Darstellung der Links per CSS? Eigene Itemstates, wie sie für NO oder ACT existieren, gibt es dafür schließlich noch nicht. Die Lösung ist denkbar einfach, denn jeder der einzelnen Menüzustände verfügt über stdWrap-Eigenschaften. Das bedeutet, dass Sie anstatt der ursprünglich vorgesehenen Links beliebige TypoScript-Elemente für deren Erzeugung verwenden können. Zunächst schalten Sie die offizielle Link-Funktionalität mithilfe von doNotLinkIt = 1 ab. Die üblichen Einstellungen für wrap, wrapItemAndSub, expAll, entryLevel usw. bleiben unverändert.
Damit das so erzeugte Menü keine Liste von Seitentiteln ohne Verlinkung wird, benötigen Sie eine Funktion, die die nötigen Links TYPO3-konform erzeugt. Bei der Verarbeitung von Links in Texten kommt hierfür üblicherweise typolink zum Einsatz, und auch für diesen speziellen Fall eignet sich diese Funktion hervorragend, weil sie sowohl mit simulateStaticDocuments als auch mit der Extension realURL korrekte Ergebnisse liefert. stdWrap.cObject = COA stdWrap.cObject { 10 = LOAD_REGISTER 10 { Ziel = _top Ziel.override.dataWrap = {field:target // TSFE:intTarget} } 20 = TEXT 20 { field = nav_title // title typolink.parameter { dataWrap = {field:alias // field:uid} {register:Ziel} typ{field:doktype} if.isTrue.numRows { table = tt_content select.pidInList.field = uid } } } }
Sie können typolink über die Eigenschaft parameter drei Teilbereiche zuweisen.
Max. Linie
Der erste bestimmt die URL des zu erzeugenden Links. Diese kann entweder auf eine weitere Seite im Seitenbaum, auf eine externe Seite, eine Mailadresse oder einen Anker eines Inhaltselements verweisen. In diesem Beispiel wird eine interne Seite entweder über ihre UID oder, so vorhanden, über ihren Aliasnamen aufgerufen.
Der zweite Parameter enthält Informationen über das Sprungziel. Dies kann ein neues Fenster, ein Frame oder das gleiche Fenster sein, in dem sich der Link befindet. Da Sprungziele in Zukunft nicht mehr Teil der XHTML-Spezifikationen sein werden, empfiehlt es sich, als Ziel so weit möglich _top zu verwenden. Solange Sie keine anderen Ziele in der Seite selbst oder per config.intTarget gesetzt haben, wird _top auch im gezeigten Beispiel verwendet. Dies erreichen Sie durch den Einsatz eines LOAD_REGISTER, das den Wert _top nur dann überschreibt, wenn eine der beiden anderen Möglichkeiten verwendet wurde.
Links
Der dritte und letzte Parameter liefert eine class-Bezeichnung für die Ansteuerung des Links. Damit dieser Parameter dem Link je nach gewähltem Seitentyp verschiedene class-Bezeichnungen liefert, erhält er als Präfix das Kürzel typ gefolgt vom Wert des Feldes doktype. Dies alles geschieht innerhalb einer einzigen Zuweisung mithilfe von dataWrap. Lesen Sie hierzu bei Bedarf Rezept 10.2. Um sicherzustellen, dass nur dann ein Link erzeugt wird, wenn sich auch Inhalt auf der jeweiligen Seite befindet, versehen Sie die Funktion typolink zusätzlich mit einer ifAbfrage. Diese stellt per numRows fest, ob es Inhaltselemente gibt, deren PID die UID der aktuellen Seite ist. Lizensiert für Markus Mueller
Dieses Konstrukt wird nun anstelle des Original-Links mittels eines Setzkastenelements COA über die Funktion stdWrap.cObject eingefügt. Kopieren Sie das temporäre Objekt wie üblich in Ihr Seiten-Setup und probieren Sie Ihr neues Komfortmenü aus.
12.13 Ein Teaser-Menü mit Bildern und Kurzbeschreibung erzeugen Problem Sie wollen ein Textmenü um dynamisch generierte Bilder erweitern, um es optisch aufzuwerten. Die Bilder sollen jeweils aus den im Menü dargestellten Seiten ausgelesen und ebenfalls verlinkt werden. Zusätzlich soll noch ein Text als Kurzbeschreibung der Seite eingebaut werden. Das Menü soll dabei als Teaser dienen, um die fünf aktuellsten Unterseiten anzuzeigen. Außerdem soll alles in semantisch korrektem HTML-Code ausgegeben werden.
Lösung
Max. Linie
Verwenden Sie die Parameter before und after zusammen mit den stdWrap-Funktionen cObject und append. Erzeugen Sie für den Notfall sogenannte Fallback-Bilder, die immer dann angezeigt werden, wenn am ursprünglich vorgesehenen Platz kein Bild gefunden werden kann. Verwenden Sie dazu die stdWrap-Funktion override.
.teasermenu ul li dl { float:right; width:420px; } .teasermenu ul li dl dt { font-size:1.3em; font-weight:bold; } .teasermenu ul li dl dt a { display:inline; } .teasermenu ul li dl dd { padding-top:1em; } .teasermenu ul li .clearer { clear:both; visibility:hidden; font-size:0; line-height:0; height:0; }
Diskussion Lizensiert für Markus Mueller
TYPO3 bietet Ihnen mehrere Menütypen zur Darstellung Ihrer Navigationen an. Allerdings müssen Sie sich dabei für die Gattung der reinen Textnavigationen mit TMENU oder aber die der grafischen Navigationen mit GMENU entscheiden. Da Sie die Zustände eines TMENU mit stdWrap erweitern können, sind aber auch Mischformen möglich. Sie können damit Menüs erzeugen, die optisch ansprechend, aber auch gut von Suchmaschinen erfassbar sind und auch bei durch den Benutzer ausgeblendeten Grafiken nutzbar bleiben. In diesem Codebeispiel geht es um ein sogenanntes Teaser-Menü, das z.B. auf der Startseite eingesetzt wird, um die fünf neuesten Unterseiten anzuzeigen. Hierzu setzen Sie zunächst den TMENU-Parameter alternativeSortingField auf tstamp DESC, um sicherzustellen, dass die Menüeinträge mit dem jüngsten Timestamp zuerst gerendert werden. Mithilfe von maxItems = 5 sorgen Sie dafür, dass nur die ersten fünf Einträge gerendert werden. Das Grundgerüst dieses Menüs besteht aus der ungeordneten Liste aus Rezept 12.11, der wir als Listeneinträge wiederum eine Definitionsliste zuweisen. Dies ist speziell aus semantischer Sicht sinnvoll, weil Sie mithilfe der Kurzbeschreibung aus dem Feld abstract den eigentlichen Linktext genauer definieren. Der hierfür erforderliche HTML-Code hat folgende Struktur:
Das zusätzliche br-Tag wird nur benötigt, wenn Sie, wie im CSS-Beispiel gezeigt, das Bild und die dazugehörige Definitionsliste per float positionieren möchten.
Lizensiert für Markus Mueller
Der Aufbau des TypoScript-Codes besteht im Prinzip aus drei Hauptteilen: dem Bild, das mithilfe von before erzeugt wird, dem textlichen Teil mit dem eigentlichen Link und der Kurzbeschreibung, die über after angehängt wird. Für das Bild haben wir uns etwas Besonderes einfallen lassen, denn hier gibt es einen dreifachen sogenannten Fallback, um sicherzustellen, dass immer ein möglichst passendes Bild verwendet wird. Dazu greifen Sie auf insgesamt drei verschiedene Bildquellen zurück: das media-Feld der Seite selbst oder, falls dieses keinen Inhalt liefert, ein mediaFeld aus der aktuellen Rootline oder, falls auch dieses keinen Inhalt haben sollte, das Verzeichnis fileadmin, aus dem eine Default-Grafik verwendet wird. Erzeugen Sie zunächst das Default-Bild mit diesem Code: before.cObject = IMAGE before.cObject { file { width = 150 import { cObject = TEXT cObject { cObject = TEXT cObject { value = fileadmin/defaultgrafik.jpg } } } } }
Max. Linie
Die doppelte Verschachtelung ist nötig, weil Sie insgesamt zweimal auf die stdWrapFunktion override zurückgreifen müssen, um die beiden anderen Bildquellen zu nutzen.
Im Prinzip erfolgt der Aufbau also rückwärts, da Sie zuerst das zweite Fallback-Bild erzeugen. Es folgt das erste Fallback-Bild, das Sie mit folgendem Code produzieren: import { cObject = TEXT cObject { cObject = TEXT cObject { value = fileadmin/defaultgrafik.jpg override { required = 1 data = levelmedia:-1, slide wrap = uploads/media/ | listNum = 0 } } } }
Lizensiert für Markus Mueller
Mithilfe von levelmedia:-1, slide wird zunächst das media-Feld der aktuellen Seite überprüft. Wird dort nichts gefunden, bewegt sich die Abfrage in der Rootline jeweils so lange eine Ebene zurück, bis eine Datei gefunden wird. Sollte dennoch keine Bilddatei vorhanden sein, wird mithilfe der Funktion required dafür gesorgt, dass override nicht ausgeführt wird. So bleibt das Default-Bild erhalten. Lesen Sie hierzu auch Rezept 10.2, in dem die Level-Funktionen näher erläutert werden. Zuletzt folgt das eigentlich gewünschte Bild aus dem media-Feld des jeweiligen Menüeintrags, das Sie mit folgendem Code einbinden: override { required = 1 field = media wrap = uploads/media/ | listNum = 0 }
Es folgen einige Parameter, mit denen Sie dem Bild einen Alternativtext und einen Titel zuweisen können. Außerdem wird es mithilfe von imageLinkWrap mit einem typolink versehen, der dafür sorgt, dass später sowohl der Linktext als auch das Bild auf die gleiche Seite verlinken. Lesen Sie hierzu bei Bedarf Rezept 10.7 zum Thema typolink. Mithilfe von before.append wird nun das öffnende dl-Tag an den bereits erzeugten Bildblock angehängt. Dies ist nötig, um sicherzustellen, dass später mindestens ein öffnendes sowie ein schließendes Tag für die Definitionsliste vorhanden sind, auch wenn diese keinen Inhalt hat. Für den Link selbst wird mithilfe von linkWrap ein dt-Tag als Verpackung gewählt.
Max. Linie
Im nun folgenden Bereich after greifen Sie auf das Feld abstract zurück, um die Kurzbeschreibung auszulesen. Diese wird mithilfe der Funktion crop auf eine maximale Länge von 250 Zeichen gekürzt und per wrap in dd-Tags verpackt. Abschließend wird hier über
append dafür gesorgt, dass sowohl ein schließendes dl-Tag als auch das im Tipp erwähnte clearing br-Tag auch dann gerendert werden, wenn das Feld abstract leer ist.
Links
before.append = TEXT before.append.value =
linkWrap =
|
after { field = abstract crop = 250 | ... | 1 wrap =
|
append = TEXT append.value =
}
Das in der Lösung gezeigte Stylesheet ist nur eine Möglichkeit, diesen flexibel gehaltenen HTML-Code zu formatieren. Hier zeigt sich deutlich, warum es in den meisten Fällen sinnvoller ist, auf eine Formatierung mithilfe von Tabellen zu verzichten.
12.14 Menü und Titel mit hierarchischer Nummerierung erzeugen Lizensiert für Markus Mueller
Problem Sie wollen die Navigation Ihrer Seite mithilfe einer hierarchischen Nummerierung übersichtlicher strukturieren. Dabei soll jedem Menüpunkt in einem Untermenü die Nummer des jeweiligen Elternelements gefolgt von einem Punkt vorangestellt werden. Für die erste Ebene soll das Ergebnis x Titel lauten, für die zweite Ebene x.x Titel, für die dritte x.x.x Titel usw. Außerdem soll die Hauptüberschrift des Inhalts jeweils die Nummer des aktuellen Menüpunkts vorangestellt bekommen. Sie wollen dies ohne zusätzlichen PHP-Code erreichen.
Lösung Verwenden Sie HMENU und dessen Zustand CUR zusammen mit LOAD_REGISTER und der stdWrap-Funktion prepend. Dieser Code kommt in Ihr TS-Setup:
} CUR < .NO CUR { stdWrap.prepend.15 = LOAD_REGISTER stdWrap.prepend.15 { nT.dataWrap = {register:L1N}.{register:L2N}.{register:L3N} } wrapItemAndSub =
|
} } }
Und dieser ins TS-Setup Ihrer Seite: page = PAGE page.10 < temp.numberedMenu page.20 = TEXT page.20 { dataWrap = {register:nT} {field:title} outerWrap =
|
}
Diskussion
Max. Linie
Wenn Sie des Öfteren Fachbücher oder wissenschaftliche Abhandlungen lesen, kennen Sie bereits die dort übliche hierarchische Nummerierung von Kapiteln. Sie dient der besseren Strukturierung des Inhalts und erleichtert dem Leser die Orientierung. Dies gilt für
webbasierte Publikationen natürlich ebenfalls, zumal hier eine Nummerierung die Orientierung für Nutzer von Screenreadern erheblich verbessert. Von Hause aus beherrscht TYPO3 zwar das Zählen von Menüpunkten über die Register count_menuItems bzw. count_HMENU_MENUOBJ und count_MENUOBJ, jedoch erhalten Sie darüber entweder die Position des Elements im gesamten Menü oder aber die Anzahl der Einträge pro Einzelmenü. Ein separater Zähler, der für jedes Menü oder Untermenü neu bei 1 beginnt, existiert leider nicht. Versierte PHP-Programmierer behelfen sich hier oft mit einer zusätzlichen iProcFunc, die den erforderlichen Zähler liefert. Dieses Rezept zeigt Ihnen jedoch, wie Sie auch mit Bordmitteln das gleiche Ergebnis erreichen können. Als Basis für das Menü dient ein TMENU, dessen Wraps Ihnen eine ul-Liste mit li-Tags liefern. Wir haben in diesem Beispiel drei Ebenen verwendet, für jede weitere Ebene müssen Sie den Code entsprechend erweitern.
Lizensiert für Markus Mueller
Max. Linie
In der ersten Ebene erzeugen Sie mithilfe von stdWrap.prepend ein Objekt, das dem eigentlichen Link vorangestellt wird. Es wird mit einem dfn-Tag versehen, dessen Aufgabe es ist, den eigentlichen Linktext näher zu erläutern. Weil Sie für den Zähler ein zusätzliches LOAD_REGISTER benötigen, ist das vorangestellte Objekt vom Typ COA. Der erste Teil 10 füllt ein temporäres Register mit dem aktuellen Wert und erhöht ihn dann um 1, der zweite Teil packt den neu errechneten Wert gefolgt von einem Leerzeichen in das dfn-Tag. stdWrap.prepend = COA stdWrap.prepend { 10 = LOAD_REGISTER 10 { L1N.stdWrap.dataWrap = {register:L1N}+1 L1N.prioriCalc = 1 } 20 = COA 20 { wrap = | 10 = TEXT 10.data = register:L1N 10.wrap = | 100 = TEXT 100.value = } }
Der Name des Registers für die erste Ebene ist L1N für Level1Nummer. Zusätzlich wird über den Zustand CUR ein weiteres Register namens nT für nummerierter Titel gefüllt. Es enthält die Nummer der aktuellen Seite und wird unabhängig von der jeweiligen Ebene einfach überschrieben. Weil der Zustand CUR immer der Seite entspricht, auf der sich der Besucher gerade befindet, erhalten Sie so stets die passende Nummer für Ihren Titel.
Für die zweite Ebene wird das gesamte Menü zunächst mithilfe von 2 < .1 kopiert. Danach werden mit L2N die Teile hinzugefügt, die Sie auf dieser Ebene benötigen, sowie mit L1N > die Teile abgeschaltet, die auf dieser Ebene nicht verändert werden dürfen. Im zweiten Teil des COA-Objekts müssen Sie lediglich einen zusätzlichen Wrap für den bereits existierenden Text erzeugen, damit dieser einen nachfolgenden Punkt erhält. Die Nummer für die zweite Ebene wird, wie bereits auf der ersten Ebene geschehen, als TEXT-Objekt hinzugefügt. Hierbei wird deutlich, warum Sie für den gesamten zweiten Teil des COA-Objekts ein weiteres COA-Objekt verwenden sollten. Das Anhängen neuer Werte wird dadurch erheblich vereinfacht.
Eine andere Methode, Werte und Trennzeichen aneinander zu reihen, sehen Sie beim nT-Register der zweiten Ebene. Hier wird die stdWrap-Funktion dataWrap verwendet, mit der Sie eine beliebige Anzahl verschiedener Feld- und Registerwerte innerhalb einer Zeichenkette einfügen können. stdWrap.prepend.15 = LOAD_REGISTER stdWrap.prepend.15 { nT.dataWrap = {register:L1N}.{register:L2N} }
Für die dritte Ebene verfahren Sie genau so, wie bereits für die zweite beschrieben: Fügen Sie die neuen Register hinzu und sorgen Sie mithilfe von L2N > dafür, dass der Zähler der zweiten Ebene hier nicht erhöht wird. Bleibt nur noch, das Menü in das Seiten-Setup zu kopieren.
Achten Sie hierbei darauf, dass der Titel nach dem Menü eingefügt werden sollte, weil ansonsten das entsprechende Register nT noch nicht gefüllt ist. Nun brauchen Sie nur noch mit ein wenig CSS dafür zu sorgen, dass Menü und Titel sinnvolle Positionen erhalten, und fertig ist Ihre verschachtelte Seitennummerierung.
12.15 Ein einfaches Grafikmenü auf Basis einer ungeordneten Liste erstellen Problem Sie wollen ein einfaches grafikbasiertes Menü mit semantisch korrektem HTML-Code erzeugen.
Lösung Verwenden Sie die Objekte HMENU und GMENU sowie die Parameter wrap und allWrap. Dieser Code kommt in Ihr TS-Setup: Lizensiert für Markus Mueller
Diskussion Das gezeigte Menü basiert auf der Urversion des zugänglichen Listenmenüs aus Rezept 12.11. Dort finden Sie auch die Begründung für den Einsatz einer ungeordneten Liste. In diesem Fall ist es jedoch ein GMENU, das eine verschachtelte Liste aus ul- und li-Tags erzeugt. Hierzu benötigen Sie immer mindestens den Normalzustand NO sowie den Zustand IFSUB innerhalb des GMENU, damit das Menü erzeugt werden kann. Weitere Zustände für aktive Einträge, Einträge mit Unterseiten oder sonstige besondere Eigenschaften werden für diese Urversion nicht benötigt. Sie finden diese im nächsten Rezept. IFSUB ist im Gegensatz zur textbasierten Variante deshalb zwingend nötig, weil es im GMENU den Parameter wrapItemAndSub nicht gibt. Sie müssen dieses Verhalten daher simulieren, indem Sie für ein aufgeklapptes Untermenü mit einer anderen Anordnung von verschiedenen Wraps arbeiten. Lizensiert für Markus Mueller
Normalerweise wird mit allWrap der komplette Menüeintrag umschlossen, und erst dann würde gegebenenfalls ein Untermenü als weiterer ul-Block eingefügt. Der Trick besteht nun darin, per allWrap nur das öffnende li-Tag zuzuweisen, während das schließende Tag einfach in den Wrap des folgenden Untermenüs verschoben wird. Aus diesem Grund wird in unserem Beispiel der Code der ersten Ebene zunächst in die zweite Ebene kopiert. Dann wird der passende Wrap mit dem schließenden li-Tag zugewiesen. Zum Schluss wird diese neu definierte zweite Ebene in die dritte Ebene kopiert. Für eventuelle zusätzliche Ebenen können Sie weiterhin die Ebene 2 kopieren, ohne irgendwelche Veränderungen vorzunehmen. Auf diese Weise erhalten Sie eine ebenso korrekt formatierte Liste, wie sie im TMENU mit wrapItemAndSub erzielt wird. Sollten Sie auf den Parameter expAll = 1 verzichten wollen, damit nur aktive Bereiche des Menüs aufgeklappt werden, müssen Sie dieses Verhalten mithilfe von ACTIFSUB anstatt IFSUB simulieren. IFSUB könnte in diesem Fall nämlich auch für Seiten gelten, die zwar Unterseiten besitzen, diese aber nicht aufgeklappt haben. Sollten Sie zusätzlich noch mit dem Zustand CUR arbeiten, müssen Sie allWrap für ACTIFSUB und CURIFSUB nach dem gleichen Prinzip verwenden, um die Liste korrekt zu erzeugen. Eine Seite mit dem Zustand CUR könnte nämlich ebenfalls sowohl mit als auch ohne Unterseiten existieren.
Max. Linie
Der eigentliche Hauptunterschied zwischen einem TMENU und einem GMENU liegt jedoch in einem anderen Bereich. Direkt hinter dem allWrap-Parameter des Zustands NO finden Sie eine Struktur, die eher einem PAGE-Element oder einem COA entsprechen könnte. Hier wird bei einem GMENU die eigentliche Grafik erzeugt, die später mit einem img-Tag und entsprechendem Alternativtext in den Link eingebaut wird.
GMENU macht sich dabei die komplette Palette der GIFBUILDER-Funktionen zu Nutze. Die Vorgehensweise ist so weit identisch, jedoch mit dem einen Unterschied, dass innerhalb eines GMENU auch die GIFBUILDER-Eigenschaften mithilfe von optionSplit verändert werden können. Da wir in diesem Rezept die Funktionsweise eines GMENU nur grundlegend erläutern wollen, entnehmen Sie weitergehende Informationen über die Möglichkeiten von GIFBUILDER und optionSplit den jeweiligen Rezepten, die Sie unter »Siehe auch« finden können. Die im Beispiel gezeigten Einstellungen reichen aus, um eine rudimentäre Grafik mit einem weißen Hintergrund und einem schwarzen Text zu erzeugen. Machen Sie keine weiteren Angaben, wird immer mit dieser Default-Einstellung gearbeitet. Der Text wird in diesem Beispiel aus dem Feld title der jeweiligen Seite entnommen. Mithilfe von XY = 100,20 legen Sie die Größe der erzeugten Grafik fest. Dies ist gleichzeitig der Arbeitsbereich für alle weiteren Operationen. Der Parameter offset dient der Positionierung des Texts auf Basis seiner Grundlinie. Die Werte 5,15 besagen in diesem Fall, dass das linke Ende der Grundlinie sich 5 Pixel vom linken Rand und 15 vom oberen Rand entfernt befinden soll. Textelemente, die die festgesetzte Größe überschreiten oder sich außerhalb des Rahmens befinden, werden zunächst abgeschnitten.
Lizensiert für Markus Mueller
Wenn Sie bei Ihren ersten Versuchen mit einem GMENU nur weiße Grafiken ohne Text erhalten haben, dürfte das daran gelegen haben, dass der y-Wert des offset-Parameters zu niedrig gewählt wurde. Je nach verwendeter Schriftart müssen Sie ein wenig probieren, bis Sie das passende Ergebnis erhalten, denn nicht alle Schriftdesigner halten sich an die Grundregeln des Schriftsatzes.
Die Positionierung und Formatierung der einzelnen Menüelemente erfolgt wie beim TMENU über CSS-Angaben.
Siehe auch Lesen Sie hierzu auch das Rezept 12.11 sowie zum GIFBUILDER die Rezepte 11.8 bis 11.11, 14.6, 14.7 und zum Zustand von Menüeinträgen das Rezept 12.3.
12.16 Ein Grafikmenü mit Effekten und Erweiterungen erzeugen Problem
Max. Linie
Sie wollen ein erweitertes grafikbasiertes Menü mit semantisch korrektem HTML-Code erzeugen.
Dabei möchten Sie mit einer Hintergrundgrafik arbeiten, die sich über das gesamte Menü erstrecken soll und nicht nur über einzelne Einträge. Außerdem sollen sich die Dimensionen des Menüs und der einzelnen Elemente sowohl an der Länge des längsten als auch an der Höhe des höchsten Elements orientieren. Zusätzlich wollen Sie für alle verwendeten Zustände entsprechende RollOver-Grafiken erzeugen, die eine andere Schriftfarbe und anstatt des Hintergrundbilds einen durchgehenden Farbton erhalten sollen.
Links
Lösung Verwenden Sie die Objekte HMENU und GMENU sowie die Parameter wrap und allWrap. Zusätzlich kontrollieren Sie die Dimensionen des Menüs mit den Parametern applyTotalH oder applyTotalW sowie useLargestItemX und useLargestItemY. Anstatt fester Zahlenwerte verwenden Sie die calc-Funktion für den Parameter XY. Für die RollOver-Effekte aktivieren Sie den jeweiligen RO-Zustand. Dieser Code kommt in Ihr TS-Setup:
Lizensiert für Markus Mueller
Max. Linie
temp.effectMenu = HMENU temp.effectMenu { wrap =
|
entryLevel = 0 1 = GMENU 1 { expAll = 1 wrap =
|
applyTotalH = 10 useLargestItemX = 1 useLargestItemY = 1 NO = 1 NO { allWrap =
Und dieser in das TS-Setup Ihrer Seite: page = PAGE page.10 < temp.effectMenu
Lizensiert für Markus Mueller
Diskussion Falls Sie die eine oder andere Einstellung innerhalb von NO oder RO nicht sofort nachvollziehen können, empfehlen wir Ihnen, die Rezepte zum Thema GIFBUILDER, die Sie unter »Siehe auch« finden, zu lesen. Das gezeigte Menü basiert auf der Urversion des grafikbasierten Listenmenüs aus Rezept 12.15. Das dort beschriebene Setup produziert ein relativ langweiliges Menü aus weißen Flächen mit schwarzer Beschriftung. Die Grafiken der einzelnen Einträge sind immer gleich groß, deswegen könnte es vorkommen, dass längere Texte einfach abgeschnitten werden. Um dies zu verhindern, wäre es von Vorteil, wenn Sie die Größe der fertigen Grafik eines Eintrags in Abhängigkeit von der Länge des Textfelds erzeugen könnten. Dafür steht Ihnen die sogenannte calc-Funktion beim Parameter XY zur Verfügung. Anstatt einfach nur feste Zahlenwerte einzugeben, beziehen Sie sich direkt auf die Breite oder Höhe eines bestimmten Eintrags innerhalb der GIFBUILDER-Konfiguration. In diesem Fall befindet sich der fragliche Text im Bereich 20. Um diesen Bereich zu verwenden, müssen Sie mit folgender Notation arbeiten: XY = [20.w]+10,[20.h]+4
Max. Linie
Dabei steht w für die Breite und h für die Höhe des jeweiligen Elements. Die zusätzlichen Angaben sorgen dafür, dass die Grafik 10 Pixel breiter und 4 Pixel höher wird als der eigentliche Text. Es ist nicht zwingend notwendig, beide Angaben aus dem gleichen
Bereich zu beziehen. Sie könnten also die Breite des Texts verwenden, während die Höhe von einem anderen Element, z.B. einer Grafik, stammt, die sich an Position 30 befindet.
Links
XY = [20.w]+10,[30.h]+4
Mit der im Beispiel verwendeten Einstellung ist also sichergestellt, dass längere Texte auf keinen Fall abgeschnitten werden. Das hat allerdings erst einmal zur Folge, dass sämtliche Menüeinträge verschiedene Breiten aufweisen, was eigentlich nicht dem gewünschten Ergebnis entspricht. Hier kommen nun die beiden Parameter useLargestItemX und useLargestItemY zum Einsatz. Damit stellen Sie sicher, dass die Abmessungen aller Grafiken immer denen der größten unter ihnen entsprechen. Je nachdem, wie Sie die Einträge anordnen, sollten Sie mindestens einen der Parameter auf 1 setzen. Bei vertikaler Anordnung gleicht useLargestItemX die Breite an, bei horizontaler Anordnung sorgt useLargestItemY für eine identische Höhe. Beide Parameter zusammen sind nicht notwendig, können aber hilfreich sein, wenn Sie mit Schriften arbeiten, deren Ober- und Unterlängen sich stark auf die Gesamthöhe des Eintrags auswirken.
Lizensiert für Markus Mueller
Wie Ihnen vielleicht aufgefallen ist, haben wir im Beispiel zusätzlich zum reinen Text eine Grafik namens menuback.tif mit eingebunden. Wir haben uns für eine TIF-Datei entschieden, weil diese in der Regel verlustfrei gespeichert wird, was die Qualität der durch den GIFBUILDER erzeugten Grafiken erheblich verbessert. Als Vorlage sollten Sie wenn möglich keine JPG-Daten verwenden, weil die sogenannten Artefakte, die sich durch die Komprimierung der Daten ergeben, sich im GIFBUILDER schnell vervielfachen. Die Vorgabe für die verwendete Grafik war aber, dass sie sich über das gesamte Menü erstrecken soll. Weil diese Situation für ein grafisches Menü nicht ungewöhnlich ist, gibt es dafür zwei zusätzliche Parameter namens applyTotalW und applayTotalH. Diese funktionieren nicht als Schalter, sondern als Zeiger. Sie zeigen nämlich auf das Element, das über das gesamte Menü ausgedehnt werden soll. In diesem Fall ist es das Bild in Bereich 10, folglich tragen Sie hier den Wert 10 ein. Um alles Weitere kümmert sich nun TYPO3. Sie brauchen also nicht umständlich in einem Grafikprogramm oder über die offset-Einstellung des GIFBUILDER für jeden einzelnen Menüpunkt einen eigenen Ausschnitt aus der Grafik zu bestimmen. Dies passiert automatisch, und als Ergebnis erhalten Sie eine Anzahl von einzelnen Buttons, die zusammengesetzt wieder dem Originalbild entsprechen. Der Unterschied zwischen beiden Parametern besteht darin, dass applyTotalH in erster Linie bei vertikaler Anordnung zum Einsatz kommt, während applyTotalW für horizontale Menüs verwendet wird.
Max. Linie
Sie sollten bei dieser Einstellung beachten, dass das gewählte Originalbild groß genug sein muss, um das komplette Menü abzudecken, weil ansonsten unschöne Lücken entstehen, durch die die Hintergrundfarbe zu sehen ist.
Kommen wir nun zur letzten Vorgabe, den RollOver-Grafiken. GMENU bietet hierfür im Gegensatz zum TMENU weitere Zustände, die durch das Anhängen von RO an den Originalzustand erzielt werden. Auch diese Zustände müssen explizit eingeschaltet werden. Die jeweiligen Paare von Standard- und RollOver-Zustand sind: NO
<->
RO
IFSUB
<->
IFSUBRO
ACT
<->
ACTRO
ACTIFSUB
<->
ACTIFSUBRO
CUR
<->
CURRO
CURIFSUB
<->
CURIFSUBRO
USR
<->
USRRO
USERDEF1
<->
USERDEF1RO
USERDEF2
<->
USERDEF2RO
Der Zustand SPC kennt keinen weiteren RollOver-Zustand, weil es sich hier in der Regel um einen reinen Abstandhalter ohne Link handelt. Lizensiert für Markus Mueller
Im gezeigten Beispiel haben wir zunächst den Zustand NO aktiviert. Dies ist zwar nicht nötig, hilft aber später beim Kopieren in andere Zustände, diese automatisch zu aktivieren. Der Zustand NO besteht aus einer Hintergrundfarbe #ffcc99, der bereits erwähnten TIFDatei in Ebene 10 und darüber in Ebene 20 dem eigentlichen Linktext in weißer Schrift. Nun kopieren Sie den Zustand NO in den Zustand RO, der damit automatisch aktiviert ist. Die Ebene 10 und die darin enthaltene Grafik werden danach abgeschaltet, und die Farbe des Texts wird auf Rot gesetzt. Damit Sie dies für IFSUBRO nicht wiederholen müssen, wird zum Schluss einfach der Zustand NO nur nach IFSUB kopiert, während IFSUBRO als Kopie von RO angelegt wird. Selbstverständlich können Sie für jeden der einzelnen Zustände auch eigene GIFBUILDER-Konfigurationen verwenden, anstatt die Einstellungen nur zu kopieren. So könnte es z.B. sinnvoll sein, für jeden Zustand verschiedene Farbtöne oder Helligkeitsstufen zu verwenden. Ihrer Fantasie sind dabei keine Grenzen gesetzt. Experimentieren Sie einfach ein wenig und greifen Sie dabei auf die bereits erwähnten Rezepte zum Thema GIFBUILDER zurück.
Siehe auch Lesen Sie hierzu auch das Rezept 12.11 sowie zum GIFBUILDER die Rezepte 11.8 bis 11.11, 14.6, 14.7 und zum Zustand von Menüeinträgen das Rezept 12.3.
12.17 Ein Jumpmenü als textbasiertes Menü konstruieren
Links
Problem Sie wollen ein einfaches JavaScript-Jumpmenü mit semantisch korrektem HTML-Code erzeugen. Dabei wollen Sie so weit wie möglich auf dynamische Werte und Beschriftungen zurückgreifen.
Lösung TypoScript stellt Ihnen zwar einen speziellen Menütyp namens JSMENU zur Verfügung, jedoch können Sie darin keinerlei stdWrap-Funktionen nutzen, um die Darstellung oder den Inhalt einzelner Menüeinträge zu beeinflussen. Es ist daher sinnvoller, ein solches Jumpmenü mithilfe von TMENU-Elementen zu konstruieren, weil diese Ihnen deutlich mehr Flexibilität bieten.
Lizensiert für Markus Mueller
Max. Linie
Weil in diesem Fall keine Verschachtelung zwischen einem Menüpunkt und dem jeweiligen Untermenü stattfinden darf, müssen Sie für jede Ebene ein separates Menü anlegen und mithilfe von entryLevel festlegen, ab welcher Ebene dieses dargestellt werden soll. Das folgende Beispiel geht von drei Ebenen aus, die jeweils mit einem eigenen Auswahlfeld dargestellt werden: temp.jsmenu = COA temp.jsmenu { 10 = HMENU 10 { entryLevel = 0 wrap = 1 = TMENU 1 { wrap = <select name="id" onChange="submit();">| NO = 1 NO { doNotLinkIt = 1 stdWrap.cObject = COA stdWrap.cObject { 10 = TEXT 10.data = leveltitle:0 10.dataWrap = 10.if.value = 2 10.if.isLessThan.data = register:count_HMENU_MENUOBJ 20 = TEXT 20.value = } } ACT < .NO ACT { stdWrap.cObject { 10.dataWrap = 30.dataWrap = {field:uid}" selected="selected"> } }
Diskussion Wie bereits in der Lösung erwähnt, ist die Verwendung des Menüelements JSMENU nur bedingt empfehlenswert, weil Sie dort keinerlei Möglichkeiten haben, das Standardverhalten mithilfe von stdWrap-Funktionen zu beeinflussen. Das gezeigte Beispiel geht daher von einer Reihe von TMENU-Elementen aus, die sich im Grundaufbau ähneln und lediglich über verschiedene Level-Zuweisungen auf die jeweils dazugehörige Ebene abgestimmt sind.
Lizensiert für Markus Mueller
Ein Jumpmenü besteht im Prinzip aus einem Formular, das mithilfe eines Auswahlfelds die verschiedenen Menüpunkte als Optionen auflistet. Sobald Sie einen dieser Menüpunkte ausgewählt haben, wird automatisch die entsprechende Seite geladen. Speziell bei umfangreicheren Seiten mit einer größeren Anzahl an Menüpunkten empfiehlt es sich, ein solches Jumpmenü zu verwenden, weil der Platzbedarf deutlich geringer ist als bei einer listenbasierten Darstellung mit einzelnen Links. Ein kleiner Wermutstropfen beim Einsatz von Jumpmenüs liegt in der Tatsache, dass diese nur mit aktiviertem JavaScript funktionieren. Sie sollten das Für und Wider daher genau abwägen, bevor Sie sich für ein Jumpmenü entscheiden.
Doch nun zum Aufbau des TypoScript-Codes. Sie benötigen zunächst ein Setzkastenelement COA, das Sie mit einer entsprechenden Anzahl von HMENU-Elementen füllen. Für jede Ebene, die später angezeigt werden soll, benötigen Sie eines davon. Der Aufbau dieser HMENU-Elemente ist im Prinzip identisch. Sie legen zunächst mithilfe von entryLevel fest, für welche Ebene dieses HMENU verwendet werden soll. Jedes weitere HMENU erhält dabei bezogen auf seinen Vorgänger das nächsthöhere entryLevel. Im Beispiel beginnen wir mit entryLevel=0, das nächste Menü erhält demzufolge entryLevel=1 und sein Nachfolger entryLevel=2.
Max. Linie
Da sich nur einige wenige Parameter innerhalb der jeweiligen Ebenen ändern, reicht es aus, das HMENU-Element des Hauptmenüs zu kopieren. Danach brauchen Sie nur noch die Parameter anzugeben, die sich ändern sollen. Als Wrap für das HMENU verwenden Sie den HTML-Code für ein Formular. Dieses bekommt als action lediglich index.php zugewiesen und als method die GET-Methode, damit die ID sich mithilfe des folgenden Auswahlfelds als URL-Parameter anhängen lässt.
Um später gegebenenfalls verschiedene Styles zuweisen zu können, sollten Sie diesem Feld eine eindeutige ID zuweisen. Für das erste Level ist dies in unserem Beispiel die ID level1. Weil innerhalb des Formulars für jedes Menü lediglich ein Auswahlfeld benötigt wird, können Sie diese ebenfalls mithilfe eines Wrap erzeugen. Der Name des Felds muss id lauten, weil dies der Parameter ist, der später in der URL dafür sorgt, dass die Seite mit der entsprechenden UID aufgerufen wird. 1 = TMENU 1 { wrap = <select name="id" onChange="submit();">| }
Innerhalb dieses TMENU-Elements definieren Sie nun die eigentlichen Menüeinträge zunächst mithilfe von NO. Weil es sich aber nicht um wirkliche Links handeln darf, müssen Sie den Schalter doNotLinkIt auf 1 setzen. Danach können Sie über stdWrap.cObject eine eigene Definition des Menüeintrags vornehmen.
Lizensiert für Markus Mueller
Max. Linie
NO = 1 NO { doNotLinkIt = 1 stdWrap.cObject = COA stdWrap.cObject { 10 = TEXT 10.data = leveltitle:0 10.dataWrap = 10.if.value = 2 10.if.isLessThan.data = register:count_HMENU_MENUOBJ 20 = TEXT 20.value = } }
Als cObject verwenden Sie ein Setzkastenelement COA, damit Sie darin die einzelnen Teile der option-Tags zusammenbauen können. An erster Stelle kommt dabei die Überschrift des Auswahlfelds, die den Titel der Startseite sowie deren UID mithilfe von leveltitle:0 und leveluid:0 zugewiesen bekommt. Damit stellen Sie sicher, dass der Benutzer später zum Ausgangspunkt des Menüs zurückkehren kann. Weil dieses Element nur dem ersten Menüpunkt vorangestellt werden soll, müssen Sie mit einer if-Abfrage arbeiten, die den Zustand des Zählregisters count_HMENU_MENUOBJ abfragt. Ist der Wert kleiner als 2, wird das Element abgearbeitet, für alle anderen Werte wird es ignoriert.
Die folgenden Zeilen liefern nun den eigentlichen Menüeintrag für jede Unterseite. Als Erstes wird das benötigte option-Tag eröffnet. Als value bekommt es per dataWrap die jeweilige UID der Seite zugewiesen. Es folgt nun der Text, der als Option zu lesen sein wird. Dies ist wahlweise der Navigationstitel oder der Titel der Seite, je nachdem, ob nav_ title gesetzt wurde oder nicht. Im Bereich 50 wird das option-Tag korrekt abgeschlossen. Das fertige Konstrukt liefert also folgendes HTML-Tag:
Links
Nun erzeugen Sie eine Kopie des Zustands NO als Zustand ACT und modifizieren die beiden option-Tags. Für den Fall, dass sich die dazugehörige Seite in der Rootline befindet, soll der Eintrag schließlich auch im HTML-Code als selected markiert werden. Dies ist das Ergebnis:
Die jeweiligen Auswahlfelder der einzelnen Ebenen zeigen so immer die passenden Elternseiten als ausgewählt an. Abschließend müssen Sie jetzt nur noch eine Kopie des kompletten HMENU für jede weitere Ebene erzeugen und danach die notwendigen Änderungen für die ID des formTags, entryLevel, leveluid und leveltitle vornehmen. Erhöhen Sie dazu deren bisher verwendete Werte jeweils um 1. Lizensiert für Markus Mueller
Sie erhalten auf diese Weise eine äußerst flexible Variante des Jumpmenüs und können so problemlos verschiedene zusätzliche Features wie z.B. CSS-Klassen für die einzelnen Zustände hinzufügen. In einem normalen JSMENU wäre dies nicht möglich gewesen.
12.18 TypoScript-Menüs als Standard-Setup für das Inhaltselement Menü/Sitemap hinterlegen Problem Sie wollen die Ausgabe des Inhaltselements Menü/Sitemap um weitere selbst definierte Menütypen ergänzen. Diese Menütypen sollen den Redakteuren im Auswahlfeld Menü Typ zur Verfügung stehen. Außerdem wollen Sie den neuen Einträgen in diesem Auswahlfeld entsprechende Bezeichnungen zuweisen, um die neuen Typen eindeutig zu beschreiben.
Lösung Wechseln Sie auf die Rootseite Ihrer Site und bearbeiten Sie deren Seiteninformationen. Geben Sie im Feld TS-Config folgenden Code ein:
Fügen Sie gemäß diesem Beispiel die erforderlichen Einträge hinzu, um alle neuen Menütypen zu beschreiben. Erhöhen Sie dabei den Zahlenwert nach addItems mindestens um 1. Erzeugen Sie nun in Ihrem TypoScript-Template die einzelnen Setups der neuen Menütypen und fügen Sie sie in das bereits existierenden CASE-Element im Bereich tt_content. menu.20 ein. temp.sprachMenu = COA temp.sprachMenu { # Setup für Sprachmenü # z.B. aus Rezept Spezielle Menütypen # Sprachauswahl } Lizensiert für Markus Mueller
temp.grafikMenu = COA temp.grafikMenu { # Setup für Grafikmenü # z.B. aus Rezept Grafikmenü # mit Effekten und Erweiterungen } temp.jumpMenu = COA temp.jumpMenu { # Setup für Jumpmenü # z.B. aus Rezept Jumpmenü als # textbasiertes Menü konstruieren } tt_content.menu.20 { 8 < temp.sprachMenu 9 < temp.grafikMenu 10 < temp.jumpMenu }
Dieses CASE-Element ist selbstverständlich nur dann vordefiniert, wenn Sie eines der sogenannten static Templates, also content(default) oder CSS-styledcontent, verwenden. Für alle anderen Fälle müssen Sie das Setup Ihren individuellen Gegebenheiten entsprechend anpassen.
Diskussion Wenn Sie mit dem Template-Analyzer oder dem TypoScript-Object-Browser das Setup von content(default) oder CSS-styled-content betrachten, können Sie dort recht einfach das Setup für die voreingestellten Menütypen finden. Es befindet sich im Bereich tt_content. menu. tt_content.menu selbst besteht aus einem COA, das zunächst in Bereich 10 mithilfe von lib.stdheader die übliche Standardüberschrift eines jeden Inhaltselements zugewiesen bekommt. Der folgende Bereich 20 enthält ein CASE-Element, dessen key aus dem Feld
menu_type bezogen wird. Damit ist es möglich, auf jeden der einzelnen Menütypen individuell zu reagieren und ein entsprechendes TypoScript-Setup zu definieren. Lesen Sie hierzu auch Rezept 8.3, das Ihnen die Arbeit mit den hilfreichen Tools TSOB und Template-Analyzer erläutert.
Es gibt acht bereits vordefinierte Menütypen, wobei die im Setup enthaltenen Zahlen jeweils einem der Typen entsprechen, die Sie im Backend-Formular aus einem Auswahlfeld wählen können. Lizensiert für Markus Mueller
Zur Veranschaulichung hier nochmals alle Typen und deren Nummern: 0 Menü dieser Seiten 1 Menü der Unterseiten 2 Sitemap 3 Abschnittsübersicht (mit Seiteninhalt) 4 Menü der Unterseiten (mit Inhaltsangabe) 5 Geänderte Seiten 6 Verwandte Seiten (nach Stichwörtern) 7 Menü der Unterseiten (mit Seiteninhalt) Da TYPO3 auch bei der Verwaltung von Backend-Formularen äußerst flexibel ist, können Sie mithilfe des Felds TS-Config Ihrer Rootseite festlegen, dass das Auswahlfeld, das für das Feld menu_type erzeugt wird, weitere Einträge anzeigen soll. Wechseln Sie hierzu in das Seitenmodul und klicken Sie zunächst auf die Rootseite Ihrer Site. Über den Button Seitentitel bearbeiten gelangen Sie in das Backend-Formular, in dem sich das Feld TS-Config befindet. Die Einträge für das Auswahlfeld werden folgendermaßen hinzugefügt:
Lesen Sie hierzu auch Rezept 6.5, das sich mit der Optimierung von Auswahllisten im Backend beschäftigt.
Tragen Sie hier nun für jedes Menü, das Sie hinzufügen möchten, einen Zahlenwert ein und geben Sie ihm ein passendes Label. Da es bereits acht Einträge gibt, die bei 0 beginnen, muss der kleinste neue Wert mindestens 8 lauten. In unserem Beispielcode haben wir drei neue Menütypen angelegt, um ein Sprachmenü, ein Grafikmenü und ein Jumpmenü zur Verfügung zu haben.
Speichern Sie nun das Formular und erzeugen Sie mithilfe des Elements Menü/Sitemap ein neues Menüelement auf einer Ihrer Seiten. Sie sollten im Auswahlfeld bereits die drei neuen Menütypen vorfinden. Nun gilt es, diese neuen Menütypen zum Leben zu erwecken, denn noch gibt es in Ihrem TypoScript-Setup nur die bisherigen acht Varianten und ein Aufruf der Seite würde Ihnen lediglich das Default-Menü präsentieren, das immer dann verwendet wird, wenn keine Definition für den jeweiligen Menütyp vorliegt. Erzeugen Sie hierzu auf Basis eines der vielfältigen Rezepte dieses Kapitels die drei Setups für die Menütypen oder lassen Sie Ihrer Kreativität freien Lauf und erstellen Sie ein paar eigene TypoScript-Setups. In unserem Beispielcode haben wir dazu lediglich die Platzhalter temp.sprachMenu, temp.grafikMenu und temp.jumpMenu angelegt, die Sie selbstständig mit Inhalt füllen müssen. Um sicherzustellen, dass die neuen Menütypen auch das Feld Startpunkt des Elements Menü/Sitemap berücksichtigen, sollten Sie den Startpunkt in Ihrem TS-Setup mithilfe von special = directory oder special = list festlegen. Der Wert dafür wird dann mithilfe von special.value.field = pages ausgelesen. Mehr dazu sagt Ihnen Rezept 12.1.
Ab sofort können Sie die neuen Menüelemente ganz einfach und komfortabel mithilfe des Elements Menü/Sitemap einbinden. Auf ähnliche Weise können Sie auch weitere Elemente für andere Felder einfügen, die im Backend mithilfe eines Auswahlfelds dargestellt und im TypoScript-Setup über ein CASE-Element ausgewertet werden. Neben zusätzlichen Überschriftentypen oder verschiedenen Layouts für Tabellen lassen sich sogar neue Inhaltselemente auf diese Weise konfigurieren und nutzen.
Wie wir bereits in Kapitel 10 erwähnt haben, unterscheidet TypoScript zwei Kategorien von Inhaltselementen: Toplevel Objects, mit denen Sie die Ausgabe für verschiedene Medien vorbereiten und das entsprechende Grundgerüst für die eigentlichen Inhalte erzeugen, sowie die sogenannten Content Objects oder auch cObjects, also Elemente, die irgendetwas mit der Ausgabe und Strukturierung von Inhalten zu tun haben. Eine Gruppe davon haben wir bereits in Kapitel 11 behandelt, weil diese Elemente als Grundlagen für die folgenden Kapitel und Rezepte dienen. Ein spezielles Element, nämlich das Element HMENU, wird im separaten Kapitel 12 erläutert, weil es die Grundlage für sämtliche Navigationselemente bildet. In diesem Kapitel werden wir uns nun mit den eigentlichen inhaltsbezogenen TypoScript-Elementen beschäftigen. Dabei handelt es sich um Elemente, die vor allem dazu benutzt werden, Daten auszulesen, für bestimmte Anwendungsbereiche aufzubereiten und zu formatieren. In erster Linie wird dabei auf die Tabelle tt_content und teilweise auch auf die Tabelle pages zugegriffen, jedoch können Sie auch Daten anderer Tabellen mithilfe dieser Elemente ausgeben. Dies ist vor allem dann hilfreich, wenn Sie TypoScript-Elemente dazu verwenden, die Ausgabe eigener Extensions zu konfigurieren. Hierzu ein wichtiger Hinweis: Verwechseln Sie diese TypoScript-Elemente auf keinen Fall mit den Inhaltselementen, die ein Redakteur im Backend anlegt!
Max. Linie
Ein Inhaltselement vom Typ Text muss nicht zwangsläufig mit einem TypoScript-Element TEXT ausgegeben werden, der Typ Bild nicht unbedingt mit IMAGE und der Typ Text mit Bild nicht ohne Weiteres mit IMGTEXT. Welche TypoScript-Elemente letztlich für die Ausgabe der Inhaltselemente verantwortlich sind, entscheiden Sie selbst.
Links Wenn Sie mit content(default) oder CSS-styled-content arbeiten, befinden sich darin zwar schon klare Zuweisungen verschiedener TypoScript-Blöcke zu den jeweiligen Inhaltselementen, jedoch stellen diese immer nur eine der vielen verschiedenen Möglichkeiten dar, den Inhalt nach Ihren Wünschen für die Ausgabe zu formatieren.
In den Rezepten dieses Kapitels und im folgenden Kapitel werden wir Ihnen weitere Möglichkeiten aufzeigen und dabei hin und wieder unkonventionelle Methoden verwenden, die sich eben diese Flexibilität zu Nutze machen. Dazu werden wir sowohl einfache Beispiele als auch komplexere Lösungen anbieten, die teilweise auf Informationen basieren, die Sie in den vorhergehenden Kapiteln finden können. Es wäre also speziell für TypoScript-Neulinge empfehlenswert, zuerst diese Grundlagenrezepte zu lesen, bevor sie sich an diesem Kapitel versuchen. Zu jedem der inhaltsbezogenen TypoScript-Elemente finden Sie mindestens ein Rezept, wobei wir die Reihenfolge der Elemente dabei aus Gründen der Übersicht der aktuellen TSref angepasst haben. • Ein einfaches Beispiel für das Element TEXT finden Sie in Rezept 13.1. Lizensiert für Markus Mueller
• Die Elemente IMAGE und IMG_RESOURCE werden in den Rezepten 13.2, 13.3 und 13.4 behandelt. • Anwendungsbeispiele für das Element CONTENT befinden sich in den Rezepten 13.5 und 13.6. • Wie Sie mit dem Element RECORDS arbeiten, erfahren Sie in den Rezepten 13.7 und 13.8. • Zum Element IMGTEXT können die Rezepte 13.3 und 13.4 hilfreich sein. • Dem Element CASE widmet sich Rezept 13.9. • Zwei Varianten des Elements FORM zeigen wir Ihnen in den Rezepten 13.10 und 13.11. • Das Element TEMPLATE für die Verwendung von HTML-Vorlagen wird in Rezept 13.12 erklärt. Einige zu dieser Gruppe gehörigen TypoScript-Elemente haben wir in diesem Kapitel nicht mehr berücksichtigt, weil diese entweder als deprecated markiert sind oder in Hinblick auf XHTML-konforme Ausgabe nicht mehr verwendet werden sollten. Sie finden daher keine Rezepte für CLEARGIF, CTABLE, OTABLE, COLUMNS, HRULER, PHP_SCRIPT, PHP_SCRIPT_INT und PHP_SCRIPT_EXT. Diese Elemente lassen sich jedoch bei Bedarf hervorragend durch die korrekte Anwendung der verbleibenden Elemente ersetzen.
13.1 Textbausteine in der Seite fest verankern Problem Sie wollen statischen HTML-Code (z.B. für Banner von Drittanbietern oder andere unveränderliche Textbausteine) fest in der Seite verankern, damit dieser von Ihren Redakteuren auf keinen Fall verändert werden kann.
Lösung Verwenden Sie das cObject TEXT mit runden Klammern. Dieser Code kommt in Ihr TS-Setup:
Lizensiert für Markus Mueller
temp.myText = TEXT temp.myText { value (
Überschrift
### ein wenig Bannercode ###
) }
oder temp.myText = TEXT temp.myText { value ( Das ist ein mehrzeiliger Textbaustein, der exakt wie hier eingegeben übernommen wird ) }
und dieser z.B. ins TS-Setup Ihrer Seite: marks.MYTEXT < temp.myText
Diskussion Es kommt häufig vor, dass bei der Ausgabe einer Webseite an bestimmten Stellen fest verdrahteter Code oder Text eingebaut werden muss. Damit dieser nicht von Redakteuren überschrieben werden kann, empfiehlt es sich, ihn direkt ins TS-Setup der Seite einzubauen.
Max. Linie
Dazu verwenden Sie in der Regel das cObject TEXT. Es existiert zwar auch ein weiteres cObject namens HTML, es ist aber sinnvoller, mit dem TEXT-Objekt zu arbeiten. Der Grund hierfür liegt in der effektiveren Verwendung der stdWrap-Funktionen.
Während das cObject HTML nur die Eigenschaft value+stdWrap kennt, können Sie value und stdWrap beim cObject TEXT separat verwenden, was das Arbeiten damit erheblich komfortabler macht. Weitere Unterschiede zwischen beiden cObjects gibt es nicht.
Links
Bei obigen Beispielen fällt Ihnen vielleicht auf, dass wir eine andere als die sonst übliche Schreibweise verwendet haben. Wo Sie sonst mit einem =-Zeichen und/oder geschweiften Klammern arbeiten, fehlt dieses Zeichen nun, und es gibt zusätzliche runde Klammern: temp.myText = TEXT temp.myText { value ( Hier haben wir einen Text ) }
anstatt wie bisher temp.myText = TEXT temp.myText.value = Hier haben wir einen Text
oder Lizensiert für Markus Mueller
temp.myText = TEXT temp.myText { value = Hier haben wir einen Text }
Diese Schreibweise ermöglicht es Ihnen, den Text oder Code exakt in der vorgegebenen Formatierung auszugeben, also mit sämtlichen Zeilenschaltungen und Leerzeichen am Anfang der jeweiligen Zeilen. Bei HTML-Code sorgt diese Schreibweise somit für eine sauber strukturierte Ausgabe. Bei reinem Text werden so Zeilenschaltungen mit übernommen, die wir bei einem echten Content-Element z.B. aus dem Rich Text Editor (RTE) erhalten hätten. Das mag Ihnen nicht sofort sinnvoll erscheinen, weil sich an der Anzeige des HTMLCodes in den jeweiligen Browsern eigentlich nichts ändert, aber spätestens bei einem Debug des von TYPO3 erzeugten Quellcodes einer Seite werden Sie diese Form der Darstellung zu schätzen lernen.
13.2 Bild auf jeder Seite anzeigen Problem
Max. Linie
Sie möchten ein Headerbild auf allen Seiten einbinden. Um den Arbeitsaufwand zu verringern, sollen alle Seiten, denen kein Headerbild zugeordnet wird, automatisch das Headerbild der übergeordneten Seite anzeigen.
Diskussion Um ein Headerbild mit einer Seite zu verknüpfen, nutzen Sie das Feld Dateien. Dieses Feld erreichen Sie über den Dialog Seiteneigenschaften bearbeiten im Kontextmenü einer Seite. Dort können Sie Headerbilder auswählen, die Sie zuvor im Dateibereich abgelegt haben. Auch die direkte Auswahl einer Datei von Ihrer Festplatte ist möglich. Das Feld ist allerdings nur sichtbar, wenn die Seite vom Typ Erweitert ist. Rezept 3.3 erklärt, wie Sie dieses Feld auch in anderen Seitentypen nutzen können. Seit TYPO3-Version 4.2 wurden die Seitentypen Standard und Erweitert zu einem einzigen Seitentyp Standard zusammengefasst. Dort befindet sich das Feld Dateien im Reiter Ressourcen. Sie müssen daher nur auf Erweitert umstellen, wenn Sie eine Vorgängerversion benutzen.
Um nun das Dateien-Feld der aktuellen Seite auszulesen, benutzen Sie die levelmediaOption des getText-Datentyps. Die data-Eigenschaft der stdWrap-Funktion ist dafür das geeignete Mittel, denn data ist vom Datentyp getText:
Max. Linie
temp.headerbild = COA temp.headerbild { 10 = TEXT 10 { data = levelmedia: -1
Dieses Objekt würde die Zeichenfolge headerbild1.jpg zurückliefern. Sind im Dateien-Feld mehrere Dateien vorhanden, können Sie mithilfe der listNum-Eigenschaft eine bestimmte Datei auswählen. Beachten Sie, dass das erste Element hier mit 0 angesprochen wird. Mit listNum = 1 würden Sie also die Zeichenfolge headerbild2.jpg zurückgeliefert bekommen. Bisher wird Ihnen allerdings nur der Name der Datei für das Headerbild zurückgeliefert. Damit das Headerbild als Bild auf Ihrer Webseite angezeigt wird, verwenden Sie ein IMAGE-Objekt. Dieses Objekt verwendet zur Auswahl der anzuzeigenden Datei über seine file-Eigenschaft die Funktion imgResource. Deren import-Funktion kann wiederum mithilfe von stdWrap erweitert werden, sodass Sie an dieser Stelle Ihr Konstrukt zum Auslesen des Bildnamens aus dem Dateien-Feld einbetten können. Die Angabe des Pfads wrap = uploads/media/ |
ist notwendig, da TYPO3 beim Auswählen einer Datei im Feld Dateien eine Kopie im Verzeichnis uploads/media anlegt. Um das erzeugte Bild mit einem sinnvollen Alternativtext versehen zu können, erweitern Sie die altText-Eigenschaft mithilfe von stdWrap. Nun wird der Inhalt des Felds subtitle der aktuellen Seite als Alternativtext verwendet. Lizensiert für Markus Mueller
Da Sie in diesem Beispiel ein Headerbild einbinden möchten, wäre es hilfreich, wenn Sie dieses nur auf Hauptseiten einbinden müssten und es dann von den Unterseiten übernommen würde. Dazu erweitern Sie die levelmedia-Option um die Option slide. Denn data = levelmedia: -1
allein würde nur den Namen einer Datei zurückliefern, die im Dateien-Feld der aktuellen Seite eingebunden ist. Wenn dort keine Datei gefunden wird, würde also kein Headerbild angezeigt werden. Die slide-Option sorgt nun dafür, dass bei einem leeren Ergebnis so lange das Dateien-Feld der übergeordneten Seiten durchsucht wird, bis eine Datei gefunden oder die unterste Ebene erreicht wird. Lesen Sie hierzu auch Rezept 10.2, das sich mit den getText-Funktionen des stdWrap-Baukastens beschäftigt. Um sicherzustellen, dass auch dann ein Headerbild angezeigt wird, wenn nirgendwo eine Datei eingebunden wurde, definieren Sie mit value eine Standarddatei. Diese Standarddatei überschreiben Sie mithilfe der stdWrap-Eigenschaft override. Eine weitere stdWrapEigenschaft, required, sorgt dafür, dass der Standardwert nur dann überschrieben wird, wenn levelmedia auch tatsächlich etwas zurückliefert.
einheitliche PDF-Bedienungsanleitung für mehrere Produkte der gleichen Serie, die alle im gleichen Seitenbaum eingeordnet sind.
13.3 Klick-Vergrößern mithilfe eines separaten Lupen-Icons realisieren Problem Sie benutzen auf Ihren Seiten die Inhaltselemente Bild und/oder Text mit Bild. Damit die Besucher Ihrer Seite die Bilder ausgiebig bewundern können, haben Sie die Option Klick vergrößern aktiviert. Sie wollen allerdings, dass eine Lupe eingeblendet wird, auf die der Benutzer klicken muss, um die Vergrößerung zu aktivieren. Diese Lupe soll als Icon unterhalb des Bilds dargestellt und eine eventuell vorhandene Bildunterschrift rechts daneben eingerückt werden. Der sonst übliche Link für einen Klick direkt auf das Bild soll weiterhin bestehen bleiben. Lizensiert für Markus Mueller
Lösung Verändern Sie die Ausgabe von tt_content. Verwenden Sie dazu im imageLinkWrap den Parameter typolink zusammen mit dem Element IMG_RESOURCE. Der folgende Code funktioniert ausschließlich mit CSS-styled-content ab Version 0.3.1 und den TYPO3-Versionen ab 4.x.
Im TS-Setup Ihrer Seite verwenden Sie weiterhin wie gewohnt: page = PAGE page.10 < styles.content.get
Diskussion
Lizensiert für Markus Mueller
TYPO3 bietet beim Einsatz der Elemente Bild und Text mit Bild im Backend-Formular die Möglichkeit, das sogenannte Klick vergrößern zu aktivieren. Bei der Ausgabe der Seite wird hierbei ein Link um jedes Bild gelegt, der bei einem Klick ein Pop-up-Fenster mit einer vergrößerten Ansicht des Bilds öffnet. Die Größe des Bilds ist dabei frei wählbar. Wenn sie nicht explizit angegeben wurde, entspricht sie entweder der Größe des Originalbilds oder der vordefinierten maximalen Größe von 800 x 600 Pixeln. Ein kleines Manko hat dieses an sich recht nützliche Feature dennoch, denn es ist für den Besucher der Site nicht direkt erkennbar, dass eine solche Funktion existiert. Daher besteht ein oftmals in den Newsgroups geäußerter Wunsch darin, die Möglichkeit zum Vergrößern mit einem Lupensymbol anzuzeigen. In unserem Codebeispiel haben wir uns entschieden, dieses Symbol außerhalb des Bilds direkt vor der Bildunterschrift zu platzieren. Auch wenn keine Bildunterschrift vorhanden ist, wird zumindest für jedes Bild ein Lupensymbol gerendert, sobald die Option Klick vergrößern im Backend aktiviert ist. Laden Sie hierzu zunächst die Bilddatei für die Lupe in den Bereich fileadmin. In unserem Beispiel heißt sie zoom.gif. Um diese Datei nun als Bild vor der Bildunterschrift zu platzieren, müssen Sie im Bereich tt_content.image.20 die Sektion caption.1 erweitern. Da diese Lösung nur mit CSS-styled-content funktioniert, reicht es aus, das Setup für tt_content.image zu modifizieren, weil für den Bereich tt_content. textpic eine Referenz von tt_content.image verwendet wird, die sämtliche Änderungen automatisch berücksichtigt.
Um sicherzustellen, dass die Lupe nur bei aktiviertem Klick vergrößern angezeigt wird, fügen Sie nun eine if-Abfrage ein. Ein einfaches isTrue reicht hier aus. Es folgen ein Wrap, der eine Leerstelle zwischen Bildunterschrift und Lupe einfügt, sowie die eigentliche Angabe des Pfads zur Bilddatei für die Lupe. Damit wären Sie schon in der Lage, ein Lupensymbol anzuzeigen, jedoch gäbe es noch keinen Link um die Lupe selbst, und der Betrachter müsste weiterhin direkt auf das Bild klicken. Daher benötigen Sie den Parameter imageLinkWrap, mit dessen Hilfe TYPO3 automatisch Links für die Verwendung mit Bildern erzeugt.
Lizensiert für Markus Mueller
Um diesen Parameter zu aktivieren, müssen Sie sowohl den Parameter selbst als auch innerhalb des Parameters dessen Unterparameter enable auf 1 setzen.
Der eigentliche Link innerhalb von imageLinkWrap wird nun mithilfe der stdWrap-Funktion typolink erzeugt. Lesen Sie hierzu auch Rezept 10.7. Diese Funktion hat die nützliche Eigenschaft, Dateinamen als solche erkennen zu können, und erzeugt dabei einen direkten Link zur angegebenen Datei. Da sie als zweiten Parameter nicht nur ein Target, sondern auch die Größe eines Fensters als [Breite]x[Höhe] akzeptiert, ist es relativ einfach, ein Pop-up-Fenster zu erzeugen, in dem ein dynamisch erzeugtes Bild angezeigt wird. Da Sie hier direkt auf die Datei verlinken und nicht auf eine komplett neue Seite mit dem Bild als Inhalt, müssen Sie das Fenster immer ein wenig größer machen als die gewünschte Datei, weil ein Styling mithilfe von CSS dabei nicht möglich ist. imageLinkWrap = 1 imageLinkWrap { enable = 1 typolink.parameter = pfad/bilddatei.jpg 420x320 }
Option import zurückgreifen, um den Namen der Bilddatei, die sich im Pfad uploads/pics/ befindet, aus dem Feld image zu beziehen.
Links
Da sich darin mehrere kommaseparierte Dateinamen befinden können, müssen Sie das Feld mithilfe von listNum auswerten. Die zu verwendende Nummer lesen Sie dabei über stdWrap.data aus dem Register IMAGE_NUM aus, das in CSS-styled-content per Default als Zählregister für Bildserien verwendet wird. So erhalten Sie immer die Datei, die bereits als Originaldatei für die Erzeugung des Bilds verwendet wurde, auf das sich die Lupe beziehen soll. Die Maße des Bilds sind in unserem Beispiel auf ein Maximum von 400 x 300 Pixeln begrenzt. Der hierfür erforderliche Spezialwert, der dazu dient, anstatt eines einfachen Targets ein passendes Pop-up-Fenster zu erzeugen, wird nun mithilfe von stdWrap.noTrimWrap an den bereits bestehenden Wert in typolink.parameter angehängt.
So erzeugen Sie auf dynamische Weise einen ähnlichen Eintrag wie den im vorigen Beispiel gezeigten. Damit ist das Setup für den Link um die Lupe fertig gestellt, und Sie können diese ab sofort durch das einfache Aktivieren der Option Klick vergrößern darstellen lassen.
13.4 Vergrößerte Bilder mit Copyright-Vermerk versehen Problem Sie benutzen auf Ihren Seiten die Inhaltslemente Bild und/oder Text mit Bild. Damit die Besucher Ihrer Seite die Bilder ausgiebig bewundern können, haben sie die Option Klick vergrößern aktiviert.
Max. Linie
Um sicherzugehen, dass die vergrößerten Bilder nicht ohne Weiteres auf fremden Seiten verwendet werden können, wollen Sie diese mit einem Copyright-Vermerk versehen. Dieser soll direkt in das Bild integriert werden.
Lösung Verändern Sie die Ausgabe von tt_content. Verwenden Sie dazu im imageLinkWrap den JSwindow-Parameter altUrl zusammen mit den Elementen IMG_RESOURCE und GIFBUILDER. Dieser Code kommt in Ihr TS-Setup:
Bilderklau ist nicht nur im Bereich der Dating-Communities ein beliebtes Hobby mancher Zeitgenossen. Damit Sie das automatisierte Verwenden von Bildern Ihrer Site durch andere Anbieter unterbinden können, empfiehlt es sich, verwertbare, hochauflösende Ansichten mit einem Copyright-Vermerk oder sogar einem Wasserzeichen zu versehen. Das verhindert zwar nicht den eigentlichen Diebstahl, macht es aber im Zweifelsfall recht einfach, die Herkunft des Originalbilds nachzuweisen, wenn dieses nicht manuell nachbearbeitet wurde. Um eine solche Markierung in die vergrößerten Ansichten der Elemente vom Typ Bild oder Text mit Bild einzubauen, müssen Sie die ursprüngliche Arbeitsweise des Parameters imageLinkWrap verändern. Normalerweise wird hier das gleiche Originalbild verwendet, das bereits im eigentlichen Inhalt zu sehen ist. Lediglich die Größe ist veränderbar, und das umschließende body-Tag kann mit ein paar Styles versehen werden. Daraus entsteht beim Klick auf das Bild im Inhalt ein Pop-up-Fenster, das eine minimale HTML-Seite mit der vergrößerten Ansicht enthält.
Lizensiert für Markus Mueller
Damit Sie die Markierung in das Bild einfügen können, benötigen Sie aber zumindest ein GIFBUILDER-Objekt, das hier auf den ersten Blick nicht verfügbar zu sein scheint. Auf den zweiten Blick fällt jedoch auf, dass der Parameter JSwindow im imageLinkWrap über einen Unterparameter altUrl verfügt. Dieser ist eigentlich dafür vorgesehen, eigene HTML-Seiten anstatt des vergrößerten Bildes anzuzeigen, beispielsweise Informationen über einen Hersteller beim Klick auf ein Logo. Da eine URL aber nicht nur auf eine HTML-Datei, sondern auch direkt auf ein Bild verweisen kann, bietet es sich an, hier das gewünschte Bild zu erzeugen. Erfreulicherweise verfügt altUrl über stdWrap-Eigenschaften, sodass Sie mit einem cObject arbeiten können. Weil es nur um den Pfad des Bilds und nicht um ein komplettes img-Tag geht, benötigen Sie als cObject das Element IMG_RESOURCE. imageLinkWrap { width = 800m height = 600m JSwindow { altUrl { cObject = IMG_RESOURCE cObject { file = meinBild } } } }
Max. Linie
Mit den Parametern width und height bestimmen Sie die Größe des Pop-up-Fensters. Das m am Ende der Angaben bewirkt eine proportional korrekte Anpassung des Fensters an das Seitenverhältnis des Originalbilds.
Rechts Sorgen Sie dafür, dass die Originalbilder mindestens in der Auflösung hochgeladen werden, die Sie hier als maximale Auflösung verwenden, weil sich das Fenster sonst automatisch der kleineren Auflösung des Originals anpasst und damit nur ein Teil der Vergrößerung sichtbar wäre!
file = meinBild liefert den eigentlichen Inhalt des Fensters. Mit dem folgenden Code
wird dieses Bild erzeugt. Für eine weitergehende Erläuterung der GIFBUILDER-Funktionen sollten Sie sich gegebenenfalls die Rezepte zum Thema in Kapitel 11 durchlesen.
In der ersten Zeile wird die Größe des neuen Bilds der des Originalbilds angepasst, das im Folgenden als Objekt 10 eingefügt wird. Das Format des Bilds sollte aus Qualitätsgründen jpg sein, es sei denn, Sie haben Ihr TYPO3-System auf die Ausgabe von png- anstatt gif-Dateien umgestellt. In diesem Fall könnten Sie auf die format-Angabe verzichten.
Um das Originalbild zu verwenden, das als Auslöser für das Pop-up-Fenster diente, setzen Sie dieses mithilfe von import.current = 1 als Quelle ein. Danach geben Sie ihm die gleichen Maße, die Sie zuvor beim Fenster verwendet haben. Mit diesem Code tt_content.textpic.20 < tt_content.image.20
überschreiben Sie den ursprünglichen imageLinkWrap des Elements Text mit Bild mit dem soeben erzeugten und können ihn danach über styles.content.get verwenden.
13.5 Inhalt einer Seite und ihrer Unterseiten zusammenfassen
Links
Problem Sie möchten die Inhalte bestimmter Seiten und ihrer Unterseiten in einer einzigen Ausgabeseite zusammenfassen. Damit könnten Sie z.B. dem Besucher der Seiten eine kompakte Druckversion anbieten, ohne dass dieser sich dazu auf jede einzelne Unterseite bewegen muss, um dort einen separaten Ausdruck vorzunehmen.
Lösung Verwenden Sie das TypoScript-Element CONTENT und verschachteln Sie es über mehrere Ebenen, indem Sie dem entsprechenden renderObj jeweils ein weiteres CONTENTElement zuweisen. Das übergeordnete CONTENT-Element liefert dabei die UID der Seiten, von denen jeweils weitere Unterseiten und/oder deren Inhaltselemente verwendet werden. Lizensiert für Markus Mueller
Max. Linie
temp.kumulierterInhalt = COA temp.kumulierterInhalt { 10 = TEXT 10.field = title 10.wrap =
Diskussion Eines der wichtigsten TypoScript-Elemente ist das CONTENT-Element, mit dem Sie Inhalte aus verschiedenen Tabellen der Datenbank auslesen und anschließend für die Ausgabe formatieren können. CONTENT verfügt dabei neben wrap und zusätzlichen stdWrap-Funktionen über drei Hauptbereiche, mit deren Hilfe Sie exakt festlegen können, welche Inhalte verwendet werden und aus welcher Tabelle diese stammen sollen. Mithilfe der Eigenschaft table legen Sie zunächst die Tabelle fest, aus der die jeweiligen Inhalte geholt werden sollen. Erlaubt sind dabei die Tabelle pages sowie alle Tabellen, deren Tabellennamen mit einem der folgenden Präfixe versehen ist: tt_ Lizensiert für Markus Mueller
tx_ ttx_ fe_ user_ Mithilfe der Eigenschaft select konfigurieren Sie die eigentliche SQL-Abfrage. select verfügt hierzu über weitere Parameter, von denen wir in diesem Rezept nur pidInList und orderBy benötigen. Per pidInList können Sie einen oder mehrere UID-Werte in einer kommaseparierten Liste angeben, um die Seiten, von denen der Inhalt geholt werden soll, festzulegen. Da pidInList über stdWrap-Eigenschaften verfügt, ist es sogar möglich, diese kommaseparierte Liste mithilfe von TypoScript dynamisch zu erzeugen. pidInList.cObject = COA pidInList.cObject { 10 = TEXT 10.field = uid 20 = TEXT 20.dataWrap = ,{GPvar:meineURLParameter} }
Max. Linie
Achtung! Sollten Sie keinerlei Angaben zu pidInList machen, wird als Default this – sprich die UID der aktuellen Seite – eingefügt. Ein Löschen oder vollständiges Ignorieren von pidInList ist daher nicht möglich.
Der Parameter orderBy wiederum legt das Sortierkriterium fest. In unserem Beispiel wird nach dem Wert des Felds sorting sortiert. Das bedeutet, dass die Ausgabe exakt in der Reihenfolge stattfindet, in der die Inhalte im Backend aufgelistet werden.
Links
Mithilfe von renderObj legen Sie die Formatierung der Ausgabe fest. Erlaubt sind hier sämtliche TypoScript-cObjects. In der Regel empfiehlt es sich, hier mit einem COA zu arbeiten, weil Sie damit sicherstellen, dass Sie später notfalls zusätzliche Werte und Felder zur bestehenden Ausgabe hinzufügen können. Wenn Sie kein spezielles renderObj angeben, wird die Default-Einstellung für die gewählte Tabelle verwendet, wie sie z.B. innerhalb von CSS-styled-content festgelegt wird. In unserem Beispiel wird zuerst eine Überschrift erzeugt, die den Titel der aktuellen Seite ausgibt. Danach folgt ein erstes CONTENT-Element, das die Inhaltselemente der aktuellen Seite aus der Tabelle tt_content ausliest. Da, wie bereits erwähnt, pidInList als Default die aktuelle Seite verwendet, wird in diesem Fall keine explizite Angabe benötigt. Bis hierhin entspricht die Ausgabe der üblichen Vorgehensweise, wie sie bei CSS-styledcontent zum Einsatz kommt. Doch nun kommen wir zum interessanten Teil des Beispiels.
Lizensiert für Markus Mueller
Wie bereits erwähnt, können Sie mithilfe von CONTENT auch auf andere Tabellen als tt_content selbst zugreifen. Da die Aufgabe lautete, die Inhalte der Unterseiten mit auszugeben, müssen Sie also zunächst auf die Tabelle pages zugreifen. Auch hier können Sie auf die Angabe von pidInList zunächst verzichten, weil nur Unterseiten der aktuellen Seite verwendet werden sollen. Sortiert wird ebenfalls nach dem Wert des Felds sorting. An dieser Stelle kommt nun erstmalig ein renderObj zum Einsatz, damit Sie erst auf den Titel der ausgewählten Seite und dann auf deren Inhalt zugreifen können. Das verwendete Element ist ein COA, das im Bereich 10 mit einem einfachen TEXT-Element versehen wird, mit dessen Hilfe das Feld title in einer Überschrift zweiten Grads verpackt wird. Der eigentliche Trick dieses Rezepts liegt im Bereich 20 des COA, denn hier wird ein weiteres CONTENT-Element verschachtelt. Weil in diesem Fall die UID der jeweiligen Unterseite und nicht etwa die der aktuellen Seite als PID verwendet werden soll, wird pidInList mithilfe von field = uid gefüllt. Mit diesem Trick sorgen Sie dafür, dass die Inhalte der Reihe nach aus den Unterseiten der aktuellen Seite ausgelesen werden und als Überschrift den Titel der jeweiligen Unterseite erhalten. Wenn Sie diesen Code für die Ausgabe sämtlicher Inhaltselemente verwenden, sollten Sie beachten, dass für eventuell verwendete Elemente vom Typ Menü/Sitemap immer manuell ein expliziter Ausgangspunkt gesetzt werden muss. Ohne die Angabe eines Ausgangspunkts verwendet TYPO3 nämlich auch dafür die aktuelle Seite als Default, was zu unerwünschten Ergebnissen führen kann.
Max. Linie
Abschließend zeigen wir Ihnen noch ein Beispiel für eine tiefer gehende Verschachtelung, die zwei weitere Unterebenen in die Ausgabe mit einbezieht.
Aus Gründen des Komforts haben wir in diesem Fall ein weiteres temp-Objekt namens unterseiten angelegt, das Sie mehrfach wiederverwenden können, indem Sie es an die richtige Stelle kopieren. temp.unterseiten = CONTENT temp.unterseiten { table = pages select { pidInList.field = uid orderBy = sorting } renderObj = COA renderObj { 10 = TEXT 10.field = title 10.wrap =
Durch den Einsatz des zusätzlichen temp-Objekts können Sie beliebig viele Ebenen hinzufügen, ohne dabei jedes Mal den vollständigen Code eingeben zu müssen. Der Inhalt von temp.unterseiten wird einfach in den Bereich 30 des übergeordneten COA kopiert. Danach müssen Sie ab der zweiten Ebene lediglich den Bereich 10 des renderObj modifizieren, damit die Überschriften den zur entsprechenden Ebene passenden Grad bekommen.
Links
13.6 Inhaltselemente mit optionSplit verpacken Problem Sie wollen per optionSplit festlegen, dass je nach Position eines Inhaltselements auf der Seite ein bestimmter Wrap verwendet werden soll. Damit wollen Sie ein komplexeres Layout realisieren, bei dem z.B. das erste Element die komplette Seitenbreite einnimmt, gefolgt von drei kleineren Elementen, die sich über drei Spalten erstrecken. Die restlichen Elemente sollen darunter zweispaltig aufgebaut werden. Zudem sollen Ihre Redakteure weiterhin individuelle Rahmen vergeben können.
Lösung Lizensiert für Markus Mueller
Max. Linie
Verwenden Sie das TypoScript-Element COA zusammen mit den stdWrap-Funktionen outerWrap und split. Dieser Code kommt in Ihr TS-Setup: tt_content { stdWrap.outerWrap = |###SPLITTER### } temp.splittedElements = COA temp.splittedElements { 10 < styles.content.get stdWrap.split { token = ###SPLITTER### cObjNum = 1||2||3||4|*|5||6|*|7||8 1.current = 1 1.wrap =
und im TS-Setup Ihrer Seite verwenden Sie diesen Code: page = PAGE page.typeNum = 0 page.10 < temp.splittedElements
Diskussion Lizensiert für Markus Mueller
Das optionSplit-Konzept ist sicherlich eines der effektivsten Werkzeuge, wenn es darum geht, komplexe Menüstrukturen zu erstellen. Mit seiner Hilfe lassen sich bestimmte Abfolgen immer wiederkehrender Parameter realisieren. Diese vereinfachen es erheblich, einem einzelnen Element abhängig von seiner Position im Menü alle nur denkbaren Eigenschaften zuzuweisen. Jeder, der schon einmal mit optionSplit in Menüs gearbeitet hat, stellt sich irgendwann zwangsläufig folgende Fragen: Gibt es das nicht auch für Content-Elemente? – Kann ich einem Content-Element abhängig von seiner Position auf der Seite bestimmte Eigenschaften zuweisen? – Die Antwort lautet: Ja! Bevor Sie jetzt die Extension TemplaVoila installieren, greifen Sie doch einfach zu einer selten beachteten, aber äußerst mächtigen Funktion aus dem stdWrap-Baukasten: Ihr Name ist split. Das Prinzip von split ist recht einfach und vergleichbar der PHP-Funktion explode. Zugewiesener Inhalt wird nach einem bestimmten Trennzeichen (oder auch einem ganzen String) durchsucht. Nach einer Anzahl von x Trennzeichen ergeben sich so x+1 Elemente, die separat bearbeitet werden können. Außerdem verfügt diese Funktion über genau das gewünschte optionSplit-Konzept, das Sie bereits von den TypoScript-Menüelementen her kennen. Lesen Sie hierzu auch Rezept 10.4, in dem wir unter anderem die Funktionsweise von split erläutern.
Max. Linie
Damit diese Funktion auf den kompletten Inhalt einer Seite angewendet werden kann, benötigen Sie zunächst einen Trenn-String. Es empfiehlt sich, wirklich einen String zu verwenden und kein einzelnes Zeichen, weil damit nahezu ausgeschlossen werden kann, dass die Trennung an einer unerwünschten Stelle erfolgt. Im Beispiel haben wir den String ###SPLITTER### verwendet. Der folgende Code erzeugt nach jedem Content-Element für content(default) oder CSS-styled-content diesen Trenn-String.
Der Grund, warum Sie hier am besten mit outerWrap arbeiten, ist, dass innerhalb von styles.content.get bereits mit mehreren Wraps gearbeitet wird. Mit dataWrap werden die Anker für die Elemente eingefügt und mit innerWrap die Rahmen, die die Redakteure für jedes Element auswählen können. Somit stellen Sie durch die Verwendung von outerWrap sicher, dass der Trenn-String wirklich nach einem Element eingefügt wird und nicht mittendrin. Im nächsten Schritt wird der gesamte Inhalt der Spalte normal einem COA-Setzkasten zugewiesen: temp.splittedElements = COA temp.splittedElements { 10 < styles.content.get }
Der Setzkasten ist nun mit Inhalt gefüllt, den Sie mithilfe von split wieder in Einzelteile zerlegen können.
Lizensiert für Markus Mueller
stdWrap.split { token = ###SPLITTER### }
Der nun folgende Parameter cObjNum verfügt über optionSplit. Damit können Sie festlegen, welche der folgenden Einstellungen für das jeweilige Element verwendet werden sollen. cObjNum = 1||2||3||4|*|5||6|*|7||8
Wenn Sie genau wissen wollen, wie optionSplit funktioniert und nach welchen Regeln die Werte zwischen den Separatoren abgearbeitet werden, lesen Sie Rezept 12.4.
Für unser Beispiel bedeutet das im Klartext: Die ersten vier Elemente erhalten Eigenschaften von 1 bis 4. Alle darauf folgenden Elemente werden abwechselnd mit den Eigenschaften 5 und 6 versehen, und die letzten beiden Elemente bekommen die Eigenschaften 7 und 8. Sollten Sie weniger Elemente zur Verfügung haben, werden die Eigenschaften gemäß den Prioritätsvorgaben von optionSplit in einer bestimmten Reihenfolge ausgelassen: erst die Werte zwischen den beiden |*|-Trennern, dann die Werte vor dem ersten |*| und zum Schluss die Werte nach dem zweiten |*|. Genauere Informationen hierzu finden Sie ebenfalls in Rezept 12.4. Hierzu ein paar Beispiele: Bei 11 Elementen ergibt sich: 1 2 3 4 5 6 5 6 5 7 8
und für die minimale Anzahl von 2 Elementen innerhalb eines split: 7 8
Sie haben es schon bemerkt: Mit diesem Konzept eröffnen sich ungeahnte Möglichkeiten für das Formatieren von Seiteninhalten! In unserem Beispiel haben wir lediglich verschiedene
-Tags um die einzelnen Elemente gelegt, um ihnen verschiedene Breiten und Farben zu geben und sie, wo nötig, mit float zu versehen. Sie können selbstverständlich noch weiter gehen und den einzelnen Elementen per stdWrap zusätzliche Elemente und Wraps zuweisen. Wichtig ist dabei lediglich, dass Sie für jede Zahl in der optionSplit-Liste ein eigenes Objekt mit der gleichen Zahl nach folgendem Strickmuster anlegen: entweder 1.current = 1 1.wrap = HTML|HTML
oder Lizensiert für Markus Mueller
1 { 10 = TEXT 10.value = etwas vor dem Element 20 = TEXT 20.current = 1 20.wrap = HTML|HTML 30 = TEXT 30.value = etwas nach dem Element }
Das zweite Beispiel entspricht bezüglich seiner Struktur einem COA-Setzkasten. Der Befehl current=1 fügt in beiden Beispielen an der entsprechenden Stelle den kompletten Inhalt aus dem Ergebnis der split-Funktion ein. Sollten Sie sich gefragt haben, warum das achte Objekt im Hauptbeispiel keinen Wrap erhalten hat: Nach dem letzten Trenn-String gibt es keinen Inhalt, weil er in diesem Beispiel immer am Ende eines Inhaltselements gesetzt wird. Sie können dieses Objekt aber auch für einen speziellen Abschluss der Seite verwenden. Das Ergebnis des obigen Beispiels ist übrigens folgende Elementanordnung: Element 1 einspaltig oben Darunter Elemente 2, 3 und 4 dreispaltig nebeneinander Danach alle folgenden Elemente zweispaltig nebeneinander Gefolgt vom einspaltigen letzten Element
Max. Linie
Nach dem gleichen Prinzip lassen sich nahezu beliebige Anordnungen beliebig vieler verschieden formatierter Elemente erzeugen. Experimentieren Sie einfach!
Problem Sie wollen bestimmte Inhaltselemente in der Seite fest verankern. Der Inhalt soll für Ihre Redakteure editierbar bleiben, sie sollen aber an der Position nichts verändern können.
Lösung Verwenden Sie das cObject RECORDS. Dieser Code kommt in Ihr TS-Setup: temp.myElement = RECORDS temp.myElement { source = tt_content_123,tt_content_456,tt_news_789 }
und dieser z.B. ins TS-Setup Ihrer Seite: marks.MYELEMENT < temp.myElement
Ersetzen Sie die Zahlen mit den jeweiligen UIDs der Inhaltselemente.
Diskussion Es kommt häufig vor, dass Sie bei der Ausgabe einer Webseite an bestimmten Stellen fest verdrahtete Inhaltslemente einbauen müssen. Damit diese von Redakteuren weiterhin bearbeitet werden können, empfiehlt es sich, sie auf einer Seite vom Typ Nicht im Menü oder besser noch auf einer Standardseite außerhalb des normalen Seitenbaums anzulegen. Eine solche Seite wird selbst nicht im Frontend angezeigt und dient lediglich als eine Art Container zum Sammeln und Bearbeiten der Inhalte. Diese werden dann mit TypoScript ins Setup eingebaut. Dazu verwenden Sie in der Regel das cObject RECORDS. Wie so oft, gibt es auch hier verschiedene Vorgehensweisen. Seit TYPO3-Version 4.2 existiert der Seitentyp Nicht im Menü nicht mehr. Sie können stattdessen das Kontrollkästchen Im Menü verstecken aktivieren oder aber den Seitentyp SysOrdner verwenden.
Im ersten Beispiel wird ausschließlich der Parameter source verwendet. Die Zahlen stehen für die jeweilige UID des gewünschten Elements. Damit eindeutig festgelegt wird, aus welcher Tabelle Sie die Elemente auslesen wollen, müssen Sie den Tabellennamen mit angeben. Die Schreibweise ist dabei wie folgt: source = tabellenname_uid
Weil das je nach Anforderung eine sehr lange und unübersichtliche Zeile erzeugen würde, gibt es eine weitere Form der Notation. Im zweiten Beispiel wird deutlich, wie der Parameter tables die Einträge für source verkürzt. Dabei gilt folgende Regel: tables enthält die Namen aller erlaubten Tabellen. Der erste darin enthaltene Name wird dabei allen Einträgen in source vorangestellt, falls diese nicht bereits einen Tabellennamen
besitzen. Sie sollten also immer dann mit dieser zweiten Form der Notation arbeiten, wenn Sie viele Einträge aus derselben Tabelle verwenden wollen. Einzelne Einträge aus anderen Tabellen erhalten dabei weiterhin den Tabellennamen vorangestellt.
Lizensiert für Markus Mueller
13.8 Verankerte Elemente unabhängig vom sonstigen Inhalt rendern Problem Sie haben, wie in Rezept 13.7 beschrieben, bestimmte Inhaltselemente in der Seite fest verankert. Der Inhalt bleibt für Ihre Redakteure editierbar. Das dazugehörige Layout soll jedoch vom üblichen Layout der Seite abweichen.
Lösung Verwenden Sie die Eigenschaft conf des cObject RECORDS und füllen Sie diese mit eigenen TypoScript-Anweisungen. Dieser Code kommt in Ihr TS-Setup: temp.meinElement = RECORDS temp.meinElement { tables = tt_content, tt_news source = 123,456,tt_news789 conf.tt_content = COA conf.tt_content { stdWrap.required = 1 stdWrap.wrap =
und ins TS-Setup Ihrer Seite kommt z.B.: marks.MEINELEMENT < temp.meinElement
Diskussion Im vorgehenden Rezept haben wir Ihnen gezeigt, wie Sie bestimmte fest verdrahtete Elemente auf Ihrer Seite positionieren. Die Redakteure können diese wie gewohnt bearbeiten, angezeigt werden sie jedoch nicht auf der dazugehörigen Seite, sondern an ganz anderer Stelle. Auch eine Domain-übergreifende Mehrfachverwendung ein und desselben ContentElements ist damit denkbar und möglich, zum Beispiel zum Anzeigen von allgemeinen Teaser-Texten auf einzelnen Subdomains einer Firmenseite. Üblicherweise weicht die Darstellung solcher Appetithäppchen vom Layout der restlichen Seiten ab, weil sie sich meist auf der Startseite befinden und dort möglichst ins Auge fallen sollen. In unserem Beispiel gehen wir davon aus, dass die verwendeten Elemente Inhalte mit Überschrift, Bild und Text besitzen. Andere Felder werden ignoriert. Die Layoutvorschrift laut Styleguide des Kunden lautet:
Max. Linie
• Zuerst die Überschrift wie bei allen anderen Elementen auch • Danach ein oder mehrere Bilder in einem div-Container zusammengefasst
• Gefolgt von simplem Text reduziert auf maximal 100 Zeichen, ohne dabei Wörter abzuschneiden • Alles zusammen kommt wiederum in einen div-Container Das erscheint zunächst einfach, wird jedoch schwieriger, wenn in dem Element wirklich mehrere Bilder vorkommen sollen, die nicht in eine Tabelle verpackt werden dürfen. Das cObject IMGTEXT scheidet demzufolge aus, weil dort Tabellen im PHP fest codiert sind. Das cObject IMAGE kennt wiederum nur ein einziges Bild, das per listNum ausgewählt werden müsste, und eine for-do-Schleife gibt es in TypoScript im eigentlichen Sinn nicht. Jedoch können Sie sich mit einem Trick behelfen, den wir später noch näher erläutern werden. In diesem Fall dient er nur dazu, eine beliebig lange Serie von Bildern ohne weitere Zusatzoptionen anzuzeigen. Seit TYPO3-Version 4.0 wird selbstverständlich nicht mehr zwangsweise mit Tabellen gearbeitet, jedoch funktioniert das Rezept auch ab dieser Version wie beschrieben
Lizensiert für Markus Mueller
Dieser Trick macht sich die Tatsache zu Nutze, dass Bilder in der Datenbank nicht wirklich als Bilder abgespeichert werden. Der Inhalt des Felds image ist vielmehr eine kommaseparierte Liste von Dateinamen. Die dazugehörigen Bilder befinden sich in der Regel im Verzeichnis uploads/pics/ und werden von dort aus per Image Magick ausgelesen, verarbeitet und im Verzeichnis typo3temp/ abgelegt. Zunächst benötigen Sie die individuelle Einstellung für verschiedene Tabellen im cObject RECORDS. Dazu verwenden Sie die Eigenschaft conf gefolgt vom Namen der Tabelle, deren Elemente ein besonderes Layout erhalten sollen. temp.myElement = RECORDS temp.myElement { tables = tt_content, tt_news source = 123,456,tt_news789 conf.tt_content = COA conf.tt_content { ... } }
Elemente aus anderen Tabellen, die nicht speziell per conf definiert wurden, werden wie üblich gerendert. Das erste Element innerhalb des COA-Setzkastens ist die Überschrift. Da sie keine Änderung gegenüber üblichen Überschriften erhält, können Sie hier einfach den kompletten TypoScript-Block für Überschriften aus lib.stdheader kopieren. 10 < lib.stdheader
Im zweiten Teil folgt nun der erwähnte Trick. Das verwendete cObject ist nicht etwa IMAGE oder IMGTEXT, sondern TEXT, denn Sie lesen damit zunächst nur den Inhalt des Felds image aus. Danach wird dieser an die Funktion split übergeben, dort nach Komma getrennt, und mithilfe des cObject IMAGE wird aus dem so erhaltenen Dateinamen ein einzelnes Bild gerendert. Die Übergabe des Namens erfolgt mithilfe von current=1, und zusätzlich wird die Größe des Bilds auf ein Maximum von 120 x 120 Pixeln beschränkt. Es erhält ein eigenes div-Tag und kann damit per float innerhalb des umschließenden Containers positioniert werden.
Im letzten Element des Setzkastens wird das Feld bodytext ausgelesen. Mithilfe von crop wird der Inhalt auf eine maximale Länge von 100 Zeichen reduziert. Wird der Text dabei abgeschnitten, erhält er als Suffix drei Punkte. Sollte die Trennung innerhalb eines Worts erfolgen, wird dieses komplett abgeschnitten. Letzteres wird durch die 1 innerhalb des Parameters 100|...|1 erreicht. Lesen Sie hierzu auch Rezept 10.4, in dem wir unter anderem die stdWrap-Funktion crop und deren Arbeitsweise erläutern. 30 = TEXT 30 { field = bodytext required = 1 wrap =
|
crop = 100|...|1 }
Für alle Elemente bis auf die Überschrift legen Sie mithilfe der stdWrap-Eigenschaft required fest, dass diese nur angezeigt werden sollen, wenn sich Inhalt in diesen Elementen befindet. So lassen Sie überflüssige Wraps ganz einfach verschwinden.
Max. Linie
Fügen Sie nun das Element an beliebiger Stelle in Ihr Template ein.
13.9 Wiederkehrende Inhalte zeitabhängig anzeigen Problem Sie wollen regelmäßig wiederkehrende Inhalte abhängig vom Wochentag und der jeweiligen Tageszeit anzeigen. Diese Inhalte sollen für Ihre Redakteure in der üblichen Art und Weise bearbeitbar bleiben.
Lösung Verwenden Sie die TypoScript-Objekte COA_INT, CASE und RECORD sowie die Condition dayofweek. Dieser Code kommt in Ihr TS-Setup:
Und dieser ins Setup Ihrer Seite: page = PAGE page.typeNum = 0 page.10 < temp.meinStundenplan
Diskussion Lizensiert für Markus Mueller
TYPO3 bietet Ihnen sowohl für Seiten als auch für Inhaltselemente verschiedene nützliche Einstellungen, um diese zeitabhängig anzuzeigen. Sie können ein Start- sowie ein Stoppdatum vergeben, und mithilfe von Conditions lassen sich Inhalte direkt mit Stunden, Minuten, Tagen, Wochentagen und Monaten in Verbindung bringen. Schwierig wird es jedoch immer dann, wenn die Zuordnung von mehreren Kriterien abhängt und der Zeitpunkt zudem immer wiederkehrt. In diesem Fall ist ein Start-/Stoppdatum wenig hilfreich, und beim Einsatz von Conditions müsste eine &&-Verknüpfung möglich sein. Da TYPO3 eine solche Verknüpfung von Hause aus erst seit Version 4.0 beherrscht und die Notation teilweise etwas umständlich wird, weil Conditions nicht innerhalb von geschweiften Klammern gesetzt werden dürfen, bietet sich ein kleiner, aber dennoch eleganter Umweg an. Im gezeigten Beispiel geht es darum, dem Besucher Ihrer Seite eine Telefonnummer und einen Ansprechpartner für eine Service-Hotline zu nennen. Diese Service-Hotline ist nachts nicht besetzt. Von Montag bis Freitag sind jeweils zwei verschiedene Mitarbeiter per Handy zu erreichen, einer davon in der Frühschicht, der andere in der Spätschicht. Am Wochenende gibt es nur eine Notfallnummer, die vormittags und nachmittags erreichbar ist. Insgesamt ergeben sich so vier verschiedene Zustände, für die Sie auf einer speziell dafür eingerichteten Seite jeweils ein eigenes Inhaltselement anlegen müssen, das die nötigen Informationen enthält.
Um zu verhindern, dass das erzeugte Objekt gecacht wird, verwenden Sie hier ein COA_ INT-Element als Setzkasten. Darin enthalten ist das Element CASE, mit dessen Hilfe Sie auf die jeweilige Tageszeit reagieren können. Hierzu wird als key ausnahmsweise kein Datenbankfeld verwendet, sondern die aktuelle Zeit. Daraus werden nur die Stunden extrahiert und mithilfe von prioriCalc durch vier geteilt. So erhalten Sie eine Aufteilung des Tages im Vier-Stunden-Takt. Damit dabei keine krummen Zeiten entstehen, wird prioriCalc hier auf intval gesetzt, was einen ganzzahligen Wert zur Folge hat. temp.meinStundenplan = COA_INT temp.meinStundenplan { 10 = CASE 10 { key.cObject = COA key.cObject { 10 = TEXT 10.dataWrap = {date:H}/4 stdWrap.prioriCalc = intval } ... } }
Lizensiert für Markus Mueller
Für jeden der möglichen Zustände von key benötigen Sie nun einen Eintrag im CASEObjekt, der den jeweils passenden Inhalt liefert. default entspricht dabei der Null. Beachten Sie, dass auch ein nicht vorhandener key den Wert null zurückliefert. Im konkreten Fall kommt uns dieses Verhalten allerdings entgegen, da null dem Zustand nicht besetzt entspricht. Weil Sie in diesem Fall auf existierende Inhaltselemente zurückgreifen wollen, benötigen Sie hier das Objekt RECORDS. Die verwendete Tabelle ist tt_content, und anstelle der Werte 1, 2, 3 oder 4, die im Beispiel als source eingetragen sind, müssen Sie logischerweise die UID des passenden Inhaltselements eintragen. Eintrag default und 5 stehen für die Nachtschicht, 1 und 2 für die Frühschicht, 3 und 4 für die Spätschicht. Je nachdem, welche Aufteilung Sie im vorigen dataWrap verwendet haben, um den Tag in Abschnitte zu zerlegen, müssen Sie gegebenenfalls zusätzliche Einträge erzeugen. Sollte key einen Wert haben, zu dem kein passender Eintrag existiert, wird prinzipiell der Eintrag default verwendet.
... n = RECORDS n { tables = tt_content source = x }
Links
Innerhalb der nun folgenden Condition dayofweek werden die Zustände für die Wochentage Sonntag 0 und Samstag 6 modifiziert. Für den frühen Morgen und den späten Abend gibt es keine Besetzung. Der Wert ist also identisch mit der bisherigen Nachtschicht. Für Vormittag und Nachmittag kommt die UID des Elements zum Einsatz, in dem sich die Beschreibung des Wochenendnotdiensts befindet. Da der Rest des Setups von meinStundenplan identisch bleibt, reicht es, nur die veränderten Werte einzutragen. Per global wird die Condition geschlossen. [dayofweek = 0,6] temp.meinStundenplan { 10.1.source = 1 10.2.source = 4 10.3.source = 4 10.4.source = 1 } [global] Lizensiert für Markus Mueller
Zum Schluss kopieren Sie meinStundenplan in Ihre Seite oder auch in einen speziell dafür eingerichteten Marker Ihres Templates. Die zeitabhängige Änderung übernimmt ab sofort TYPO3.
13.10 Statische Formulare individuell erstellen Problem Sie wollen im Rahmen Ihres Webprojekts Formulare einsetzen. Deren Inhalt soll aus Sicherheitsgründen jedoch nicht durch Redakteure veränderbar sein, sondern immer in der gleichen Form an vorgegebenen Stellen auftauchen. Zudem wollen Sie den Inhalt des Formulars bestimmten Bedingungen anpassen, um z.B. einer bestimmten Benutzergruppe besondere Formularfelder anzuzeigen, die für andere nicht sichtbar sein sollen.
Lösung
Max. Linie
Verwenden Sie das TypoScript-Element FORM mit seinen vielfältigen Möglichkeiten. Legen Sie dazu zunächst ein COA-Element an und erzeugen Sie darin ein grundlegendes Element FORM. Verwenden Sie statt des üblichen Parameters data, den Sie vielleicht aus dem TypoScript-Code von CSS-styled-content kennen, den Parameter dataArray. Dies hat den Vorteil, dass Sie sowohl für label als auch für value mit stdWrap-Funktionen arbeiten können.
Der Parameter data ist eigentlich nur dann sinnvoll einzusetzen, wenn Sie Formulare von Redakteuren pflegen lassen, denn dann wird der Inhalt eines Felds wie z.B. bodytext am Stück an das FORM-Element übergeben. Dieser Inhalt kann manuell oder mit dem Form-Wizard eingegeben worden sein und arbeitet mit Zeilenschaltungen als Trennzeichen für einzelne Felder sowie dem Pipesymbol als Trennzeichen für die Einstellungen eines einzelnen Felds. Ein Textblock wie dieser: Ein Textarea-Feld | [*]Feldname1 = textarea[,Spalten,Zeilen,"wrap= [z.B. "OFF"]"] | Standardwert1 | Spezielle Auswertung der Eingabedaten Ein Input-Feld | [*]Feldname2 = input[,Grösse,Maximum] | Standardwert2 | Spezielle Auswertung der Eingabedaten Ein Passwort-Feld | [*]Feldname3 = password[,Grösse,Maximum] | Standardwert3 Ein Datei-Feld | [*]Feldname4 = file[,Grösse] Eine Checkbox | Feldname5 = check | [checked=1] Eine Auswahlbox | [*]Feldname6 = select[,Grösse (Zahl/"auto"), "m"=multiple] | label [=Wert] , ... Ein Optionsfeld | [*]Feldname7 = radio | label [=Wert] , ... |Feldname8 = hidden | Wert Ein Submitbutton |Feldname9 = submit | Beschriftung Ein Resetbutton |Feldname10 = reset | Beschriftung Ein Label | label | Wert
wird dann so übergeben: Lizensiert für Markus Mueller
lib.meinFormular = COA lib.meinFormular { 10 = FORM 10 { data.field = bodytext layout =
Der Parameter layout mit den Platzhaltern ###LABEL### und ###FIELD### ist zwingend nötig, um eine Ausgabe zu erhalten. Zusätzlich sollten Sie immer auch die Parameter accessibility=1, dontMd5FieldNames=1 und formname verwenden, weil das Formular dann weitestgehend standardkonform mithilfe von ordnungsgemäß verknüpften label-Tags und passenden id-Angaben für die Formularfelder versehen wird. Wenn Sie die beiden Letzteren nicht verwenden, werden die id-Werte für die Formular- und Feldnamen als MD5Hash ausgegeben, was den HTML-Code nicht nur extrem aufbläht und unübersichtlich macht, sondern auch das Styling mithilfe von CSS-Angaben für die einzelnen IDs unnötig erschwert.
Max. Linie
Wie Sie unschwer erkennen können, ist die Schreibweise des Textblocks dennoch mehr als unübersichtlich und führt bei umfangreicheren Formularen schnell zu Verwirrung, wenn man nicht mit dem Form-Wizard arbeitet. Im folgenden Rezept werden wir daher mit
dataArray arbeiten, weil die Daten fest verdrahtet und eben nicht von einem Form-Wizard übergeben werden sollen. Innerhalb von dataArray werden die einzelnen Abschnitte
Links
ebenso nummeriert, wie das auch in PAGE-, COA- und GIFBUILDER-Elementen getan wird. Maßgeblich ist dabei die Nummer und nicht die Reihenfolge der Notierung. Das gleiche Formular, das wir oben als Text übergeben haben, sieht dann so aus
Lizensiert für Markus Mueller
Max. Linie
lib.meinFormular = COA lib.meinFormular { 10 = FORM 10 { dataArray { 10 { label = Ein Textarea-Feld type = Feldname1 = textarea,40,5 value = Standardwert1 required = 1 specialEval = EREG : Nur Buchstaben von A bis Z : ^[a-zA-Z]*$ } 20 { label = Ein Input-Feld type = Feldname2 = input,40,255 value = Standardwert2 required = 1 specialEval = EMAIL } 30 { label = Ein Passwort-Feld type = Feldname3 = password,40,255 required = 1 value = Standardwert3 } 40 { label = Ein Datei-Feld type = Feldname4 = file,250000 required = 1 } 50 { label = Eine Checkbox type = Feldname5 = check value = checked=1 } 60 { label = Eine Auswahlbox type = Feldname6 = select,auto,m required = 1 value = label1=Wert1,label2=Wert2,label3=Wert3 } 70 { label = Ein Optionsfeld type = Feldname7 = radio required = 1 value = label1=Wert1,label2=Wert2,label3=Wert3 }
Angaben in eckigen Klammern sind optional. Wenn Sie die optionale Angabe * verwenden und z.B. type = *Feldname1 schreiben, sorgt dies dafür, dass dieses Feld zum Pflichtfeld wird. Bei Verwendung von dataArray werden Pflichtfelder mit dem Parameter required=1 markiert. Weitere optionale Angaben gelten ebenso wie bei Verwendung von data. Wir haben Sie lediglich durch echte Werte ersetzt, damit Sie mit diesem Code direkt arbeiten können.
Diskussion
Max. Linie
Ein besonders kritisches Element beim Einsatz auf öffentlichen Webseiten stellen sicherlich Formulare dar. Neben reinen Kontaktformularen, die per E-Mail verschickt werden, gibt es eine Fülle weiterer Einsatzmöglichkeiten speziell im Rahmen dynamischer Webseiten mit Datenbankanbindung. Oftmals werden die dabei übermittelten Daten in der Datenbank gespeichert, um sie erst später auszuwerten. In allen Fällen eröffnen Sie jedoch als Betreiber einer solchen Webseite böswilligen Zeitgenossen zusätzliche Möglichkeiten, die übermittelten Inhalte für ihre eigenen Zwecke zu manipulieren. Außerdem besteht bei verschiedenen Formularen die Möglichkeit, dass sie aufgrund fehlender Angaben oder anderer Formfehler gegen geltende Gesetze wie z.B. das Telemediengesetz
oder das Bundesdatenschutzgesetz verstoßen könnten. Verantwortungsvolle Betreiber lassen die verwendeten Formulare daher gern von Fachleuten überprüfen, um auf der sicheren Seite zu sein.
Links
Um ganz sicherzugehen, dass die verwendeten Formulare wie geprüft erstellt wurden und keine rechtlichen oder Sicherheitslücken aufweisen, ist es daher oftmals sinnvoll, diese nicht durch Redakteure pflegen zu lassen, sondern direkt fest verdrahtet in den TypoScript-Code der Seite einzubauen. Ein solches grundlegendes Formular sehen Sie im zweiten Teil der Lösung. Es ist wie ein COA-Setzkasten aufgebaut und kann innerhalb seines dataArray beliebig viele nummerierte Elemente enthalten. Diese verfügen ihrerseits über bis zu fünf Parameter, nämlich label, type, required, value und specialEval. Die Parameter label und value können dabei mithilfe von stdWrap-Funktionen erzeugt werden, was Ihnen die Möglichkeit gibt, beliebige TypoScript-Elemente zur Erzeugung von Feldbeschriftungen und Standardwerten zu verwenden. So können Sie z.B. bestimmte Felder mit bekannten Daten vorbelegen, falls der Besucher sich bereits als registrierter Benutzer eingeloggt hat.
Lizensiert für Markus Mueller
lib.meinFormular = COA lib.meinFormular { 10 = FORM 10 { dataArray { 10 { label = Benutzername: label { override = Registrierter Benutzername: override.if.isTrue.data = TSFE:fe_user|user|username } type = username=input,40,40 required = 1 value.data = TSFE:fe_user|user|username specialEval = EREG : Nur Buchstaben von A bis Z : ^[a-zA-Z]*$ } } layout =
Während label die Beschriftung eines Felds liefert, legen Sie mit type fest, welche Art Formularfeld Sie verwenden wollen und welche zusätzlichen Parameter für diese Art gelten sollen. Die Schreibweise können Sie dem ersten Textblock der Lösung entnehmen.
Max. Linie
Zusätzlich können Sie per value einen Standardwert für die Vorbelegung eines Formularfelds vergeben, mit required=1 dafür sorgen, dass es zum Pflichtfeld wird, und unter Zuhilfenahme von specialEval bestimmte Spielregeln für die Eingabemöglichkeiten festlegen. Zulässig sind für specialEval die Optionen EMAIL und EREG. Dabei prüft EMAIL ledig-
lich, ob eine Adresse korrekt formatiert ist, nicht aber deren Existenz. EREG lässt eine Überprüfung mit sogenannten Regular Expressions zu, wobei zunächst die Fehlermeldung und danach die Expression selbst durch einen Doppelpunkt getrennt an EREG angehängt werden. Neben diesen grundlegenden Bestandteilen eines FORM-Elements gibt es natürlich noch weitere Parameter, mit deren Hilfe Sie Verhalten und Aussehen des Formulars bestimmen können.
Verhalten eines Formulars Das folgende Beispiel zeigt, wie Sie das Verhalten eines Formulars beeinflussen können:
Lizensiert für Markus Mueller
Max. Linie
lib.meinFormular = COA lib.meinFormular { 10 = FORM 10 { dataArray { 10 { label = Benutzername: label.override = Registrierter Benutzername: label.override.if.isTrue.data = TSFE:fe_user|user|username type = username=input,40,40 required = 1 value.data = TSFE:fe_user|user|username specialEval = EREG : Nur Buchstaben von A bis Z : ^[a-zA-Z]*$ } } type = 123 target = _top method = GET no_cache = 1 noValueInsert = 1 recipient = email@domain.tld hiddenFields { feldname = TEXT feldname.data = TSFE:id feldname2 = COA feldname2 { 10 = TEXT 10.value = Wert2 20 = TEXT 20.value = Wert2b } } layout =
Mithilfe des Parameters type legen Sie fest, welche URL im Attribut action des form-Tags erzeugt werden soll. Geben Sie hier einen Zahlenwert ein, geht TYPO3 davon aus, dass es sich um eine interne Seite handelt. Sie können auch eine komplette URL eingeben oder type gar nicht setzen. Letzteres veranlasst TYPO3, die aktuelle Seite als URL zu verwenden.
Links
Es existiert noch ein weiterer Parameter namens redirect, der sich ebenso verhält wie type. Da redirect gegebenenfalls die mithilfe von type bestimmte action überschreibt, kann dies zu unerwarteten Ergebnissen führen!
Der Parameter redirect verfügt über stdWrap-Eigenschaften und kommt daher immer dann zum Einsatz, wenn die URL für die action des form-Tags dynamisch erzeugt werden soll. Wenn Sie den Parameter method verwenden, bestimmen Sie damit, ob das Formular die Daten per GET oder POST verschicken soll. Die Default-Einstellung ist POST, sodass Sie den Parameter nur angeben müssen, wenn Sie stattdessen mit GET arbeiten wollen.
Lizensiert für Markus Mueller
Der Schalter no_cache dient dazu, den Parameter no_cache=1 an die URL der action anzuhängen. Damit würden Sie verhindern können, dass die Inhalte beim Abschicken des Formulars im Cache landen und gegebenenfalls für andere sichtbar werden könnten. Da jedoch seit TYPO3-Version 4.2 die Möglichkeit besteht, die Auswertung des no_cacheParameters systemweit zu deaktivieren, sollten Sie stattdessen lieber das gesamte Formular in einem COA_INT-Element unterbringen. Das hätte nebenbei noch den Vorteil einer verbesserten Performance der Seite, weil die restlichen Inhalte bis auf das Formular dennoch aus dem Cache geholt werden könnten. Um sicherzustellen, dass keinerlei Eingaben des Nutzers nach dem Absenden wieder in das Formular eingetragen werden, müssen Sie zusätzlich den Schalter noValueInsert aktivieren. Falls das Formular, das Sie erzeugen wollen, eine E-Mail an einen bestimmten Empfänger verschicken soll, benötigen Sie ein verstecktes Feld namens recipient. Um dieses Feld ordnungsgemäß zu erzeugen, sollten Sie es nicht innerhalb des dataArray als hidden-Feld anlegen, sondern mithilfe des Parameters recipient. Der Grund hierfür ist eine Besonderheit von TYPO3 beim Erzeugen von Mailformularen, die in der TSRef leider nicht erwähnt wird. Je nachdem, ob im Install-Tool die beiden Parameter [FE][strictFormmail] und [FE][secureFormmail] gesetzt wurden, können Sie Mailformulare per TypoScript erzeugen oder nicht.
Max. Linie
Im Fall von strictFormmail darf der recipient nur vom System selbst, nicht aber aus einem Eingabefeld im Frontend erzeugt werden! Wenn parallel zu diesem Schalter secureFormmail gesetzt wurde, muss der recipient zwingend aus einem Inhaltselement bezogen werden, das im Backend angelegt wurde! Da recipient aber ebenfalls über stdWrap-Eigenschaften verfügt, können Sie zumindest für den Fall, dass nur strictFormmail oder keiner dieser Parameter gesetzt ist, ein rein TypoScript-basiertes Mailformular erzeugen.
Falls Sie weitere versteckte Felder benötigen, können Sie diese im Bereich hiddenFields anlegen. Geben Sie dazu einfach einen Feldnamen an und weisen Sie diesem ein TypoScript-Element zu. Je nach verwendetem Element stehen Ihnen danach sämtliche Parameter dieses Elements ebenfalls zur Verfügung. Im Beispiel erzeugen wir die Felder feldname1 und feldname2, wobei Ersteres ein simples TEXT-Element nutzt, während Letzteres mit einem COA-Setzkasten aufgebaut wird.
Layout eines Formulars Um ein Formular passend zum Styling einer Website zu gestalten, bietet das FORM-Element eine Vielzahl von Parametern, die wir im Folgenden zusammenfassend erläutern.
Lizensiert für Markus Mueller
lib.meinFormular = COA lib.meinFormular { 10 = FORM 10 { dataArray { 10 { label = Benutzername: label.override = Registrierter Benutzername: label.override.if.isTrue.data = TSFE:fe_user|user|username type = username=input,40,40 required = 1 value.data = TSFE:fe_user|user|username specialEval = EREG : Nur Buchstaben von A bis Z : ^[a-zA-Z]*$ } } layout =
Im vorigen Beispiel haben wir zunächst den image-Parameter dazu verwendet, einen grafischen Absende-Button zu erzeugen. Hierzu greift TYPO3 auf das vollständige Portfolio des IMAGE-Elements zurück. Sie können daher auch Grafiken aus Inhaltselementen oder per GIFBUILDER erzeugte Buttons verwenden. Lesen Sie hierzu bei Bedarf die entsprechenden Rezepte. Im gezeigten Fall haben wir lediglich eine hochgeladene Grafik eingebunden.
Lizensiert für Markus Mueller
Mit dem folgenden Schalter REQ = 1 sorgen Sie dafür, dass für Pflichtfelder eine andere Formatierung ermöglicht wird als für sonstige Felder. Verschiedene Layoutvarianten und Wraps mit Ausnahme von Checkboxen, Radiobuttons und Kommentare stehen dann unterhalb von REQ nochmals zur Verfügung. Haben Sie also für die sonstigen Felder z.B. layout = sonstige verwendet, können Sie nun für die Pflichtfelder mit REQ.layout = pflicht ein eigenes Layout zuweisen. Für Kommentare, Checkboxen, Radiobuttons und Label können Sie eigene Layoutvarianten angeben, indem Sie eine der vier Varianten COMMENT.layout, CHECK.layout, RADIO. layout oder LABEL.layout verwenden. Diese Varianten sind durchaus sinnvoll, denn speziell im Fall von Checkboxen und Radiobuttons ist oftmals die Reihenfolge von Feld und Beschriftung spiegelverkehrt zu sonstigen Input- oder Textarea-Feldern. Zusätzlich stehen Ihnen noch weitere stdWrap-Funktionen für Felder, Beschriftungen, Kommentare und Radiobuttons zur Verfügung, indem Sie einen der Parameter fieldWrap, labelWrap, commentWrap oder radioWrap verwenden, wobei fieldWrap und labelWrap auch unter REQ verfügbar sind. Die Bezeichnung xxxWrap ist ein wenig irreführend, denn es handelt sich um den kompletten stdWrap-Baukasten und nicht nur um einen Wrap, den Sie hier nutzen könnten. labelWrap.cObject = TEXT wäre daher z.B. ebenfalls möglich. Weitere Möglichkeiten finden Sie in den entsprechenden stdWrapRezepten.
Max. Linie
Im Bereich params haben Sie die Möglichkeit, HTML-Attribute für die Formularfelder zu definieren. Dabei können Sie params selbst einen allgemeingültigen Wert zuweisen, der dann für alle Felder verwendet wird. Falls Sie für einzelne Felder Ausnahmen von dieser Einstellung angeben möchten, können Sie das mithilfe von params.feldtyp tun. Im Beispiel wird für Textarea eine andere Breite zugewiesen, während Checkboxen keinerlei
Attribute erhalten. Wie Sie sehen, sorgt das pure Vorhandensein eines Feldtyps unterhalb von params bereits dafür, dass die Eigenschaft überschrieben wird. Wenn Sie wie im Fall von check keinerlei Wertzuweisung vornehmen, werden für diesen Feldtyp die Attribute gelöscht. Die letzte Gruppe von Parametern nimmt kleinere Änderungen innerhalb der Attribute der HTML-Tags des Formulars vor. Mithilfe von wrapFieldName können Sie dafür sorgen, dass sämtliche Feldnamen mit zusätzlichem Text verpackt werden. Dies ist besonders hilfreich, wenn Sie wie im gezeigten Beispiel Daten an ein Plugin übergeben wollen, das sämtliche Formulardaten im Array eingabe erwartet. Sie müssen die Feldbezeichnung daher nicht jedes Mal umständlich hinzufügen, denn es reicht nun, den eigentlichen Namen anzugeben, der dann automatisch in das Array eingebaut wird. Die Parameter formName und fieldPrefix haben ähnliche Aufgaben. Wenn Sie nur formName verwenden, wird dieser Text als Name für das form-Tag verwendet und gleichzeitig als Präfix für alle Feldnamen eingesetzt. Verwenden Sie gleichzeitig fieldPrefix, wird dessen Wert anstatt des unter formName angegebenen eingesetzt. Mithilfe von fieldPrefix=0
Lizensiert für Markus Mueller
Max. Linie
sorgen Sie dafür, dass keinerlei Zusatz für die Feldnamen verwendet wird. Je nach verwendeter HTML-/XHTML-Variante darf jedoch das form-Tag selbst kein name-Attribut mehr haben. Sie sollten also gegebenenfalls mit einem Validator überprüfen, ob Ihr HTMLCode dem verwendeten Standard entspricht. Für eben diese Problematik ist auch der letzte der Layoutschalter noWrapAttr zuständig. Setzen Sie ihn auf 1, wird dafür gesorgt, dass innerhalb von Textarea-Feldern kein wrap-Attribut verwendet werden kann, weil dies in einigen XHTML-Varianten nicht mehr zulässig ist.
Meldungen eines Formulars Zu guter Letzt können Sie noch bestimmen, welche Meldungen TYPO3 im Fall von fehlerhaften oder fehlenden Eingaben ausgeben soll. lib.meinFormular = COA lib.meinFormular { 10 = FORM 10 { dataArray { 10 { label = Benutzername: label.override = Registrierter Benutzername: label.override.if.isTrue.data = TSFE:fe_user|user|username type = username=input,40,40 required = 1 value.data = TSFE:fe_user|user|username specialEval = EREG : Nur Buchstaben von A bis Z : ^[a-zA-Z]*$ } } layout =
formName = meinformular goodMess = Alles in Ordnung badMess = Bei der Eingabe sind Fehler aufgetreten emailMess = Bitte geben Sie ein korrekte E-Mail-Adresse ein
Links
} }
Eine dieser Meldungen haben wir bereits erwähnt. Es handelt sich um den zweiten Teil des Parameters specialEval, wenn Sie die Option EREG verwenden. Die Nachricht wird mit Doppelpunkten abgetrennt, und die Reihenfolge lautet EREG:Nachricht:Expression. Zusätzlich können Sie noch unter goodMess eine Nachricht eingeben, die angezeigt wird, wenn alle Eingaben in Ordnung waren. Mit badMess legen Sie im Gegenteil dazu eine Nachricht fest, die immer angezeigt wird, wenn beim Evaluieren Fehler aufgetreten sind, und emailMess wird für den speziellen Fall benötigt, dass eine Eingabe der Überprüfung hinsichtlich der korrekten Formatierung als E-Mail nicht standhalten konnte. Zum Schluss noch ein Hinweis bezüglich einer Unschönheit bei der Ausgabe von Formularen mit CSS-styled-content:
Lizensiert für Markus Mueller
Aus unerfindlichen Gründen kommt auch in der aktuellen TYPO3-Version 4.2.1 immer noch ein TypoScript-Code zum Einsatz, der im Fall von Radiobuttons automatisch ein Fieldset sowie eine Legend hinzufügt. Dies erzeugt die doppelte Ausgabe des Labels im HTML-Code. Außerdem wird ebenfalls automatisch ein Fieldset um alle Formularfelder gelegt, was in den meisten Fällen genauso unerwünscht ist. Mit dem folgenden Codeschnipsel können Sie diesen Bug beheben. tt_content.mailform.20.radioWrap.accessibilityWrap > tt_content.mailform.20.stdWrap.wrap >
Siehe auch Lesen Sie im folgenden Rezept, wie Sie Ihre Formulare sinnvoll mit fieldset- und legendTags strukturieren können.
13.11 Formulare mit Fieldset zusammenfassen Problem Sie wollen das Inhaltselement Mailform verwenden. Wegen der besseren Übersicht und um den Anforderungen für Zugänglichkeit zu entsprechen, wollen Sie einzelne Elemente des Formulars mithilfe des HTML-Tags fieldset zusammenfassen. Jedes Fieldset soll dabei eine eigene Legende erhalten, die dem Betrachter mitteilt, was sich innerhalb dieser Gruppe von Feldern befindet.
Max. Linie
Zur Eingabe sollen dabei weiterhin sowohl der Form-Wizard als auch das direkte Eingabefeld wie gewohnt zur Verfügung stehen.
Lösung Verwenden Sie die stdWrap-Funktion split und eine zusätzliche Kommentarzeile im Formular. Das erste Wort dient dabei als Trennzeichen und heißt im gezeigten Beispiel sinnvollerweise fieldset. Danach folgt je nach Bedarf die Beschriftung des Fieldsets eingebettet in zwei # als Trennzeichen. Mit diesem Code in Ihrem TS-Setup modifizieren Sie die Ausgabe von CSS-styled-content. Das Setup des Inhaltselements Mailform wird zunächst gelöscht und dann mit Ihrem eigenen Code überschrieben. Falls dieses Element noch anderweitig zum Einsatz kommt, sollten Sie vielleicht eher ein eigenes Element anlegen, anstatt das Default-Rendering zu verändern. Wie Sie dies mithilfe einer Extension tun können, erfahren Sie in den Kapiteln 16 und 18.
Lizensiert für Markus Mueller
Max. Linie
tt_content.mailform.20 > tt_content.mailform.20 = FORM tt_content.mailform.20 { stdWrap.wrap =
Diskussion Formulare sind mit die problematischsten Elemente, wenn es darum geht, Inhalt zugänglich und XHTML-konform darzustellen. Dies gilt ebenfalls für das Inhaltselement Formular in TYPO3.
Lizensiert für Markus Mueller
Die Default-Ausgabe dieses Elements arbeitete lange Zeit auch bei Verwendung von CSSstyled-content mit Tabellen. Mehrspaltige Ausgaben sind oftmals nur schwer zu realisieren, offizielle HTML-Elemente des form-Tags wie