[gelöst] Modul addressfield mit eigenen Ländern belegen
am 15.09.2012 - 13:14 Uhr in
Hallo ihr,
ich nutze addressfield um Adressen zum Contents abzuspeichern. Aber ich möchte nicht das die User sowas selber eintippen, sondern lasse das Ganze durch ein GeoField ausfüllen.
Also ich lese die Position aus dem GeoField und machen ein reverse Geocoding über Goolge:
<?php
function xip_geolocate($location) {
$data = array ( 'Strasse' => NULL,
'plz' => NULL,
'Land' => NULL,
'Stadt' => NULL );
$json = drupal_http_request("http://maps.googleapis.com/maps/api/geocode/json?latlng=$location&sensor=true");
$response = drupal_json_decode($json->data);
switch ($response['status']) {
case 'OK':
foreach($response['results'] as $results)
{
if (isset($results['address_components'][0]['types'][0]))
{
if(strcmp($results['address_components'][0]['types'][0],"postal_code")==0 && !isset($data['plz']))
{
$data['plz'] = $results['address_components'][0]['long_name'];
}
if(strcmp($results['address_components'][0]['types'][0],"route")==0 && !isset($data['Strasse']))
{
$data['Strasse'] = $results['address_components'][0]['long_name'];
}
if(strcmp($results['address_components'][0]['types'][0],"country")==0 && !isset($data['Land']))
{
$data['Land'] = $results['address_components'][0]['long_name'];
}
if(strcmp($results['address_components'][0]['types'][0],"locality")==0 && !isset($data['Stadt']))
{
$data['Stadt'] = $results['address_components'][0]['long_name'];
}
}
}
break;
case 'ZERO_RESULTS':
break;
case 'OVER_QUERY_LIMIT':
watchdog('geolocate', t('OVER QUERY LIMIT'), array(), WATCHDOG_ALERT);
break;
}
if(!isset($data['Stadt']))
$data['Stadt']=' ';
if(!isset($data['Land']))
$data['Land']=' ';
if(!isset($data['plz']))
$data['plz']=' ';
if(!isset($data['Strasse']))
$data['Strasse']=' ';
return($data);
}
?>das klappt auch alles super!!!
Nur, wenn ich danach die Daten überschreibe von dem adressfield klappt das mit dem Land nicht.
Google gibt mir z.B. Germany und das Ding will De. Naja. Ich hab jetzt kein Bock für alle Länder die Abkürzungen rauszusuchen und das auch immer zu pflegen.
Es gibt da im Modul die Funktion _addressfield_country_options_list . Damit könnte man das irgendwie im Modul ändern. Habt ihr sowas schon mal gemacht?
Habt ihr da eine Idee??
Vielen Dank
- Anmelden oder Registrieren um Kommentare zu schreiben

verfügbare Länder
am 15.09.2012 - 13:29 Uhr
... Es gibt da im Modul die Funktion _addressfield_country_options_list . Damit könnte man das irgendwie im Modul ändern.
Meh, falscher Ansatz.
Hole Dir doch alle verfügbaren Länder (über die Funktion [api:country_get_list:7] und such dann per array_search() nach dem von Google zurückgegebenen Namen.
So in etwa:
<?php$country_list = country_get_list();
$country = ' ... '; // retrieved from google
$langcode = array_search(t($country), $country_list);
?>
t($country_list)tendiert zwar leicht zum Bösen, ist jedoch notwendig, um die gerade verwendete Sprache zu berücksichtigen.vielen lieben Dank
am 15.09.2012 - 13:44 Uhr
Vielen Dank.
das war ein super Hinweis. So klappts jetzt!
so mache ich das jetzt:
<?php
function googlereversecode_node_presave($node)
{
require_once DRUPAL_ROOT . '/includes/locale.inc';
$latlng = $node->field_posi['und'][0]['lat'].','.$node->field_posi['und'][0]['lon'];
$google_revgeocode = xip_geolocate($latlng);
$node->field_adress['und'][0]['postal_code'] = $google_revgeocode['plz'];
$node->field_adress['und'][0]['thoroughfare'] = $google_revgeocode['Strasse'];
$node->field_adress['und'][0]['locality'] = $google_revgeocode['Stadt'];
$country_list = country_get_list();
$country = $google_revgeocode['Land'];
$langcode = array_search(t($country), $country_list);
//debug($langcode);
$node->field_adress['und'][0]['country'] = $langcode;
}
?>