[TYPO3-german] Referenzierung von config-Einstellungen in PHP

Rolf Gründler gruendler at ngi.de
Tue Sep 25 12:49:47 CEST 2007


Hallo Martin,

zunächst einmal danke für Deine Bereitschaft, Dich mit meinem
zugegebenermaßen exotischen Problem auseinanderzusetzen.

Zum besseren Verständnis vielleicht noch einpaar Hintergrundinformationen:

Das Projekt, an dem ich arbeite, ist ein Webauftritt für meine in Spanien
lebende Tochter (www.mowgli.es). Da ich jedoch des Spanischen nicht mächtig
bin, haben wir die Site erstmal in Deutsch angelegt, und meine Tochter hat
sie dann ins Spanische übersetzt - daher Defaultsprache = Deutsch
(sys_language_uid = 0) und Zusatzsprache 1 = Spanisch (sys_language_uid =
1).

Beim Aufruf von www.mowgli.es soll aber natürlich sofort die spanische
Version erscheinen - daher "config.sys_language_uid = 1" im Setup des
TS-Template der Rootpage. Solange man nicht den Sprachumschalter betätigt,
werden alle Seiten ohne L-Parameter in der URL generiert, was ja auch besser
aussieht. Erst, wenn man eine der beiden Flaggen anklickt, wird von diesem
Zeitpunkt an der L-Parameter immer mitgeschleppt (L=0 für Deutsch und L=1
für Spanisch). Funktioniert aber alles prima.

Bringt man nun Alias-Namen für die Seiten ins Spiel, wird die Sache
komplizierter. Zunächst einmal gibt es im Typo3-Core keine Sprachversion für
"Alias" (Feld existiert nur in Tabelle "pages" aber nicht in
"pages_language_overlay"). Ist aber wünschenswert, damit die Seitennamen in
den verschiedenen Sprachen Sinn machen.

Die kleine Extension "multilingual_alias" bringt da Abhilfe, indem sie die
Tabelle "pages_language_overlay" um das Feld "alias" ergänzt. Gleichzeitig
bohrt sie die Funktion "getPageIdFromAlias($alias)" der Klasse
"ux_t3lib_pageSelect" des Typo3-Cores auf.

Im Typo3-Core:

 function getPageIdFromAlias($alias) {
  $alias = strtolower($alias);
  $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'pages',
'alias='.$GLOBALS['TYPO3_DB']->fullQuoteStr($alias, 'pages').' AND pid>=0
AND pages.deleted=0'); // "AND pid>=0" because of versioning (means that
aliases sent MUST be online!)
  if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
   return $row['uid'];
  }
  return 0;
 }

Wird in der Extension "multilingual_alias" zu:

 function getPageIdFromAlias($alias)
 {
  $alias = strtolower($alias);
  $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'pages',
'alias='.$GLOBALS['TYPO3_DB']->fullQuoteStr($alias, 'pages').' AND pid>=0
AND pages.deleted=0'); // "AND pid>=0" is because of versioning...
  if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))
  {
   return $row['uid'];
  }
  if ($L=$_GET['L'])
  {
   $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('pid',
'pages_language_overlay',
'alias='.$GLOBALS['TYPO3_DB']->fullQuoteStr($alias,
'pages_language_overlay').' AND sys_language_uid='.$L);
   if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))
   {
    return $row['pid'];
   }
  }
  return 0;
 }

Das funktioniert jedoch nur, wenn in der URL der L-Parameter gesetzt ist,
was beim Aufruf von www.mowgli.es, wie oben beschrieben, zunächst nicht der
Fall ist. Ist der L-Parameter nicht gesetzt, wird der 2. if-Ausdruck nie
durchlaufen und keiner der spanischen Alias-Namen gefunden.

Ich habe mir dann so geholfen, dass ich schlicht und einfach

  if ($L=$_GET['L'])

durch

  if ($L=1)

ersetzt habe. Wird keine Entsprechung für den "Alias"-Namen in der URL in
"pages" (also in Deutsch) gefunden, wo zunächst immer nachgeschaut wird, so
wird auf jeden Fall auch noch in "pages_language_overlay" für
"sys_language_uid = 1" (in meinem Fall Spanisch) danach gesucht, und das
alles unabhängig davon, ob ein L-Parameter in der URL angegeben ist oder
nicht. Damit funktioniert meine Site dann wieder.

So ist die Ausgangslage entstanden. Du hast natürlich Recht:   if ($L=1) ist
immer wahr. Der if-Ausdruck ist also eigentlich unnötig. War aber so der
minimale Änderungsaufwand, um meine Site mit der Extension wieder ans Laufen
zu bekommen

Allerdings muss für die deutsche Version der Seiten weiterhin der
L-Parameter in der URL angegeben werden. Ohne diesen findet die Funktion
"getPageIdFromAlias" zwar die richtige Seite, da aber
"config.sys_language_uid = 1" gesetzt ist, wird im späteren Verlauf des
Seiten-Rendering die spanische Version produziert. Die Funktion
"getPageIdFromAlias" gibt nur die richtige "uid" aus "pages" zurück. Welche
Sprachversion dann zur Anzeige kommt, hängt von anderen Faktoren ab.

Um den L-Parameter auch für die deutsche Version der Seiten loszuwerden, war
meine Idee nun, in "getPageIdFromAlias" wenn nötig, die Seitensprache (also
die Einstellung für "config.sys_language_uid") umzuschalten. Doch das
scheint nicht zu funktionieren. Es könnte sein, dass
"$GLOBALS['TSFE']->config['config']['sys_language_uid']" dort nicht
definiert ist. Wäre es definiert, sollte der Ausdruck:

  if ($L=$GLOBALS['TSFE']->config['config']['sys_language_uid'])

das gleiche liefern wie

  if ($L=1)

da ja "config.sys_language_uid = 1". Das ist aber nicht der Fall. Der
if-Ausdruck wird nie durchlaufen.

Meine letzte Idee ist nun, in der Funktion den L-Parameter zu verändern,
wenn ein deutscher Alias gefunden wird. Der L-Parameter kann dort ja
offensichtlich mit "$_GET['L']" referenziert werden, also könnte er rein
theoretisch auch verändert werden.

Die Frage ist nun: Kann man dem L-Parameter in PHP einen Wert zuweisen und
wenn ja, wie lautet die Syntax?

Uff - wenn das nicht geht, dann geb ich wirklich Ruhe!

Gruß Rolf




More information about the TYPO3-german mailing list