Hallo Andreas,
vielen Dank für Deine Antwort.
Habe auch gleich deinen Vorschlag mit dem onload_callback ausprobiert. Allerdings scheint das Array list->sorting->root nur bei ListViews definiert zu sein.
Mittlerweile habe ich in http://https://contao.org/issues/show/299 ein Leidensgenossen mit einem ähnlichen Problem gefunden. Dieser wollte allerdings die Einträge in einem, zu dem foreignKey gehörenden, Drop-Down-Feld sortiert haben. Dazu hat Leo die option findInSet in TL2.7 hinzugefügt ( $GLOBALS['TL_DCA'][TABLE]['fields'][FIELD]['eval']['findInSet'] = true; )
Analog dazu habe ich eine Lösung für mein Problem gebastelt. Für den Fall, dass es mal jemanden interessiert:´
Die grundlegende Methode besteht darin, dass zuerst eine Liste der Fremdschlüssel erzeugt wird, die nach den zugeordneten Werten sortiert ist. Danach können dann die eigentlichen Datensätze anhand der Position des Fremschlüssels in der Liste sortiert werden. Die zugehörige SQL-Funktion FIND_IN_SET http://dev.mysql.com/doc/refman/4.1/...on_find-in-set lässt sich über list->sorting->fields einfügen, da die Einträge hier quasi als String an ORDER BY angehängt werden. Da Erzeugung der Liste mit den Fremschlüsseln kann man in der onload_callback-Methode machen. (danke für den Hinweis).
Als Programmcode (in der onload_callback-Methode):
PHP-Code:
$objDBRes = $this->Database->prepare("SELECT `id` FROM `tl_fremd` ORDER BY `wert`")->execute();
$arrRes = $objDBRes->fetchAllAssoc();
function getId($x) {return ($x['id']);}
$arrIds = array_map("getId",$arrRes);
$strList = "'".implode(',',$arrIds)."'";
$GLOBALS['TL_DCA']['tl_mytable']['list']['sorting']['fields'] = array("FIND_IN_SET(fremdId,$strList)");
Naja. Scheint zwar zu funktionieren und macht genau das, was ich wollte, allerdings ist das wohl schon ein ziemlicher Hack. Außerdem vermute ich mal, dass FIND_IN_SET bezüglich des Laufzeitverhaltens nicht das Gelbe vom Ei ist.
Wie dem auch sei. Ich denke dass die Problematik in TL noch ihrer Lösung harrt. Das wage ich mal zu sagen, auch wenn ich, wie gesagt, noch nicht den großen Überblick habe. Sobald man mit Fremschlüsseln arbeitet taucht das Problem jedenfalls bestimmt auch bei anderen schnell auf. Das Einfachste wäre vielleicht eine call_back-Funktion mit der man selbst die Sortierungsangaben in die SQL-Abfrage einfügen kann?
Viele Grüße
Frank
PS: also ich muss noch sagen, dass ich wirklich begeistert von TL (oder von der Art Leos zu programmieren) bin. Macht wirklich Spaß sich damit in PHP und Co einzuarbeiten.
Lesezeichen