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

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

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

Если нужно получить список городов из модуля "Местоположения" можно воспользоваться 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-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Свойство: привязка к Яндекс:Картам - вывести из нескольких элементов ... Просмотров: 18668 Предположим, что у вас есть инфоблок со свойством "Привязка к яндекс картам". В этом инфоб... Вывести свойство отдельно ото всех или исключить из всех Просмотров: 7665 Иногда, на сайте, под управлением 1С-Битрикс, нужно вывести какое-то конкретное свойство о... Вывести компонент новостей на страницу в Битрикс Просмотров: 65107 Посмотрел Яндекс метрику на свой сайт, и решил что буду частенько писать сюда именно то, ч... Определить местоположение пользователя и показать на карте Просмотров: 3957 Задача определить местоположение текущего пользователя и показать его на карте, с меткой. ... Показ страницы сайта в боковом слайдере, на примере всплывающей формы... Просмотров: 3204 Если вы хотите сделать подгрузку любой страницы сайта в боковой слайдер, для этого в битри... Ссылка и название раздела в списке новостей Битрикс Просмотров: 11467 Если нужно вывести название раздела инфоблока в котором находится конкретный элемент/новос... Модифицировать состав заказа #ORDER_LIST# в почтовом событии "Новый з... Просмотров: 30308 Если вы хотите как-то по особенному сверстать состав заказа в почтовом уведомлении 1С-Битр... Моментальная фильтрация на AJAX в умном фильтре 1С-Битрикс Просмотров: 26773 При штатной установке, интернет-магазина на 1С Битрикс, умный фильтр по товарам, показывае... Вывести разделы инфоблока по первым буквам не меняя структуру каталог... Просмотров: 2503 Например: у нас есть инфоблок с большим количеством разделов. И мы хотим, на сайте разбить... Многосайтовость битрикс на разных доменах и поддоменах Просмотров: 63137 Часто спрашивают "как настроить многосайтовость Битрикс на разных доменах", решил записать... Cordova, ввод в input под диктовку. Голосовой поиск в мобильном прило... Просмотров: 1608 Итак, задачка: реализовать голосовой поиск в мобильном приложении на Cordova. По сути, нам... Цвета торговых предложений из Highload инфоблоков в списке товаров Просмотров: 14905 Подвернулся на доработку очень старый сайт, работал еще на 11-ой версии Битрикс. Выполнили... Если пользователь авторизован то... API Битрикс Просмотров: 23720 Достаточно часто, при создании сайта на битрикс нужно вывести в шаблон или компонент, неку... Удалить товары из корзины, если есть определенные товары. Просмотров: 1915 Задача: если в корзину добавлены товары с определенным свойством, нужно удалить из корзины... Создание блога с комментариями, оценками и просмотрами на сайте с 1С-... Просмотров: 24530 Если на вашем сайте требуется создание раздела с блогом или новостями, статьями. Записям в... Очистить брошенные корзины с помощью API 1С-Битрикс Просмотров: 1121 Задача: в интернет-магазине накапливается большое количество брошенных корзин, нужно их оч... Ленивая подгрузка картинок в компоненте, на vue js Битрикс Просмотров: 10349 Если на одну страницу сайта выводится большое количество картинок, которые могут долго под... Добавление в избранное или отложенные, на AJAX из карточки товара Просмотров: 29183 В этой заметке рассакажу как добавлять товары в "Отложенные", для иммитации функционала "И... Вывести все товары, с постраничной навигацией, из всех разделов инфоб... Просмотров: 29884 По сути, эта заметка, небольшой лайфхак. Достаточно часто нужно, в корне каталога, в ТОП-е... FTP доступ на Виртуальной машине Битрикс Просмотров: 17248 Бывает что нужно открыть FTP доступ к заранее известной папке на сайте под управлением 1С ...