Sortierung anhand einer CSV-List

In der TYPO3 v4 MVC project Mailingliste kam die Frage auf, wie man eine über FlexForms eingetragene CSV-Liste von Uids aus der Datenbank holt und in der gemachten Reihenfolge wieder darstellt.

Führen wir diesen verschachtelten Satz an Hand des folgenden Szenarios ein wenig aus:
Wir haben ein FlexForm-Field in dem wir News-Datensätze hinterlegen können.

Wenn wir das FlexForm-Field auf die uns bekannte Art und Weise auslesen, erhalten wir eine kommaseparierte Liste der Uids.
Wenn wir dann unsere DB-Anfrage zum Abholen der Datensätze mit IN erstellen, stehen wir vor der Frage, wonach denn sortiert werden soll.

Es gibt aus meiner Sicht zwei Möglichkeiten, diese Frage zu beantworten.

  1. DB-seitig mit ORDER BY FIELD(uid, ‚1‘, ‚3‘, ‚4‘)
  2. PHP-seitig

zu 1:
Die Anfrage ist MySQL-Spezifisch und wird möglicherweise bei einem ORM nicht immer unterstützt.
Diese Form der Sortierung kann bei anderen RDBMS auf andere Weise realisiert werden.
Mehr Beispiele und eine konkrete Verwendung für die Funktion FIELD unter:
Cakebaker

zu 2:
Hier gibt es sicherlich einige Wege dies zu realisieren.

Eine Möglichkeit wäre folgender Code, eingebettet in einer Utility-Class:

/**
     * Sort elements as defined in a CSV-List
     * @param string $definedInFlexFormsAsList
     * @param mixed $records
     * @return array $sortedRecords
     */
    public function sortElementsAsDefinedInFlexForms($definedInFlexFormsAsList, $records) {
        if ($this->areElementsValid($records)) {
            $arrayOfRecordsAsOrderedInFlexForms = t3lib_div::intExplode(',', $definedInFlexFormsAsList);
            $sortedRecords = array();
            foreach ($arrayOfRecordsAsOrderedInFlexForms as $flexFormEntryKey => $flexFormEntryValue) {
                $sortedRecords[] = $this->sortArray($records, $flexFormEntryValue);
            }
            return $sortedRecords;
        }
    }

    /**
     * Sort the array
     * @param mixed $records
     * @param integer $num
     * @return array
     */
    protected function sortArray($records, $num) {
        foreach ($records as $record) {
            if (is_array($record)) {
                $recordUid = $record['uid'];
            } elseif ($record instanceof Tx_Extbase_DomainObject_AbstractDomainObject) {
                $recordUid = $record->getUid();
            } elseif (is_object($record)) {
                $recordUid = $record->uid;
            }
            if ((integer) $recordUid === (integer) $num) {
                return $record;
            }
        }
    }

Veröffentlicht von

avatar

Sebastian Schreiber

Ich bin 1980 in Bergisch Gladbach geboren. Nach dem Abitur und Zivildienst habe ich 2000 an der Fachhochschule Lippe & Höxter das Studium der Medienproduktin begonnen und nach längeren Aufenthalten in Valencia und Berlin 2003 das Studium mit dem Abschluss Bachelor of Science in Medienproduktion abgeschlossen. Nach einer Festanstellung kurz nach dem Studium in einer kleinen Webagentur in Köln mit Schwerpunkt TYPO3 bin ich nun seit 2008 freiberuflicher Webentwickler.

Schreibe einen Kommentar

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