Hallo TheBrainer,
ich versuche mal zu helfen, da ich mich gerade mit dem gleichen Thema beschäftigt habe.
Ich habe in meinem Projekt eine ähnliche Herausforderung gehabt. Hier habe ich ein MM als Kalender aufgebaut (also mit 31 Tagen). In die Tagesfelder werden Kürzel eingetragen. Die mm_kalender wird dann als Tabelle im FE ausgegeben. Die Beschreibung und die Farben sind in einem weiteren MM beschrieben. Die beiden MM's sind nicht referenziert! Die Beschreibungen sollen nun am Ende der Kalenderausgabe als Legende aufgeführt werden. Die Zellen mit den Kürzeln werden mit den hinterlegten Farben eingefärbt. Geht einwandfrei!
Einlesen aller Informationen aus dem "fremden MM":
PHP-Code:
$objMetaModel = MetaModelFactory::byTableName('mm_kalender_werte');
$objFilter = $objMetaModel->getEmptyFilter();
$objItems = $objMetaModel->findByFilter($objFilter);
$arrWerteKeys= array();
foreach ($objItems as $objItem) {
if (!empty($objItem)) {
$arrWerte[strtoupper($objItem->get('wert'))] = array(
'desc' => $objItem->get('beschreibung'),
'fcolor' => $objItem->get('fcolor'),
'bcolor' => $objItem->get('bcolor'));
}
}
Hier habe ich ein Codeschnipsel, mit dem ich erst einmal die Funktionsweise getestet habe. Es gibt hier zwei MM (Kalender und Standorte). Im mm_kalender ist ein Attribut vom Typ Auswahl das mit mm_standorte referenziert ist. Um die Details zu dem Standort zu bekommen, habe ich folgenden Code erstellt:
PHP-Code:
<?php
// echo '<pre>' . $this->showTemplateVars() . '</pre>'; // Zeigt alle Werte aus dem MM an
// ### Tabelle mm_kalender auslesen ###
foreach ($this->data as $arrItem) {
// ============================================
// ### Detaildaten aus Fremdtabelle STANDORTE holen ###
// http://de.contaowiki.org/MetaModels_Beispiel:_Referenced_items
// Tabelle, in der die gesuchten Informationen stehen
$objMetaModel = MetaModelFactory::byTableName('mm_standorte');
// Filterobjekt erzeugen
$objFilter = $objMetaModel->getEmptyFilter();
// Einen bestehenden Filter zuordnen
// $objFilter = $objMetaModel->prepareFilter(10, array()); // 10 = Id des Filters
// Hier werden in der MM mm_standorte alle Datensätze gesucht, die im Feld 'standort' den
// Wert $arrItem['raw']['mitarbeiter']['standort'] haben
$objFilter->addFilterRule(new MetaModelFilterRuleSearchAttribute($objMetaModel->getAttribute('standort'), $arrItem['raw']['mitarbeiter']['standort'], $objMetaModel->getAvailableLanguages()));
// Nur die aktiven Datensätze zurück geben
$objFilter->addFilterRule(new MetaModelFilterRuleSearchAttribute($objMetaModel->getAttribute('aktiv'), true, $objMetaModel->getAvailableLanguages()));
// Array mit allen gefundenen Datensäten
$objItems = $objMetaModel->findByFilter($objFilter);
// ## KONTROLLE ##
// Ausgabe der gefundenen Datensätze
foreach ($objItems as $objItem) {
echo "<br>====================== ".$arrItem[text][mitarbeiter]."<br>";
if (!empty($objItem)) {
$arrBetrieb = $objItem->get('betrieb');
$arrAbteilung = $objItem->get('abteilung');
$arrFunktion = $objItem->get('Funktion');
} else {
$arrBetrieb = "???";
$arrAbteilung = "???";
$arrFunktion = "???";
}
echo "Betrieb: ".$arrBetrieb['betrieb']." | Abteilung: ".$arrAbteilung['abteilung']." | Funktion: ".$arrFunktion['funktion']."<br>";
}
}
?>
Hinweis:
$arrItem['raw']['mitarbeiter']['standort']
['mitarbeiter'] = Name des Attribut in mm_kalender. Dies Feld ist ein Array! In diesem Array sind alle Attribute aus dem referenzierten MM mm_standorte zum aktuellen Datensatz enthalten. ['standort'] enthält den gesuchten Datensatz.
Würde es mehrere Standorte mit der gleichen Bezeichnung geben, würden auch alle entsprechenden Datensätze aus mm_standort zurück gegeben. Die Suche funktioniert natürlich auch über den Alias. Allerdings muss dieser dann auch in mm_kalender mit ausgegeben werden.
Ich denke, dass hier das Prinzip klar wird. Vielleicht gibt es auch eine bessere Lösung, aber es funktioniert so auf jeden Fall.
Viel Spaß
Gruß Dirk