Автозаполнение JQuery UI с json и ajax

Я видел много вопросов, связанных с передачей массива с метками и свойствами значения через JSON, но не так много о передаче строк. Моя проблема в том, что я не могу заполнить свой автозаполнение. Я запустил функцию дампа и получаю эти значения образцов, переданные через JSON, в автозаполнение:

0: 23456
1: 21111
2: 25698

Вот код:

$("#auto_id").autocomplete( {
    source: function(request,response) {

        $.ajax ( {
          url: "fill_id.php",
          data: {term: request.term},
          dataType: "json",
          success: function(data) {
            //what goes here?
                 } 
    }) }
   });

Вот fill_id.php:

$param = $_GET['term'];
$options = array();


$db = new SQLite3('database/main.db');
    $results = $db->query("SELECT distinct(turninId) FROM main WHERE turninid LIKE '".$param."%'");


while ($row_id = $results->fetchArray()) {
        $options[] =  $row_id['turninId']; 
    }   
echo json_encode($options);

Мой автозаполнение остается пустым. Как мне изменить свой массив JSON, чтобы заполнить его? Или что я могу включить в свою функцию успеха ajax?

Ответ 1

Вы можете сильно приложить к удаленной демонстрации автозаполнения пользовательского интерфейса jQuery: http://jqueryui.com/resources/demos/autocomplete/remote-jsonp.html

Чтобы получить результаты в списке автозаполнения, вам нужно поместить объект с меткой и значением параметра ответа (который фактически является функцией) внутри вашей функции успеха ajax:

source: function( request, response ) {
    $.ajax({
        url: "fill_id.php",
        data: {term: request.term},
        dataType: "json",
        success: function( data ) {
            response( $.map( data.myData, function( item ) {
                return {
                    label: item.title,
                    value: item.turninId
                }
            }));
        }
    });
}

Но это будет работать, только если вы немного измените yor fill_id.php:

// escape your parameters to prevent sql injection
$param   = mysql_real_escape_string($_GET['term']);
$options = array();

// fetch a title for a better user experience maybe..
$db = new SQLite3('database/main.db');
    $results = $db->query("SELECT distinct(turninId), title FROM main WHERE turninid LIKE '".$param."%'");

while ($row_id = $results->fetchArray()) {
    // more structure in data allows an easier processing
    $options['myData'][] = array(
        'turninId' => $row_id['turninId'],
        'title'    => $row_id['title']
    ); 
}

// modify your http header to json, to help browsers to naturally handle your response with
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');

echo json_encode($options);

Конечно, когда у вас нет названия или чего-либо в вашей таблице, вы также можете просто оставить свой ответ так, как есть, и повторить идентификатор в своем обратном вызове. Важно отметить, что вы заполняете свою функцию response в автозаполнении парой value/item:

// this will probably work without modifying your php file at all:
response( $.map( data, function( item ) {
    return {
        label: item,
        value: item
    }
}));

изменить: обновил ссылку ссылки на новый автозавершение пользовательского интерфейса jquery ui