Ankündigung

Einklappen
Keine Ankündigung bisher.

Ergebnisse der Umkreissuche sortieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ergebnisse der Umkreissuche sortieren

    Hallo liebste Freunde der gepflegten Datensätze,

    Kunde hätte gerne, dass die Ergebnisliste einer Umkreissuche sinnvollerweise auch so sortiert ist, dass der Treffer mit der geringsten Distanz zu den gesuchten Koordinaten ganz oben steht. Soweit ich das im Forum jetzt rausfinden konnte, existiert seit CC 2.13.0 dafür die findDistanceByCoords Methode.

    Wie genau arbeitet man denn damit?

  • #2
    So haben wir es gelöst:

    PHP-Code:
    <?php
    $arrOptions
    ['apikey'] = 'apiXXX';
    $boolUseCache true// Cache für Google API Requests nutzen

    $standort sprintf('%s Deutschland', \Input::get('umkreissuche_address'));
    if(!empty(
    $standort)):
    $result = [];

    foreach(
    $this->entries as $entry):
    // Geo Berechnung
    $objGeoAttr = new \PCT\CustomElements\Attributes\Geolocation();

    $zip $entry->field('address_zipcode')->value();
    $city $entry->field('address_city')->value();

    if(!empty(
    $zip) && !empty($city)):
    $objectaddress sprintf('%s %s Deutschland'$zip$city);
    $objDistBetween $objGeoAttr->findDistance($standort$objectaddress$arrOptions$boolUseCache);
    if(!
    $objDistBetween->hasError):
    $distance $objDistBetween->distance['value'];
    if(!empty(
    $distance)):
    $result[$distance] = $entry;
    endif;
    endif;
    endif;
    endforeach;

    // Aufsteigende Sortierung des neuen Arrays
    if(count($result) > 0):
    ksort($result);
    $this->entries $result;
    endif;
    endif; 
    ?>

    Kommentar


    • #3
      Standardmäßig ist das Rückgabeergebnis der Umkreissuche die gefundenen IDs aufsteigend sortiert (keine Standardsortierung angeben!). Die kann man abgreifen und damit eine neue CC Instanz für die Liste sortieren lassen (auch geflippt (reverse)).

      SQL order by FIELD erlaubt das.

      mod_customcatalog (ab 4.3.8)

      Code:
      <?php
      // aktuelle Ids holen
      $arrIds = $this->CustomCatalog->prepare()->fetchEach('id');
      // neue CC Instanz aus Modul erstellen
      $objCC = \Contao\CustomCatalog::findByModule($this);
      // ASC, DESC
      #$arrIds = array_reverse($arrIds);
      // nach ID Feld sortieren:
      $objCC->addSorting('FIELD(id,'.implode(',',$arrIds).')' );
      ?>
      <?= $objCC->render(); ?>
      Zuletzt geändert von Tim; 11.10.2021, 14:02.
      http://www.premium-contao-themes.com

      Kommentar


      • #4
        Traurig aber wahr... ich konnte leider mit beiden Antworten nichts brauchbares anfangen.

        Hier mal mein Template, das grundsätzlich ja funktioniert, aber leider eben die Ergebnisse falsch sortiert.

        PHP-Code:
        <?php foreach ($this->entries as $entry): ?>
        <div class="dealer" coords="<?php echo $entry->field('address')->value ?>">
        <div class="name" id="<?= $entry->field('id')->value?>"><?= $entry->field('name')->value(); ?></div>
        <div class="address additional"><?= $entry->field('additional')->value(); ?></div>
        <div class="address">
        <?= $entry->field('address_street')->value(); ?><br>
        <?= $entry->field('address_zipcode')->value(); ?> <?= $entry->field('address_city')->value(); ?><br>
        </div>
        <div class="route">
        <a href="http://maps.google.com/maps?daddr=<?= $entry->field('address_street')->value(); ?>+<?= $entry->field('address_city')->value(); ?>" target="_blank">{{trans::gm_route}}</a>
        </div>
        </div>
        <?php endforeach; ?>

        Kommentar

        Lädt...
        X