如何将 ActiveDataProvider 与 select2 一起使用?

Posted

技术标签:

【中文标题】如何将 ActiveDataProvider 与 select2 一起使用?【英文标题】:How to use ActiveDataProvider with select2? 【发布时间】:2015-12-13 08:06:22 【问题描述】:

我正在尝试将 jquery-select2(加载远程数据)插件与 Yii2 搜索模型一起使用。截至目前,我的控制器返回从搜索模型创建的 $dataProvider。但是,它显然不是 select2 可以用来创建下拉菜单的格式。

我需要对 $dataProvider 或 select2 做什么才能让两者协同工作?

在我看来,有两种选择:

    从 $dataProvider 中提取“cat_name”并将其放入 select2 可以使用的格式。 教 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);

    

脚本方面

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,
  );   
);

【讨论】:

【参考方案2】:

尝试从模型中提取您需要的列

 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); 

   

【讨论】:

我试过了,但结果是空的。 尝试不带json_encode返回,尝试或var_dump $cat_name的值,$dataProvider->models,尝试查找问题出在哪里

以上是关于如何将 ActiveDataProvider 与 select2 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

yii2从ActiveDataProvider中删除模型

Yii2 - ActiveDataProvider试图获取非对象的属性

PHPYii2使用ActiveDataProvider超出页码一直展示最后一页的解决方案源码分析亲测有效

如何将原始 SQL 转换为 Yii2,如查找查询

Yii2 如何在不使用 all()、one() 或其他执行方法的情况下在新查询中设置数据库配置?

yii2GridView的简单使用