[gelöst] Alternative zu location
Eingetragen von jens78 (40)
am 09.10.2016 - 06:24 Uhr in
am 09.10.2016 - 06:24 Uhr in
Hallo,
leider ist location für Drupal 8 immer noch nicht verfügbar und wie es aussieht wird das wohl auch erstmal so bleiben.
Gibt es eine gleichwertige Alternative, mit der sich auch eine Umkreissuche realisieren lässt?
- Anmelden oder Registrieren um Kommentare zu schreiben
Moinsen, das einzige Modul,
am 09.10.2016 - 08:17 Uhr
Moinsen,
das einzige Modul, welches momentan proximity search views Integration hat, ist https://www.drupal.org/project/geolocation
Default muss der User in den exposed filter allerdings Längen und Breitengrad eintippen, was kaum jemanden zuzumuten ist. Ohne ein wenig custom code gehts also auch hier nicht. Ist aber nicht weiter schwierig. Wenn du willst, schick ich dir den von mir und du passt ihn für dich an. Das Ergebnis sieht dann so aus (Die Darstellung der Ergebnisse auf einer Map ist optional, nicht zwingend) :
Der Vorteil bei geolocation ist, dass es sehr schlanke Lösung ist. Es werden keine externen Libraries benötigt.
Vielen Dank
am 09.10.2016 - 14:55 Uhr
Vielen Dank für deine Antwort.
Ich habe mir das Modul gerade mal angesehen und es scheint tatsächlich genau das zu sein was ich brauche :-)
Ich wäre dir sehr dankbar, wenn du mir den Code und einen kurzen Hinweis wo er eingebaut wird geben würdest.
Viele Grüße
Jens
Hallo glycid, würdest du
am 09.10.2016 - 16:50 Uhr
Hallo glycid,
würdest du auch den Patch hier anbieten?
Ich kann mir vorstellen, dass es einige Interessiert wie sich eine Umkreissuche mit D8 realisieren lässt (mich eingeschlossen)
Wäre super wenn das okay für dch ist!
jens78 schriebIch wäre dir
am 10.10.2016 - 08:55 Uhr
Ich wäre dir sehr dankbar, wenn du mir den Code und einen kurzen Hinweis wo er eingebaut wird geben würdest.
Ich habs in einem custom Module, wo auch noch andere Sachen drin sind. Ich löse es raus und mache ein extra Modul. Denke, morgen oder übermorgen werde ich dazu kommen...
Nachtrag: Willst du die Umkreis- Kilometerauswahl auch als Dropdown wie in meinem Fall? Standard ist ein einfaches Textfeld zur freien Eingabe.
sui schrieb Hallo glycid,
am 10.10.2016 - 08:53 Uhr
Hallo glycid, würdest du auch den Patch hier anbieten?
Patch isses nicht, sondern ein Ergänzungsmodul. Ich stelle den Download Link dann rein, wenn ich soweit bin.
Dropdown ist super!
am 10.10.2016 - 09:04 Uhr
Dropdown ist super!
Top! Danke
am 10.10.2016 - 10:27 Uhr
Top! Danke
Anleitung und custom module
am 11.10.2016 - 07:05 Uhr
Anleitung und custom module Download
Vielen Dank !!!!
am 11.10.2016 - 13:18 Uhr
Hab es gerade ausprobiert und es tut genau was es soll :-)
In der Anleitung gibt es aber einen kleinen Fehler, du schreibst dass als Bezeichner für den Filter "Umkreis" eingeben werden soll im Modul-Code wird umkreis aber klein geschrieben.
Was denkst du wäre es möglich, dass Modul so anzupassen dass auch beim Eingabeformular die Engabe einer Adresse möglich wäre? Dann wäre location meiner Meinung nach komplett überflüssig.
Viele Grüße und nochmals vielen Dank!!
Jens
jens78 schrieb In der
am 11.10.2016 - 14:18 Uhr
In der Anleitung gibt es aber einen kleinen Fehler, du schreibst dass als Bezeichner für den Filter "Umkreis" eingeben werden soll im Modul-Code wird umkreis aber klein geschrieben.
Ah ja, danke, ist korrigiert
Was denkst du wäre es möglich, dass Modul so anzupassen dass auch beim Eingabeformular die Engabe einer Adresse möglich wäre? Dann wäre location meiner Meinung nach komplett überflüssig.
Du meinst im location entity wo auch das geolocation Field ist?
Ja genau
am 11.10.2016 - 16:20 Uhr
Die Anfrage an die Google Maps api müsste zwar aus mehreren Feldern (Ort,Strasse,Plz) zusammengesetzt werden aber ansonsten ist das Prinzip doch eigentlich gleich oder?
Ja, so ähnlich hab ichs auch
am 11.10.2016 - 16:43 Uhr
Ja, so ähnlich hab ichs auch in Anwendung. Nur kommen meine Adressdaten aus dem Address Field. Aber es gehen natürlich auch einfache Textfelder...
Address muss aber via Composer installiert werden.
Muss die Adresse auch im Node gerendert werden?
Ich bin gar nicht auf die
am 11.10.2016 - 19:38 Uhr
Ich bin gar nicht auf die Idee gekommen eine extra Erweiterung zur Eingabe von Adressen zu benutzen. Aber jetzt habe ich adress mal probeweise installiert und es gefällt mir richtig gut.
Muss die Adresse auch im Node gerendert werden?
Wenn du damit meinst ob neben den Geodaten auch die Adresse gespeichert und im node ausgegeben werden soll, dann ja.
Mit Addressfield
am 12.10.2016 - 12:40 Uhr
ok. dann holst du dir die Daten aus dem Addressfield und übergibst sie an Geolocation Field. Dazu erweiterst du einfach den better_proximity_search_form_alter() hook und fügst vor der letzten schließenden Klammer folgendes ein (natürlich ohne die
<?php
?>
<?php
if ($form_id == 'node_NODETYPE_form') { // Beim Inhaltstyp Article müsste hier stehen: 'node_article_form'
// entity builder function hinzufügen
$form['#entity_builders'][] = 'NODETYPE_builder';
// Field Geodaten (wenn es bei dir so heisst, wenn nicht anpassen) kann im Node Form ausgeblendet werden, da die Werte progr. gesetzt werden
$form['field_geodaten']['#access'] = FALSE;
}
?>
Nach dem form_alter() hook fügst du folgende entity_builder function ein (ohne php tags):
<?php
use Drupal\node\NodeInterface;
function NODETYPE_builder($entity_type, NodeInterface $node) {
// api key aus den Settings holen
$api_key = \Drupal::config('geolocation.settings')->get('google_map_api_key');
// Addressfield Daten holen
$address = $node->field_ADDRESSFIELDNAME->getValue(); // ADDRESSFIELDNAME = Maschinenname deines Addressfields
$addressdata = $address[0]['address_line1'] . ' ' . $address[0]['postal_code'] . ' ' . $address[0]['locality'];
// Geocoding
$user_location = urlencode($addressdata);
$request_url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' . $user_location . '&key=' . $api_key . '&components=country:DE';
$response_json = file_get_contents($request_url);
$response = json_decode($response_json, TRUE);
if ($response['status'] == 'OK') {
$values = $node->field_geodaten->getValue();
$values[0] = array(
'lat' => $response['results'][0]['geometry']['location']['lat'],
'lng' => $response['results'][0]['geometry']['location']['lng']
);
$node->field_geodaten->setValue($values);
}
else {
drupal_set_message(t('Error Message deiner Wahl'), 'error');
}
}
?>
Wichtig: NODETYPE muss überall durch den Maschinennamen deines betreffenden Inhaltstypen ersetzt werden (kleingeschrieben). field_geodaten muss entsprechend geändert werden, wenn dein Geolocation Feld einen anderen Maschinennamen hat. Das Geolocation Form Field Widget muss glaub ich "Latitude / Longitude" sein.
Funktioniert super!!!
am 12.10.2016 - 10:35 Uhr
Nur die Zeile
<?php
$address = $profile->field_ADDRESSFIELDNAME->getValue(); // ADDRESSFIELDNAME = Maschinenname deines Addressfields
?>
hat bei mir einen Ajax-Fehler verursacht. Nachdem ich $profile durch $node ersetzt habe, läuft aber alles wunderbar.
Denkst du nicht, dass es Sinn machen würde, das ganze in ein Modul zu packen und dann auf drupal.org zu veröffentlichen? Ich habe schon seit vielen Monaten nach einer Alternative zu location gesucht und habe dabei festgestellt, dass es vielen anderen genau so geht.
Mir hat deine Lösung auf jeden Fall sehr geholfen :-)
Vielen Dank
Jens
jens78 schriebNur die Zeile
am 12.10.2016 - 13:02 Uhr
Nur die Zeile
<?php
$address = $profile->field_ADDRESSFIELDNAME->getValue(); // ADDRESSFIELDNAME = Maschinenname deines Addressfields
?>
hat bei mir einen Ajax-Fehler verursacht. Nachdem ich $profile durch $node ersetzt habe, läuft aber alles wunderbar.
Ach, Scheiß copy 'n paste....habs geändert, sorry.
Denkst du nicht, dass es Sinn machen würde, das ganze in ein Modul zu packen und dann auf drupal.org zu veröffentlichen? Ich habe schon seit vielen Monaten nach einer Alternative zu location gesucht und habe dabei festgestellt, dass es vielen anderen genau so geht.
Jein ;) Das eine "fertige" Proximity Search Lösung her sollte ist klar. Das wird häufig benötigt. Ein extra Modul macht für mich nur bedingt Sinn, denn:
Mir ist eher der Gedanke gekommen, mich für diesen Part bei Geolocation mit einzubringen und entsprechende Patches zu schreiben. Mein Problem dabei ist im Moment, dass sich in D8 unter der Haube so viel geändert hat und ich gegenwärtig bei den Views Filtern noch nicht ganz durchblicke ;). Aber kommen wird das ganz sicher. Entweder von mir oder jemand anderem. Kurzfristig tuts ja erstmal das custom module.
Mir hat deine Lösung auf jeden Fall sehr geholfen :-)
Sehr schön. Eine Bitte noch zum Schluss: Könntest du den Thread dann auf "gelöst" setzen?
danke für das modul und
am 14.05.2017 - 13:38 Uhr
danke für das modul und tutorial. habe jetzt alles aus deinem blog so umgesetzt wie beschrieben und hier aus dem forum versucht das ganze mit address zu kombinieren.
leider funktioniert es nicht wie gewünscht. das umkreis-feld wird auch noch in meiner form ausgegeben.
die verknüpfung zur google maps api funktioniert, zumindest kommen die requests im dashboard an. jedoch wenn ich zb einen eintrag aus dortmund suche, werden alle nodes ausgegeben... also dortmund, hamburg, berlin.
gibt es iwo ein gesamtes paket der integration?
also eingabe im backend über address modul, die ausgabe mit textfeld für ort und umkreis als dropdown, inkl. dem patch für das geo modul?
habe zum testen eine saubere d8 instanz aufgesetzt mit der version 8.2.3.
würde mich freuen wenn du mir helfen könntest.