JQuery Автозаполнение - PullRequest
0 голосов
/ 12 июля 2011

Я хочу создать поле ввода jquery Auto Complete для города, в котором находится пользователь. Когда пользователь начинает вводить слова, я хочу отобразить список из 5 городов с ближайшими ассоциациями в этом формате [Город, Страна]

у меня есть три стола

  1. Страна (id, название страны)
  2. Регион (id, имя_региона, идентификатор страны)
  3. Город (id, название города, region_id, country_id)

когда пользователь выбирает город, я хочу записать идентификатор города, чтобы вставить его в базу данных.

Как мне сделать это с автозаполнением?

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

JS код

$("#UserCity").autocomplete({
    source: function (request, response) {
        $.ajax({
            url: "http://localhost/baku/users/location/",
            dataType: "json",
            data: {
                data: request.term
            },
            success: function (data) {
                /// Need to modify this part
                response($.map(data.geonames, function (item) {
                    return {
                        label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
                        value: item.name
                    }
                }));
            }
        });
    },
    minLength: 2
});

Пример строки JSON, которую я получаю из Ajax

[{"name":"Banaras, Uttar Pradesh, India","city_id":"1927","region_id":"2193","country_id":"113"},{"name":"Banda, Uttar Pradesh, India","city_id":"1938","region_id":"2193","country_id":"113"},{"name":"Bangalore, Karnataka, India","city_id":"1949","region_id":"2185","country_id":"113"},{"name":"Banganapalle, Andhra Pradesh, India","city_id":"1950","region_id":"2169","country_id":"113"},{"name":"Banswara, Rajasthan, India","city_id":"1983","region_id":"2190","country_id":"113"},{"name":"Banur, Punjab, India","city_id":"1987","region_id":"2189","country_id":"113"}]

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

Массив

Array
(
    [0] => Array
        (
            [name] => Banaras, Uttar Pradesh, India
            [city_id] => 1927
            [region_id] => 2193
            [country_id] => 113
        )

    [1] => Array
        (
            [name] => Banda, Uttar Pradesh, India
            [city_id] => 1938
            [region_id] => 2193
            [country_id] => 113
        )

    [2] => Array
        (
            [name] => Bangalore, Karnataka, India
            [city_id] => 1949
            [region_id] => 2185
            [country_id] => 113
        )

    [3] => Array
        (
            [name] => Banganapalle, Andhra Pradesh, India
            [city_id] => 1950
            [region_id] => 2169
            [country_id] => 113
        )

    [4] => Array
        (
            [name] => Banswara, Rajasthan, India
            [city_id] => 1983
            [region_id] => 2190
            [country_id] => 113
        )

    [5] => Array
        (
            [name] => Banur, Punjab, India
            [city_id] => 1987
            [region_id] => 2189
            [country_id] => 113
        )

)

Ответы [ 2 ]

1 голос
/ 12 июля 2011

HTML:

<input type="text" name="city" id="city" />
<input type="hidden" name="city_id" id="city_id" />

JQuery:

$('input.city').autocomplete('/ajax/autocomplete-city.php').result(function(e, data){
    $('city_id'.val(data[1]);
});

PHP:

$query = mysql_real_escape_string($_GET['q']);

$rs = mysql_query("
    SELECT
        CONCAT_WS(', ', city.city_name, region.region_name, country.country_name)
    ,   city.id
    FROM
        city
    INNER JOIN
        region ON region.id = city.region_id
    INNER JOIN
        country ON country.id = city.country_id
    WHERE
        city.city_name LIKE '$query%'
    LIMIT 10
");

while ($r = mysql_fetch_row($rs))
{
    echo implode("|", $r);
    echo "\n";
}
1 голос
/ 12 июля 2011

Столкнувшись с возможностью того, что 2 экземпляра имеют одно и то же имя, я всегда добавляю еще одну уникальную вещь, чтобы различать их (но это только для того, чтобы пользователи могли сделать правильный выбор). Обычно ваши города должны иметь разные идентификаторы (они должны быть уникальными).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...