Дискретные подсказки для адреса
В основной статье про подсказки для ФИО, которую можно посмотреть здесь, мы рассказали, как с помощью Ахантера сделать быстрый и удобный ввод ФИО одной строкой в одном поле формы.
Однако в некоторых случаях вам может понадобиться заполнять ФИО по отдельности в трёх разных полях. Для этих целей в Ахантере реализована поддержка дискретного ввода ФИО, который подразумевает, что фамилия, имя и отчество в вашей форме вводятся отдельно друг от друга в соответствующих полях. Подсказки в этом случае формируются для каждого такого поля по отдельности, а не для всего ФИО целиком.
Также как и в случае с однострочным вводом ФИО, Ахантер предлагает подсказки с учётом пола и национальности персоны. Эти сведения он распознаёт по уже введённой информации в остальных полях формы.
Приведенная ниже форма демонстрирует вживую, как это работает. Список подсказок отображается при вводе компонентов ФИО в соответствующие поля формы.
Варианты в списке ранжируются по убыванию их популярности. При поиске и ранжировании учитывается как самостоятельная популярность предлагаемого варианта, вводимого пользователем в настоящий момент, так и его сочетаемость с уже введенными компонентами. Сочетаемость компонентов ФИО подразумевает следующее.
Таким образом, если пользователь ввёл, например, армянское женское имя в поле Имя, то при вводе в поля Отчество и Фамилия ему будут предлагаться подсказки с армянскими женскими отчествами и фамилиями соответственно. При формировании подсказок учитывается, что слова, составляющие ФИО, могут содержать ошибки. При выполнении поиска осуществляется автоматическое исправление этих ошибок.
В демонстрационной форме, приведённой выше, для отображения подсказок используется наш JavaScript-модуль ahunter_suggest.js, скачать его можно по следующей ссылке. Модуль использует библиотеку jQuery, поэтому, чтобы запустить подсказки у вас на сайте, в дополнение к ahunter_suggest.js нужно будет установить свежую версию jQuery.
Для запуска подсказок в этой форме мы использовали следующий JavaScript-код.
//настраиваем подсказки для ввода ФИО в отдельных полях var options = { fields: [ { id: 'js-Field1', tag: 'last_name' }, { id: 'js-Field2', tag: 'first_name' }, { id: 'js-Field3', tag: 'patronym' } ] }; //запускаем дискретные подсказки AhunterSuggest.Person.Discrete( options );
Детальное описание этого кода, а также описание подготовки вашего сайта к использованию подсказок приводится далее в этой статье.
В большинстве случаев для работы с подсказками бывает достаточно использовать модуль ahunter_suggest.js. Однако если вам нужно встроить подсказки в отдельное приложение, либо если у вас есть своё JavaScript решение для отображения подсказок, то для получения подсказок от Ахантера нужно будет использовать напрямую его REST API. Соответствующее описание приводится во второй части данной статьи.
Чтобы добавить дискретные подсказки для фамилий, имён и отчеств на сайт, как и в случае с обычными подсказками, необходимо выполнить подготовку сайта. А именно, нужно установить jQuery, установить наш JavaScript-модуль ahunter_suggest.js, взяв его здесь, а также настроить таблицу стилей, чтобы подсказки отображались красиво.
Все эти процедуры детально описаны в подсказках для почтовых адресов по следующей ссылке. При разработке модуля ahunter_suggest.js мы реализовали единообразную работу с почтовыми адресами и ФИО, поэтому подготовка в обоих случаях выполняется одинаково.
Чтобы запустить дискретные подсказки, на вашем сайте должна присутствовать форма с тремя полями, куда пользователи будут вводить фамилии, имена и отчества. Если вам достаточно получать от ваших пользователей только имена и фамилии, то поле с отчеством можно не добавлять. Подключение подсказок в этом случае будет выполняться аналогично.
Каждому из этих полей вашей формы должен быть присвоен идентификатор, чтобы по нему наш модуль ahunter_suggest.js смог найти это поле на веб-странице и запустить для него подсказки. HTML-разметка такой формы может выглядеть следующим образом.
<div> <input id="js-Field1" placeholder="Фамилия"/> <input id="js-Field2" placeholder="Имя"/> <input id="js-Field3" placeholder="Отчество"/> </div>
Согласно этой форме, первое поле с идентификатором js-Field1 предназначено для ввода фамилии. В поле с идентификатором js-Field2 пользователи будут вводить свои имена, а в поле с идентификатором js-Field3 – отчества. Когда пользователь будет заполнять эти поля, Ахантер должен будет предлагать подсказки для соответствующего компонента ФИО.
Чтобы сообщить Ахантеру, какие именно подсказки он должен предлагать при заполнении этих полей, необходимо в опциях модуля явно указать связь между компонентами ФИО и полями вашей формы. Для этого на странице с формой нужно добавить следующий код.
//настраиваем подсказки для ввода ФИО в отдельных полях var options = { fields: [ { id: 'js-Field1', tag: 'last_name' }, { id: 'js-Field2', tag: 'first_name' }, { id: 'js-Field3', tag: 'patronym' } ] }; //запускаем дискретные подсказки AhunterSuggest.Person.Discrete( options );
Здесь видно, что в опциях options заполняется список fields, каждый элемент которого устанавливает связь между полем вашей формы и одним из компонентов ФИО, для которого Ахантер будет предлагать подсказки. Эта связь устанавливается за счёт пары из двух следующих обязательных полей.
В приведённом примере видно, что при заполнении первого поля формы с идентификатором js-Field1 будут предлагаться подсказки с фамилиями (last_name). Если пользователь начнёт вводить в это поле имя или отчество, то Ахантер перестанет показывать подсказки и выдаст предупреждающее сообщение. Аналогичным образом сконфигурированы остальные поля формы.
После того как настройки в объекте options заполнены, они передаются нашему модулю посредством вызова AhunterSuggest.Person.Discrete( options ). Этот вызов привяжет функционал дискретных подсказок к заданным в списке options.fields полям формы, так что ввод ФИО в этих полях будет приводить к отображению подсказок.
В настройках options можно указывать и другие опции, которые будут влиять на поведение и внешний вид подсказок. Ознакомиться с ними можно по следующей ссылке.
Среди этих опций следует отдельно выделить флаг suggest_on_empty, который, в отличие от адресных подсказок, не применяется для ФИО.
Ниже приведён пример инициализации формы из трёх полей, для которых подсказки запускаются с использованием дополнительных опций.
//настраиваем подсказки для ввода ФИО в отдельных полях var options = { fields: [ { id: 'js-Field1', tag: 'last_name', empty_msg : 'Неизвестная фамилия' }, { id: 'js-Field2', tag: 'first_name', empty_msg : 'Неизвестное имя' }, { id: 'js-Field3', tag: 'patronym', empty_msg : 'Неизвестное отчество' } ], //Веб-адрес облачной версии сервиса ahunter_url : 'https://ahunter.ru/', //Будем показывать только 5 топовых подсказок limit : 5, //Не будем показывать подсказки при возврате фокуса в поле ввода suggest_on_focus : false }; //запускаем дискретные подсказки AhunterSuggest.Person.Discrete( options );
Здесь у каждого поля мы дополнительно указали параметр empty_msg, который содержит сообщение, показываемое пользователю, если в соответствующее поле он ввёл что-то неизвестное Ахантеру. Это сообщение будет появляться под редактируемым полем. Такие сообщения полезно показывать, поскольку они своевременно предупреждают пользователя о том, что он вводит некорректные данные, и, таким образом, стимулируют его исправить уже введённую информацию.
Кроме этого в данной конфигурации мы явно запретили показывать подсказки при переключении фокуса между полями формы. Это сделано с помощью флага suggest_on_focus = false. Также с помощью параметра limit у всех полей формы установлен лимит на количество показываемых подсказок.
Ниже показано, как будет работать эта форма вживую.
Использование REST API дискретных подсказок напрямую без модуля ahunter_suggest.js может потребоваться, если вы хотите использовать подсказки в вашем приложении, не поддерживающем JavaScript или jQuery. В этом случае, как и с обычными подсказками для ФИО, следует использовать ту же самую API команду suggest/person. Однако для работы в дискретном режиме понадобится передавать дополнительные параметры, а также немного иначе оформлять сам запрос.
Дискретный режим команды suggest/person подразумевает, что компоненты ФИО вводятся не в одно, а в три разных поля: в одном поле вводится фамилия, в другом поле – имя, а в третьем - отчество. В любой момент времени редактироваться может только одно из этих полей, при этом полагается, что остальные два поля либо уже полностью заполнены, либо пока пусты. Каждый раз, когда пользователь вводит очередной символ в одно из этих полей, увеличивается количество информации, на основе которой сервис может сформировать подсказки для соответствующего компонента ФИО. При этом информация, уже введённая в других полях, тоже должна учитываться.
Поэтому при вводе пользователем каждого нового символа в текущем поле ваше приложение должно брать всю информацию, введённую к настоящему моменту во всех полях формы, и отсылать её в виде запроса Ахантеру для получения новых подсказок.
Для организации такого взаимодействия ваше приложение должно отслеживать события, возникающие, когда происходят изменения в каком-либо поле формы. При возникновении такого события приложение должно отсылать сервису запрос, содержащий текст, введенный к настоящему моменту в каждое из этих полей, с указанием того, в какое из них сейчас вводится информация, чтобы Ахантер вернул подсказки именно для этого компонента ФИО.
Получив ответ от Ахантера, ваше приложение должно извлечь из него предложенные подсказки и показать их пользователю, предоставив тем самым возможность выбрать подходящий вариант для заполнения текущего поля формы.
Приведенный ниже запрос отсылает сервису информацию о том, что в поле Фамилия введен текст "Смирнов", а в поле Имя пользователь к настоящему моменту ввёл текст "А" и продолжает ввод. На основании этой информации сервис должен сформировать подсказки для завершения компонента, вводимого пользователем в настоящий момент (в данном случае этим компонентом является имя).
В данном запросе используются следующие параметры.
Рассмотрим более подробно все параметры, которые сервис может получать в рамках данной команды.
Обязательные параметры для выполнения запроса.
Опциональные параметры.
Приведенный ниже запрос отсылает сервису информацию о том, что в поле Имя введен текст "Фёдор", в поле Отчество - текст "Михайлович", а в поле Фамилия пользователь к настоящему моменту ввёл текст "Д" и продолжает ввод. На основании этой информации сервис должен сформировать подсказки для завершения компонента, вводимого пользователем в настоящий момент (в данном случае этим компонентом является фамилия).
В данном запросе используются следующие параметры.
Ниже приведен ответ сервиса с результатом формирования подсказок по запросу со следующими исходными данными:
Результирующий JSON-ответ получен с использованием опции output=json|pretty, позволяющей выполнить "красивое" форматирование JSON-текста, а также с опцией personlim=3, чтобы ограничить число выводимых подсказок тремя штуками
{ "query" : "Фёдор Михайлович Д", "request_process_time" : 15, "suggestions" : [ { "first_name" : "Фёдор", "last_name" : "Дмитриев", "patronym" : "Михайлович", "value" : "Дмитриев" }, { "first_name" : "Фёдор", "last_name" : "Давыдов", "patronym" : "Михайлович", "value" : "Давыдов" }, { "first_name" : "Фёдор", "last_name" : "Денисов", "patronym" : "Михайлович", "value" : "Денисов" } ] }
Результатом формирования подсказок для вводимого ФИО является JSON-объект со следующими элементами.
Ниже приведено детальное описание этих элементов.
Поскольку при формировании подсказок полагается, что ФИО введено не полностью, вариантов завершения написания компонента ФИО, вводимого пользователем в настоящий момент, в общем случае может быть несколько. Каждый из вариантов является подсказкой для пользователя, которую тот может выбрать в качестве целевого значения компонента. Каждому предлагаемому сервисом варианту соответствует отдельный элемент JSON-массива suggestions. Количество предлагаемых вариантов может лимитироваться с помощью опционального параметра personlim, передаваемого в рамках запроса.
Пример JSON-объекта, соответствующего одному варианту подсказок для вводимого ФИО, приведен ниже.
{ "first_name" : "Фёдор", "last_name" : "Дмитриев", "patronym" : "Михайлович", "value" : "Дмитриев" }
Каждый элемент массива suggestions представляет собой JSON-объект со следующими элементами.
Поскольку формирование подсказок происходит в режиме реального времени, никакой дополнительной информации по каждой подсказке сервис не возвращает. Это обусловлено необходимостью минимизировать сетевой трафик и время отклика сервиса. Чтобы получить исчерпывающую информацию по итоговому ФИО, которое ввел или выбрал из предложенных подсказок пользователь, приложению пользователя следует использовать команду стандартизации ФИО: cleanse/person.
Здесь и далее приводится описание ответа сервиса в случае использования формата XML. По существу, возвращаемые в XML-ответе элементы имеют аналогичное назначение JSON-элементам, описанным выше. Для получения ответа в формате XML необходимо в исходном запросе использовать значение параметра output=xml.
Ниже приведен XML-ответ сервиса в результате формирования подсказок по запросу со следующими исходными данными:
<ProcessSuggestResult> <Query val="Фёдор Михайлович Д"/> <Suggestion first_name="Фёдор" last_name="Дмитриев" patronym="Михайлович" val="Дмитриев"/> <Suggestion first_name="Фёдор" last_name="Давыдов" patronym="Михайлович" val="Давыдов"/> <Suggestion first_name="Фёдор" last_name="Денисов" patronym="Михайлович" val="Денисов"/> </ProcessSuggestResult>
Результатом формирования подсказок для вводимого ФИО является XML-документ со следующими дочерними элементами.
Ниже приведено детальное описание этих XML-элементов.
Элемент Suggestion содержит информацию об одной подсказке из предложенного сервисом списка подсказок по вводимому ФИО. Пример данного элемента приведен ниже.
<Suggestion first_name="Фёдор" last_name="Дмитриев" patronym="Михайлович" val="Дмитриев"/>
Данный элемент содержит следующие атрибуты.