Бесплатно
Загрузите дополнение из админки вашего сайта.
Как загрузить?
Автор дополнения
Иван Бочкарев
Пакетов
30
Закачек
183
Автор дополнения
Пакетов
30
Закачек
183
Версия 1.0.0-pl
Дата выпуска 31.08.2026
Загрузки 0
Просмотры 37
Внимание, этот компонент требует PHP 8.2 или выше!
Внимание, этот компонент требует MODX 3 или выше.
Компонент GeoLocation2 позволяет определить город посетителя и вывести список доступных городов.

Особенности
  • определение города пользователя по ip
  • справочник стран, регионов и городов в базе. Можно добавить и изменить нужную локацию под себя
  • модалка подтверждения и смены города
  • контакты, адрес и изображение в gl_data
  • импорт и экспорт городов в csv

Установка
  • Подключите репозиторий дополнений
  • Установите GeoLocation2
  • Заполните страны, регионы и города в Компоненты → GeoLocation2

Сниппет GeoLocation2Initialize — Подключает web-ассеты и конфигурацию. Вызвать в любом удобном месте.

Сниппет GeoLocation2Current — Текущее состояние города и confirmed.

Сниппет GeoLocation2Modal — UI выбора и подтверждения города.

Сниппет GeoLocation2Location — Определение локации по IP.

Сниппет GeoLocation2 — Список активных городов.

Сниппет GeoLocation2Data — Контактные данные gl_data (вкладка «Данные»).

Если Bootstrap 5 нет в теме, у Initialize поставьте loadBootstrap => 1.

Пример вызова, текущий город


{set $city = '!GeoLocation2Current'|snippet:[
    'asJson' => 1
]|fromJSON}
{$city|print}

(
[gl2_current_id] => 1
[gl2_current_name_ru] => Москва
[gl2_current_name_en] => Moscow
[gl2_display_name_ru] => Москва
[gl2_real_name_ru] => Москва
[gl2_default_id] => 1
[gl2_default_name_ru] => Москва
[gl2_prompt_done] => 0
[gl2_confirmed] => 0
[gl2_csrf] =>
[gl2_unknown_label] => не определён
[gl2_default_label] => По умолчанию
)


Пример вызова, модалка выбора города

{'!GeoLocation2Modal' | snippet : ['modalShow' => 1, 'modalId' => 'geolocation2Modal']}

<a href="#" class="gl2-open-modal">Открыть модалку</a>


На стенде вопрос модалки: «Ваш город — Москва?», кнопки «Да, верно» и «Изменить город».

Пример вызова, геолокация по IP

{'!GeoLocation2Location' | snippet : ['ip' => '8.8.8.8']}
{'!GeoLocation2Location' | snippet : ['ip' => '1.1.1.1']}


Ответ на стенде (оба IP): пустой блок.

<div class="geolocation2-location">
</div>


Пример вызова, список городов

{'!GeoLocation2' | snippet : ['limit' => 10, 'sortby' => 'name_ru', 'sortdir' => 'ASC']}


Ответ (фрагмент, чанк tpl.GeoLocation2.item):


<p>
    <strong>Алматы</strong>
    Almaty — id региона: 9    43.23895 76.94553
</p>
<p>
    <strong>Астана</strong>
    Astana — id региона: 10    51.16939 71.44907
</p>


Поля записи города на стенде (Москва):

(
[id] => 1
[region_id] => 1
[name_ru] => Москва
[name_en] => Moscow
[lat] => 55.75583
[lon] => 37.61778
[okato] => 45000000000
[default] => 1
[active] => 1
)


Пример вызова, контакты текущего города

{'!GeoLocation2Data' | snippet : ['forCurrent' => 1, 'tpl' => 'tpl.GeoLocation2.data.current']}


Ответ на стенде (Москва, gl_data id=2):

<div class="gl2-data-current gl2-qa-box" data-gl2-data-id="2">
    <dl class="gl2-qa-kv">
        <dt>Класс / ID локации</dt>
        <dd>GlCity · 1 (МСК)</dd>
        <dt>Email / телефон</dt>
        <dd>moscow@example.ru · +7 (495) 000-00-01</dd>
        <dt>Адрес</dt>
        <dd>ул. Тверская, д. 1</dd>
        <dt>Изображение</dt>
        <dd>—</dd>
        <dt>По умолчанию</dt>
        <dd><span class="gl2-pill gl2-pill-ok">Да</span></dd>
        <dt>Свойства</dt>
        <dd class="gl2-qa-code">{"population":13010112}</dd>
    </dl>
</div>


Пример вызова, все записи gl_data

{'!GeoLocation2Data' | snippet : ['limit' => 0, 'sortby' => 'id', 'sortdir' => 'DESC']}


Ответ: строки таблицы. Фрагмент со стенда:

<tr class="gl2-data-row" data-gl2-data-id="8" data-gl2-data-class="GlCity" data-gl2-data-identifier="9">
    <td>8</td>
    <td>GlCity</td>
    <td>9</td>
    <td>Алматы</td>
    <td>1</td>
    <td>almaty@example.kz</td>
    <td>+7 (727) 000-00-09</td>
    <td>пр. Абая, 150</td>
    <td>—</td>
    <td><span class="gl2-pill gl2-pill-warn">Нет</span></td>
</tr>

Управление локациями в админке

Компоненты → GeoLocation2: вкладки Страны, Регионы, Города, Данные.

На вкладке Города доступен импорт и экспорт csv.

На вкладке Данные: email, телефон, адрес, изображение. Поле class задаёт тип (GlCountry, GlRegion, GlCity), identifier: id записи.

Для сохранения нужен permission geolocation2_save.

Геолокация пользователя

Из коробки город определяется по ip через SxGeo (SxGeoCity.dat).

Стратегия задаётся настройкой geolocation2_detect_method:
  • sxgeo: по ip, включено по умолчанию
  • session: только сессия, без обращения к SxGeo

База лежит в папке assets/components/geolocation2/vendor/sypexgeo/data/

Обновление: php core/components/geolocation2/bin/update-sxgeo.php

Можно повесить на cron или на задачу Scheduler geolocation2_update_sxgeo. Scheduler для работы компонента не нужен.

Примечание

Справочник городов вы заполняете сами. В список и поиск попадают города с флагом active. Город с флагом default подставляется, если посетитель закрыл модалку без выбора.


Нужны MODX Revolution 3.0+, PHP 8.2+, MySQL или MariaDB (InnoDB).

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[1.0.0-pl] - 2026-08-27

Added

  • First public release for MODX Revolution 3.x and PHP 8.2+.
  • Tables gl_countries, gl_regions, gl_cities, gl_data (same purpose as vgrish/gl).
  • Manager: Countries, Regions, Cities, Data; lookup combos; permission geolocation2_save; CSV import/export for cities.
  • SxGeo City UTF-8 (SxGeoCity.dat), PHP reader based on gam6itko/sypex-geo.
  • Service $modx->services->get('GeoLocation2').
  • Snippets: GeoLocation2Initialize, GeoLocation2Modal, GeoLocation2Current, GeoLocation2, GeoLocation2Location, GeoLocation2Data (with forCurrent / liveUpdate).
  • Bootstrap 5 city modal: confirm/change, CSRF, session confirmed, API search (not from cached page HTML).
  • Web API action.php: state, search, data, confirm, save, dismiss.
  • Setting geolocation2_detect_method (sxgeo / session).
  • SxGeo update via CLI (bin/update-sxgeo.php) or optional Scheduler task geolocation2_update_sxgeo.
  • Transport can ship .dat (GL2_SKIP_SXGEO_BUNDLE, GL2_FORCE_SXGEO, local GL2_SXGEO_DAT / GL2_SXGEO_ZIP).
  • Docs under docs/, including overview, install, API, and snippet pages.

Последние обсуждения в сообществе MODX.pro