Extbase: Sortierung von Child Objects / ObjectStorages / IRRE

Heute möchte ich mal ein unbefriedigendes ExtBase Thema aufgreifen, für das in TYPO3 leider noch keine „schöne“ Lösung vorliegt. Und zwar geht es um die Sortierung von Child Objects in ExtBase, die durch ein TCA IRRE Feld hinzugefügt werden und im Model standardmäßig als ObjectStorage zurückgegeben werden.

Die Klassen Parent und Child in diesem Beitrag sind lediglich Beispiele!

Hat mein beispielsweise ein Model „Parent“ und diesem werden per Inline Relational Record Editing im Backend Datensätze des beispielhaften Models „Child“ hinzugefügt, so verfügt man im Model des Parents in der Regel über einen GETTER der einen entsprechenden ObjectStorage mit den Child Records zurückgibt.
Allerdings wird hierbei die Sortierung aus dem Backend keineswegs übernommen, egal wie sehr man probiert mit den Feldern sort_by, foreign_sortby oder default_foreign_sortby herumspielt – es hat keine Auswirkungen auf die normal UID Sortierung.

Im TYPO3 Forge wird seit einiger Zeit an einer Lösung gewerkelt, die es aber vermutlich nicht mehr in TYPO3 6.x schaffen wird, weshalb man sich anders behelfen muss. In diesem Artikel möchte zwei Lösungsansätze vorschlagen:

Lösung 1: Manueller Aufruf des Repositories / Änderung der QuerySettings

Ändert man im Repository der Childs das DefaultOrderings, so hat dies leider noch keine Auswirkungen auf die Sortierung des ObjectStorage den man im Parent via

return $this->childs

erhält.
Ruft man das Repository im Model jedoch manuell auf, so wird die Sortierung respektiert. Dazu kann man die Sortierung entweder direkt in einer eigenen Funktion verändern oder am Anfang des ChildRepository das Attribut defaultOrderings ändern wie zum Beispiel so:

protected $defaultOrderings = array(
    'sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
);

Anschließend muss man das ChildRepository im Model des Parent per Annoation oder per Konstruktur injected (@inject) und ruft dieses dann in der Funktion getChild() auf:

public function getChilds() {
    return $this->childRepository->findByParent($this->uid);
}

Lösung 2: Manipulation der Sortierung via PHP / Fluid ViewHelper (empfohlen)

Die erste Lösung ist sicherlich möglich, aber wie ich finde haben Repositories im Model nichts zu suchen, außer es geht mal wirklich nicht anders. Aufwändiger aber womöglich schöner ist die nachträgliche Sortierung des ObjectStorages per PHP im ParentController, vor der Ausgabe, oder in einem Fluid ViewHelper.

Wie für so viele Probleme gibt es unter den ViewHelpern der vhs Extension bereits einen ViewHelpers zur Sortierung von Arrays oder ObjectStorages, welchen ich euch für euer Projekt uneingeschränkt empfehlen kann (klick mich hart).

3 Kommentare

  • Absolut unbefriedigend! Leider fehlen noch so einige „schöne Lösungen“, danke für den Beitrag! 🙂

  • Danke!!!!!!!

  • Matthias Kappenberg

    ‚foreign_sortby‘ => ’sorting‘,
    ins TCA +

    config.tx_extbase{
        persistence{
            classes{
                Vendor\Extname\Domain\Model\Classname {
                    mapping {
                        tableName = tx_the_tablename
                        columns {
                            sorting.mapOnProperty = sorting
                        }
                    }
                }
            }
        }
    }
    ins setup…

    Funktioniert bei mir und scheint der „schöne weg“ zu sein 😉

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Highlighting von Codes ist mit den Tags  [ts], [php], [html], [javascript], [xml] oder [code] möglich.