/
bitrix-dev
/
Starter-kit
Обзор
Документация
Войти
/
bitrix-dev
/
Starter-kit
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
main
local/php_interface/classes/mwi/Location/Search.php
173 строки
5 KB
Alexey Karizhenskiy
Первая сборка (из ранее используемого)
19 янв 2026, 21:00
19 янв 2026, 21:00
d843e36
Код
Авторство
О чём код?
<?php /* * Created by PhpStorm. * @author: AlexeyS <Karizhenskiy@bk.ru> * @date: 2025.01.19 */ namespace MWI\Location; use Bitrix\Main\Loader; use Bitrix\Sale\Location; use Bitrix\Main\Context; use intec\regionality\models\Region; /** * Класс для поиска и работы с местоположениями */ class Search { /** * Кэш регионов * @var array|null */ private static $regions = null; /** * Поиск городов по строке запроса * @param string $query Строка поиска * @param int $limit Максимальное количество результатов * @return array Массив найденных городов */ public static function searchCities(string $query, int $limit = 20): array { if (!Loader::includeModule('sale')) { return []; } $cities = []; // Очистка и форматирование поискового запроса $query = trim($query); $query = htmlspecialchars($query); $query = str_replace(' ', '%', $query); $query = str_replace('"', '', $query); $query = str_replace("'", '', $query); // Параметры фильтрации $arFilter = [ '=NAME.LANGUAGE_ID' => LANGUAGE_ID, 'TYPE_CODE' => array("REGION", "CITY"), 'NAME.NAME' => $query . '%' ]; // Выбираемые поля $arSelect = [ '*', 'ID' => 'ID', 'REGION_ID' => 'REGION_ID', 'NAME_RU' => 'NAME.NAME', 'TYPE_CODE' => 'TYPE.CODE', ]; // Получение списка местоположений $res = Location\LocationTable::getList([ 'filter' => $arFilter, 'select' => $arSelect, 'limit' => $limit + 10, 'order' => ['NAME.NAME' => 'ASC'] ]); while ($item = $res->fetch()) { if ($item['TYPE_CODE'] == 'CITY') { $arCity = [ 'ID' => $item['ID'], 'NAME' => $item['NAME_RU'], 'REGION_ID' => $item['REGION_ID'], 'REGION_NAME' => '', 'REGIONALITY_REGION_ID' => self::getRegionalityRegionIdByCityName($item['NAME_RU']), ]; // Получение информации о регионе города if (!empty($item['REGION_ID'])) { $region = Location\LocationTable::getList([ 'filter' => [ '=NAME.LANGUAGE_ID' => LANGUAGE_ID, '=ID' => $item['REGION_ID'], ], 'select' => [ 'NAME_RU' => 'NAME.NAME', ], ])->fetch(); if (!empty($region)) { $arCity['REGION_NAME'] = $region['NAME_RU']; } } $cities[] = $arCity; if (count($cities) >= $limit) { break; } } } return $cities; } /** * Получить список регионов из модуля regionality * @return array Массив регионов */ public static function getRegionalityRegions(): array { if (self::$regions === null) { self::$regions = []; if ( !Loader::includeModule('intec.core') && !Loader::includeModule('intec.regionality') ) return []; $oContext = Context::getCurrent(); // Получение списка активных регионов $regions = Region::find() ->where([ 'active' => 1 ]) ->forSites('s1'/*$oContext->getSite()*/) ->orderBy(['sort' => SORT_ASC]) ->all(null, false); $oRegionCurrent = Region::getCurrent(); // Формирование массива регионов foreach ($regions as $oRegion) { self::$regions[] = [ 'ID' => $oRegion->id, 'NAME' => $oRegion->name, 'CODE' => $oRegion->code, 'CURRENT' => ($oRegion->id == $oRegionCurrent->id), ]; } } return self::$regions; } /** * Получить ID региона из модуля regionality по названию города * @param string $cityName Название города * @return int ID региона (0 если не найден) */ public static function getRegionalityRegionIdByCityName(string $cityName): int { $regionOtherId = 0; $arRegions = self::getRegionalityRegions(); // Поиск региона по названию foreach ($arRegions as $arRegion) { if ($arRegion['NAME'] == $cityName) { return $arRegion['ID']; } // Если регион "Другое", сохраняем его ID if (strtolower($arRegion['CODE']) == 'other') { $regionOtherId = $arRegion['ID']; } } return $regionOtherId; } }