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

URL dieses Beitrags: http://blog.stefan-macke.com/2008/05/14/globale-sprachdatei-fuer-saemtliche-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

  1. require_once(PATH_tslib.'class.tslib_pibase.php');
  2. abstract class sm_testextension_pibase extends tslib_pibase
  3. {
  4.         private $globalLocallangLoaded = false;
  5.         function pi_loadLL()
  6.         {
  7.                 parent::pi_loadLL();
  8.                 if (!$this->globalLocallangLoaded)
  9.                 {
  10.                         $basePath = t3lib_extMgm::extPath($this->extKey).'locallang_global.xml';
  11.                         $tempLOCAL_LANG = t3lib_div::readLLfile($basePath, $this->LLkey);
  12.                         //array_merge with new array first, so a value in locallang (or typoscript) can overwrite values from locallang_global.xml
  13.                         $this->LOCAL_LANG = array_merge_recursive($tempLOCAL_LANG, is_array($this->LOCAL_LANG) ? $this->LOCAL_LANG : array());
  14.                         if ($this->altLLkey)   
  15.                         {
  16.                                 $tempLOCAL_LANG = t3lib_div::readLLfile($basePath, $this->altLLkey);
  17.                                 $this->LOCAL_LANG = array_merge_recursive($tempLOCAL_LANG, is_array($this->LOCAL_LANG) ? $this->LOCAL_LANG : array());
  18.                         }
  19.                         $this->globalLocallangLoaded = true;
  20.                 }       
  21.         }
  22. }

Eine Plugin-Klasse

  1. require_once(t3lib_extMgm::extPath('sm_testextension').'class.sm_testextension_pibase.php');
  2. class tx_smtestextension_pi2 extends sm_testextension_pibase
  3. {
  4.         // übliche Plugin-Implementierung
  5. }

Meine globale Sprachdatei locallang_global.xml

  1. <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
  2. <T3locallang>
  3.         <meta type="array">
  4.                 <type>module</type>
  5.                 <description>Global language labels for the plugins of extension 'sm_testextension'</description>
  6.         </meta>
  7.         <data type="array">
  8.                 <languageKey index="default" type="array">
  9.                         <label index="smte_test1">Test1 global</label>
  10.                 </languageKey>
  11.                 <languageKey index="de" type="array">
  12.                         <label index="smte_test1">Test1 global deutsch</label>
  13.                 </languageKey>
  14.         </data>
  15. </T3locallang>
Füge diesen Artikel zu deinen Bookmarks hinzu Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • del.icio.us
  • bodytext
  • MisterWong
  • Reddit
  • Technorati
  • Spurl
  • description

Kommentare zu diesem Beitrag

  1. Gravatar Webagentur
    Am 18. November 2008 um 13:54 Uhr

    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. Gravatar Stefan
    Am 18. November 2008 um 18:57 Uhr

    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).

Einen Kommentar schreiben

XHTML: Diese Tags sind erlaubt: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>