Extbase: Datensätze aus uidlist sortieren

Oftmals müssen Datensätze in einer FlexForm im TYPO3 Backend manuell zur Ausgabe selektiert werden. Das Problem dabei ist, dass Extbase Repository liefert die Daten nicht in der Reihenfolge zurück, wie die einzelnen Datensätze in der FlexForm eingetragen wurden.

Da in der FlexForm vom Typ "Select" eine Sortierung möglich ist, sollten die Daten entsprechend im Listing sortiert sein. Hier ein Beispiel wie das FlexForm für gewöhnlich konfiguriert ist:

 


 

 

<settings.software>
    <TCEforms>
        <exclude>0</exclude>
        <label>LLL:EXT:products/Resources/Private/Language/locallang_db.xlf:flexform.software</label>
        <config>
            <type>select</type>
            <autoSizeMax>20</autoSizeMax>
            <foreign_table>tx_products_domain_model_software</foreign_table>
            <maxitems>9999</maxitems>
            <size>10</size>
        </config>
        <displayCond><![CDATA[FIELD:switchableControllerActions:=:Software->list]]></displayCond>
    </TCEforms>
</settings.software>

 

 

 

Im Controller wird nun die Methode des Repositories aufgerufen, als Parameter wird die UID-Liste übergeben:

 


 

 


 

/**
 * action list
 *
 * @return void
 */
public function listAction() {
    $softwares = $this->softwareRepository->findByUidlist($this->settings['software']);
    $this->view->assign('softwares', $softwares);
}

 

 

Die Repository Methode ist relativ Simpel aufgebaut. In der vorletzten Zeile wird die Sortierung bestimmt. Hier wird als Parameter nicht ein Feld, sondern eine zusätzliche Methode aufgerufen:

 


 

 

/**
 * @param string $uidlist
 * @return QueryResultInterface
 */
public function findByUidlist($uidlist){
    /** @var QueryInterface $query */
    $query = $this->createQuery();
    $uidlist = explode(',', $uidlist);

    $constraints = array();
    if(count($uidlist) > 0){
        foreach($uidlist as $uid){
            $constraints[] = $query->equals('uid', (int)$uid);
        }
    }
    $query->matching(
        $query->logicalOr(
            $constraints
        )
    );
    $query->setOrderings($this->orderByKey('uid', $uidlist));
    return $query->execute();
}

 

 

Diese Methode ist dafür zuständig, die Repository Orderings so aufzubereiten, dass Sie der Sortierung aus der FlexForm entsprechen.

 


 

 

 

  /**
     * @param $key
     * @param $uidlist
     * @return array
     */
    protected function orderByKey($key, $uidlist) {
        $order = array();
        foreach ($uidlist as $uid) {
            $order["$key={$uid}"] = QueryInterface::ORDER_DESCENDING;
        }
        return $order;
    }

 

 

Damit werden die gefundenen Datensätze identisch zur Liste in der FlexForm sortiert ausgegeben.