Meine TypoScript Organisation

Ein Problem das mir die Arbeit mit Typo3 lange erschwert hat, ist die schlechte Wiederverwertbarkeit, Übersichtlichkeit und Versionierbarkeit von TypoScript. Einer der wichtigsten, wenn nicht DER Schritt zur Lösung dieses Problems, war es alle TypoScripts strikt ins Dateisystem auszulagern. Im Folgenden eine kurze Skizze davon, wie ich meine TypoScrips aktuell organisiere.

Ziel ist es erst einmal möglichst wenig TypoScript in der Datenbank stehen zu haben. Anstatt im Backend sollen die Scripts direkt in der IDE angepasst werden können. Zum Einbinden einer TypoScript Datei aus dem Dateisystem kommt folgender Befehl zum Einsatz:

<INCLUDE_TYPOSCRIPT:source="file:$pathToTemplate/template.ts">

Direkt auf root-Ebene der Seite, im init-Script, steht daher auch nicht viel mehr als jeweils eine Zeile. Einmal für die Konstanten und einmal für das Setup:

<INCLUDE_TYPOSCRIPT:source="
  file:fileadmin/templates/ts/init.ts">
<INCLUDE_TYPOSCRIPT:source="
  file:fileadmin/templates/ts/init.ts">

In der Wahl der Pfade ist man dabei natürlich völlig frei. Wichtig ist das ab diesem Punkt alles TypoScript im Dateisystem verwaltet werden kann. Also, auch neue Scripts werden direkt in diesen Dateien mit eingebunden.

Die Struktur im Dateisystem

Die Dateistruktur einer fertigen Seite sieht bei mir dann grob wie folgt aus:

ts/
-- init.ts
-- constants/
---- init.ts
-- plugin/
---- plugin.ts
---- plugin.tt_news.ts
---- plugin.tx_indexedsearch.ts
---- ...
-- lib/
---- lib.ts
---- lib.mainnavi.ts
---- lib.servicenavi.ts
---- lib.quicksearch.ts
---- lib.homelink.ts
---- ...
-- page/
---- page.ts
---- page.10.ts
---- page.config.ts
---- page.headerDate.ts
---- page.meta.ts
---- ...

Die Logik ergibt sich dabei aus den Namen der TypoScript Objekte. Zumindest in meiner kleinen Welt ;)

Ein Versuch der Erklärung: Auf oberster Ebene steht die init.ts Datei. In dieser befinden sich die Include-Anweisungen für jeweils eine weitere Datei in jedem Ordner. Diese Dateien tragen den Namen des Ordners selbst, etwa lib.ts, und dienen wiederum ausschließlich zum inkludieren aller benötigten Scripts innerhalb des Ordners.

Auf diese Weise entstehen zwar viele Dateien, dafür hat aber auch jede in der Regel nur genau eine Aufgabe. Das schlägt sich wiederum enorm auf die Wiederverwertbarkeit und Wartbarkeit der TypoScripts aus.

Das Caching-Problem

Verzweiflung bei dieser Art der TypoScript-Einbindung ist allerdings vorprogrammiert, wenn man das Caching nicht entsprechend unter Kontrolle hat. Verständlicher Weise liest Typo3 solche externen TypoScript-Dateien immer nur einmal. Auf Produktivsystem natürlich ein Muss, sollte man dieses Verhalten innerhalb der Entwicklungsumgebung jedoch ändern. Dazu dient folgende Zeile im TSconfig des eigenen Nutzers. Dadurch werden die Templates immer geladen, sobald man eingeloggt ist. Das nervige manuelle Cache leeren entfällt.

admPanel.override.tsdebug.forceTemplateParsing = 1

Die TS-Dateien vor Zugriff schützen

Ein letztes, aber sehr wichtiges Wort zur Sicherheit des Ganzen. Die Dateien mit der Endung .ts werde vom Server in aller Regel im Klartext angezeigt, was etwas zu viel Einblicke in den Aufbau eine Seite gewehrt, woraus wiederum Sicherheitsprobleme entstehen können. Daher sollte der direkte Zugriff auf die TS-Files per htaccess verboten werden:

<FilesMatch "\.ts" >
 deny from all
</FilesMatch>

Die Weisheit

Sicherlich handelt es sich bei dem gesamten Vorgehen noch nicht um der Weisheit letzter Schluss. Für weitere Tipps und Anregungen bin ich daher sehr dankbar! Aktuell funktioniert diese Art der Organisation seit einigen Projekten für mich überaus gut. Ich spare Zeit und Nerven. Was will man mehr?!

9 Gedanken zu „Meine TypoScript Organisation“

  1. Great article, I’m using a similar structure and it’s working pretty nicely. Didn’t know about the option to disable the cache for TS files, very useful :-)

    Also like it that you are pointing out to hide the TS files from public view. Well done! :-)

    Cheers,
    Sebastiaan

    (Sorry for my English comment, just want to spare everyone the embarrassment of my lousy German writing.)

    1. Oh, thank you! Nice to hear that I’m not alone with this approach.

  2. No definitely not alone with this. I’ve been using this approach for some time now, and these are just some little nice pointers to some additional features. These will come in handy!

    thanks!

    cheers,
    Pim

  3. Ich mache es auch so. Allerdings suche ich noch nach einem Weg, die Dateiendung „ts“ zu erlauben – fileadmin erlaubt es mir nicht, neue Dateien mit dieser Endung anzulegen.

    1: File extension „ts“ is not a textfile format! (txt,html,htm,css,tmpl,js,sql,xml,csv,php,php3,php4,php5,php6,phpsh,inc,phtml)

    Ein Tipp, wie ich das hinbekomme?

    1. @eurosat7
      Bin gerade über diesen Blog-Eintrag gestolpert.
      Einfachster Weg:
      Schau mal im Install nach [SYS][textfile_ext]. Dort kannst die Endungen anpassen.
      Trage einfach zusätzlich ts dort ein.

  4. Hallo Andy,

    tolle Idee, um das Typoscript zu bändigen.
    Was ich nicht ganz verstehe, ist die Einbindung auf root Ebene:
    und
    für setup und constants.

    Sollte es nicht so sein:
    für setup
    für constants?
    Und dann noch weitere Unterteilungen nach setup und constants unter plugin, lib und page?

    Gruß Egon

  5. Mein Aufbau ist ähnlich, nur das ich seit längerem den ganzen TS Code nicht mehr im fileadmin habe, so das Redakteure nicht versehentlich etwas ändern. Dazu habe ich eine simple Template Extension erstellt.

    Mein Root Template würde etwa so aussehen, wenn der Code im fileadmin abgelegt ist:

    setup

    constants:

    in tsconfig der home seite:

    @andy: danke für den forceTemplateParsing Hinweis!

    @egon : so viel constants Code hat man jeweils nicht um dies gross unterteilen zu müssen.

Kommentare sind geschlossen.