Разработка
17
Сен
0

Поиск адреса с помощью Google Places

У Google’а имеется сервис под названием Google Places, с помощью которого можно бесплатно искать адреса. Попробуем задействовать его для автоматического поиска и заполнения стандартных полей адреса на карточках CRM:

  • Создайте JS Веб-ресурс из GoogleJsapi.js;
  • Создайте второй JS Веб-ресурс с именем GoogleAddressAutocomplete.js и таким содержимым:
    Что тут происходит:

    function PopulateAddresses() {
        // Ждем пока загрузится библиотека google
        if (google == null) {
            google.load("maps", "3", { other_params: "libraries=places&sensor=false", "callback": PopulateAddresses });
            setTimeout(PopulateAddresses, 2000);
            return;
        }
    
        // Ждем пока загрузится библиотека google.maps
        if (google != null && google.maps == null) {
            google.load("maps", "3", { other_params: "libraries=places&sensor=false", "callback": PopulateAddresses });
            setTimeout(PopulateAddresses, 2000);
            return;
        }
    
        // Ждем пока загрузится google.maps.place
        if (google.maps.places == null) {
            setTimeout(PopulateAddresses, 2000);
            return;
        }
    
        // Получаем контрол ввода для Google Places
        var autocomplete;
        var control = Xrm.Page.getAttribute('address1_composite').controls.get(0);
        if (control != null) {
            control.setFocus();
            // var input = $("#" + attributeName + "_i")
            var input = $("#address1_composite_compositionLinkControl_address1_line1_i");
    
            /* Sometimes google places list is not showing thats why need to add this style */
            var pacContainerInitialized = false;
            input.keypress(function () {
                if (!pacContainerInitialized) {
                    $('.pac-container').css('z-index', '9999');
                    pacContainerInitialized = true;
                }
            });
    
            // Добавляем в поле ввода функцию autocomplete
            autocomplete = new google.maps.places.Autocomplete(document.getElementById('address1_composite_compositionLinkControl_address1_line1_i'));
        }
    
        // Добавляем обработчик для события выбора адреса
        google.maps.event.addListener(autocomplete, 'place_changed', function () {
    
            // Получаем детали адреса
            var place = autocomplete.getPlace();
            if (!place.geometry)
                return;
    
            // Просматриваем компоненты адреса и заполняем соответствующие поля CRM
            var houseNumber, StreetName, city, state, Zip, Country;
            for (i = 0; i < place.address_components.length; i++) {
                var type = place.address_components[i].types[0];
                if (type == 'street_number')
                    houseNumber = place.address_components[i].long_name + "";
                if (type == 'route')
                    StreetName = place.address_components[i].long_name;
                if (type == 'locality' || type == 'administrative_area_level_3')
                    city = place.address_components[i].long_name;
                if (type == 'postal_code')
                    Zip = place.address_components[i].long_name;
                if (type == 'administrative_area_level_1')
                    state = place.address_components[i].short_name;
                if (type == 'country')
                    Country = place.address_components[i].long_name;
            }
    
            Xrm.Page.getAttribute('address1_line1').setValue(houseNumber);
            Xrm.Page.getAttribute('address1_line2').setValue(StreetName);
            Xrm.Page.getAttribute('address1_city').setValue(city);
            Xrm.Page.getAttribute('address1_postalcode').setValue(Zip);
            Xrm.Page.getAttribute('address1_stateorprovince').setValue(state);
            Xrm.Page.getAttribute('address1_country').setValue(Country);
        });
    }
    
    • Сначала дожидаемся пока загрузятся все нужные библиотеки;
    • Формируем контрол Google Places и добавляем его к нужно полю. Заметьте, что для работы функции Autocomplete требуется элемент HTMLInput. Поэтому мы передаем ей «хардкорный» address1_composite_compositionLinkControl_address1_line1_i, который соответствует первой строке адреса в композитном контроле CRM;
    • Добавляем обработчик выбора адреса, в котором парсим выбранный адрес и подставляем его отдельные части в различные поля карточки CRM.
  • Добавьте оба Веб-ресурса к форме CRM (Организации/Контакта/Интерес);
  • Добавьте на онлоад вызов функции PopulateAddresses.

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


Комментарии (0)

*

code