4.9, MetaModels 2.2 - FindByFilter liefert nicht alle Daten
Liebe Gemeinde,
ich bin Neuling in der MetaModels-Welt und muss aktuell Fehlerbehebung in einem Template betreiben.
Hier kurz die Ausgabngssituation:
Es gibt ein MetaModel <tiere> welches ein Attribut <geschlecht> enthält. Dieses Attribut ist mit einem weiteren MetaModel verknüft, welches nicht nur "männlich, weiblich" enthält sonder auch die tierart.
Nutze ich das Standardtemplate zur Ausgabe eines Tieres, wird mit das <geschlecht> richtig ausgegeben.
Nun muss ich in einem Template das Tier separat abfragen und nutze dazu folgenden Code
Code:
$idlist[] = $tier['id'];
$factory = \Contao\System::getContainer()->get('metamodels.factory');
$model = $factory->getMetaModel(<tabellenname_tiere>);
$languages = $model->getAvailableLanguages();
$attribute = $model->getAttribute('id');
$availableLang = $model->getLanguages();
if (in_array($currentLanguage, $availableLang)) {
$model->selectLanguage($currentLanguage);
} else {
$model->selectLanguage('en');
}
$filter = $model->getEmptyFilter();
$filter->addFilterRule(new \MetaModels\Filter\Rules\StaticIdList($idlist));
$item = $model->findByFilter($filter);
$item_parsed = $item->parseAll('html5', $model->getView(13));
$tier_parsed = $item;
Ein
Code:
dump($item_parsed);
gibt mir zwar ein Objekt mit Daten zurück, jedoch fehlen einige Daten bzw. enthalten den Wert NULL. In diesem Beispiel gender_dog, gender_cat, rasse. Diese Daten haben eins gemeinsam. Sie stehen, wie schon erwähnt, nicht in einer n:1-Beziehung zum Tier sondern eher in einer n:n:1-Beziehung.
Code:
^ array:48 [?
"id" => "XXXX"
"pid" => "0"
"sorting" => "0"
"tstamp" => "1705524547"
"rufname" => "Rudi"
"tier" => array:4 [?]
"gender_dog" => null
"gender_cat" => null
"kastriert" => array:2 [?]
"rasse" => null
"geburtsdatum" => "1293914948"
]
Kann man den Interfaces von MetaModels mitteilen, wie "tief" die Daten ausgelesen werden sollen, sodass auch die zweite Relationsebene ausgelesen wird?
Hat jemand ein Codebeispiel für mich?
Beste Grüße!
Frank
Liste der Anhänge anzeigen (Anzahl: 4)
Vielen Dank für die schnelle Antwort. Ich kann die Verwunderung nachvollziehen.
Ich versuche mal zu erklären, was hier vorhanden ist:
Es gibt 3 Metamodels:
1. Tierart
Anhang 26941
2. Geschlechter
Anhang 26942
3. Tiere
Anhang 26943
Anhang 26944
Im Tier wird je nach ausgewähltem Geschlecht nur die Auswahl der Geschlechter angezeigt, die der jeweiligen Tierart entsprechen. Funzt also irgendiwe.
Geht man nun nach der Standard-Routine vor um ein Tier in einem Template anzuzeigen, bekommt man ein sauberes Objekt mit den Tierdaten, darunter auch das exakte Geschlecht.
PHP-Code:
array:7 [?
"raw" => array:48 [?
"id" => "16373"
"pid" => "0"
"sorting" => "0"
"tstamp" => "1706639309"
"rufname" => "Merli"
"tier" => array:4 [?]
"gender_dog" => null
"gender_cat" => array:3 [?
"__SELECT_RAW__" => array:6 [?]
"name" => "Kater"
"tier" => "Katze"
]
Ein anderes Template ruft nicht per se die Tierdaten auf sondern einen Datensatz, an dem eine TierID hängt.
Lädt man nun diese Tierdaten über den von mir geposteten Code, bekommt man auch ein Objekt zurück, allerdings fehlen hier eben eingie Daten. Sh. oben.
Geh also mal bitte davon aus, dass ich nicht mit der Standardvariante das Tier anzeige, sondern ein anderes MetaModel im Frontend angezeigt wird, dass nicht alle Tierdaten enthält und ich deshalb nochmal Daten nachfassen muss.
Wenn es eine Möglichkeit gibt, die Tiefe der auszulesenden Objekte zu erhöhen und ich bekomme mit einem Objekt alle benötigten Daten (wie bei einer jPA), dann nutze ich gern diese Methode. Dann wäre mein Code tatsächlich überflüssig. Aber ich bekomme ins Template nur das folgende Objekt:
PHP-Code:
^ array:1 [?
0 => array:7 [?
"raw" => array:11 [?
"id" => "24"
"pid" => "0"
"sorting" => "0"
"tstamp" => "1696508266"
"uuid" => "xxxxxxxx"
"pet" => array:45 [?
"__SELECT_RAW__" => array:48 [?
"id" => "xxxxx87"
"pid" => "0"
"sorting" => "0"
"tstamp" => "1705524547"
"rufname" => "Rudi"
"tier" => array:4 [?
"__SELECT_RAW__" => array:7 [?
"id" => "1"
"pid" => "0"
"sorting" => "0"
"tstamp" => "1700220211"
"placeholder" => array:4 [?]
"icon" => array:4 [?]
"name" => array:6 [?]
]
"name" => "Hund"
"placeholder" => "files/xxx.jpg"
"icon" => "files/xxx.png"
]
"gender_dog" => null
"gender_cat" => null
"kastriert" => array:2 [?]
Ich hoffe, das Problem konnte ich eingiermaßen verständlich erklären.
Fazit: In $this-Ydata ist alles Nötige enthalten, wenn man die Standardfrontendausgabe für das MetaModel benutzt, möchte ich aber selbst aus einem anderen MetaModel in einem Template Daten nachladen, fehlen jene Daten, die zu tief oder zu komplex verknüpft sind.
Ich wäre für Unterstützung sehr dankbar.
Beste Grüße!
Frank