2015-09-16 3 views
1

Я пытаюсь использовать плагин jquery-select2 (загрузка удаленных данных) с помощью модели поиска Yii2. На данный момент мой контроллер возвращает $ dataProvider, созданный из модели поиска. Однако это явно не в формате, который select2 может использовать для создания раскрывающегося списка.Как использовать ActiveDataProvider с select2?

Что мне нужно сделать для $ dataProvider или select2, чтобы заставить их работать вместе?

Как я вижу это, есть 2 варианта:

  1. извлечь «cat_name» от $ DataProvider и поставить его в формате, который можно использовать Выбор2.
  2. Учить select2 как читать $ dataProvider.

Я не знаю, как бы я сделал 2, и я подозреваю, что это сделало бы «пометка» функциональность трудно реализовать, таким образом, я склоняюсь к 1.

Любая помощь будет оценена.

Вот мой код:

Контроллер боковой

public function actionCatSearch($q) 
{ 
    if (Yii::$app->request->isAjax) { 

     $searchModel = new CatSearch(); 
     $dataProvider = $searchModel->search(['catSearch' => ['cat_name' => $q]]); 

     return $dataProvider->models; 


    } 
} 

JS сторона

$(document).ready(function(){  
    $('.js-select').select2({ 
    tags: true, 
    ajax: { 
     url: 'cat-search', 
     dataType: 'json', 
     delay: 250, 
     data: function (params) { 
      return { 
       q: params.term 
      }; 
     }, 
     processResults: function (data, page) { 
      return { 
       results: data 
      }; 
     }, 
     cache: true 
    }, 
    minimumInputLength: 1 
    }); 
}); 

ответ

1

Потребовалось время, но я сумел понять это. Есть несколько вещей, которые должны произойти. Сначала используйте встроенный сериализатор от Yii2, затем json_encode.

На стороне скрипта мне пришлось использовать templateResult.

Здесь все изменения:

стороны контроллера

стороны
public function actionCatSearch($q) 
{ 
    if (Yii::$app->request->isAjax) { 

     $searchModel = new CatSearch(); 
     $dataProvider = $searchModel->search(['catSearch' => ['cat_name' => $q]]); 

     $serial = new Serializer(); 
     $test = $serial->serialize($dataProvider); 

     return json_encode($test); 

    } 
} 

Script

function formatStuff (stuff) { 
    if (stuff.loading) return 'Searching...'; 

    markup = "<p>" + stuff.cat_name + "</p>"; 

    return markup; 
} 

$(document).ready(function(){  
    $('.js-select').select2({ 
    tags: true, 
    ajax: { 
     url: 'cat-search', 
     dataType: 'json', 
     delay: 250, 
     data: function (params) { 
      return { 
       q: params.term 
      }; 
     }, 
     processResults: function (data, page) { 
      return { 
       results: data 
      }; 
     }, 
     cache: true 
    }, 
    escapeMarkup: function (markup) { return markup; }, 
    minimumInputLength: 1, 
    templateResult: formatStuff, 
    }); 
}); 
+1

Вы должны отметить это как ответ тогда. – topher

0

Попробуйте извлекая столбец, нужно из моделей

public function actionCatSearch($q) 
{ 
    if (Yii::$app->request->isAjax) { 

     $searchModel = new CatSearch(); 
     $dataProvider = $searchModel->search(['catSearch' => ['cat_name' => $q]]); 

     $cat_name = array_column($dataProvider->models, 'cat_name'); 
     return json_encode($cat_name); 

    } 
} 
+0

Я попытался это, но он дал пустой результат для меня. – MikelG

+0

попробуйте вернуться без json_encode, попробуйте или var_dump значение $ cat_name, $ dataProvider-> models, попробуйте найти где проблема – scaisEdge

Смежные вопросы