Zum Inhalt springen

Sortierung 1:n Relation kindelemente

Erstellt am 29. November 2013 · 7 Antworten · letzte Antwort am 30. November 2013

Tags: Frage

Beast ·

Ich bitte um Hilfe bei folgende Szenario:

In meiner Extenion habe ich einmal Berichte und eine Relation zu Kategorien (und umgekehrt hat jede Kategorie auch eine 1:n relation zu den berichten).
Ich gebe im Frontend alle Kategorien aus und somit für jede Kategorie auch die entsprechenden Berichte.

Innerhalb jeder Kategorie werden die Berichte im Frontent sortoert nach der UID ausgegeben.
Was ich nun möchte ist, dass ich alle Kategorien ausgebe und innerhalb der jeweiligen Kategorie die zugehörigen Berichte nach dem crdate sortiert ausgeben.

ich habe viele möglichkeiten gefunden, wie es theoretisch gehen soll, aber das tut es bei mir nicht (stichwort defaultorderings)

Viellicht kann mir hier jemand helfen.
Wo muss ich was eintragen (Controller oder Repository)

Bildlich soll die Sortierung also so aussehen;

Kategorie1
-- Bericht(uid4) date: 1.1.70
-- Bericht(uid1) date: 1.2.70
-- Bericht(uid3) date: 1.4.70
Kategorie2
..

besten Dank
gruß
sebastian

Schweriner ·

Was im Blog Example gezeigt wird, sollte eigentlich einwandfrei funktionieren. Probier Dir mal eine eigene Repository Funktion zu schreiben und Dich an dieses Beispiel zu halten:

public function findRecentByBlog(Tx_BlogExample_Domain_Model_Blog $blog, $limit = 5) {
    $query = $this->createQuery();
    return $query->matching($query->equals('blog', $blog))
        ->setOrderings(array('date' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING))
        ->setLimit((integer)$limit)
        ->execute();
}

Was für Dich hierbei vielleicht sehr wichtig ist, ist das dieses Beispiel nicht bei 6.x funktioniert, da seitdem mit Namespaces in den Klassen gearbeitet wird. Welche TYPO3 Version verwendest Du?

Ansonsten, wonach wird denn momentan bei der Ausgabe sortiert? Vielleicht könntest Du Dir im Fluid FOR Viewhelper einfach mit dem Attribut "reverse" helfen und die Ausgabe umdrehen 😛
https://fedext.net/viewhelpers/fluid/6.1.0/ForViewHelper.html#arguments

Beast ·

Ich nutze Typo3 6.1.5... aber die richtige Namespaces notation finde ich heraus...
Das Blog-Beispiel hatte ich auch gefunden, vermutlich aber dann doch falsch umgesetzt? Ich versiche es nochmal damit.
Anmerkung: Ich habe hier ein "Aggregat" "Kategorie" und ein "Aggregat" "Bericht". Also beide haben eigene Views,Models, Controller und Repositories. Da Kategorie udn Berichte jeweils in relation stehen, frage ich bei meinem PlugIn die Kategorie ab und gebe dann unter dem Stichpunkt {kategorie.bericht} alle Berichte aus. Diese berichte sollen nun nahc einem bestimmten Feld sortiert werden.

Das obige Blog-beispie müsste ich dann also in das KategorieRepository schreiben, richtig? Irritieren tut mich hier folgendes:

return $query->matching($query->equals('blog', $blog))

wäre das 'blog' hier in meinem beispiel der name des Feldes (in Kategorie TCA?), also 'bericht'?

Die idee mit dem "reverse" würde grds. gehen (ausser wenn ich nach ganz bestimmten eigenschaften sortieren möchte). Danke für den Tip. Probiere ich ebenfalls aus.

Schweriner ·

Da Du die Berichte und nicht die Kategorien sortieren willst, muss das ins BerichtRepository. Limit und Matching kannst Du bei der Abfrage eigentlich ignorieren. Wichtig sind nur createQuery(), setOrderings() und execute() um die Abfrage zu starten.

Sollte eigentlich alle Elemente der Storage PID zurückgeben, kann mich aber auch irren und da fehlt noch was um alles zurückzugeben.

Beast ·

Ah, ok.
(Da ich noch "etwas neu bin in extabse/fluid" ) Heisst also wenn ich die Kategorien abfrage und dort die (relation) "berichte" erreiche, wird automatisch das BerichtRepository (findAll()) benutzt, um innerhalb der Kategorie die Berichte auszugeben, richtig?

aber 1000 Dank schon mal, für deine Hilfe!!

Schweriner ·

Hört sich richtig an 😛 Rufst Du im Controller jedoch in deinem BerichtRepository->findAll() auf, beachtet er die Relation nicht soweit ich weiß. In dem Model für Kategorie sollte es einen ObjectStorage für die Berichte geben, in dem sozusagen die Relationen hinterlegt sind. ExtBase sucht sich irgendwie selber die dazugehörigen raus 😛

Du brauchst Ihn deinem Repository also eine Funktion, die Dir alle Berichte zu einer Kategorie ausgibt und diese nach deinem Wunsch sortiert.

Schweriner ·

Da fällt mir noch ein, du sagtest ja DefaultOrderings funktioniert nicht. Schreibt mal das hier so in deine Repository Class (nicht in eine Funktion).

protected $defaultOrderings = array("crdate"=>\TYPO3\CMS\Extbase\Persistence\QueryInterface:😮RDER_ASCENDING);

Überprüf nochmal die Schreibweise des Namespaces. Vielleicht lag es ja daran, dass du keinen NameSpace verwendet hast?

Beast ·

Also folgendes:
Die Sortierung der Kategorien mittels $defaultOrderings im KategorieRepository funktiert wie gewünscht. Leider greift aber bei der Abfrage der Kategorien nicht die Sorterung der Kindelemente "Berichte" auch wenn ich im BerichteRepository das $defaultOrderings angebe.

Werde also nun nochmal die "Blog"-Variante probieren