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

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

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

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

Установка Битрикс24 "Интернет-Магазин + CRM" на один домен и настройк... Просмотров: 872 Задача: установить лицензию "Интернет-Магазин + CRM" на один домен. Что бы crm была доступ... Многосайтовость битрикс на разных доменах и поддоменах Просмотров: 61196 Часто спрашивают "как настроить многосайтовость Битрикс на разных доменах", решил записать... Картинка торгового предложения вместо иконки цвета, в выборе SKU Просмотров: 252 Задача: вместо не информативных иконок цветов нужно вывести детальную картинку торгового п... Объединить отдельные поля ФИО в одно свойство при оформлении заказа. Просмотров: 855 Пользователь, при оформлении заказа, заполняет три отдельных поля с фамилией, именем и отч... Пункты меню из разделов инфоблока Битрикс Просмотров: 90592 В принципе это стандартная возможность системы управления битрикс, но почему-то часто спра... Изменить размер картинок на лету в битрикс Просмотров: 46733 Встала задачка: на собственном сайте, уменьшить размер превьюшек картинок у анонсов раздел... Создать pdf файл из элемента инфоблока, дать скачать пользователю, по... Просмотров: 3901 Задача: при каждом посещении статьи, на сайте, нужно создавать pdf файл с ее содержимым и ... Создание раздела инфоблока при регистрации пользователя в Битрикс Просмотров: 7873 Например вам нужно выводить информацию исключительно для определенного пользователя. Само ... Удалить товары из корзины, если есть определенные товары. Просмотров: 861 Задача: если в корзину добавлены товары с определенным свойством, нужно удалить из корзины... Установка вебсервера на Apple M1 (нативный ARM стек), оптимизированны... Просмотров: 6114 Появилась задачка, установить стек MAMP (macOS, Apache, MYSQL, PHP) на рабочий ноутбук с п... Сравнение двух типов цен для иммитации системы скидок, в Битрикс Просмотров: 5839 Встала задачка, иммититровать систему скидок в интернет магазине на Битрикс. Из 1С-УТ, на ... Вывести минимальную цену торговых предложений в Битрикс Просмотров: 26824 Если у товара несколько торговых предложений и у каждого предложения разные цены, иногда т... Снять ограничение на количество символов в комментарии к заказу магаз... Просмотров: 11506 Как многим известно, в интернет-магазине на Битрикс имеется ограничение на количество симв... Добавление своих полей в почтовые шаблоны Битрикс Просмотров: 43562 Иногда нужно внести свои поля в почтовые шаблоны битрикс. Например: добавить имя и номе... Вывести свойство привязка к Яндекс Картам в Битрикс Просмотров: 18143 Часто бывает нужно вывести свойство привязка к Яндекс карте в детальном описании элемента... Вывести дополнительное пользовательское поле, использование полей в ф... Просмотров: 15436 Если вам нужно вывести дополнительное пользовательское поле типа "Привязка к разделам инфо... XML в формате Commerce ML-2, города России и Мира, для выгрузки в инф... Просмотров: 6285 Подвернулась задачка, создать инфоблок для Битрикс, в котором будут просто города России и... Использование WebP изображений в 1С-Битрикс (на Битрикс: Веб окружени... Просмотров: 25830 WebP это современный формат сжатия изображений, который позволяет, при правильных настройк... Простые калькуляторы в карточке товара каталога на Битрикс Просмотров: 15368 На одном из создаваемых сайтов было необходимо сделать небольшой калькулятор и предварител... Создание PWA для сайта на 1С-Битрикс Просмотров: 2052 Технология PWA позволяет создать приложение для любого сайта. Не обязательно работающего ...