Sortierungsfehler im tt_address-Plugin

tt_address bringt ein Plugin mit, das zur Darstellung der Adressen im Frontend verwendet werden kann. Nach dem Einfüges des Plugins auf der Seite kann man entweder einzelne Adressen auswählen oder eine Adressgruppe, darunter kann man eine Sortierung wählen und einen Speicherordner. Dabei wird die Reihenfolge der Adressen in der Einzelauswahl bei der Darstellung im Frontend komplett ignoriert, selbst wenn man keine Sortierung wählt.
Um dieses Problem zu lösen habe ich tt_address per XClass erweitert (meine Anleitung für XClass), dann muss man mindestens zwei Funktionen erweitert: die Funktion, die die einzelnen Datensätze holt und die Hauptfunktion, um da die nachträgliche Sortierung auszuschalten.

Die Funktion für die Datensätze muss soweit angepasst werden, dass die die Uids abgearbeitet werden – anstatt uid IN (…) eine foreach-Schleife mit uid = X. Die darauf kommende foreach-Schleife wird dadurch überflüssig, den Code daraus kann man in die neue übernehmen.

In der main-Funktion muss die Sortierung ausgeschaltet werden, wenn keine angegeben ist. Die Sortierung wird bereits in der init-Funktion gesetzt, daher muss man an der Stelle die Konfiguration erneut auslesen. Wenn keine Sortierung gewählt ist, ist der Wert in den Flexforms ‚default‘. So kann man in einer if-Abfrage die Sortierung für ‚default‘ weglassen.

6 Kommentare

  1. Josef

    Hallo,

    ich möchte auf einer Internetseite das Plugin tt_address verwenden. Dabei beabsichtige ich, einen SysFolder für alle Adressen anzulegen. Auf diversen Unterseiten sollen dann immer nur ein paar Adressen angezeigt werden, deren Sortierung ich gerne manuell vornehmen möchte. Es soll dann also nicht nach Name, Adresse oder sonst irgendeinem Feld sortiert werden, sonder nach der Reihenfolge, wie ich die Adressen im Backend im Feld „Einzelne Adressen“ einfüge.
    Ihre Anleitung scheint mir genau das zu realisieren, nur verstehe ich sie nicht. Könnten Sie mir eine detailiertere Anleitung zukommen lassen, wie ich dies realieieren kann? Vielen, vielen Dank schon mal im Voraus.

  2. natalia

    Hi,
    es ist leider so, dass ich den Quellcode für diese Lösung nicht mehr habe. Es gibt in tt_address nur eine PHP-Datei, die das Auslesen der Adressen umsetzt. Such doch dort nach einer Funktion, die listView im Namen hat und dort nach exec_SELECTquery. Dann solltest du – PHP und MySQL Kenntnisse vorausgesetzt, entsprechend der Anleitung die Änderungen vornehmen können. Mehr Hilfe kann ich Dir leider nicht geben.

  3. Peter Rauber

    Ich hatte hier die gleiche Augabenstellung. Hier mein Code, geschrieben basierend auf der obigen Anleitung:

    init($conf);
    $content = “;

    $singleSelection = $this->getSingleRecords();
    $groupSelection = $this->getRecordsFromGroups();

    // merge both arrays so that we do not have any duplicates
    $addresses = t3lib_div::array_merge($singleSelection, $groupSelection);

    $templateCode = $this->getTemplate();
    $sorting = explode(‚,‘, $this->ffData[’singleRecords‘]);

    if (($this->ffData[’sortBy‘] != ‚default‘) || ($this->ffData[‚groupSelection‘]) ) {
    // sorting the addresses
    $sortBy = array();
    foreach($addresses as $k => $v) {
    $sortBy[$k] = $v[$this->conf[’sortByColumn‘]];
    }
    array_multisort($sortBy, $this->conf[’sortOrder‘], $addresses);
    }

    // limit output to max listMaxItems addresses
    if( ((int) $this->conf[‚listMaxItems‘]) > 0) {
    $addresses = array_slice($addresses, 0, int($this->conf[‚listMaxItems‘]));
    }

    // output
    foreach($addresses as $address) {
    if(!empty($address)) {
    $markerArray = $this->getItemMarkerArray($address);
    $subpartArray = $this->getSubpartArray($templateCode, $markerArray, $address);

    $addressContent = $this->cObj->substituteMarkerArrayCached(
    $templateCode,
    $markerArray,
    $subpartArray
    );

    $wrap = $this->conf[‚templates.‘][$this->conf[‚templateName‘].‘.‘][‚wrap‘];
    $content .= $this->cObj->wrap($addressContent, $wrap);

    $content .= chr(10).chr(10);
    }
    }

    $templateAllWrap = $this->conf[‚templates.‘][$this->conf[‚templateName‘].‘.‘][‚allWrap‘];
    $content = $this->cObj->wrap($content, $templateAllWrap);

    $overallWrap = $this->conf[‚wrap‘];
    $content = $this->cObj->wrap($content, $overallWrap);

    return $this->pi_wrapInBaseClass($content);
    }

    /**
    * gets the records the user selected in the single address selection field
    *
    * @return array array of addresses with their uids as array keys
    */
    function getSingleRecords() {

    if (($this->ffData[’sortBy‘] != ‚default‘) || ($this->ffData[‚groupSelection‘]) ) {
    return parent::getSingleRecords();
    }

    $singleRecords = array();
    $uidList = $GLOBALS[‚TYPO3_DB‘]->cleanIntList(
    $this->conf[’singleSelection‘]
    );

    if(!empty($uidList) && !empty($this->conf[‚pidList‘])) {

    foreach (explode(‚,‘, $uidList) as $uid) {

    $addresses = $GLOBALS[‚TYPO3_DB‘]->exec_SELECTgetRows(
    ‚*‘,
    ‚tt_address‘,
    ‚uid = ‚.$uid.‘ AND pid IN(‚.$this->conf[‚pidList‘].‘)‘
    .$this->cObj->enableFields(‚tt_address‘)
    );

    foreach($addresses as $k => $address) {
    $singleRecords[$address[‚uid‘]] = $this->getGroupsForAddress($address);
    }
    }
    }

    return $singleRecords;
    }

    }
    ?>

  4. Peter Rauber

    im obigen Listing fehlt folgendes (am Anfang):

    <?php
    class ux_tx_ttaddress_pi1 extends tx_ttaddress_pi1 {

    function main($content, $conf) {

  5. Silke

    Hallo Peter!

    Genau das Problem habe ich jetzt auch. Da du deinen Code hier veröffentlicht hast, nehme ich an, dass man ihn so verwenden darf? Falls nicht, bitte Bescheid geben.

  6. Supi, bei mit klappt das auch!

    im localconf.php noch die XCLASS noch reinschreiben:

    $TYPO3_CONF_VARS[‚FE‘][‚XCLASS‘][‚ext/tt_address/pi1/class.tx_ttaddress_pi1.php‘] = PATH_site.’fileadmin/files/class.ux_tx_ttaddress_pi1.php‘;