Города Плюс – модуль для HostCMS

Модуль «Города+»

Платформа: HostCMSТекущая версия: 1.0Последнее обновление: 21 марта 2019
3 990 р.
Как купить?
... и самостоятельно установить на сайт

Для разработчиков

Вы находитесь на типовой динамической странице системы HostCMS, с установ­ленным модулем «Города+». Это означает, что все примеры, которые вы здесь увидите, формируются и выводятся напрямую из новых справочников.

Для лёгкой и непринуждённой работы с новыми данными вы должны понимать, как работает ORM и QueryBuilder в HostCMS. Если вам потребуется освежить знания или вы слегка теряетесь, то обязательно почитайте официальную документацию.

Модели и связи

Итак, после установки модуля «Города+» у вас появится три новых таблицы в базе данных и три новых модели в HostCMS:

  • Shop_Country_District — для федеральных округов РФ.
  • Shop_Country_District_Location — для субъектов РФ.
  • Shop_Country_District_Location_City — для населённых пунктов РФ.

По сути, новые модели являются надстройками над оригинальными справочника­ми. Все они последовательно связаны друг с другом и дополнительно связаны с соответствующими справочниками HostCMS. Чтобы стало немного понятнее, взгляните на пример:

Справочники HostCMS, которые последовательно связаны друг с другом.

Новые справочники, которые последовательно связаны друг с другом и дополнительно связаны с соответствующими справочниками HostCMS.

Получается, что каждый объект новой модели населённого пункта содержит связь с объектом населённого пункта из HostCMS. То же самое можно сказать и о субъектах. Эти связи позволяют выводить данные из нового справочника посетителям сайта, а внутри системы продолжать использовать стандартные справочники, сохраняя целостность.

$oDistrictLocationCity =
  Core_Entity::factory('Shop_Country_District_Location_City')
    ->getByName('Дно');

echo
  $oDistrictLocationCity->type . ' ' .
  $oDistrictLocationCity->name . ' (' .
  $oDistrictLocationCity->shop_country_location_city->name . ') → ';

$oDistrictLocation = $oDistrictLocationCity->shop_country_district_location;

echo
  $oDistrictLocation->type . ' ' .
  $oDistrictLocation->name_short . ' (' .
  $oDistrictLocation->shop_country_location->name . ') → ';

$oDistrict = $oDistrictLocation->shop_country_district;

echo $oDistrict->name . ' → ';

$oCountry = $oDistrict->shop_country;

echo $oCountry->name;

Благодаря связям, можно подняться даже с самого Дна:

г Дно (Дно) → обл Псковская (Псковская область) → Северо-Западный → Россия

Поиск и подсчёт

Если вы ранее работали с кодом в HostCMS, то вы уже знаете, как работать с новыми моделями. Данные в новых справочниках статичны, поэтому вам понадобится лишь поиск. Для выборки всех записей используется старый добрый метод findAll(), а для подсчёта количества элементов — getCount(). Допустим, нам нужно получить список всех федеральных округов и узнать количество субъектов у каждого:

$aDistricts = Core_Entity::factory('Shop_Country_District')->findAll();

foreach ($aDistricts as $oDistrict)
{
  echo
    $oDistrict->name . ' – ' .
    $oDistrict->shop_country_district_locations->getCount() . ' шт.<br />';
}

В результате получим вот такой список:

Дальневосточный – 9 шт.
Приволжский – 14 шт.
Северо-Западный – 10 шт.
Северо-Кавказский – 7 шт.
Сибирский – 12 шт.
Уральский – 6 шт.
Центральный – 17 шт.
Южный – 7 шт.

Фабрика и проверка существования

Давайте предположим, что у нас на руках есть точные данные. Например, иденти­фикатор субъекта – 70. В таком случае можно быстро и удобно получить соответ­ствующий объект через фабрику:

$oLocation = Core_Entity::factory('Shop_Country_District_Location', 70);

echo
  $oLocation->name_full . ', автомобильные коды: ' . $oLocation->gibdd;

Результат:

Ханты-Мансийский автономный округ – Югра, автомобильные коды: 86, 186

Бывает так, что вы не уверены в корректности исходных данных, поэтому можно удостовериться в существовании полученного объекта проверив одно из значений:

$oLocation = Core_Entity::factory('Shop_Country_District_Location', 11170);

echo
  is_null($oLocation->name) ?
    'Такого субъекта нет' :
    'Cубъект существует';

Получим:

Такого субъекта нет

Методы перехватчики

Для поиска по определённому полю в таблице или для получения связей очень удобно использовать методы-перехватчики. Представим, что у нас на руках есть название – Благовещенск. С помощью методов-перехватчиков мы можем без труда отобрать все населённые пункты с таким названием, определить тип и выяснить к какому субъек­ту они принадлежат, и вывести координаты:

$aCities = Core_Entity::factory('Shop_Country_District_Location_City')
  ->getAllByName('Благовещенск');

foreach ($aCities as $oCity)
{
  echo
    $oCity->type . ' ' .
    $oCity->name .
    ' (' .$oCity->shop_country_district_location->name . '), ' .
    'координаты: ' . $oCity->latitude . ', ' .
    $oCity->longitude . '<br />';
}

Их оказалось несколько:

г Благовещенск (Амурская область), координаты: 50.2907225, 127.5272566
г Благовещенск (Башкортостан), координаты: 55.0499867, 55.9553186

Ну, или предположим, что у нас есть код КЛАДР — 2700000100000 и по нему требуется получить город и вывести дополнительные данные:

$oCity = Core_Entity::factory('Shop_Country_District_Location_City')
  ->getByKladr('2700000100000');

$oDateTime =
  new DateTime('now', new DateTimeZone(substr($oCity->timezone, 3)));

echo
  $oCity->type . ' ' .
  $oCity->name . ' (' .
  $oCity->shop_country_district_location->name . '), ' .
  'часовой пояс: ' . $oCity->timezone . ', ' .
  'местное время: ' . $oDateTime->format('H:i') . ', ' .
  'индекс: ' . $oCity->postal_code . '<br />';

Вуаля:

г Хабаровск, часовой пояс: UTC+10, местное время: 04:26, индекс: 680000

Построитель запросов и немного волшебства

Порой выборка должна включать сразу несколько хитрых условий. Для этого ис­пользуется построитель запросов. Представим компанию, которая работает только в городах с населением более 100 000 человек. У такой компании есть форма на сайте, в которую пользователь вводит первые буквы названия своего города — Ма. Нам необходимо отобрать совпадения, но не более трёх вариантов:

$oCity = Core_Entity::factory('Shop_Country_District_Location_City');

$oCity
  ->queryBuilder()
    ->where('name', 'LIKE', 'Ма%')
    ->where('population', '>', 100000)
    ->limit(3);

$aCities = $oCity->findAll();

foreach ($aCities as $oCity)
{
  echo
    $oCity->type . ' ' .
    $oCity->name . ', ' .
    $oCity->shop_country_district_location->name . '<br />';
}

Пожалуйста:

г Магнитогорск, Челябинская область, 416521 чел.
г Майкоп, Адыгея, 141970 чел.
г Махачкала, Дагестан, 596356 чел.

Возьмёмся за что-нибудь посложнее. Предположим, стоит задача показать все областные центры Центрального федерального округа и отсортировать их по численности населения субъектов:

$oCity = Core_Entity::factory('Shop_Country_District_Location_City');

$oCity->queryBuilder()
  ->leftJoin(
    'shop_country_district_locations',
    'shop_country_district_locations.id', '=',
    'shop_country_district_location_cities.shop_country_district_location_id')
  ->leftJoin(
    'shop_country_districts',
    'shop_country_districts.id', '=',
    'shop_country_district_locations.shop_country_district_id')
  ->where('shop_country_districts.name', '=', 'Центральный')
  ->where('shop_country_district_location_cities.capital', '=', 1)
  ->orderBy('shop_country_district_locations.population');

$aCities = $oCity->findAll();

foreach ($aCities as $oCity)
{
  echo
    $oCity->type . ' ' .
    $oCity->name . ' (' .
    $oCity->shop_country_district_location->name_full . ', ' .
    $oCity->shop_country_district_location->population . ' чел.)' . '<br />';
}

Как видите, даже это делается без особых проблем:

г Кострома (Костромская область, 637145 чел.)
г Орёл (Орловская область, 739327 чел.)
г Смоленск (Смоленская область, 942786 чел.)
г Иваново (Ивановская область, 1003835 чел.)
г Калуга (Калужская область, 1009996 чел.)
г Тамбов (Тамбовская область, 1015369 чел.)
г Курск (Курская область, 1106945 чел.)
г Рязань (Рязанская область, 1114312 чел.)
г Липецк (Липецкая область, 1143749 чел.)
г Брянск (Брянская область, 1199951 чел.)
г Ярославль (Ярославская область, 1259935 чел.)
г Тверь (Тверская область, 1269182 чел.)
г Владимир (Владимирская область, 1365384 чел.)
г Тула (Тульская область, 1478777 чел.)
г Белгород (Белгородская область, 1547788 чел.)
г Воронеж (Воронежская область, 2327703 чел.)
г Москва (Московская область, 20226625 чел.)

«А в чём же волшебство?» — спросите вы. Волшебство заключается в том, что вы до­читали эту страницу до самого конца. Вероятно, вам было действительно полезно, и я не зря потратил несколько ночей на составление и оформление этих приме­ров. Если у вас остались какие-либо вопросы по использованию модуля — спрашивайте, не стесняйтесь.

Перед использованием модуля обязательно почитайте: