Как заполнить автозаполнение Yii2 вызовом AJAX

#autocomplete #yii2

#автозаполнение #yii2

Вопрос:

Я пытаюсь переключиться на Yii2 из Yii 1.1. Это был исходный атрибут виджета TextAreaJuiAutoComplete

 'source'=>"js:function(request, response) {
    $.getJSON('".$url"', {
        term: extractLast(request.term)
    }, response);
}",
  

Это больше не работает в Yii2 с yii jui AutoComplete. Кто-нибудь может дать мне подсказку, в чем причина? Базовые объекты JavaScript должны быть одинаковыми.

Если я введу следующий код, это сработает, но я хочу использовать вызовы ajax вместо этого.

 'source' => [ "c  ", "java", "php", "coldfusion", "javascript", "asp", "ruby" ],
  

Комментарии:

1. Пожалуйста, проверьте ваш javascript с помощью firebug и увидите ошибку

2. Ошибки нет, просто ничего не происходит.

Ответ №1:

Попробуйте это:

 use yiiwebJsExpression;

.....
.....


'source'=>new JsExpression("function(request, response) {
    $.getJSON('".$url."', {
        term: request.term
    }, response);
}"),
  

Ответ №2:

Попробуйте это:

 AutoComplete::widget([
    'name'=>'myacfield',
    'clientOptions' => [
        'source' => Url::to(['autocomplete']),
             'minLength'=>'2',
         ],
    'options'=>[
        'class' => 'form-control'
    ]
]);
  

Но ваше AutoComplete действие должно возвращать одномерный массив, подобный

 ...            
$rs = Yii::$app->db->createCommand($sql)->queryAll();
$row_set = [];
foreach ($rs as $row)
{
    $row_set[] = $row['name']; //build an array
}
echo json_encode($row_set); //format the array into json data
  

Ответ №3:

Пример с подобным. Контроллер:

  public function actionSearch($term)
        {
            Yii::$app->response->format = yiiwebResponse::FORMAT_JSON;
            $rs = Cure::find()->where(['like', 'name_uz', $term])->all();
           if($rs !=null){
               $row_set = [];
               foreach ($rs as $row)
               {
                   $row_set[] = $row->name_uz; //build an array
               }
               return $row_set;
           }else{
               false;
           }

        }
  

В поле зрения:

 <? use yiijuiAutoComplete;?>
<?= AutoComplete::widget([
    'model' => $model,
    'attribute' => 'country',
    'options' => ['class' => 'form-control'],
    'clientOptions' => [
        'source' => Url::to(['cure/search']),
        'minLength'=>'2',
    ],
]); ?>