Zum Inhalt springen

[DBAL] Problem mit Mapping bei Selectbox

Erstellt am 20. April 2007 · 8 Antworten · letzte Antwort am 28. April 2007

Tags: Frage

garbast ·

Ich habe dieses Problem bereits in einem anderen Forum berichtet, aber dort konnte mir niemand helfen. Vielleicht weiss hier jemand, was ich falsch mache.

Für die Intergration externer Tabellen verwende ich DBAL. Dabei bleibt die DB gleich, nur die Tabellen an sich sind bisher Typo3 nicht bekannt gewesen. Der Grund warum ich DBAL verwende, liegt darin, dass die Tabellen keine uid als ID verwenden sondern unterschiedliche Feldbezeichner. Ausserdem gibt es kein Feld für die PageID.

Deshalb habe ich als erstes für alle verwendeten Tabellen die uid per Mapping auf die entsprechenden id Felder umgeleitet und die pid auf einen festen Wert gemappt.

'pre_categories' => array (
	'mapTableName' => $confArr['Prefix'] . 'categories',
	'mapFieldNames' => array(
		'pid' => 24,
		'uid' => 'cid',
	)
),

In diesem Beispiel verwende ich ein Config Array um die Zuweisungen nicht statisch zu haben, sondern bei jedem Projekt neu zuweisen zu können.

So lange es um die reine Auflistung im List-Modul von Typo3 geht, funktioniert diese Bearbeitung schon ganz gut.

Da ich aber in den Einträgen auch Verweise untereinander habe. wollte ich diese per Selectbox auswählen können. Deshalb habe ich in der TCA.php folgendes für eine der Selectboxen verwendet.

'category' => Array (
	'exclude' => 0,
	'label' => 'LLL:EXT:my_ext/locallang_tca.xml:objects.category',
	'config' => Array (
		'type' => 'select',
		'items' => Array (
			Array ('LLL:EXT:my_ext/locallang_tca.xml:objects.category.nocat', 0),
		),
		'size' => 1,
		'maxitems' => 1,
		'foreign_table' => 'pre_categories',
	)
),

Doch genau dies läuft auf einen Fehler hinaus. Denn aus irgendeinem Grund wird mir folgender Fehler ausgegeben.

SELECT pre_categories.cid, pre_categories.name
FROM pre_categories, pages
WHERE
pages.uid = pre_categories.pid AND pages.deleted = 0 AND 1 = 1
 
Unknown column 'pre_categories.pid' in 'where clause'

Warum aber jetzt genau kann ich nicht nachvollziehen, denn eigentlich wurde ja dem Feld pid der feste Wert 24 zugewiesen und wenn es um das List-Modul geht, funktioniert das ganze ja auch.

Ich bin mir auch ziemlich sicher, dass dies ein Fehler der DBAL ist, denn eine ähnliche Selectbox für die FE Groups funktioniert einwandfrei. Nur muss dafür auch kein Mapping herhalten.

'visibility' => Array (
	'exclude' => 1,
	'label' => 'LLL:EXT:my_ext/locallang_tca.xml:objects.visibility',
	'config' => Array (
		'type' => 'select',
		'items' => Array (
			Array ('LLL:EXT:my_ext/locallang_tca.xml:objects.visibility.public', 0),
		),
		'size' => 1,
		'maxitems' => 1,
		'foreign_table' => 'fe_groups',
	)
),

Hat irgendwer ne Idee, woran es liegen kann?
Habe ich einen Fehler in meinem Code?
Oder ist das einfach eine Aufgabe die DBAL nicht kann?

Wenn ich das Problem nicht behoben kriege, kann ich die gesamte Backend Integration in Typo3 vergessen und die Extention ist in Frage gestellt, denn eine Bearbeitung über ein eigenes Backend Modul macht an dieser Stelle dann keinen Sinn.

Liebe Grüße
Sebastian

garbast ·

Hallo just2b,

danke erstmal für Deine schnelle Antwort.

Das Mappen auf einen Fixwert sollte einer Manipulation an den Tabellen vorbeugen. Zwar wäre es möglich eine Feld hinzuzufügen, aber ich hatte mir erhofft, dass es auch ohne geht, denn mittels dem festen Mapping erreiche ich im Backend ja bereits, dass die Einträge im entsprechenden Sysfolder auftauchen. Nur halt leider funktioniert die Selectbox nicht wunschgemäss.

Auf ein User-Feld kann ich sicherlich zurückgreifen. Wenn sich keine besser Lösung findet, werde ich das auch noch ausprobieren. Allerdings hatte ich gehofft zumindest beim Backend Editing auf Hausmittel zurückgreifen zu können. Für den Fall das, hab ich aber bereits so was ins Auge gefasst. Wie sind da Deine Erfahrungen von der Gestalltungsseite her? Kann man das dem Look and Feel von Typo3 so weit anpassen, dass man den Unterschied nicht mehr feststellt?

just2b ·

Hallo,

ja der Sinn deines mapping ist mir schon klar, wäre eher testweise gedacht gewesen.

zum Userfeld: Da merkt man den Unterschied IMO nicht, du kannst dir ja auch im Quelltext anschauen welche CSS_klassen verwendet werden (falls dem so ist).

Georg

garbast ·

Hallo nochmals.

Hab jetzt mal ein Feld in die Tabelle Categories eingefügt und erhalte immer noch den gleichen Fehler. Da ich nicht nachvollziehen kann, warum der immer noch nicht das Mapping überarbeitet, werde ich wohl um ein User_Feld nicht drum herumkommen.

Hier nochmal die Änderung in der localconf und der Fehler

'pre_categories' => array (
        'mapTableName' => $confArr['Prefix'] . 'categories',
        'mapFieldNames' => array(
                'pid' => 'page_id',
		//'pid' => $confArr['sysfolderID'],
                'uid' => 'cid',
        )
),
SELECT pre_categories.cid, pre_categories.name
FROM pre_categories, pages
WHERE
pages.uid = pre_categories.pid AND pages.deleted = 0 AND 1 = 1
 
Unknown column 'pre_categories.pid' in 'where clause'
garbast ·

Jemand, dessen Hirn besser getaktet ist als meins, hat das Problem an dem ich selber auch hänge deutlich aufgeräumter Zusammengefasst und einen Bug Report http://bugs.typo3.org/view.php?id=5481 dafür geöffnet.

Jetzt bleibt nur zu hoffen, dass dieses Thema nicht in der Versenkung verschwindet, denn so weit ich das abschätzen kann, dürften noch deutlich mehr Entwickler genau damit zu kämpfen haben.

garbast ·

Nachdem ich doch arg in einer Sackgasse gehangen habe, hab ich mir das Thema selber mal in der DBAL angeschaut. Als Ergebniss ist ein Patch raus gekommen, der die Bugs 0005465 und 0005481 fixen sollte.

Bitte schaut Euch den Patch an und meldet, wenn es irgendwo hängt.

--- typo3/sysext/dbal/class.ux_t3lib_db.php	2007-02-21 04:51:34.000000000 +0100
+++ class.ux_t3lib_db.php	2007-04-28 14:18:46.000000000 +0100
@@ -2279,6 +2279,27 @@
 				if (is_array($sqlPartArray[$k]['sub']))	{
 					$this->map_sqlParts($sqlPartArray[$k]['sub'], $defaultTable);	// Call recursively!
 				} else {
+						// if value is present
+					if (is_array($sqlPartArray[$k]['value'])) {
+						$l = 0;
+						foreach($sqlPartArray[$k]['value'] as $vk => $vv) {
+								// splitting Table and field if table is available
+							list($vt, $vv) = explode('.', $vv);
+							
+								// Mapping field name, if set:
+							if (is_array($this->mapping[$vt]['mapFieldNames']) && $this->mapping[$vt]['mapFieldNames'][$vv])	{
+								$vv = $this->mapping[$vt]['mapFieldNames'][$vv];
+							}
+		
+								// Map table?
+							if ($this->mapping[$vt]['mapTableName'])	{
+								$vt = $this->mapping[$vt]['mapTableName'];
+							}
+							
+							$sqlPartArray[$k]['value'][$l++] = $vt . ($vv != '' ? '.' . $vv: '');
+						}
+					}
+				
 						// For the field, look for table mapping (generic):
 					$t = $sqlPartArray[$k]['table'] ? $sqlPartArray[$k]['table'] : $defaultTable;

Rückmeldung dringenst erbeten.