如何在Yii2中使用kartik-export组件处理数组格式模型数据
我在控制器里写了这段查询代码,直接返回数组格式的查询结果:
$dataPendaftar = Pendaftar::find() ->select(['pendaftar.*','user.*']) ->from('pendaftar') ->leftJoin('user', 'user.id=pendaftar.id_user_pendaftar') ->asArray() ->all(); return $this->render('index', [ 'dataPendaftar' => $dataPendaftar, ]);
然后在视图里尝试用Kartik的yii2-export组件的ExportMenu小部件:
$gridColumns= [ 'nik_pendaftar', 'tanggal_lahir', 'email', ]; echo ExportMenu::widget([ 'dataProvider' => $dataPendaftar, 'columns' => $gridColumns, 'fontAwesome' => true, ]);
结果触发了错误:
Call to a member function getModels() on array
想问问能不能用数组格式的模型数据替代dataProvider来使用这个导出组件?
解答
当然可以,但得先搞清楚为啥报错:ExportMenu的dataProvider参数要求的是实现了yii\data\DataProviderInterface的实例(比如ActiveDataProvider),而不是直接传数组——它内部会调用getModels()方法来获取数据,数组自然没有这个方法,所以才会报错。
这里给你两种可行的解决思路:
方法1:改用ActiveDataProvider(推荐)
既然你已经有AR查询了,直接把查询对象传给ActiveDataProvider就行,不用手动转数组,ExportMenu能完美兼容:
控制器修改:
$query = Pendaftar::find() ->select(['pendaftar.*','user.*']) ->from('pendaftar') ->leftJoin('user', 'user.id=pendaftar.id_user_pendaftar'); $dataProvider = new \yii\data\ActiveDataProvider([ 'query' => $query, // 如果需要分页或排序,这里可以配置,比如: // 'pagination' => ['pageSize' => 20], ]); return $this->render('index', [ 'dataProvider' => $dataProvider, ]);
视图修改:
直接把dataProvider传进去就行,不用改columns:
$gridColumns= [ 'nik_pendaftar', 'tanggal_lahir', 'email', ]; echo ExportMenu::widget([ 'dataProvider' => $dataProvider, 'columns' => $gridColumns, 'fontAwesome' => true, ]);
这种方式更符合Yii2的最佳实践,还能顺便用上分页、排序这些功能,推荐优先用这个。
方法2:把数组转成ArrayDataProvider(如果一定要用数组的话)
如果你因为某些原因必须用数组数据,那可以把数组包装成ArrayDataProvider实例,它同样实现了DataProvider接口,ExportMenu能识别:
控制器修改(如果还是要返回数组的话):
$dataPendaftar = Pendaftar::find() ->select(['pendaftar.*','user.*']) ->from('pendaftar') ->leftJoin('user', 'user.id=pendaftar.id_user_pendaftar') ->asArray() ->all(); // 把数组包装成ArrayDataProvider $dataProvider = new \yii\data\ArrayDataProvider([ 'allModels' => $dataPendaftar, // 可选:配置分页或排序 // 'pagination' => ['pageSize' => 10], ]); return $this->render('index', [ 'dataProvider' => $dataProvider, ]);
视图代码不变:
还是原来的ExportMenu代码,直接传dataProvider就行。
两种方法都能解决你的报错问题,建议优先用第一种,更贴合Yii2的设计思路~
内容的提问来源于stack exchange,提问作者eniac05
相关产品推荐
相关产品推荐

