Выводим подсказки для полей адреса на сайте Bitrix

Содержимое:

В новой записи я вам покажу свое решение для вывода подсказок для полей местоположения. В записи представлен код для любого типа полей (название города, название области, название страны).

Данные мы будем брать через API модуля Location.

При изменение поля будет отправляться Ajax запрос на файл со скриптом, и данный скрипт будет возвращать названия по части слова.

Дополнительно к этому, я добавил условие сортировки, при котором определенные города будут выше остальных.

HTML

Вёрстка состоит из обёртки для текстового поля fieldBlock, самого поля и блока куда будут выводиться варианты заполнения windowFieldValue.

<div class="fieldBlock">
    <input type="text" name="" id="state">
    <div class="windowFieldValue"></div>
</div>

CSS

.fieldBlock {
    display: flex;
    flex-direction: column;
    width: 300px;
}

.windowFieldValue ul.listFieldValue {
    padding: 0;
    margin: 0;
}
.windowFieldValue .listFieldValue li.itemFieldValue {
    font-size: 14px;
    list-style: none;
    line-height: 1;
    padding: 5px;
    border-bottom: 1px solid #eee;
    cursor: pointer;
}
.windowFieldValue .listFieldValue li.itemFieldValue:hover {
    background: #eee;
}

JavaScript

Для реализации своего решения я использую несколько функций

queryDataGeo — для отправки ajax запроса

createListGeoData — для формирования списка вариантов заполнения

/* ФУНКЦИЯ ДЛЯ ОТПРАВКИ AJAX ЗАПРОСА */
function queryDataGeo() {
    let value = $(this).val()

    if(value) {
	$.ajax({
		url: "/local/templates/bintaga/ajax/basketValueField.php",
		method: 'post',
		dataType: 'html',
		data: {valueField: value},
		success: function(data){
		    var listData = jQuery.parseJSON(data);
		    createListGeoData("state", listData) 
		}
	});
    }
	
}

/* ФУНКЦИЯ ДЛЯ СОЗДАНИЯ СПИСКА ВАРИАНТОВ ПОД ПОЛЕМ */
function createListGeoData(idField, arrListGeo) {
    $("#".idField).siblings(".windowFieldValue").remove()

    let codeDataGeo = '<ul class="listFieldValue">'
    for(let item in arrListGeo) {
	codeDataGeo += `<li onclick="$(this).parents('.fieldBlock').find('input').val($(this).text())" class="itemFieldValue">`+ arrListGeo[item] +`</li>`
    }
    codeDataGeo += "</ul>"

    $(".windowFieldValue").html(codeDataGeo)
}

/* при выборе варианта закрываем окно */
$(".windowFieldValue").on("click", function() {
    $(this).html()
})

/* при вводе в текста в поле, сразу отправляем ajax запрос */
$("input[type='text']").on("input", queryDataGeo)

PHP

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

\Bitrix\Main\Loader::includeModule('sale');

/* список городов которые имеют приоритет */
$listMainState = [
    "Москва",
    "Санкт-Петербург",
    "Нижний Новгород",
    "Белгород",
    "Брянск",
    "Воронеж",
    "Иваново",
    "Краснодар",
    "Курск",
    "Липецк",
    "Орел",
    "Рязань",
    "Сочи",
    "Тула",
    "Ярославль",
];


$res = \Bitrix\Sale\Location\LocationTable::getList(array(
    'filter' => array(
	'=TYPE.ID' => '5', 
	'=NAME.LANGUAGE_ID' => LANGUAGE_ID, 
	'NAME_RU' => $_POST["valueField"] . '%'
    ),
    'select' => array(
	'NAME_RU' => 'NAME.NAME'
    )
));

$listData = array();
while($item = $res->fetch()) {
	
    if(in_array($item['NAME_RU'], $listMainState)) {
	array_unshift($listData, $item['NAME_RU']);
    }
    else {
	array_push($listData, $item['NAME_RU']);
    }
	
}

$listData = array_slice($listData, 0, 10);
echo json_encode($listData);


?>
На этом всё!
Больше интересных статей в нашей группе - https://vk.com/progtime
Вы так же можете разместить свой вопрос на нашем форуме, где другие программисты смогут вам помочь в решение вашей задачи - https://vk.com/prog_time
Так же прокачивайте свои навыки на нашем канале - https://www.youtube.com/c/ProgTime