Телеграм: @bazarow_ru Почта: mihail@bazarow.ru

Получение местоположений через API Битрикс c поиском по select.

Просмотров: 23250

Если нужно получить список городов из модуля "Местоположения" можно воспользоваться API Битрикс. Данные местоположения можно использовать в любом месте сайта или в любом компоненте. Например в профиле пользователя или формах обратной связи.

Получение местоположений и вывод их в select

Для примера, буду выводить города в профиле пользователя. Данные должны записаться в стандартное поле "Город" с кодом "PERSONAL_CITY"

Сначала импортируем местоположения. Для этого проходим в административную панель по пути Магазин -> Настройки -> Местоположения -> Импорт местоположений и выбираем нужные данные. Для примера, я выберу регион Россия->Центр

Дожидаемся окончания импорта. Затем идем в шаблон компонента main.profile и открываем файл template.php в нужном месте шаблона вызываем местоположения с помощью API \Bitrix\Sale\Location\LocationTable::getList пока выводим все города, просто списком

<?
$res = \Bitrix\Sale\Location\LocationTable::getList(array(
    'filter' => array('=TYPE.ID' => '5', '=NAME.LANGUAGE_ID' => LANGUAGE_ID),
    'select' => array('NAME_RU' => 'NAME.NAME')
    ));
    while ($item = $res->fetch()) {
        echo $item['NAME_RU'].'<br>'; 
    }
?>

Где в массивах:
'filter' - передали ID типа местоположения. В моем случае это 5-ый, города. И языковые настройки. Сюда можете предать любые типы: Улицы, Села, Страны, Регионы.
'select' - передали нужные для вывода данные, в моем случае русские названия (городов).

В итоге, получили список всех городов импортированных в местоположения. Теперь оформляем это в список c выбором select, где первым option (по умолчанию) будет ранее выбранный и сохраненный город. Самому селекту назначаем name="PERSONAL_CITY", что бы он сохранялся в стандартное поле пользователя- Город

<select name="PERSONAL_CITY">
    <option value="<?= $arResult["arUser"]["PERSONAL_CITY"] ?>">
        <?= $arResult["arUser"]["PERSONAL_CITY"] ?>
    </option>
    <?
    $res = \Bitrix\Sale\Location\LocationTable::getList(array(
        'filter' => array('=TYPE.ID' => '5', '=NAME.LANGUAGE_ID' => LANGUAGE_ID),
        'select' => array('NAME_RU' => 'NAME.NAME')
    ));
    while ($item = $res->fetch()) {?>
        <option value="<? print_r($item['NAME_RU']); ?>">
            <? print_r($item['NAME_RU']); ?>
        </option>
     <?} ?>
</select>

Все, теперь пользователь может выбрать город из списка и он сохранится в нужное поле (Город). Но если городов очень много, например вы загрузили всю Россию, выбирать из такого списка будет очень тяжело. Поэтому...

Автопоиск по первым буквам из выпадающего списка select

Реализуем удобный поиск по select, который будет подбирать значения в процессе ввода данных. выглядет например, так:

Для этого воспользуемся готовым плагином SELECT2. Просто подключаем приложенные скрипты и файлы стилей. Можно подключить их прямо в template.php, если используете данный способ только в кабинете пользователя

Скачать SELECT2

Для select задаем любой удобный id. Например id="my_sity". И указываем плагину, какой select он должен обработать. Целиком это будет выглять так (комментарии прямо в коде):


<select name="PERSONAL_CITY"  id="my_sity">
    <option value="<?= $arResult["arUser"]["PERSONAL_CITY"] ?>">
        <?= $arResult["arUser"]["PERSONAL_CITY"] ?>
    </option>
    <?
    $res = \Bitrix\Sale\Location\LocationTable::getList(array(
        'filter' => array('=TYPE.ID' => '5', '=NAME.LANGUAGE_ID' => LANGUAGE_ID),
        'select' => array('NAME_RU' => 'NAME.NAME')
    ));
    while ($item = $res->fetch()) {?>
        <option value="<? print_r($item['NAME_RU']); ?>">
            <? print_r($item['NAME_RU']); ?>
        </option>
     <?} ?>
</select>

<!-- ПОДКЛЮЧАЕМ ОФОРМЛЕНИЕ И JS ПЛАГИНА -->
<link href="/local/templates/.default/js/select/select2.min.css" type="text/css" rel="stylesheet"/>
<script src="/local/templates/.default/js/select/select2.full.min.js"></script>

<!-- УКАЗЫВАЕМ ID НУЖНОГО SELECT-а -->
<script>
$(document).ready(function () {
   $("#my_sity").select2();
});
</script>

Само собой, стили и скрипты плагина, лучше всего подключать через API Битрикс, для оптимизации работы. В примере оставил "по старинке", что бы не усложнять объяснение.

В общем-то и все. Использовать данный плагин можно с любым select-ом. Так же и получение местоположений, можете использовать в любом месте сайта, в любом компоненте или шаблоне.

Николай Сухих 25.07.2018
Очень полезная статья, спасибо. p.s. Забавный ID: my_sity :))
Николай Сухих 31.07.2018
Опечатка вот в этой строке: Лишняя ")"
Код
echo $item['NAME_RU']).'<br>'; 
Михаил Базаров 31.07.2018
Цитата
Николай Сухих пишет:
Опечатка вот в этой строке: Лишняя " ;) "
Код
 echo $item['NAME_RU']).'<br>'; 
 
Поправил  :D
Николай Сухих 03.08.2018
Может вы знаете, как в \Bitrix\Sale\Location\LocationTable::getList получить еще и название региона. К примеру если в filter массив добавить * то получим REGION_ID, но не REGION_NAME.
С D7 еще совсем не дружу, может на этом примере станет чуть понятнее..
Николай Сухих 03.08.2018
Цитата
Николай Сухих пишет:
Может вы знаете, как в \Bitrix\Sale\Location\LocationTable::getList получить еще и название региона. К примеру если в filter массив добавить * то получим REGION_ID, но не REGION_NAME.
С D7 еще совсем не дружу, может на этом примере станет чуть понятнее..
Видимо пятничный синдром. Если вместо
Код
 '=TYPE.ID' => '5'

указать
Код
'TYPE_CODE' => array("REGION", "CITY")

Получим в списке регионы и города и по REGION_ID ищем сущность(регион) в этом же списке с ID = REGION_ID и TYPE_CODE = REGION

Код
$arFilter = array(
    '=NAME.LANGUAGE_ID' => LANGUAGE_ID,
    // "COUNTRY", "VILLAGE",
    'TYPE_CODE' => array("REGION", "CITY"),
);

$arSelect = array(
    // '*',
    'ID' => 'ID',
    'REGION_ID' => 'REGION_ID',
    'NAME_RU' => 'NAME.NAME',
    'TYPE_CODE' => 'TYPE.CODE',
);
Николай Сухих 18.09.2018
А как указанный город передать в sale.order.ajax (Выбор региона)?
Михаил Базаров 18.09.2018
Цитата
Николай Сухих написал:
А как указанный город передать в sale.order.ajax (Выбор региона)?
Там это есть штатно, в старом и в новом шаблоне должен быть подключен компонент location

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Старые шаблоны битрикс для простой верстки Просмотров: 18217 Новые версии типового интернет-магазина, который идет в комплекте с Битрикс (от 12 версии ... Адаптивное гамбургер меню для битрикс Просмотров: 15172 Заметка коротенькая, но решил оставить ее - так как самому часто нужно нечто подобное. В а... Скопировать номер телефона из поля пользователя в телефон для регистр... Просмотров: 2841 Задача, на конкретном сайте: раньше все пользователи регистрировались по стандартному режи... Заполнить коэффициент единицы измерения (MEASURE_RATIO) из свойства э... Просмотров: 6498 Задачка: Каталог наполняется из 1С, но 1С не передает коэффициент единицы измерения (особе... Открытие мобильного приложения Apache Cordova по ссылке Просмотров: 1194 Достаточно часто нужно реализовывать открытие мобильного приложения по ссылке. Например: п... Вывод элементов с помощью API битрикс Просмотров: 24003 Иногда, выводить элементы инфоблока с помощью компонентов, может оказаться избыточным. Нап... Массово: применить наценку ко всем товарам каталога с пересчетом от б... Просмотров: 6401 Рассмотрим как, в магазине работающем на 1С-битрикс, массово применить наценку на все това... Свойство: привязка к Яндекс:Картам - вывести из нескольких элементов ... Просмотров: 18697 Предположим, что у вас есть инфоблок со свойством "Привязка к яндекс картам". В этом инфоб... Вывести дополнительное пользовательское поле, использование полей в ф... Просмотров: 16795 Если вам нужно вывести дополнительное пользовательское поле типа "Привязка к разделам инфо... Установка веб-сервера LAMP на ubuntu 20.04 LTS, оптимизированный под ... Просмотров: 12793 В последнее время, плотно пересел c macOS на ubuntu, и решил настроить себе полноценное ра... Изменить размер картинок на лету в битрикс Просмотров: 48894 Встала задачка: на собственном сайте, уменьшить размер превьюшек картинок у анонсов раздел... Вывести артикул в печатную форму бланка заказа Просмотров: 1114 Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе. ... Добавить свойство в административную форму заказа Просмотров: 3802 Задача, кастомизировать административную форму заказа: добавить свойство заказа в шапку фо... Автоматическая загрузка каталогов из csv файлов в Битрикс Просмотров: 11828 Если требуется настроить автоматический импорт каталогов из csv файлов, от поставщиков. В... Помечаем новинки лейблом в каталоге битрикс Просмотров: 20877 Достаточно часто, при разработке каталога товаров или интернет магазина на системе управле... Простой WEB сервер на ubuntu, для Битрикс Просмотров: 35965 Расскажу как по быстрому сконфигурировать WEB сервер для работы с Битрикс. Безо всяких ngi... Установка Битрикс24 "Интернет-Магазин + CRM" на один домен и настройк... Просмотров: 1709 Задача: установить лицензию "Интернет-Магазин + CRM" на один домен. Что бы crm была доступ... Denwer c PHP 7.1.8 и MYSQL 5.7 оптимизированный для Битрикс Просмотров: 30811 В последнее время, все чаще приходиться работать на Windows, хотя и не люблю эту ОС- с точ... Очистка корзины в 1С-Битрикс одним нажатием Просмотров: 29636 В стандартной корзине Битрикс не хватает кнопки для полной очистки корзины одним нажатием... Вывести товары из того же раздела в карточке товара Просмотров: 18895 Немножко топорный, но все же вполне действенный способ по выводу внутри подробной карточки...