Hallo Leute,
einfache Frage nach einer vermutlich noch einfacheren Antwort 😉 :
Wie bekomme ich denn in ein über eID angesprochenen php-Script (für AJAX) die Variablen aus der locallang am einfachsten rein, damit ich sie per pi_getLL() ansprechen kann?
Dank und Gruß
Jehu
Hallo,
gar nicht so einfach, schau dir mal rgecard an. Dort habe ich das über eine Variable in einem div gelöst, das ich dann per js auslese. Aber du kannst das sicherlich auch einfach in der URL mitgeben
georg
Hmm. Schade.
Die URL-Lösung ist suboptimal, da ich in der php-Datei für den AJAX-Request umfangreiche DB-Abfragen mache und die Ergebnisse (z. B. umfangreiche Listen mit vielen Divs) zurückliefere. Das heisst, ich benötige ziemlich viele Sprach-Variablen.
Ich guck mal in 'rgecard' rein. Danke.
Dachte, es gäbe sowas wie "tslib_eidtools::connectDB()" auch für die Sprachdateien oder die tslib_pibase.
... da hab ich mir wohl selber das Stichwort gegeben.
Google-Suche und das hier gefunden: http://www.typo3-tutorials.org/tutorials/extensions/eid-mechanismus.html
Müsste doch so funktionieren. Oder?
Spricht eigentlich etwas dagegen, die Plugin-Datei (class.meinplugin_pi1.php) auch für die Ajax-Requests zu verwenden?
Jehu schrieb
Spricht eigentlich etwas dagegen, die Plugin-Datei (class.meinplugin_pi1.php) auch für die Ajax-Requests zu verwenden?
naja die Übersicht vielleicht, weil du ja doch nicht die gleichen Funktionen sofort bereit hast.. aber reine Geschmacksache
georg
Soooo. Nun habe ich eine zufriedenstellende Lösung für die Lokalisierung von AJAX-Anwendungen und eID gefunden.
Ausschlaggebend war dieser Eintrag im Bugtracker, bzw eine Antwort darauf.
<?PHP
header('Content-Type: text/html; charset=UTF-8');
// Exit, if script is called directly (must be included via eID in index_ts.php)
if (!defined ('PATH_typo3conf')) die ('Could not access this script directly!');
require_once(PATH_tslib.'class.tslib_pibase.php');
/* Fake class LL support */
class csConvObj {
function parse_charset() {
return 'utf-8';
}
function utf8_decode($l,$c) {
return $l;
}
}
$TSFE=new stdClass;
$TSFE->csConvObj=new csConvObj;
class ajax_addressbook extends tslib_pibase {
function main(){
global $TSFE;
$feUserObj = tslib_eidtools::initFeUser(); // Initialize FE user object,
tslib_eidtools::connectDB(); //Connect to database
// Sprache aus GET-Variable auslesen
// Wenn Variable fehlt, dann Fallback auf 'default'
$this->lang = t3lib_div::_GET('lang');
if($this->lang == '') $this->lang = 'default';
// locallang.xml parsen
$LOCAL_LANG=t3lib_div::readLLfile('EXT:mein_extkey/pi1/locallang.xml',$this->lang);
// Inhalt der locallang testweise ausgeben
print_r($LOCAL_LANG);
$this->action = t3lib_div::_GET('action');
// Funktionsaufruf abhängig von "action"-Variable
if ($this->action=='getAddresslist') {
print $this->getAddresslist();
}
}
function getAddresslist() {
// Code....
}
}
$output = t3lib_div::makeInstance('ajax_addressbook');
$output->main();
?>
Nun köknnen die Variablen der locallang.xml angesprochen werden:
$LOCAL_LANG[$this->lang]['nodata'];
['nodata'] muss natürlich durch den entsprechenden index aus der locallang.xml ersetzt werden, der angesprochen werden soll.
Ich hoffe, das erspart manch einem die Arbeit, dich ich mit der Lösungsfindung hatte...
Alternative Vorschläge sind willkommen.
Grüße
Jehu
ehrlichgesagt finde ich die Lösung nicht so prickelnd, da hier ein Pseudo-TSFE-Objekt erstellt wird.
Für eID ist es viel einfacher, LANG zu initialisieren und die Labels über $LANG->sL anzusprechen
require_once(PATH_typo3.'sysext/lang/lang.php');
$LANG = t3lib_div::makeInstance('language');
$label = $LANG->sL('LLL:EXT:extension/pi1/locallang.xml:labelName', 1);
Hallo Steffen,
ist schon ein wenig her der Eintrag, aber ich bin gerade erst darüber gestolpert. Laut Kommentaren innerhalb von lang.php ist der "language-splitted" als deprecated gekennzeichnet. Das nur am Rande.
Ich habe allerdings ein konkretes Problem, wenn ich in der XML Datei Umlaute für deutsche Labels verwende wird mir kein korrekter Wert zurück gegeben.
Hast du da noch eine Idee?
// Abfragen
$this->LLkey = t3lib_div::GPvar('L');
if($this->LLkey == '') { // Standard
$this->LLkey = 'default';
}
$this->LOCAL_LANG = t3lib_div::readLLfile('EXT:'.$this->extKey.'/pi1/locallang.xml', $this->LLkey);
$this->LOCAL_LANG_loaded = 1;
$this->pi_loadLL();
Hallo an Alle,
auch auf die Gefahr hin, dass dieser Thread uralt ist, wollte ich eine kurze Bemerkung dazu machen.
Dieses minimalistische Beispiel hat bei mir schon funktioniert.
class tx_my_extension_name extends tslib_pibase {
var $extKey = 'tx_my_extension_name';
public $scriptRelPath = 'pi1/class.tx_my_extension_name.php';
function main() {
$GLOBALS['TSFE'] = t3lib_Div::makeInstance('tslib_fe');
$GLOBALS['TSFE']->fe_user = tslib_eidtools::initFeUser();
$this->pi_loadLL();
echo $this->pi_getLL('my_label');
}
}
Sorry, dass ich diesen alten Thread hier noch einmal ausgrabe:
$this->lang = $values['lang'];
if($this->lang == '') $this->lang = 'default';
$this->LOCAL_LANG = t3lib_div::readLLfile('EXT:lb4de/pi4/locallang.xml',$this->lang);
$this->pi_loadLL();
Debug-Ausgabe:
t3lib_div::debug($this->LOCAL_LANG);
liefert mir folgendes Array:
default
Label1
0
source DEF:value
target DEF:value
1
Label1
0
source DEF:value
target DEF:value
eigentlich sollte unter 1 der englischsprachige Text geladen werden - dem ist aber nicht so. Jemand eine Idee warum? (unter 1 lädt er nochmals den default-text, ändert auch nichts daran, dass ich versuche zB die id 3 zu laden.., er überschreibt die werte der language id 1,2,3,etc. immer mit dem default wert)
Cache habe ich mittlerweile abgeschalten, das wars nicht..
Ich weiss, der Thread ist alt.
Ich komme trotzdem nicht umhin zu ergänzen/verbessern, aus gegebenem Anlass.
1. Die Klasse des eID-Scripts muss von tslib_pibase abgeleitet werden:
class tx_myextkey_eid extends tslib_pibase {
// @todo fill code
}
2. Wir benötigen zwei Class-Properties:
var $extKey = 'myextkey';
var $scriptRelPath = 'piX/class.tx_my_script_path.php';
es ist eigentlich wurscht ob public oder protected. AFAIK nur halt nicht private.
3. Anschliessend müssen wir das TSFE initialisieren (möglichst bevor wir tslib_eidtools::initFeUser() aufrufen).
Haken an der Sache: diese Klasse benötigt (mittlerweile) 3 Parameter, wir gehen also wie folgt vor (strikt nach T3 Coding Guidelines/API):
public function main() {
$GLOBALS['TSFE'] = t3lib_div::makeInstance('tslib_fe', $GLOBALS['TYPO3_CONF_VARS'], (int)t3lib_div::_GP('id'), (int)t3lib_div::_GP('type'));
$GLOBALS['TSFE']->fe_user = tslib_eidtools::initFeUser();
// @todo more code in mainfunction
}
4. Nun können wir gefahrlos den üblichen Weg zum Laden von Sprachen gehen:
private function myEidLoadLL() {
$this->pi_loadLL(); // loads $this->LOCAL_LANG; could be written in main() of course too.
}
Hmm, leider führt keiner der Lösungen bei mir zur Verwendung der korrekten Sprache, immer wird das default-Array geladen.
Anbei der Beginn meiner Klasse:
public function main($content, $conf) {
$GLOBALS['TSFE'] = t3lib_div::makeInstance('tslib_fe', $GLOBALS['TYPO3_CONF_VARS'], t3lib_div::_GP('id'), t3lib_div::_GP('type'));
$GLOBALS['TSFE']->connectToDB();
$GLOBALS['TSFE']->initFEuser();
$GLOBALS['TSFE']->checkAlternativeIdMethods();
$GLOBALS['TSFE']->determineId();
$GLOBALS['TSFE']->getCompressedTCarray();
$GLOBALS['TSFE']->initTemplate();
$GLOBALS['TSFE']->getConfigArray();
$this->cObj = t3lib_div::makeInstance('tslib_cObj');
$this->conf = $conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();
Sieht jemand, woran es liegen könnte?
jaaa, das problem ist, dass man $this->LLkey setzen muss bevor man pi_loadLL aufruft.
ich habe leider keinen weg gefunden das vernünftig über die api hinzubekommen, $this->LLkey muss ja lang-iso2 sein.
man bekommt aber so nur die sys_language_uid raus. man muss sich also den iso2 aus der db holen, was reichlich umständlich ist.
oder man matched sich das händisch, if (int)t3lib_div::_GP('L') = 0 -> $this->LLkey = 'de' etc ...
vielleicht besser mit nem array oder so.
ich hab es im typoscript gesetzt. geht aber auch nur, wenn man sich eine funktion parseMergeTypoScript schreibt, oder so, die das entsprechende typoscript lädt ...
Wunderbar, das klappt!
Und da in meiner Extension sowieso erstmal nur deutsch und englisch enthalten sein sollen, kann ich es auch händisch setzen.
wenn nur alle probleme so einfach zu lösen wären ... 😉
du hast im ausgleich dafür nicht schnell ne lösung parat wie ich (komplett OT) den imageMarker-optionSplit in den tt_news auch für die listenansicht verwenden kann? :-)
Leider nicht, hab das bisher auch nur in der Einzelansicht gebraucht 😉