Globale Sprachdatei für sämtliche Plugins einer TYPO3-Extension

Ich entwickle gerade meine TYPO3-Extension sm_employeelist neu, um sie um einige Funktionen zu erweitern, an TYPO3 4.x anzupassen und meine inzwischen gewachsenen Programmierkenntnisse einfließen zu lassen 😉

Als erstes habe ich heute getestet, wie ich in mehreren Plugins, die meine Extension bieten wird, eine einzige (quasi “globale”) Sprachdatei verwenden kann. Normalerweise hat nämlich jede Extension eine eigene locallang.xml und die gesamte Extension noch einmal eine locallang_db.xml, in der jedoch nur die Backend-Texte enthalten sind und die im Frontend (wo die Plugins ausgeführt werden) nicht (oder nur umständlich) zugreifbar ist.

Ich habe zu diesem Thema diese schöne Seite gefunden: TYPO3-Spickzettel von Pi-Phi-Productions. Dort wird vorgeschlagen, die Methode pi_loadLL() zu überschreiben und eine eigene Sprachdatei einzubinden. Dies müsste ich allerdings in jeder Plugin-Klasse (extkey_pi1, extkey_pi2 etc.) tun, was mir eindeutig missfällt.

Doch da wir ja objektorientiert programmieren, ist die Lösung recht einfach: Ich erstelle mir eine abstrakte Basisklasse für all meine Plugins, die von tslib_pibase abgeleitet ist und die Methode pi_loadLL() wie beschrieben überschreibt. Meine Plugin-Klassen leite ich dann wiederum von meiner eigenen Basisklasse ab und fertig ist die Laube. Zusätzlich kann ich diese Basisklasse dann noch verwenden um Funktionen zu implementieren, die auch in allen Plugin-Klassen benötigt werden (z.B. GET-Parameter prüfen, Flexform-Konfiguration auslesen etc.).

Quelltext

Zunächst einmal verwende ich die folgende Projektstruktur:

Projektstruktur für globale Extension-Sprachdateien in TYPO3

Wie sieht das Ganze nun im Code aus?

Meine abstrakte Plugin-Basisklasse
require_once(PATH_tslib.'class.tslib_pibase.php'); abstract class sm_testextension_pibase extends tslib_pibase { private $globalLocallangLoaded = false; function pi_loadLL() { parent::pi_loadLL(); if (!$this->globalLocallangLoaded) { $basePath = t3lib_extMgm::extPath($this->extKey).'locallang_global.xml'; $tempLOCAL_LANG = t3lib_div::readLLfile($basePath, $this->LLkey); //array_merge with new array first, so a value in locallang (or typoscript) can overwrite values from locallang_global.xml $this->LOCAL_LANG = array_merge_recursive($tempLOCAL_LANG, is_array($this->LOCAL_LANG) ? $this->LOCAL_LANG : array()); if ($this->altLLkey) { $tempLOCAL_LANG = t3lib_div::readLLfile($basePath, $this->altLLkey); $this->LOCAL_LANG = array_merge_recursive($tempLOCAL_LANG, is_array($this->LOCAL_LANG) ? $this->LOCAL_LANG : array()); } $this->globalLocallangLoaded = true; } } }

Eine Plugin-Klasse
require_once(t3lib_extMgm::extPath('sm_testextension').'class.sm_testextension_pibase.php'); class tx_smtestextension_pi2 extends sm_testextension_pibase { // übliche Plugin-Implementierung }

Meine globale Sprachdatei locallang_global.xml
<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <T3locallang> <meta type="array"> <type>module</type> <description>Global language labels for the plugins of extension 'sm_testextension'</description> </meta> <data type="array"> <languageKey index="default" type="array"> <label index="smte_test1">Test1 global</label> </languageKey> <languageKey index="de" type="array"> <label index="smte_test1">Test1 global deutsch</label> </languageKey> </data> </T3locallang>

Über Stefan

Polyglot Clean Code Developer

3 Kommentare

  1. Nettes Tutorial, aber wie kann ich in meiner eigenen Extension eine weitere Klasse mit Methoden einbinden? Innerhalb dieser zusätzlichen Klasse sollten dann auch die ganzen Typo3-Funktionen vorhanden sein. Danke!

  2. Hast du dich schon mal intensiver mit Extension-Entwicklung beschäftigt? Deine Extension ist ja direkt von der entsprechenden Extension-Klasse abgeleitet und hat über einige Attribute Zugriff auf die wichtigsten Funktionen. Allen weiteren Klassen musst du die benötigten Funktionen “mitteilen” (z.B. per Dependency Injection).

  3. danke für das interessante Tutorial =)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax