[Frage] Sortierung 1:n Relation kindelemente

  • Beast Beast
    T3PO
    0 x
    18 Beiträge
    0 Hilfreiche Beiträge
    29. 11. 2013, 20:34

    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


  • 1
  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    30. 11. 2013, 10:11

    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:

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

    Was für Dich hierbei vielleicht sehr wichtig ist, ist das dieses Beispiel [b]nicht bei 6.x funktioniert[/b], 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 :P
    https://fedext.net/viewhelpers/fluid/6.1.0/ForViewHelper.html#arguments

  • Beast Beast
    T3PO
    0 x
    18 Beiträge
    0 Hilfreiche Beiträge
    30. 11. 2013, 10:57

    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:

    1. 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 Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    30. 11. 2013, 11:09

    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 Beast
    T3PO
    0 x
    18 Beiträge
    0 Hilfreiche Beiträge
    30. 11. 2013, 11:19

    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 Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    30. 11. 2013, 11:34

    Hört sich richtig an :P 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 :P

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

  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    30. 11. 2013, 11:58

    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::ORDER_ASCENDING);

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

  • Beast Beast
    T3PO
    0 x
    18 Beiträge
    0 Hilfreiche Beiträge
    30. 11. 2013, 12:48

    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

  • 1