<?php namespace Podlove\Model; class GeoArea extends Base { } GeoArea::property('id', 'INT NOT NULL AUTO_INCREMENT PRIMARY KEY'); GeoArea::property('geoname_id', 'INT', array('unique' => true)); GeoArea::property('parent_id', 'INT'); GeoArea::property('code', 'VARCHAR(5)'); GeoArea::property('type', 'VARCHAR(255)');
public function add_geo_data($ip_string) { try { $reader = new \GeoIp2\Database\Reader(\Podlove\Geo_Ip::get_upload_file_path()); } catch (\Exception $e) { return $this; } try { // geo ip lookup $record = $reader->city($ip_string); $this->lat = $record->location->latitude; $this->lng = $record->location->longitude; /** * Get most specific area for given record, beginning at the given area-type. * * Missing records will be created on the fly, based on data in $record. * * @param object $record GeoIp object * @param string $type Area identifier. One of: city, subdivision, country, continent. */ $get_area = function ($record, $type) use(&$get_area) { // get parent area for the given area-type $get_parent_area = function ($type) use($get_area, $record) { switch ($type) { case 'city': return $get_area($record, 'subdivision'); break; case 'subdivision': return $get_area($record, 'country'); break; case 'country': return $get_area($record, 'continent'); break; case 'continent': // has no parent break; } return null; }; $subRecord = $record->{$type == 'subdivision' ? 'mostSpecificSubdivision' : $type}; if (!$subRecord->geonameId) { return $get_parent_area($type); } if ($area = GeoArea::find_one_by_property('geoname_id', $subRecord->geonameId)) { return $area; } $area = new GeoArea(); $area->geoname_id = $subRecord->geonameId; $area->type = $type; if (isset($subRecord->code)) { $area->code = $subRecord->code; } elseif (isset($subRecord->isoCode)) { $area->code = $subRecord->isoCode; } if ($area->type != 'continent') { $parent_area = $get_parent_area($area->type); $area->parent_id = $parent_area->id; } $area->save(); // save name and translations foreach ($subRecord->names as $lang => $name) { $n = new GeoAreaName(); $n->area_id = $area->id; $n->language = $lang; $n->name = $name; $n->save(); } return $area; }; $area = $get_area($record, 'city'); $this->geo_area_id = $area->id; } catch (\Exception $e) { // geo lookup might fail, but that's not grave } return $this; }