Zum Inhalt springen

Eigene Extension - Daten verschwinden bei Sprachwechsel

Erstellt am 13. März 2011 · 7 Antworten · letzte Antwort am 27. März 2011

Tags: Frage

submental ·

Hallo,

in meiner Extension stoße ich gerade auf ein Problem, für das ich bisher keine verständlichen Informationen im Netz finden konnte:

Ändere ich die Sprache auf der Detailseite eines Datensatzes verschwindet der Inhalt!

In der Listenansicht dagegen funktioniert die Umstellung der Sprache. Dort werden aber auch keine Variablen in der Url übergeben.

Ich habe festgestellt das beim Umschalten der Sprache auf der Detailseite die Sprachen-Variable "L=x" verloren geht.

Kennt jemand ein derartiges Problem! Für jeden Tip wäre ich sehr dankbar!

vince ·

Hallo,

Wie sieht denn der Link aus, den Du in deiner Extension erzeugst?
(um von der Listenansicht auf die Detailansicht zu kommen).

Da kannst Du den L= Parameter ja mit ranhängen.

Gruß,
Vince.

submental ·

Hallo Vince,

danke für die Antwort! So sieht der Link aus:

url.../kuenstlerdetail.html?&no_cache=1&L=3&tx_aorealgallery_pi1[showUid]=3

Dieser bringt einen zur Detailansicht des Künstlers ID3.
Allerdings scheine ich mich vertan zu haben. Die Sprach-Variable fehlt garnicht. Bei der default Sprache fällt die L=0 ja raus.Und bei einer dritten Sprache wird die ganz richtig mit übergeben.

Eventuell geht es doch eher darum, wie meine Datenbank Abfrage in der Extension funktioniert! Mein SQL Query beinhaltet einen Teil der nach aktueller Sprache Inhalte zieht, als eine Art Bedingung. Kann das falsch sein?

So sieht meine DB Anfrage aus:

function getItemsFromTable($table,$searchStrg,$addStrg,$orderBy){
		$lang = $GLOBALS['TSFE']->sys_language_uid;
		$field = "hidden = 0 AND sys_language_uid = ".$lang.$addStrg;
		$groupBy = "";
		$limit = "";
		
		$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($searchStrg,$table,$field,$groupBy,$orderBy,$limit);
		
		$out = array();
		while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
   			$out[] = $row;
		}
		
		return $out;
	}

Viele Grüße
Oliver

vince ·

Hallo,

was genau steht denn in Deiner $lang Variable drinn??

$GLOBALS['TSFE']->sys_language_uid;

liefert die Sprache, in der die Extension eingebunden wurde.

Den L Parameter fragt man so ab:

$this->lang = $GLOBALS['TSFE']->config['config']['sys_language_uid'] ;

Ansonsten wird ich mir zum testen mal die Query ausgeben lassen. Dann kannst Du die
direkt ausprobieren (das mach ich immer um auszuschließen, dass der Fehler in der Query liegt).

Gruß,
Vince.

aemka ·

Hi,

hast du nicht in der Detail-Ansicht einfach nur das problem, dass du den datensatz mit einer bestimmten id selektieren möchtest, der in Verbindung mit einer durch den Link im Sprachmenu gewechselten Sprach-ID nicht mehr in der datenbank gefunden werden kann weil die SQl Where-Bedingung diesen bestimmenten Datensatz in einer Sprache selektieren will, in der er nicht verfügbar ist. denn übersetzte records haben ja alle eine andere uid.

Falls das der Fall ist lies das mal:
http://www.felixnagel.com/blog/artikel/2010/06/24/mehrsprachige-typo3-extensions-getrecordoverlay-richtig-einsetzen/

submental ·

Hey, danke für die Antwort!

Es ist ja aktuell so: Ich wähle eine Sprache auf der Hauptseite, das funktioniert problemlos. Anschließend wechsel ich in die Listenansicht, switche zwischen unterschiedlichen Sprachen und es funtioniert ebenfalls. Nun klicke ich auf ein Item der Liste um in den Detailübersicht zu kommen, und sehe die Details in der jeweilig gewählten Sprache! - Aber - will ich nun in der Detailansicht erneut die Sprache wechseln sehe ich nur noch leere Seiten.

@vince: Ich probiere das mal und schaue was passiert!

@aemka: Schaue mir mal Deine Empfehlung an und berichte!

Danke für den Input!

submental ·

Hallo aemka,

ich denke dein Link geht absolut in die richtige Richtung! Ledier hab ichs aber noch nicht geschafft das die richtigen Inhalte angezeigt werden. Ich vermute das ich meine bisherige DB Abfrage und Verarbeitung stark verändern muss, noch blicke ich da nicht durch.

Meine Funktionen in der Extension rufen die DB Abfrage zum Beispiel so:

$rows = $this->getItemsFromTable("tx_aorealgallery_artist","uid,firstname,lastname,image,category"," AND category=6","lastname asc" ) ;

Aus der originalen Abfrage:

function getItemsFromTable($table,$searchStrg,$addStrg,$orderBy){
		$lang = $GLOBALS['TSFE']->sys_language_uid;
		$field = "hidden = 0 AND sys_language_uid = ".$lang.$addStrg;
		$groupBy = "";
		$limit = "";
 
		$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($searchStrg,$table,$field,$groupBy,$orderBy,$limit);
 
		$out = array();
		while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
   			$out[] = $row;
		}
 
		return $out;
	}

habe ich versucht diverse Variablen zu verteilen und so in die neue Variante eingesetzt:

function getItemsFromTable($mytable,$searchStrg,$addStrg,$orderBy){
	$select = $searchStrg;
	$table = $mytable;
	// we try to get the default language entry (normal behaviour) or, if not possible, currently the needed language (fallback if no default language entry is available)
	$where = '(sys_language_uid IN (-1,0) OR (sys_language_uid = ' .$GLOBALS['TSFE']->sys_language_uid. ' AND l18n_parent = 0))';
	$where  .= $addStrg;
	// always (!) use TYPO3 default function for adding hidden = 0, deleted = 0, group and date statements
	$where  .= $GLOBALS['TSFE']->sys_page->enableFields($table);
	$order = $orderBy;
	$group = '';
	$limit = '';
	$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select, $table, $where, $group, $order, $limit);
 
	while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
		// check for language overlay if:
		// * row is valid
		// * row language is different from currently needed language
		// * sys_language_contentOL is set
		if (is_array($row) && $row['sys_language_uid'] != $GLOBALS['TSFE']->sys_language_content && $GLOBALS['TSFE']->sys_language_contentOL) {
			$row = $GLOBALS['TSFE']->sys_page->getRecordOverlay($table, $row,$GLOBALS['TSFE']->sys_language_content, $GLOBALS['TSFE']->sys_language_contentOL);
			$out[] = $row;
		}
	}
  return $out;
}

Momentan wird leider kein Datensatz ausgegeben...

submental ·

Keine Antwort ist auch ne Antwort 🙂

Das Array $res scheint ab dem moment keinen Inhalt mehr zu haben, sobald ich mit diesen $where Klauseln komme.

so sieht meine DB funktion jetzt aus:

function getItemsFromTable($table,$searchStrg,$addStrg,$order){

	$select = 'pid,sys_language_uid,'.$searchStrg;	
	echo('This is the SELECT string: <br>'.$select.'<br><br>');
	
	$where = '(sys_language_uid IN (-1,0) OR (sys_language_uid = ' .$GLOBALS['TSFE']->sys_language_uid. ' AND l18n_parent = 0))';
	$where .= $GLOBALS['TSFE']->sys_page->enableFields($table);	
	echo('This is the WHERE string: <br>'.$where.'<br><br>');
	
	$group = '';
	$limit = '';
	$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select, $table, $where, $group, $order, $limit);
	
	echo('This is the array res: <br>'.$res.'<br><br>');
	
	while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
		if (is_array($row) && $row['sys_language_uid'] != $GLOBALS['TSFE']->sys_language_content && $GLOBALS['TSFE']->sys_language_contentOL) {
    		$row = $GLOBALS['TSFE']->sys_page->getRecordOverlay($table, $row,$GLOBALS['TSFE']->sys_language_content, $GLOBALS['TSFE']->sys_language_contentOL);
			}
  		if ($row) {
    	$link_uid = ($row['_LOCALIZED_UID']) ? $row['_LOCALIZED_UID'] : $row['uid'];
  		}
		$out[] = $row;
	}
	return $out;
}

meine variablen $select und $where sehen ansich ok aus:

$select:
pid,sys_language_uid,uid,firstname,lastname,image,category

$where:
(sys_language_uid IN (-1,0) OR (sys_language_uid = 0 AND l18n_parent = 0)) AND tx_aorealgallery_artist.deleted=0 AND tx_aorealgallery_artist.hidden=0

Hat keiner ne Idee warum kein Inhalt ausgegen wird?