Перейти к содержанию
View in the app

A better way to browse. Learn more.

Русскоязычное сообщество Opencart

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

В связи с блокировкой банка QIWI оплата через сайт не возможна.
Для оплаты и получения дополнений просьба писать в личные сообщения 
Admin*у
или в Телеграмм https://t.me/pascha_opencart
После оплаты Вам так же будет доступно скачивание дополнений и обновлений на данном форуме

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

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

Опубликовано

Модуль подсказок 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
});

 

Последние посетители 0

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.