Manchmal muss man beim Entwickeln für Typo3 TypoScript an den unterschiedlichsten Stellen auslesen. Im folgenden zwei Beispiele, die mich gerade ein wenig auf die Probe gestellt haben.
TypoScript bei Nutzung von eID
Das Skript, welches mit eID angesprochen wird, ist ja lightweight und lädt erstmal nahezu nix vom Typo3-Kern. Nutzer und Datenbank sind schnell initialisiert, aber wenn man z.B. Werte aus dem TypoScript Setup des Plugins auslesen will geht das nicht nur mit einer Zeile Code. Dem eID-Skript muss auf irgendeine Weise die PageID übergeben werden (ich mache das mit einer Get-Variable), die braucht man nämlich, um das TSFE (das ja nicht da ist), ordentlich zu initialisieren. Man instanziiert sich eine tslib_fe Klasse, verbindet zur Datenbank, initialisiert den Nutzer, das Template und die Config und schon ist man fertig:
// eID specific initialization of user and database tslib_eidtools::connectDB(); tslib_eidtools::initFeUser(); // initialize TSFE require_once(PATH_tslib.'class.tslib_fe.php'); require_once(PATH_t3lib.'class.t3lib_page.php'); $temp_TSFEclassName = t3lib_div::makeInstanceClassName('tslib_fe'); $GLOBALS['TSFE'] = new $temp_TSFEclassName($TYPO3_CONF_VARS, $pid, 0, true); $GLOBALS['TSFE']->connectToDB(); $GLOBALS['TSFE']->initFEuser(); $GLOBALS['TSFE']->determineId(); $GLOBALS['TSFE']->getCompressedTCarray(); $GLOBALS['TSFE']->initTemplate(); $GLOBALS['TSFE']->getConfigArray();
Nun kann man altbekannt via
$GLOBALS['TSFE']->tmpl->setup['plugin.']['extensionkey.']['your_value']
auf die Daten zugreifen. Mit der letzten Codezeile kann man übrigens auch in nicht vollständig initialisierten Plugins das TypoScript beliebig auslesen.
TypoScript in Backend-Modulen
In Backend-Modulen ist es auch manchmal notwendig, auf das TypoScript Setup zuzugreifen, zum Beispiel beim Senden einer Email, um den Absender auszulesen etc. Der Ablauf ist ähnlich wie bei eID, jedoch ermitteln wir selber die RootPageID und nutzen die t3lib_pageSelect und t3lib_tsparser_ext Klassen. Ich habe das ganze in eine Funktion gepackt, da man das ja nicht unbedingt immer braucht:
/** * Loads the TypoScript for the given extension prefix, e.g. tx_cspuppyfunctions_pi1, for use in a backend module. * * @param string $extKey * @return array */ function loadTypoScriptForBEModule($extKey) { require_once(PATH_t3lib . 'class.t3lib_page.php'); require_once(PATH_t3lib . 'class.t3lib_tstemplate.php'); require_once(PATH_t3lib . 'class.t3lib_tsparser_ext.php'); list($page) = t3lib_BEfunc::getRecordsByField('pages', 'pid', 0); $pageUid = intval($page['uid']); $sysPageObj = t3lib_div::makeInstance('t3lib_pageSelect'); $rootLine = $sysPageObj->getRootLine($pageUid); $TSObj = t3lib_div::makeInstance('t3lib_tsparser_ext'); $TSObj->tt_track = 0; $TSObj->init(); $TSObj->runThroughTemplates($rootLine); $TSObj->generateConfig(); return $TSObj->setup['plugin.'][$extKey . '.']; }
Und damit hätte man wieder ein paar Typo3-Probleme weniger...
Tags: backend-module, eID, Typo3, typoscript
September 1st, 2008 at 9:34 am
Tolle Info – genau das hab ich gesucht
)) Werd’s gleich in mein Script einbauen!
September 25th, 2008 at 5:20 pm
super info – danke für’s posten!
lustig, wir bloggen über ähnliche dinge und haben das gleiche wp theme
November 18th, 2008 at 11:43 am
Achtung Tippfehler, der leicht übersehen wird:
In der Zeile
$GLOBALS['TSFE']->tmpl->setup['plugin']['extensionkey.']['your_value']
fehlt der Punkt (.) hinter “plugin”. Korrekt heisst es
$GLOBALS['TSFE']->tmpl->setup['plugin.']['extensionkey.']['your_value']
Hoffe euch damit Fehlersuche zu ersparen
Januar 21st, 2009 at 11:11 pm
Danke für die Löung
Allerdings hatte ich bei einer userfunc, die über eine Flexform aufgerufen wird, das Problem, dass das Rootline-Array nicht die aktuelle Seite enthalten hat, auf der das Plugin eingefügt war, sondern immer nur die Root-Seite des gesamten Seitenbaums.
Folgender Lösungsansatz hat zum Ziel geführt:
Übergabe von $config an die Funktion, also hier
function loadTypoScriptForBEModule($config) ….
Und dann nachfolgend
$sysPageObj = t3lib_div::makeInstance(‘t3lib_pageSelect’);
$rootline = $sysPageObj->getRootLine($config['row']['pid']);
Damit liest er die komplette Rootline aus und packt alles brav in das $rootline-Array.
Evtl. hilft es ja jemandem weiter.
Gruß
Gregor
Juni 17th, 2010 at 10:37 am
Vielen Dank! Nach 2-3 Stunden aktiver Suche bin ich endlich auf deine Lösung gestoßen!
Juni 17th, 2010 at 10:38 am
[...] [...]
August 10th, 2010 at 9:00 am
Vielen Dank für diese gute Anleitung. Seit TYPO3 4.3 ist t3lib_div::makeInstanceClassName deprecated und wurde durch t3lib_div::makeInstance ersetzt.
August 10th, 2010 at 4:32 pm
Hey Lina, danke für die Anmerkung!