Заполнение моего автозаполнения jquery содержимым ajax-вызова cakephp

У меня есть поле ввода, которое я превращаю в автозаполнение jqueryUI:

$( "#autocomplete" ).autocomplete({
    autoFocus: true,
    source: mylist
 });

Переменная mylist — это просто строка в формате массива ['Value1','Value2,'Blah'], которую я изначально просто жестко запрограммировал в скрипте.

Теперь я хочу, чтобы переменная mylist была результатом ajax-вызова функции в моем приложении cakephp. Функция в основном выглядит следующим образом, она просто захватывает все данные в виде списка и кодирует их в json.

public function source() {
    $this->layout = 'ajax';
    $countries=$this->Country->find('list',array('fields'=>'Country.country'));
    ChromePhp::log($countries);
    echo json_encode($countries);
}

Это выводит:

{"1":"Afghanistan","2":"Albania ","3":"Algeria ","5.. 

Моя проблема заключается в том, чтобы получить вывод этой функции (который заканчивается обратным вызовом успеха ajax как «данные») в правильном формате для размещения в массиве параметров автозаполнения.

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

$.ajax({
    type: "GET",
    dataType: "json",
    url: "/source/",
    success: function(data){
        /*
        magic array string creation code would go here instead of my code below...
        */
        $.each(data, function(i, item) {
            console.log(item);
        });
        console.log('data',data);


    }
})

person Chris J Allen    schedule 06.11.2012    source источник


Ответы (1)


Плагин автозаполнения может сделать большую работу за вас, если вы дадите ему что-то в правильном формате.

Я бы начал с переиндексации переменной $countries, чтобы начать с 0. Вы можете использовать для этого функцию array_values():

echo json_encode(array_values($countries));

Это должно дать вам JSON в формате:

['Afghanistan','Albania','Algeria',...]

Затем вы можете изменить исходное свойство в коде автозаполнения, чтобы оно было URL-адресом вашего исходного действия.

$( "#autocomplete" ).autocomplete({
    autoFocus: true,
    source: "/your_controller/source"
});

Плагин автозаполнения не будет фильтровать результаты за вас, вместо этого к URL-адресу добавляется строка запроса с полем term (например, /your_controller/source?term=foo), поэтому вам нужно изменить метод find(), чтобы использовать это.

$countries = $this->Country->find('list', array(
    'fields' => 'Country.country',
    'conditions' => array(
        'Country.country LIKE' => $this->request->query['term'] . '%'
    )
));

Вы можете узнать больше о различных типах, которые опция source может принимать в автозаполнении, в Документация по API.

person Josh    schedule 06.11.2012
comment
Именно поэтому этот сайт — мой любимый сайт разработчиков всех времен :) Спасибо. - person Chris J Allen; 07.11.2012