Zum Inhalt springen

mm-Relation im FE ausgeben

Erstellt am 11. Oktober 2006 · 9 Antworten · letzte Antwort am 13. Oktober 2006

Tags: TCA, Datenbank, Frage

gaengsterbruth ·

Hallo!

Habe mit dem Kickstarter eine Extension erstellt die eine Selectorbox (True M-M relation) enthält. Nun weiss ich nicht genau wie ich die in dieser Selectorbox eingegebenen Werte im Frontend ausgeben kann.

Der zugehörige tca Teil sieht folgendermassen aus:

"ranlage" => Array (		
	"exclude" => 1,		
	"label" => "LLL:EXT:mstreferenz/locallang_db.xml:tx_mstreferenz_referenz.ranlage",		
	"config" => Array (
		"type" => "select",	
		"foreign_table" => "tx_mstreferenz_anlage",	
		"foreign_table_where" => "AND tx_mstreferenz_anlage.pid=###CURRENT_PID### ORDER BY tx_mstreferenz_anlage.aname",	
		"size" => 3,	
		"minitems" => 0,
		"maxitems" => 5,	
		"MM" => "tx_mstreferenz_referenz_ranlage_mm",	
		"wizards" => Array(
			"_PADDING" => 2,
			"_VERTICAL" => 1,
			"add" => Array(
				"type" => "script",
				"title" => "Create new record",
				"icon" => "add.gif",
				"params" => Array(
					"table"=>"tx_mstreferenz_anlage",
					"pid" => "###CURRENT_PID###",
					"setValue" => "prepend"
				),
				"script" => "wizard_add.php",
			),
			"list" => Array(
				"type" => "script",
				"title" => "List",
				"icon" => "list.gif",
				"params" => Array(
					"table"=>"tx_mstreferenz_anlage",
					"pid" => "###CURRENT_PID###",
				),
				"script" => "wizard_list.php",
			),
			"edit" => Array(
				"type" => "popup",
				"title" => "Edit",
				"script" => "wizard_edit.php",
				"popup_onlyOpenIfSelected" => 1,
				"icon" => "edit2.gif",
				"JSopenParams" => "height=350,width=580,status=0,menubar=0,scrollbars=1",
			),
		),
	)
),

Wie muss ich diese in der Datei class.tx_mstreferenz_pi1.php umschreiben, damit ich die Werte zurückgeliefert bekomme. So sieht mein bisheriger Versuch aus:

case 'ranlage':
 if(!count($this->aCash)){
  $query = ('SELECT t1.uid, t1.pid, t2.uid_local,    t2.uid_foreign, t3.uid, t3.aname FROM tx_mstreferenz_anlage t1,tx_mstreferenz_referenz_ranlage_mm  t2, tx_mstreferenz_anlage t3 WHERE t1.pid ='.intval($GLOBALS["TSFE"]->id).' AND t1.uid = t2.uid_local AND t2.uid_foreign = t3.uid');
  $this->cObj-> enableFields('tx_mstreferenz_anlage');
  $res = mysql(TYPO3_db, $query);
  while($row = mysql_fetch_array($res)
   $this->aCash[$row['t1.uid']]=$row;
  }
 }
 return $this->aCash[$this->internal['currentRow']['ranlage']]['aname'];
break;

Sollte eigentlich nicht so schwierig sein, weiss einfach nicht genau wie. Danke schon im vorraus.

Schönen Tag & Gruess

Ruth

lavitto ·

Hallo gangsterbruth

Schau dir mal die Funktion "pi_exec_query()" der pibase an, die unterstützt MM-Verknüpfungen.

Falls du die Query selbst schreiben möchtest, verwendest du am besten die JOIN-Funktion von MySQL.

Gruss Philipp

gaengsterbruth ·

Ich habe mir die pi_exec_query Funktion schon lange studiert.
Leider verstehe ich nicht ganz wie des mit dem MM Query funktionieren soll.
Bei mir ist ja nicht das query selber das Problem.
sondern wie ich die werte aus der Funktion zurückgeben kann.

Das Abfrage Query welches ich geschriben habe, ist zwar nicht ganz sauber und wär mit einem Join sicher schöner aber funktionieren tuts.

'SELECT t1.uid, t1.pid, t2.uid_local,    t2.uid_foreign, t3.uid, t3.aname FROM tx_mstreferenz_anlage t1,tx_mstreferenz_referenz_ranlage_mm  t2, tx_mstreferenz_anlage t3 WHERE t1.pid ='.intval($GLOBALS["TSFE"]->id).' AND t1.uid = t2.uid_local AND t2.uid_foreign = t3.uid'

Wie kriege ich nun den wert aus t3.aname für den ensprechenden Datensatz als Rückgabewert aus der Funktion ?

steffenk ·
$res=$GLOBALS['TYPO3_DB']->exec_SELECT_mm_query($select,$local_table,$mm_table,$foreign_table,$whereClause='',$groupBy='',$orderBy='',$limit='');
gaengsterbruth ·

Irgendwiä will das bei mir nicht so klappen.
Hat jetzt das query umgestellt, doch anscheinend stimmt das so nicht, gibt immer nen sql Fehler zurück. Sieht jemand den Fehler?

$query=$GLOBALS['TYPO3_DB']->exec_SELECT_mm_query(
'tx_mstreferenz_anlage.aname',
'tx_mstreferenz_anlage',
'tx_mstreferenz_referenz_ranlage_mm',
'tx_mstreferenz_anlage',
' AND tx_mstreferenz_anlage.pid =".intval($GLOBALS[TSFE]->id)."');

Und kann mit jemand sagen was folgene Zeile, genau bewirkt:

$this->aCash[$row['uid']]=$row;
steffenk ·

Deine Foreign-Tabelle ist falsch, das muss doch tx_mstreferenz_referenz sein.

Woher sollen wir wissen, was in Deinem Modul in der Funktion aCash passiert ?

gaengsterbruth ·

Danke steffenk, habs auch rausgefunden mit der foreign Tabelle.
Das mit dem aCash hab ich auch rausgefunden, ist ja ne Variable die ich selber definiert habe, habs nur vergessen.

Leider funktioniert das dumme Query immer noch nicht, obwohl es im SQL Browser von phpmyAdmin keinen Fehler gibt. Naja hoffe werde den Fehler bald finden.

case 'ranlage':
$out2 = '';
//Ist Array Leer
if(!count($this->aCash)){
  $query=$GLOBALS['TYPO3_DB']->exec_SELECT_mm_query('tx_mstreferenz_referenz.uid_local, tx_mstreferenz_anlage.aname','tx_mstreferenz_referenz','tx_mstreferenz_referenz_ranlage_mm','tx_mstreferenz_anlage',' AND tx_mstreferenz_anlage.pid =".intval($GLOBALS[TSFE]->id)."');
  $this->cObj->enableFields('tx_mstreferenz_anlage');
  $this->cObj->enableFields('tx_mstreferenz_referenz');
  
  $res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, $query); 

  
  while($row = mysql_fetch_array($res)){
   $out2 = $row[aname];

  }
}
return $out2;
steffenk ·

also da kommt das raus

SELECT tx_mstreferenz_referenz.uid_local, tx_mstreferenz_anlage.aname
FROM tx_mstreferenz_referenz,tx_mstreferenz_referenz_ranlage_mm,tx_mstreferenz_anlage
WHERE
tx_mstreferenz_referenz.uid=tx_mstreferenz_referenz_ranlage_mm.uid_local AND tx_mstreferenz_anlage.uid=tx_mstreferenz_referenz_ranlage_mm.uid_foreign AND tx_mstreferenz_anlage.pid =".intval($GLOBALS[TSFE]->id)."

Und da sieht man Deinen Fehler: der Schluss

tx_mstreferenz_anlage.pid ='.intval($GLOBALS[TSFE]->id));