0
Fixed

Ошибка в jQuery плагине при формированию value по объекту адреса

Кирилл 4 years ago updated by Антон 2 years ago 7
У Вас явная ошибка в jQuery плагине.
если передать плагину следующий параметр
{ bounds: "city-settlement" }, тогда при вводе "Железнодорожный" в подсказках будет показываться "Московская обл, г Железнодорожный", а при выборе этого варианта - в поле запишется "г Железнодорожный", а должно писаться именно как в подсказке.

Чтобы изменить это поведение, я изменил параметр на { bounds: "region-area-city-settlement" }, тогда при вводе "Железнодорожный" - все правильно и показывается в подсказках и при выборе "Московская обл, г Железнодорожный"
а вот для запроса "Москва" - в подсказках будет показываться "г Москва" а при выборе - "г Москва, г Москва", соответственно для этого варианта ситуация следующая - когда происходит выбор варианта подсказки - к вам на сервер уходит запрос с параметром { count: 1 }, он возвращает объект suggestion, внутри которого поле value заполнено как надо "г Москва", потом этот объект suggestion попадает вот в эту функцию:

checkValueBounds: function (suggestion) {
    var that = this,
        valueData;

    // If any bounds set up
    if (that.bounds.own.length && that.type.composeValue) {
        valueData = that.copyBoundedData(suggestion.data, that.bounds.own);
        suggestion.value = that.type.composeValue(valueData);
    }
}
И здесь поле value перезаписывается через функцию composeValue
composeValue: function (data) {
    return utils.compact([
        data.region_with_type || utils.compact([data.region, data.region_type]).join(' '),
        data.area_with_type || utils.compact([data.area_type, data.area]).join(' '),
        data.city_with_type || utils.compact([data.city_type, data.city]).join(' '),
        data.settlement_with_type || utils.compact([data.settlement_type, data.settlement]).join(' '),
        data.street_with_type || utils.compact([data.street_type, data.street]).join(' '),
        utils.compact([data.house_type, data.house, data.block_type, data.block]).join(' '),
        utils.compact([data.flat_type, data.flat]).join(' '),
        data.postal_box ? 'а/я ' + data.postal_box : null
    ]).join(', ');
}
Но она очевидно работает не правильно, т.к. вы в обновлении 15.7 - сделали следующий пункт:
Адрес одной строкой формируем с учетом требований Почты России: если город — центр региона, название региона не пишется (г Новосибирск, ул Абаканская, д 21). Если центр района — не пишется название района (Московская обл, г Одинцово, ул Ракетчиков).
А в функции composeValue - value просто формируется объединеннием всего подряд - вот и получается что от сервера приходит правильный value "г Москва", а функция composeValue возвращает неправильное значение "г Москва, г Москва".

Т.к. запрос к вашему серверу при выборе подсказки уходит с параметрами { count: 1, from_bound: {value: "region"}, to_bound: {value: "settlement"} }, т.е. с учетом bounds, то и ответ приходит правильно отформатированный уже, поэтому по-сути вызов composeValue - просто лишний, поэтому у себя я просто исправил функцию checkValueBounds вот так:
checkValueBounds: function (suggestion) {
    return;
    var that = this,
        valueData;

    // If any bounds set up
    if (that.bounds.own.length && that.type.composeValue) {
        valueData = that.copyBoundedData(suggestion.data, that.bounds.own);
        suggestion.value = that.type.composeValue(valueData);
    }
}


P.S. Еще у меня есть проблема - наша компания задумывается о приобретении standalone версии подсказок, чтобы обезопасить себя от вопросов доступности вашего сервиса, но мне никак не может ваш менеджер толком объяснить - что именно будет работать по-другому в standalone версии, но говорит что точно чего-то не будет, а чего до конца не ясно, в общем плавает ваш менеджер в этом вопросе... Я предложил чтобы не разбираться с этим вопросом на словах, а опробовать в деле - можете ли вы запустить у себя отдельную чистую standalone версию, и давать к ней доступ хотя бы по запросу через менеджера, а то как-то стремно покупать лицензию на что-то что работает так же, но только не совсем точно так же, а вот по-другому:) Хочется перед покупкой оттестировать именно на том функционале который и будет приобретен.

P.P.S. Спасибо за ваш сервис - все очень круто!)
Кирилл, насчет jQuery-плагина отвечу сегодня в течение дня. По поводу постскриптума: я так понял, что с менеджером вы сегодня уже все обсудили. Мы еще добавили в базу знаний страницу про разницу межде standalone и облачными подсказками: https://dadata.userecho.com/topic/906651
Да еще раз все обсудили - теперь стало гораздо яснее, спасибо!

И еще, мне кажется, в базу знаний стоит добавить инфу, что все ответы на запросы с count > 1 работают абсолютно одинаково и через сервис и в standalone версии, а вот на запросы с count = 1 уже появляются различия.
Именно эта информация позволила мне окончательно принять решение.
Хорошо бы добавить и сюда https://dadata.userecho.com/topic/906651 и сюда http://dadata.userecho.com/topic/797454-pochemu-podskazki-vozvraschayut-raznyie-znacheniya-v-zavisimosti-ot-count/
Planned
Проблема с форматированием Москвы при использовании bounds есть, посмотрим, как лучше исправить. Спасибо за багрепорт!
Вам спасибо за отличный сервис!