Краткая инструкция по геокодингу
Для установки бандла вам необходимо создать папку src/Amadi/GeoBundle и скопировать туда сам бандл.
Поправить файл /app/AppKernel.php:
$bundles = array(
...
new Amadi\GeoBundle\AmadiGeoBundle(),
);
А так же файл /app/config/config.php, добавив в него следующие строки
services:
geo:
class: Amadi\GeoBundle\Service\Geo
arguments: [@doctrine.orm.default_entity_manager, @security.context]
База данных IP адресов с регионами, областями и городами РФ и Украины находится в файле /ipGeoBase.sql
Это дамп с сайта ipGeoBase.ru от 12.07.2012 г.
Важно - Данный бандл, определяет только регион пользователя, а не город. но возможность определения города присутствует.
Для определения нужного вам географического уровня необходимо поправить методы findInRange() и puts() в файле Service/Geo.php
Но над этим я буду работать.
В планах:
- Сверстать окно выбора региона (оно сейчас есть. Необходимые стили для него лежат в файле
selectRegion.css). - Написать методы для определения нужного географического уровня.
- Внедрить геобандл в шаблонизатор.
- Написать скрипт обновления базы данных IP-адресов
Весь геокодинг основан на двух переменных:
- locate - код региона в БД
- region - Текстовая метка региона. Например: "Волгоградская область" Сервис при инициализации старается сохранить эти переменные в Cookie и Сессии. Это необходимо, что бы пользователи с отключёнными Cookie могли просматривать контент сайта без каких либо проблем.
Активировать сервис геокодинга можно обратившись к нему через следующую конструкцию в контроллере:
$geo = $this->container->get('geo')->init($request);
Обязательным параметром при инициализации геокодирования является объект, передаваемый методу init(Request) - это объект класса Symfony\Component\HttpFoundation\Response
После того, как объект $geo создан, вам доступны всего два публичных метода этого сервиса: locate() и puts()
Этот метод вызывается без параметров. Он сообщает сервису, что ему необходимо определить местоположение пользователя. Этот метод универсальный. Вначале он проверяет есть ли у пользователя установленные значения Cookie с информацией о его местонахождении.
Если Cookie присутствуют, то автоматически выполнится приватный метод putsToSession(), который поместит информацию о местонахождении пользователя в сессию.
Если Cookie отсутствуют, то он проверит наличие переменных в его Сессии. (Возможно у пользователя отключены cookie) Если обе проверки не прошли, тогда сервис пытается определить местонахождение пользователя по его IP, либо, если есть возможность, читает из БД то значение, которое указал пользователь у себя в профиле.
При помощи этого метода можно изменить информацию о местоположении пользователя. Пример кода, для переключения местонахождения пользователя:
public function selectRegionAction($code){
$request = $this->getRequest();
$em = $this->getDoctrine()->getEntityManager();
$regions = $em->getRepository('UniplanetGeoBundle:Region')->findOneById($code);
$geo = $this->container->get('geo')->init($request)->puts($regions);
return $this->redirect($this->generateUrl('_profile_blank'));
}
$this->getRequest()->getSession()->get('location');
или
$this->getRequest()->cookies->get('location');
Вернёт число с ID региона в БД.
$this->getRequest()->getSession()->get('region');
или
$this->getRequest()->cookies->get('region');
Вернёт название региона строкой.
{{ app.session.get('location') }}
или
{{app.request.cookies.get('location')}}
Вернёт число с ID региона в БД.
{{ app.session.get('region') }}
или
{{app.request.cookies.get('region')}}
Вернёт название региона строкой.