Hallo Leute!
Ich habe da eine Klasse ohne Controller und möchte auf die TS-Settings zugreifen. Wie geht das? Das sollte doch irgendwie über die Configuration-Klasse von extbase funktionieren, oder?
lg lixx
Hallo Leute!
Ich habe da eine Klasse ohne Controller und möchte auf die TS-Settings zugreifen. Wie geht das? Das sollte doch irgendwie über die Configuration-Klasse von extbase funktionieren, oder?
lg lixx
Inhalt ext_typoscript_setup.txt
plugin.tx_myextension {
settings {
foo = blub
}
}
Im Controller erfolg der Zugriff über
print $this->settings['foo']
Ausgabe: "blub"
Danke für Deine Antwort!
Das wäre aber innerhalb eines Controllers und derselben Extension. Was ich gerne wissen würde ist, wie man die settings einer Extension "richtig" laden kann. Also nicht aus der $GLOBALS. So was ähnliches wie xxx::getConfigurationFromPlugin($plugin)
lg lixx
Wie man das "richtig" macht kann ich dir nicht sagen aber man bekommt das ganze TS hier ausgelesen:
'$GLOBALS['TSFE']->tmpl->setup'
Wie du das dann vereibeitest bleibt dir überlassen, ich mach das z.B. so:
class Tx_MyExtension_Service_TsLoader {
/**
* Gibt fuer $_EXTKEY das 'plugin.'-Array (ohne Punkte) zurueck
*
* @param string Extension-Key z.B.'tx_extbase'
* @param boolean true für plugin TS, falls für config TS
* @return array
*/
public static function getTsSetup($_EXTKEY, $plugin = true) {
// TypoScript von $_EXTKEY laden
$settings = t3lib_div::makeInstance('Tx_Extbase_Configuration_FrontendConfigurationManager')->loadTypoScriptSetup();
return self::removeDots($settings[$plugin ? 'plugin.' : 'config.'][$_EXTKEY.'.']);
}
/**
* Entfernt Punkte in dem TypoScript-Array
*
* @return void
*/
private static function removeDots($settings) {
$conf = array();
foreach ($settings as $key => $value)
$conf[self::removeDotAtTheEnd($key)] = is_array($value) ? self::removeDots($value) : $value;
return $conf;
}
/**
* Entfernt einen Punkt am ende von $string
*
* @param string $string
* @return string $string
*/
private static function removeDotAtTheEnd($string) {
return preg_replace('/\.$/', '', $string);
}
}
Aufruf:
$extbaseTs = Tx_MyExtension_Service_TsLoader::getTsSetup('tx_extbase', false);
Vielleicht kannst du damit was anfangen.
Gruß
Danke für Deine Antwort, freshman!
Dachte es würde bereits eine solche Funktion geben. Danke für deinen Tipp.
lg lixx
Ich möchte ein ähnlich gelagertes Problem lösen:
Im TSconfig einer FrontendUserGroup möchte ich ein paar Einstellungen für eine Extension hinterlegen.
tx_myextension {
settings {
param1 = 3
}
}
Kann man Extbase-Bordmitteln diese Einstellungen mit den TS-setup/constants Einstellungen des Templates zusammenführen, so dass sie dann gemeinsam über $this->settings->param1 zur Verfügung stehen?
Momentan habe ich mir selbst eine Lösung durch das Auslesen von
$GLOBALS['TSFE']->fe_user->groupData['TSconfig']
zusammengeschraubt.
Interessant wäre dennoch zu wissen, ob es eine bessere Möglichkeit gibt.
Der Threat ist ja schon ein wenig älter und mittlerweile bietet extbase (ab 1.3) eine Lösung an 🙂
hier ein Beispiel:
// fall Aufruf aus dem Controller dann über $this->objectManager
$objectManager = t3lib_div::makeInstance('Tx_Extbase_Object_ObjectManager');
$configurationManager = $objectManager->get('Tx_Extbase_Configuration_ConfigurationManagerInterface');
/**
* mögliche Werte:
*
* const CONFIGURATION_TYPE_FRAMEWORK = 'Framework';
* const CONFIGURATION_TYPE_SETTINGS = 'Settings';
* const CONFIGURATION_TYPE_FULL_TYPOSCRIPT = 'FullTypoScript';
*/
$frameworkConfiguration = $configurationManager->getConfiguration(
Tx_Extbase_Configuration_ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK
);
$this->settings = $frameworkConfiguration['settings'];
Hallo Freshman,
das klingt ja schon viel versprechend. So etwas habe ich auch schon in einer Mailing-List gefunden.
Bei meinem Test konnte ich aber nicht auf die Settings zugreifen, die ich im TSconfig bei dem FeUser definiert hatte.
FeUser->Options->TSconfig:
tx_myextension{
settings {
testvalue = abc
}
}
Mit "CONFIGURATION_TYPE_FRAMEWORK" werden die Settings aus der setup.txt (wenn als statisches Template eingeschlossen) zurückgegeben.
Mit "CONFIGURATION_TYPE_SETTINGS" oder "CONFIGURATION_TYPE_FULL_TYPOSCRIPT" bleibt $this->settings komplett leer.
Hast Du noch eine Idee, woran es liegen bzw. wie man an die TSconfig von FeUser / FeUserGroups rankommen könnte?
VG
Hi,
damit wir nicht aneinander vorbeireden, es geht hier um TypoScript(!!!) und NICHT umd TSConfig, oder?
Um das TypoScript einer Extension durch die settings-property auszulesen, muss die TypoScript-Konfigurationsdatei zuerst eingebunden werden.
Das kann auf zwei Wegen erfolgen:
Definition
1 Methode (im Backend): Template->Seite->Vollständigen Template-Datensatz bearbeiten im Reiter "Enthält" in der rechten Spalte die Extension auswählen.
damit kann man jetzt die "myext/Configuration/TypoScript/setup.txt" und "myext/Configuration/TypoScript/constants.txt" nutzen.
2 Methode: Im Root der Extension gibt es eine Datei "ext_typoscript_setup.txt" die von TYPO3 eingebunden wird ohne das man machen muss. Hier kann man
die Settings definieren z.B. so:
plugin.tx_myext.settings {
foo = hello TypoScript
}
Alternativ bzw. um die Ordnerstruktur von Extbase zu nutzen, kann man in die Dateien folgendes reinschreiben
Datei: "ext_typoscript_setup.txt" mit folgendem Inhalt
<INCLUDE_TYPOSCRIPT: source=FILE:EXT:myext/Configuration/TypoScript/setup.txt>
Datei: "ext_typoscript_constants.txt" mit folgendem Inhalt
<INCLUDE_TYPOSCRIPT: source=FILE:EXT:myext/Configuration/TypoScript/constants.txt>
Das Auslesen:
Im Controller
$this->settings['foo']
In Fluid
{settings.foo}
In anderen PHP-Dateien durch den ConfigurationManager (Tx_Extbase_Configuration_ConfigurationManager)
Gruß
Hallo nochmal,
Im ursprüngliche Ansatz des Threads ging um das TypoScript. Korrekt!
Meine letzten Fragen bezogen sich jedoch auf tatsächlich auf TSconfig, weil ich meine Problemstellung für verwandt hielt und sich auf typo3.org als einleitende Beschreibung für die TSconfig Doku folgendes findet :
TypoScript can be used to create templates for the TYPO3 frontend, but also to configure the TYPO3 backend. In this case, it is called "TSconfig". TSconfig is divided into configuration for pages ( "Page TSconfig" ) and configuration for users and groups ( "User TSconfig" ). Each variant is further detailed in its own chapter. TSconfig offers vast possibilities of customizing the TYPO3 backend.
Nun exsitiert auch bei FeUsern und FeUserGroups das Feld "TScondig", so dass die Sache mit dem Backend scheinbar nicht mehr so 100%-ig passt (but also to configure the TYPO3 backend. In this case, it is called "TSconfig"). Da ich in dieser Doku bei User TSconfig / Top Level Objects den Platzhalter für Extensions gefunden hatte (tx_[extension key with no underscore] This is reserved space for extensions), bin ich davon ausgegangen, dass dies auch für FeUser gilt.
However, ich möchte auf Basis der FeUser und deren Gruppen mittels TSconfig eine feingliedriger Konfiguration vornehmen.
Mit $GLOBALS['TSFE']->fe_user->groupData['TSconfig'] und $GLOBALS['TSFE']->fe_user->TSdataArray komme ich an die Rohdaten ran (letzteres beinhaltet ja auch die TSconfig der Gruppen). Die Arrays gehe ich einzeln mit t3lib_TSparser durch und hole mir so die Werte raus. Nicht schön, aber geht.
Die Frage war jetzt, ob es auch eine saubere Lösung über den ConfigurationManager gibt?!
Aber vielleicht bin ich die Sache ja auch komplett falsch angegangen. Deswegen sind Vorschläge für beide Fälle willkommen.
So wie ich dich verstanden habe willst du nur einmal (was auch immer konfigurieren) und in TypoScript, so wie in TSConfig nutzen.
Bespiel als Anregung:
ext_tables.php
//Add default pageTS
t3lib_extMgm::addPageTSConfig('<INCLUDE_TYPOSCRIPT: source="FILE:EXT:myext/Configuration/TSConfig/default.txt">');
in myext/Configuration/TSConfig/default.txt
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:myext/Configuration/TypoScript/setup.txt">
TCEFORM.tx_myext_domain_model_product.foo {
PAGE_TSCONFIG_ID < plugin.tx_myext.settings.bar
}
in myext/Configuration/TypoScript/setup.txt
plugin.tx_myext {
settings {
bar = hello TSConfig
}
}
in Fluid:
{settings.bar}
Somit "settings.bar" nur einmal definiert und im FE + BE benutzt 😉
Danke erstmal im Voraus, dass Du Dir so geduldig die Zeit nimmst. Deine Lösung trifft nicht das, was ich zu beschreiben versucht habe. Bei deinem Vorschlag gilt TSconfig für alle FeUser und FeUserGroups gleichermaßen, da es ja aus der Datei kommt.
Ich wollte für einzelne Gruppen bzw. Benutzer die Settings definieren (siehe Anhang), um z.B. in der Extension den Zugriff auf gewisse SysFolder zu ermöglichen oder andere Dinge in Abhängigkeit von User/Groups festzulegen.
Im Anhang sind die TSconfig-Felder vom FeUser und FeUserGroup zu sehen, auf die ich mich die ganze Zeit beziehe.
Kannst du die Konfiguration nicht in eine Datei auslagern? Ansonsten einen Service erstellen und die Funktionalität (sowie du es hast mit $GLOBALS['TSFE']->fe_user->groupData['TSconfig']) dort kapseln, spricht ja nichts dagegen!
Danke "freshman17" das ist aber genau was ich schon seit langem gesucht habe.
Cooler Trick!!!
in myext/Configuration/TSConfig/default.txt
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:myext/Configuration/TypoScript/setup.txt">
TCEFORM.tx_myext_domain_model_product.foo {
PAGE_TSCONFIG_ID < plugin.tx_myext.settings.bar
}
in myext/Configuration/TypoScript/setup.txt
plugin.tx_myext {
settings {
bar = hello TSConfig
}
}
in Fluid:
{settings.bar}
Somit "settings.bar" nur einmal definiert und im FE + BE benutzt 😉
[/quote]