Ergebnis 1 bis 3 von 3

Thema: Sortierung im BE nach foreignKey

  1. #1
    Contao-Nutzer
    Registriert seit
    25.11.2009.
    Beiträge
    11

    Standard Sortierung im BE nach foreignKey

    Hallo zusammen,

    ich möchte eine Tabelle im BE verwalten, die mehrere foreign keys enthält. Der Benutzer soll dabei natürlich den Wert der diesen Keys zugeordnet ist sehen.

    Im Eingabeformular erledigt TL das ja prima von selbst, wenn die Zuordung im DCA über foreignKey=>Fremdtabelle.key definiert wurde.

    Um in der Auflistung der Datensätze die Werte statt der keys darzustellen gibt es m.E. zwei (einfache) Möglichkeiten:
    1. über label_callback die jeweiligen Zeilen selbst aufbauen und dabei den Wert in der Fremdtabelle nachschlagen
    2. in fields (unter label) das Feld über die Syntax id:fremdtabelle.wert definieren
    (siehe http://https://contao.org/issues/show/88)

    In beiden Fällen funktioniert die Ausgabe der Datensätze mit den Werten der foreign keys sehr gut. Allerdings ist mir nicht klar, wie ich es schaffe, diese Datensätze auch anhand dieser Werte zu sortieren. Die obige Syntax funktioniert für das Sortierfeld jedenfalls nicht. Und gibt man als Sortierfeld das Feld mit dem foreignKey an, so werden die Datensätze in der Reihenfolge der id (und nicht der Werte) dargestellt, was für den Benutzer dann wohl ziemlich unintuitiv ist.

    Übersehe ich da irgend eine Möglichkeit? Ich bin ziemlicher TL/SQL/PHP-Anfänger. Über jeden Hinweis würde ich mich jedenfalls sehr freuen.

    Viele Grüße
    Frank

  2. #2
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.613
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hallo Frank,

    Interessant, von dem Mapping wusste ich nichts, scheint nirgends dokumentiert zu sein

    Bezüglich deinem Problem, ich sehe da nur eine eventuelle Möglichkeit: Über den onload_callback kannst du das list->sorting->root Array setzen. Dieses Array enthält alle Datensätze welche angezeigt werden sollen. Womöglich beachtet TYPOlight dir Reihenfolge in diesem Array...
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  3. #3
    Contao-Nutzer
    Registriert seit
    25.11.2009.
    Beiträge
    11

    Standard

    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.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Im checkboxWizard mehrere Werte über foreignKey
    Von iCodr8 im Forum Entwickler-Fragen
    Antworten: 10
    Letzter Beitrag: 31.07.2014, 13:32
  2. Sortierung nach Child-Datensätzen
    Von Toflar im Forum Entwickler-Fragen
    Antworten: 7
    Letzter Beitrag: 09.01.2011, 10:49
  3. foreignKey - Zwei Felder kombinieren
    Von johannes.enjoy im Forum Sonstiges zu Contao
    Antworten: 2
    Letzter Beitrag: 24.06.2010, 13:04
  4. FE Modul - richtigen Wert ausgeben der per foreignKey belegt wurde
    Von xs-hoppelhase im Forum Entwickler-Fragen
    Antworten: 3
    Letzter Beitrag: 21.06.2010, 03:11
  5. Sortierung im BE nach foreignKey
    Von franks im Forum Entwickler-Fragen
    Antworten: 1
    Letzter Beitrag: 11.12.2009, 20:23

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •