Zum Inhalt springen

SQL Query lokalisieren - einfache Geschichte!?

Erstellt am 14. September 2008 · 17 Antworten · letzte Antwort am 22. September 2008

Tags: Frage

steffenk ·

wüsste nicht warum es nicht mit getRecordOverlay funktionieren sollte. Beide Tabellen benutzen ja Felder im gleichen Record für die Lokalisierung.

einpraegsam.​net ·

Hier mein Versuch:

$this->languid = $GLOBALS["TSFE"]->tmpl->setup['config.']['sys_language_uid'] ? $GLOBALS["TSFE"]->tmpl->setup['config.']['sys_language_uid'] : 0;

$this->query = array();
$this->query['select'] = 'object.*, category.*';
$this->query['from'] = 'object LEFT JOIN category ON (object.category = category.uid)';
$this->query['where'] = '1 ' . $this->cObj->enableFields('object') . $this->cObj->enableFields('category');
$this->query['groupby'] = 'object.uid';
$this->query['orderby'] = '';
$this->query['limit'] = '';

$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery ($this->query['select'], $this->query['from'], $this->query['where'], $this->query['groupby'], $this->query['orderby'], $this->query['limit']);
$num = $GLOBALS['TYPO3_DB']->sql_num_rows($res); // numbers of all entries
if ($res) { // If there is a result
	while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { // One loop for every tt_address entry
		$row = $GLOBALS['TSFE']->sys_page->getRecordOverlay('object', $row, $this->languid, ($this->sys_language_mode == 'strict' ? 'hideNonTranslated' : ''));
		$this->content .= $row['title']. '/' . $row['title_cat'] . '<br />';
	}
}

Problem und Verständnismangel habe ich mit den mehreren Tabellen, die ich miteinander verknüpfe (derzeit mit einem Join)

steffenk ·

Ja, viel mir nach meinem Post auch auf.

Ich kann Dich beruhigen, es gibt noch kein Konzept für diese Abfrage mit Join, erst recht nicht für Workspaces.

Also bleibt nichts anderes übrig als die Tabellen einzeln abzufragen und den Overlay zu nutzen.

einpraegsam.​net ·
steffenk schrieb

Also bleibt nichts anderes übrig als die Tabellen einzeln abzufragen und den Overlay zu nutzen.

Das kann doch nicht sein? Ich habe eigentlich 6 oder 7 Kategorietabellen (hier der einfachheit nur eine Kategorie) - das wären dann ja extrem viele Queries?
Geht das ohne Join eventuell einfacher? Will den Code nicht unnötig aufblähen...

Ehrlich gesagt verstehe ich sowieso nicht warum man mit enableFields nicht auf Lokalisierung und Workspace eingehen kann (anderes Thema)...

Grüße, Alex

steffenk ·

Die Sache ist einfach komplex.
Workspaces sind noch mal ein anderes Thema, aber auch hier gibt es overlays. enableFields() berücksichtigt die schon, aber auch das ist nicht "fertig"

Francois versucht diesen Missstand zu beseitigen, stöhnt aber aufgrund der Komplexität, es müssen ja alle Joins aufgedröselt werden und entsprechend der Language die entsprechenden Felder, die in TCA definiert sind gegen die Originalfelder ausgetauscht werden.

Wenn Du eine Idee hast oder Francois Suter unterstützen möchtest. sag ihm einfach Bescheid, sein Kontakt findest Du z.B. bei typo3.org unter sponsored projects

steffenk ·

Mach einen Workarround: eine Funktion der Du die uid der Kategorie übergibst und die Dir den lokalisierten Titel zurückgibt, dann kannst Du auf den Join verzichten.

einpraegsam.​net ·
steffenk schrieb

Mach einen Workarround: eine Funktion der Du die uid der Kategorie übergibst und die Dir den lokalisierten Titel zurückgibt, dann kannst Du auf den Join verzichten.

Ja, klingt gut - so werde ichs machen, dank dir!

steffenk ·

ist doch mehr oder weniger c&p, oder?

soviel kanns doch nicht geben, aber klar, ist umständlicher, hat mehr SQL-Queries und auf Dauer keine schöne Lösung.

einpraegsam.​net ·

Habe nur ein ellenlanges SQL Query und fülle dann ein Array $row_category mit uid, pid und title und lasse dann dieses Array wieder überschreiben.

Und da ich mehrere Kategorien habe, zieht sich das etwas...

Aber du hast Recht - es funktioniert 😃

Stoneage ·

Also ein Join sollte eigentlich so funktionieren:.

$this->andWhere('uid' => '666');
 
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
    '*,V.title VT,V.uid VU,S.title ST,S.uid SU,S1.uid S1U, S1.title S1T, S2.uid S2U, S2.title S2T',
    'pages WA INNER JOIN pages V ON WA.pid=V.uid INNER JOIN pages S ON V.pid=S.uid INNER JOIN pages S1 ON S.pid=S1.uid INNER JOIN pages S2 ON S1.pid=S2.uid',
    'S2.uid='.$GLOBALS['TYPO3_DB']->cleanIntList($parentUid).' AND WA.deleted=0 AND WA.hidden=0'.(count($this->andWhere)?' AND '.implode(' AND ',$this->andWhere):'').(count($this->orWhere)?' AND ('.implode(' OR ',$this->orWhere).')':''),
    'S1.uid','WA.pid','');

[/quote]

Stoneage ·

Also, ich denke mal, dass die Lokalisierungs-Tabellen auch über das Parent-Child-Modell verfügen. Mit diesem join, den ich Dir genannt habe, kann man über 3-Unterkategorien eine Tabelle mit Parent-Child-Modell abfragen (Orignalsprache + Lokalisierung gibt bei meir 2 Unterkategorien). Da wird dann sicherlich auch Deine Lokalisierung dabei sein.