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

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

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

在我看来,有两种选择:

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

【问题讨论】:

    标签: php yii2 jquery-select2 jquery-select2-4


    【解决方案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,尝试查找问题出在哪里
      猜你喜欢
      • 2016-01-30
      • 2018-04-22
      • 2016-11-23
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 2019-09-04
      • 1970-01-01
      相关资源
      最近更新 更多