Skip to content

amadi/GeoBundle

Repository files navigation

GeoBundle

Краткая инструкция по геокодингу

Установка

Для установки бандла вам необходимо создать папку 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()


Метод locate()

Этот метод вызывается без параметров. Он сообщает сервису, что ему необходимо определить местоположение пользователя. Этот метод универсальный. Вначале он проверяет есть ли у пользователя установленные значения Cookie с информацией о его местонахождении.

Если Cookie присутствуют, то автоматически выполнится приватный метод putsToSession(), который поместит информацию о местонахождении пользователя в сессию.

Если Cookie отсутствуют, то он проверит наличие переменных в его Сессии. (Возможно у пользователя отключены cookie) Если обе проверки не прошли, тогда сервис пытается определить местонахождение пользователя по его IP, либо, если есть возможность, читает из БД то значение, которое указал пользователь у себя в профиле.

Метод puts()

При помощи этого метода можно изменить информацию о местоположении пользователя. Пример кода, для переключения местонахождения пользователя:

 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')}}

Вернёт название региона строкой.

About

Geocoding bundle for Symfony 2

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages