Unsere Snippets

Abfrage von MM-Relationen in Extensionscode

Das manuelle Verfassen von SQL Statements in Form von Strings in Extension's ist etwas was man tunlichst vermeiden sollte, wenn man größt mögliche Kompatibilität innerhalb des Systems haben möchte gerade in Hinblick das es nicht zwingend eine MySQL Datenbank sein muss, wo die Extension später drauf zugreift.

Die Abfrage von MM-Relationstabellen, die mittels des Kickstarters erzeugt wurden, geht sehr elegant vonstatten, mittels einiger weniger Core Funktionen des TYPO3 Frameworks und ohne eine Zeile von MySQL Code.

Es gibt auf Basis des TYPO3 Core mehrere Möglichkeiten die entsprechenden Resultate zu erzeugen. Wir behandeln hier nicht die Möglichkeit mittels ExtBase.

Wir nehmen hier die folgende Variante.
Das Kernstück hierbei ist die Funktion pi_exec_query der PiBase Klasse von TYPO3. 

Wir vernachlässigen bei diesem Beispiel bewusst erstmal die Parameter für eine korrekte Abfrage der jeweiligen System-Sprache.

In hiesigen Fall wollen wir in Abhängigkeit von jeweils einem gesetzten GET-Parameter $this->piVars['cat'] oder mehreren kommaseperierten IDs die der Kategorientabelle tx_xtpreference_category (welche mittels einer FlexForm gesetzt werden könnenen oder wie hier über TS) entsprechend die dazugehörigen Datensätze der Tabelle tx_xtpreference_items aufgelistet bekommen werden, über den Weg mittels der Kreuztabelle.

$select = 'tx_xtpreference_items.*';
$local_table = 'tx_xtpreference_items';
$mm_table = 'tx_xtpreference_items_categories_mm';
$foreign_table = 'tx_xtpreference_category';
$orderBy = "tx_xtpreference_items.title ASC";



### entweder per GET Parameter oder per conf werden mehrere ID's in
### Form einer kommaseperierten Liste der Kategorien die wir darstellen wollen angegeben
if ((isset($this->piVars['cat'])) AND (is_numeric($this->piVars['cat']))):
     $item = $this->piVars['cat'];
elseif (isset ($this->conf['listView.']['selectedCategories'])):
     $item = $this->conf['listView.']['selectedCategories'];
endif;



### Der Array nimmt für die Verknüpfungstabelle wichtige Daten
### Daten entgegen
$mm = array('table' => $foreign_table,
            'mmtable' => $mm_table,
            'catUidList' => $item);

$query = $this->pi_exec_query($local_table, 0, $aW="", $mm, '', '', '');

if ($GLOBALS['TYPO3_DB']->sql_num_rows($query) > 0):

while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($query)):

$content .= $row['title'];
endwhile;
endif;



Kategorie: Extensions
Ansprechpartner: Timo Prüssing (www.mediengarage.de)
« Zurück