Перейти к содержанию
  • В связи с блокировкой банка QIWI оплата через сайт не возможна.
    Для оплаты и получения дополнений просьба писать в личные сообщения
    Admin*у
    После оплаты Вам так же будет доступно скачивание дополнений и обновлений на данном форуме

Модуль подсказок Dadata, автозаполнение полей Ф.И.О, Адреса, данные по ИНН


admin

Рекомендуемые сообщения

Модуль подсказок Dadata, автозаполнение полей Ф.И.О, Адреса, данные по ИНН


Модуль интеграции сервиса dadata.ru в магазин OpenCart, ocStore.

 

Сервис

  • Выводит подсказки по району, городу, индексу, улице, метро, адресу, геолокации, ИНН.
  • Возвращает всю информацию по организации, ИП или банку.
  • Проверяет и разбирает ФИО из строки. Проверяет паспорт по справочнику МВД.
  • Проверяет телефон по Россвязи, определяет оператора, отсеивает одноразовые емейлы.
  • Находит похожих и одинаковых клиентов, адреса, телефоны или торговые точки.
  • Находит пересечение разных аудиторий для маркетологов.
  • Помогают человеку быстро ввести корректные данные.

 

  • Информация о клиентах и контрагентах.
  • Для продаж, маркетинга, логистики, дистрибуции, скоринга и аналитики.
  • помогает избежать ошибочного ввода, что значительно облегчит обработку заказов, интеграцию модулей доставок и т.д.

 

Обратите внимание: данное решение лишь помогает интегрировать сервис в ваш магазин!

используется suggestions.js 
все настройки для него можно взять из документации, здесь-же свойства и методы и примеры.

 

здесь можно почитать о сервисе dadata.ru

здесь вы найдёте как подключить подсказки по адресу.

здесь как разложить адрес по полям.

адреса внутри конкретного города.

здесь много-много других примеров.

 

Наши примеры настроек: 

можно найти в FAQ к модулю.

 

Настройки довольно многообразны,

а что-бы уменьшить конфликты и во избежание нагромождения кода часто нужно настраивать индивидуально.

Установка модуля интеграции:

стандартными средствами установки OpenCart.

 

Настройка модуля интеграции:

1) зарегистрироваться на https://dadata.ru/#registration_popup для получения ключа api,

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

2) вывести модуль в необходимой схеме/схемах

3) включаем модуль,

4) ввести в поле "ДОБАВИТЬ ROUTE" роут нужной схемы: например для оформления заказа checkout/checkout, или для simple checkout/simplecheckout

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

можно открыть её кликнув по названию, включаем текущие настройки,

5) если используете simple или подобные модули, которые обновляют данные без перезагрузки страницы, в simple в поле свой javascript можно добавить вызов связанных настроек, например if('checkout_simplecheckout' in window) checkout_simplecheckout();

иначе можно вызвать вписав в поле "ВЫЗОВ JAVASCRIPT" например так.

Сохраняем! Всё!

 

Так-же стоит обратить внимание, на то что:

- Стандартизация работает только с адресами России. Других стран пока нет. 

- Подсказки работают со всеми странами мира. По России и Беларуси с точностью до дома, по остальным странам — до города.

- Если вы не приобретали модуль, а лишь настраиваете за того кто приобретал модуль и обращаетесь за поддержкой в лс. Просьба указывать домен, и факт покупки модуля.

- предыдущие версии модуля более не поддерживаются, Opencart 1.5 больше не поддерживается.

- распространяется as is.


  • Добавил
  • Добавлено
    29.03.2022
  • Категория

 

Ссылка на комментарий

Передача города в Shiptor, для вывода доставок

Если у вас стоит модуль доставки Shiptor, добавьте этот код в метод callback модуля dadata opencart

callback: [function(self, data) {
      let kladr_id_v = data(['kladr_id']);
      if(kladr_id_v) {
        $.post("index.php?route=extension/shipping/shiptor/save", {
        	kladr_id: kladr_id_v
      	});
      }
    }, reloadAll],

Данный код тестировался на версии Opencart 2.3

Ссылка на комментарий

Настройка версия dadata-opencart.ocmod.xml

K69Hlw9.png

1) checkout/simplecheckout

2) как добавили, кликаем на добавленный route откроется форма для вставки настроек js для сервиса дадаты.

3) настраиваем js

 - полный пример с конфигурациями доступен на сайте дадаты

Цитата

Пример конфигурации для гранулярных подсказок

Спойлер


// Ваш api ключ из лк дадаты https://dadata.ru/#registration_popup
var token = "";
// Для блока адресс
function checkAddress($city, $address, $postcode, $region) {
    // Если инпут города нету выходим
    if (!$city.length) return;
    var type = 'ADDRESS';
    $city.suggestions({
        token: token,
        type: type,
        bounds: "city-settlement",
        geoLocation: false,
        onSelect: enforceCity,
        onSelectNothing: enforceCity,
        formatSelected: formatCitySelected
    });

    $address.suggestions({
        token: token,
        type: type,
        onSelect: restrictAddressValue,
        formatSelected: formatSelected
    });

    // Если на поле адрес есть перезагрузка поля
    var p = $postcode.val() || "";
    var a = $address.val() || "";
      
    $city.on("suggestions-fixdata",
      function(e, suggestion) {
        //console.log(suggestion);
        $address.val(a);
      	$postcode.val(p)
      }
    );

    $city.suggestions().fixData();

    function setConstraints(sgt, kladr_id) {
        var restrict_value = false;
        var locations = null;
        if (kladr_id) {
            locations = {
                kladr_id: kladr_id
            };
            restrict_value = true;
        }
        sgt.setOptions({
            constraints: {
                locations: locations
            },
            restrict_value: restrict_value
        });
    }

    function enforceCity(suggestion) {
        var sgt = $address.suggestions();
        sgt.clear();
        if (suggestion) {
            setConstraints(sgt, suggestion.data.kladr_id);
            formatRegion(suggestion.data);
        } else {
            setConstraints(sgt, null);
        }
    }

    function formatCitySelected(suggestion) {
        var address = suggestion.data;
        if (address.city_with_type === address.region_with_type) {
            return address.settlement || address.city || "";
        } else {
            return join([
                address.city,
                address.settlement
            ]);
        }
    }

    function formatRegion(address) {
        $postcode.val(address.postal_code || '');
        if ($region.length) {
            var result = address.region.replace(/\s{0,1}[-\/].+/gi, '').toLowerCase();
            $region.find('option').each(function (i, o) {
                if ($(o).text().toLowerCase().search(result) >= 0) $(this).attr('selected', true);
                else $(this).attr('selected', false);
            });
        }
    }

    function restrictAddressValue(suggestion) {
        var citySgt = $city.suggestions();
        var addressSgt = $address.suggestions();
        if (!citySgt.currentValue) {
            citySgt.setSuggestion(suggestion);
            var city_kladr_id = suggestion.data.kladr_id.substr(0, 13);
            setConstraints(addressSgt, city_kladr_id);
        }
    }

    function formatSelected(suggestion) {
        var addressValue = makeAddressString(suggestion.data);
        return addressValue;
    }

    function makeAddressString(address) {
        formatRegion(address);

        return join([
            address.street_with_type,
            join([address.house_type, address.house,
                address.block_type, address.block
            ], " "),
            join([address.flat_type, address.flat], " ")
        ]);
    }

    function join(arr /*, separator */ ) {
        var separator = arguments.length > 1 ? arguments[1] : ", ";
        return arr.filter(function (n) {
            return n
        }).join(separator);
    }
}
// Для блока адресс берем в переменные нужные инпуты
var $city = $('#shipping_address_city');
var $address = $('#shipping_address_address_1');
var $postcode = $('#shipping_address_postcode');
var $zoneId = $('#shipping_address_zone_id');
// Для блока адресс вызов
checkAddress($city, $address, $postcode, $zoneId);

// Для блока имени, фамилия
function initName($surname, $name) {
    // Если инпута фамилия или имя нету, выходим
    if (!$surname.length || !$name.length) return;
    var self = {};
    self.$surname = $surname;
    self.$name = $name;
    var fioParts = ["SURNAME", "NAME"];
    $.each([$surname, $name], function (index, $el) {
        var sgt = $el.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: [fioParts[index]]
            }
        });
    });
};
// Для блока имени, фамилия вызов
var $surname = $("#shipping_address_lastname");
var $name = $("#shipping_address_firstname");

initName($surname, $name);

// Для блока email с проверкой есть ли данный инпут
var $email = $("#customer_email");
if ($email.length) {
    $email.suggestions({
        token: token,
        type: "EMAIL",
    });
}

Измените селекторы '#input......' на свои.

Обратите внимание что данный конфиг использует поля на странице 

город, адрес, регион, индекс

имя, фамилию, емаил

 

4) после вставки кода ниже есть кнопка сохранить.

5) не забудьте справа от формы включить модуль.

6) свеху над черной формой, будет желтый блок, там надо взять текущий route и добавить на текущею checkout схему. Так же там добавить модуль в позицию вверх

7) после в желтой подсказке, будет код типа 

if('checkout_simplecheckout' in window) ....;

копируете этот код и вставляете в модуль simple в раздел javascript

с этого момента, симпла при инициализации на странице, дергает код модуля дадаты.

Ссылка на комментарий

Feature 'SUGGESTIONS' disabled for token

 

  1. После регистрации на сайте dadata, обязательно подтвердите почту указанную Вами при регистрации.
  2. Так же не надо делать привязку к домену в личном кабинете Dadata (Так как модуль шлет запрос средствами php), ваш api ключ никто не видит кроме Вас и не виден из браузера никоим образом.
  3. В модуле в поле API-ключ, надо вставлять API-ключ, а не Секретный ключ для стандартизации

Так же ссылка на страницу ошибки полученная в ответе от dadata - https://dadata.userecho.com/topics/1834

Ссылка на комментарий

Как записывать ключи из ответа.

 

Как записать ключи в модуле подсказок Дадаты Опенкарт

'|' = пробел
', ' = запятая и пробел
' ' = пробел
'.' = точка
'. ' = точка и пробел
':' = двоеточие
'-' = склеивает две строки

Возьмем пример

street_with_type, house_type.house, block_type-block, flat_type.flat

Данная строка преобразуется в такую

Улица с типом, Тип дома (сокращенный).Дом, Тип корпуса/строения (сокращенный)Корпус/строение, Тип квартиры (сокращенный).Квартира

 

Ссылка на комментарий

Поиск адреса по главному инпуту

Обратите внимание для адреса есть - Основной инпут. Это главный инпут с которого можно осуществить ввод и по нему произойдет автозаполнение полей адреса. ОН опционален. Но я бы рекомендовал его применять.

GDRYud1.png

и три метода

U1L3rH0.png

В который передается store - объект в котором есть все найденные поля в массиве, и сам данный инпут, а также helper. Который можно модифицировать, перезаписав любое значение или добавив некий прокси, для методов объекта.

Данный код вызывается перед инициализацией данного инпута.

Далее 

PIuKDS9.png

В данном примере вставлен метод из корзины Simple. onSelected - вызывается когда пользователь выбрал подсказку из выпадающего списка, после всех манипуляций над дочерними элементами. Удобно как на данном примере вызвать обновление корзины Simple.

В него передается Объект возвращенных подсказок, функция помощи поиска в этом объекте и сам главный инпут. Ниже кусок данного кода

let result = setting.onSelected(data[index], helper.find, requestInput);
if(result) {
  requestInput.value = result;
}

Как мы видим, вы можете вернуть строку которая будет записана в данный инпут.

Далее

zSq97Q5.png

 

Нужен для того что бы сгенерировать основной инпут. В данном примере уже создана преднастройка. Котороую можно переопределить под свой шаблон.

На примере

{
    // Родительский эелемент
  	tag: 'div',
    // Его пропсы
  	props: {className: 'form-group'},
    //Сам шаблон инпута, строкой. Обратите внимание что <div class="suggestions-wrap"><ul class="js_suggestions"></ul></div> лучше не изменять. так как в них записываются подсказки.
	child: '<label class="col-sm-4 control-label" for="input-address-1">Поиск адреса и автозаполнение</label><div class="col-sm-8"><input type="text" class="form-control suggestions-input" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"><div class="suggestions-wrap"><ul class="js_suggestions"></ul></div></div>' 
 
}

 

Ссылка на комментарий

Разложить подсказки по одному полю

var $region = $('#shipping_address_zone_id');
var $city = $('#shipping_address_city');
var $address = $("#shipping_address_address_1");
var $postal_code = $('#shipping_address_postcode');

var block_suggestion = '';
block_suggestion += '<div class="form-group">';
block_suggestion += '  <label for="suggestion_address"><strong>Поиск адреса и автозаполнение</strong></label>';
block_suggestion += '   <input id="suggestion_address" class="form-control" type="text" placeholder="Поиск адреса и автозаполнение">';
block_suggestion += '</div>';

function showRegion(address) {
    var findRegionValue = address.region.replace(/\s{0,1}[-\/].+/gi, '').toLowerCase();
    if ($region.length) {
        $region.find('option').each(function (i, o) {
            if ($(o).text().toLowerCase().search(findRegionValue) >= 0) $(this).attr('selected', true);
            else $(this).attr('selected', false);
        });
    }
}

function showCity(address) {
    if($city.length) {
        $city.val(join([address.city, address.settlement]));
    }
}

function showStreet(address) {
    if($address.length) {
        var addressValue = [
            join([address.street_type, address.street, ], " "), 
            join([address.house_type, address.house], " "),
            join([address.block_type, address.block], " "),
            join([address.flat_type, address.flat], " ")
        ];

        $address.val(join(addressValue),);
    }
}

function showPostalCode(address) {
    if($postal_code.length) {
        $postal_code.val(address.postal_code);
    }
}

function showSelected(suggestion) {
    var address = suggestion.data;
    showPostalCode(address);
    showRegion(address);
    showCity(address);
    showStreet(address);
    setTimeout(function() {
        reloadAll();
    }, 700);
}

function join(arr /*, separator */ ) {
    var separator = arguments.length > 1 ? arguments[1] : ", ";
    return arr.filter(function (n) {
        return n
    }).join(separator);
}

$('#simplecheckout_customer').after($(block_suggestion));

$("#suggestion_address").val(
    join([$city.val(), $address.val(), ], " "),
);

$("#suggestion_address").suggestions({
    token: 'Ваш токен',
    type: "ADDRESS",
    onSelect: showSelected
});

Если у вас отличаются id полей, замените на свои

Это то что указано выше, пример:

var $region = $('#shipping_address_zone_id');
var $city = $('#shipping_address_city');
var $address = $("#shipping_address_address_1");
var $postal_code = $('#shipping_address_postcode');

 

Ссылка на комментарий

Полный адрес в одном поле. Результат - почтовый индекс, регион, город, улица и дом автоматически разложить по скрытым полям.

// Ваш api ключ из лк дадаты https://dadata.ru/#registration_popup
var token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

function join(arr /*, separator */) {
  var separator = arguments.length > 1 ? arguments[1] : ", ";
  return arr.filter(function(n){return n}).join(separator);
}

function showPostalCode(address) {
  $("#shipping_address_postcode").val(address.postal_code);
}

function showRegion(address) {
  $region = $("#shipping_address_zone_id");
  
  if ($region.length 
      && typeof(address.region) !== 'undefined' 
     	&& address.region) {
    		var result = address.region.replace(/\s{0,1}[-\/].+/gi, '').toLowerCase();
    		$region.find('option').each(function (i, o) {
          if ($(o)
              .text()
              .toLowerCase()
              .search(result) >= 0
             )
            $(this).attr('selected', true);
        	else
            $(this).attr('selected', false);
        });
  };
}

function showCity(address) {
  $("#shipping_address_city").val(join([
    join([address.city_type, address.city], " "),
    join([address.settlement_type, address.settlement], " ")
  ]));
}

function showAddress(address) {
  insert = '';

  if (typeof(address.settlement) !== 'undefined'
     	&& address.settlement)
    insert += join([address.settlement_type, address.settlement], " ")
  
  insert += join([
    join([address.street_type, address.street], " "),
    join([address.house_type, address.house], " ")
  ])
  
  if (parseInt(address.block) > 0)
    insert += join([address.block_type, address.block], " ");
  
  if (parseInt(address.flat) > 0)
    insert += join([address.flat_type, address.flat], " ");
  
  $("#shipping_address_address_1").val(insert);
}

// function showStreet(address) {
//   $("#shipping_address_street").val(
//     join([address.street_type, address.street], " ")
//   );
// }

// function showHouse(address) {
//   $("#house").val(join([
//     join([address.house_type, address.house], " "),
//     join([address.block_type, address.block], " ")
//   ]));
// }

// function showFlat(address) {
//   $("#flat").val(
//     join([address.flat_type, address.flat], " ")
//   );
// }
  
var cityChanged = 0;
function inputChanged(a,b,c) {
  cityChanged = 1
}

function showSelected(suggestion) {
  var address = suggestion.data;
  showPostalCode(address);
  showRegion(address);
  showCity(address);
  showAddress(address);
  // showStreet(address);
  // showHouse(address);
  // showFlat(address);
  
  if (cityChanged) 
    reloadAll()
}

$("#shipping_address_address_2").suggestions({
  token: token,
  type: "ADDRESS",
  onSelect: showSelected,
  beforeRender: inputChanged
});

 

Ссылка на комментарий

если не знаете какие настройки выбрать (simple).

// Ваш api ключ из лк дадаты https://dadata.ru/#registration_popup
var token = "";
// Для блока адресс
function checkAddress($city, $address, $postcode, $region) {
    // Если инпут города нету выходим
    if (!$city.length) return;
    var type = 'ADDRESS';
    $city.suggestions({
        token: token,
        type: type,
        bounds: "city-settlement",
        geoLocation: false,
        onSelect: enforceCity,
        onSelectNothing: enforceCity,
        formatSelected: formatCitySelected,
      	beforeRender: inputChanged
    });

    $address.suggestions({
        token: token,
        type: type,
        onSelect: restrictAddressValue,
        formatSelected: formatSelected,
      	beforeRender: inputChanged
    });

    // Если на поле адрес есть перезагрузка поля
    var p = $postcode.val() || "";
    var a = $address.val() || "";

    var cityChanged = 0;
    console.log(0)
    function inputChanged() {
    	cityChanged = 1
    	console.log(1)
    }
      
    $city.on("suggestions-fixdata",
      function(e, suggestion) {
        //console.log(suggestion);
        $address.val(a);
      	$postcode.val(p)
      }
    );

    $city.suggestions().fixData();

    function setConstraints(sgt, kladr_id) {
        var restrict_value = false;
        var locations = null;
        if (kladr_id) {
            locations = {
                kladr_id: kladr_id
            };
            restrict_value = true;
        }
        sgt.setOptions({
            constraints: {
                locations: locations
            },
            restrict_value: restrict_value
        });
    }

    function enforceCity(suggestion, changed) {
      console.log('changed ' + changed);

      if (changed) 
        $(this)
          .val(
          $(this)
            .val()
            .trim()
        );

        var sgt = $address.suggestions();
        sgt.clear();
        if (suggestion) {
            setConstraints(sgt, suggestion.data.kladr_id);
            formatRegion(suggestion.data);
        } else {
            setConstraints(sgt, null);
        }

      	if (cityChanged) 
          reloadAll()
    }

    function formatCitySelected(suggestion) {
        var address = suggestion.data;
        if (address.city_with_type === address.region_with_type) {
            return address.settlement || address.city || "";
        } else {
            return join([
                address.city,
                address.settlement
            ]);
        }
    }

    function formatRegion(address) {
        $postcode.val(address.postal_code || '');
        if ($region.length) {
            var result = address.region.replace(/\s{0,1}[-\/].+/gi, '').toLowerCase();
            $region.find('option').each(function (i, o) {
                if ($(o).text().toLowerCase().search(result) >= 0) $(this).attr('selected', true);
                else $(this).attr('selected', false);
            });
        }
    }

    function restrictAddressValue(suggestion) {
      	console.log('restrict address value');

      	var citySgt = $city.suggestions();
        var addressSgt = $address.suggestions();
        if (!citySgt.currentValue) {
            citySgt.setSuggestion(suggestion);
            var city_kladr_id = suggestion.data.kladr_id.substr(0, 13);
            setConstraints(addressSgt, city_kladr_id);
        }

      	if (cityChanged) 
          reloadAll()
    }

    function formatSelected(suggestion) {
        var addressValue = makeAddressString(suggestion.data);
        return addressValue;
    }

    function makeAddressString(address) {
        formatRegion(address);

        return join([
            address.street_with_type,
            join([address.house_type, address.house,
                address.block_type, address.block
            ], " "),
            join([address.flat_type, address.flat], " ")
        ]);
    }

    function join(arr /*, separator */ ) {
        var separator = arguments.length > 1 ? arguments[1] : ", ";
        return arr.filter(function (n) {
            return n
        }).join(separator);
    }
}
// Для блока адресс берем в переменные нужные инпуты
var $city = $('input[name*="city"]');
var $address = $('input[name*="address_1"]');
var $postcode = $('input[name*="postcode"]');
var $zoneId = $('select[name*="zone_id"]');
// Для блока адресс вызов
checkAddress($city, $address, $postcode, $zoneId);

// Для блока имени, фамилия
function initName($surname, $name) {
    // Если инпута фамилия или имя нету, выходим
    if (!$surname.length || !$name.length) return;
    var self = {};
    self.$surname = $surname;
    self.$name = $name;
    var fioParts = ["SURNAME", "NAME"];
    $.each([$surname, $name], function (index, $el) {
        var sgt = $el.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: [fioParts[index]]
            }
        });
    });
};
// Для блока имени, фамилия вызов
var $surname = $('input[name*="lastname"]');
var $name = $('input[name*="firstname"]');

initName($surname, $name);

// Для блока email с проверкой есть ли данный инпут
var $email = $('input[name*="e-mail"]');
if ($email.length) {
    $email.suggestions({
        token: token,
        type: "EMAIL",
    });
}

 

Ссылка на комментарий

если не знаете какие настройки выбрать

// Ваш api ключ из лк дадаты https://dadata.ru/#registration_popup
var token = "";
// Для блока адресс
function checkAddress($city, $address, $postcode, $region) {
    // Если инпут города нету выходим
    if (!$city.length) return;
    var type = 'ADDRESS';
    $city.suggestions({
        token: token,
        type: type,
        bounds: "city-settlement",
        geoLocation: false,
        onSelect: enforceCity,
        onSelectNothing: enforceCity,
        formatSelected: formatCitySelected
    });

    $address.suggestions({
        token: token,
        type: type,
        onSelect: restrictAddressValue,
        formatSelected: formatSelected
    });

    // Если на поле адрес есть перезагрузка поля
    var p = $postcode.val() || "";
    var a = $address.val() || "";

    $city.on("suggestions-fixdata",
      function(e, suggestion) {
        $address.val(a);
      	$postcode.val(p)
      }
    );

    $city.suggestions().fixData();

    function setConstraints(sgt, kladr_id) {
        var restrict_value = false;
        var locations = null;
        if (kladr_id) {
            locations = {
                kladr_id: kladr_id
            };
            restrict_value = true;
        }
        sgt.setOptions({
            constraints: {
                locations: locations
            },
            restrict_value: restrict_value
        });
    }

    function enforceCity(suggestion, changed) {
      if (changed) 
        $(this)
          .val(
          $(this)
            .val()
            .trim()
        );

        var sgt = $address.suggestions();
        sgt.clear();
        if (suggestion) {
            setConstraints(sgt, suggestion.data.kladr_id);
            formatRegion(suggestion.data);
        } else {
            setConstraints(sgt, null);
        }
    }

    function formatCitySelected(suggestion) {
        var address = suggestion.data;
        if (address.city_with_type === address.region_with_type) {
            return address.settlement || address.city || "";
        } else {
            return join([
                address.city,
                address.settlement
            ]);
        }
    }

    function formatRegion(address) {
        $postcode.val(address.postal_code || '');
        if ($region.length) {
            var result = address.region.replace(/\s{0,1}[-\/].+/gi, '').toLowerCase();
            $region.find('option').each(function (i, o) {
                if ($(o).text().toLowerCase().search(result) >= 0) $(this).attr('selected', true);
                else $(this).attr('selected', false);
            });
        }
    }

    function restrictAddressValue(suggestion) {
      	var citySgt = $city.suggestions();
        var addressSgt = $address.suggestions();
        if (!citySgt.currentValue) {
            citySgt.setSuggestion(suggestion);
            var city_kladr_id = suggestion.data.kladr_id.substr(0, 13);
            setConstraints(addressSgt, city_kladr_id);
        }
    }

    function formatSelected(suggestion) {
        var addressValue = makeAddressString(suggestion.data);
        return addressValue;
    }

    function makeAddressString(address) {
        formatRegion(address);

        return join([
            address.street_with_type,
            join([address.house_type, address.house,
                address.block_type, address.block
            ], " "),
            join([address.flat_type, address.flat], " ")
        ]);
    }

    function join(arr /*, separator */ ) {
        var separator = arguments.length > 1 ? arguments[1] : ", ";
        return arr.filter(function (n) {
            return n
        }).join(separator);
    }
}

// Для блока адресс берем в переменные нужные инпуты
var $city = $('input[name*="city"]');
var $address = $('input[name*="address_1"]');
var $postcode = $('input[name*="postcode"]');
var $zoneId = $('select[name*="zone_id"]');
// Для блока адресс вызов
checkAddress($city, $address, $postcode, $zoneId);

// Для блока имени, фамилия
function initName($surname, $name) {
    // Если инпута фамилия или имя нету, выходим
    if (!$surname.length || !$name.length) return;
    var self = {};
    self.$surname = $surname;
    self.$name = $name;
    var fioParts = ["SURNAME", "NAME"];
    $.each([$surname, $name], function (index, $el) {
        var sgt = $el.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: [fioParts[index]]
            }
        });
    });
};

// Для блока имени, фамилия вызов
var $surname = $('input[name*="lastname"]');
var $name = $('input[name*="firstname"]');

initName($surname, $name);

// Для блока email с проверкой есть ли данный инпут
var $email = $('input[name*="e-mail"]');
if ($email.length) {
    $email.suggestions({
        token: token,
        type: "EMAIL",
    });
}

 

Ссылка на комментарий
  • 9 месяцев спустя...

добрый день, подскажите такой случай, поставил модуль который скачал тут, стоит модуль citymanager-pro-v8.3 город в симплу подтягивается из данного модуля, но тогда не работает поле адрес, не подтягивается с Dadata, как можно исправит данную проблему ?

Ссылка на комментарий
  • 2 месяца спустя...

Сделал в ocStore 3.0.3.7 + симпл - 1 строка адреса с DaData, которая заполняет остальные поля

 

// Ваш api ключ из лк дадаты https://dadata.ru/#registration_popup
var token = "";

// Для блока адресс берем в переменные нужные инпуты
var $city = $('input[name*="city"]');
var $address = $('input[name*="address_1"]');
//var $postcode = $('input[name*="postcode"]');
var $region= $('select[name*="zone_id"]');
var $countryId = $('select[name*="country_id"]');


// Для блока имени, фамилия
function initName($surname, $name) {
    // Если инпута фамилия или имя нету, выходим
    if (!$surname.length || !$name.length) return;
    var self = {};
    self.$surname = $surname;
    self.$name = $name;
    var fioParts = ["SURNAME", "NAME"];
    $.each([$surname, $name], function (index, $el) {
        var sgt = $el.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: [fioParts[index]]
            }
        });
    });
};
// Для блока имени, фамилия вызов
var $surname = $('input[name*="lastname"]');
var $name = $('input[name*="firstname"]');

initName($surname, $name);

// Для блока email с проверкой есть ли данный инпут
var $email = $('input[name*="email"]');
if ($email.length) {
    $email.suggestions({
        token: token,
        type: "EMAIL",
    });
}

function join(arr /*, separator */) {
  var separator = arguments.length > 1 ? arguments[1] : ", ";
  return arr.filter(function(n){return n}).join(separator);
}

function showRegion(address) {
    var findRegionValue = address.region.replace(/\s{0,1}[-\/].+/gi, '').toLowerCase();
    if ($region.length) {
        $region.find('option').each(function (i, o) {
            if ($(o).text().toLowerCase().search(findRegionValue) >= 0) $(this).attr('selected', true);
            else $(this).attr('selected', false);
        });
    }
}


function showCity(address) {
  $city.val(join([
    join([address.city], " "),
    join([address.settlement_type, address.settlement], " ")
  ]));
}

function showAddress(address) {
  $address.val(join([
    address.street_type, address.street, 
    address.house_type, address.house, 
    address.block_type, address.block, 
    address.flat_type, address.flat], " ")
   );
}

function showSelected(suggestion) {  
  $countryId.val(176);
  var address = suggestion.data;  
  //showPostalCode(address);
  showRegion(address);  
  showCity(address); 
  showAddress(address); 
}

$("#shipping_address_field20").suggestions({
  token: token,
  type: "ADDRESS",
  onSelect: showSelected
});

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...