Extbase Repository: findNext und findPrevious Funktionen

Hier mal wieder ein kleines Snippet für eure TYPO3 Extbase Repositories. Falls ihr aus irgendwelchen Gründen mal das nächste oder das vorherige Objekt z.B. anhand der UID ausgeben müsst, dann werden euch diese beiden Funktionen behilflich sein.

Bindet diese Funktionen einfach in euer Repository ein und ruft diese dann z.B. aus dem Controller auf und übergebt eine UID.

/**
 * Find next item by uid
 * @param integer $uid The uid of the current record
 * @return boolean|\TYPO3\CMS\Extbase\Persistence\Generic\QueryResult 
 */
public function findNext($uid) {
    $query = $this->createQuery();
    $result = $query->matching($query->greaterThan('uid',$uid))->setLimit(1)->execute();
    if($query->count()) {
        return $result;
    } else {
        return false;
    }
}

/**
 * Find previous item by uid
 * @param integer $uid The uid of the current record
 * @return boolean|\TYPO3\CMS\Extbase\Persistence\Generic\QueryResult 
 */
public function findPrev($uid) {
    $query = $this->createQuery();
    $ordering = array('uid'=>\TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING);
    $result = $query->matching($query->lessThan('uid',$uid))->setLimit(1)->setOrderings($ordering)->execute();
    if($query->count()) {
        return $result;
    } else {
        return false;
    }
}

9 Kommentare

  • Hallo,

    besten Dank für das Snippet. Ich habe genau das gesucht
    Ich versuche gerade meine erste Extension zu bauen und wäre deshalb für einen Tipp dankbar, was ich in den Controller schreiben muss, damit ich im Fluid Template die beiden Variablen (mit welchem Namen?) ausgeben kann.

  • Hallo Thomas,

    mit assign() und assignMultiple() übergibst Du Variablen an Dein Fluid Template.

    • Hallo Paul,
      Danke für Deine hilfreiche Antwort. Ich habe jetzt den Controller entsprechend erweitert

      /**
      * action show
      *
      * @param \TMRuebe\Faerbepflanzen\Domain\Model\Pflanzen $pflanzen
      * @return void
      */
      public function showAction(\TMRuebe\Faerbepflanzen\Domain\Model\Pflanzen $pflanzen)
      {
      $this->view->assign(‚pflanzen‘, $pflanzen);
      $this->view->assign(‚findNext‘, $findNext);
      }
      }

      Leider bekomme ich mit der Variable {findNext} im Template (noch) kein Ausgabe.

  • Hallo Paul,
    leider bekomme ich es nicht hin. Falls Du noch einen Tipp für den Controller hättest, wäre ich dir sehr dankbar.

    • Hallo Thomas,

      findNext ist eine Funktion für dein „PflanzenRepository“ und keine Variable die Du an den View übergeben kannst. Du musst die Funktion in Deinem Repository aufrufen und das Ergebnis daraus an deinen View übergeben. Also in Deiner Action: (DAS IST NUR EIN BEISPIEL!)

      $nextPflanze = $this->pflanzenRepository->findNext($EINZELNEpflanze->getUid());
      $this->view->assignMultiple(['pflanze'=>$EINZELNEpflanze, 'naechtePflanze' => nextPflanze ]);
      
  • Hallo Paul,
    Danke für den zusätzlichen Hinweis. Ich bin ein völliger Neuling und lerne gerade viel.

    • Hallo Paul,
      es tut mir Leid, aber trotz längerem Bemühen ist das Problem für mich immer noch ungelöst. Solltest Du noch einmal einen Moment Zeit für mich haben, wäre ich Dir dankbar.

      Ich habe Deinen Code-Vorschlag wie folgt im Controller eingebunden.

      [php]
      /**
      * action show
      *
      * @param \TMRuebe\Faerbepflanzen\Domain\Model\Pflanzen $pflanzen
      * @return void
      */
      public function showAction(\TMRuebe\Faerbepflanzen\Domain\Model\Pflanzen $pflanzen)
      {
      $this->view->assign(‚pflanzen‘, $pflanzen);
      $nextPflanze = $this->pflanzenRepository->findNext($Einzelne-pflanze->getUid());
      $this->view->assignMultiple([‚pflanze’=>$EINZELNEpflanze, ’naechstePflanze‘ => nextPflanze ]);
      }
      [php]

      Leider erhalte ich jetzt die Fehlermeldung ‚Call to a member function getUid() on null‘.
      Ich verstehe das so, dass keine uid an die Variable $nextPflanze übergeben wurde.

      Vielen Dank für deine Geduld.

      • Hallo Thomas,
        du kannst mich unter teamgeist_medien_pab gerne mal abends bei Skype anschreiben und dann lösen wir das am Besten via TeamViewer.

  • Hallo Paul,

    vielen Dank für dein Angebot. Ich habe in den letzten Tagen versucht, dich über Skype zu erreichen und werde es einfach weiter probieren.

Schreibe einen Kommentar zu Paul Beck Antworten abbrechen

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.