为你的CGridView自定义CDataProvider
在阅读之前,你需要了解CGridView及其使用方式,建议阅读CGridView类文件里面的注释。
CGridView是Yii下的一个展示内容列表的组件,十分适合后台使用(前台比较适合使用CListView)。但是CGridView需要一个DataProvider来提供数据。如果数据来源是ActiveRevord(也就是数据库表),那么可以使用下面的代码来生成一个DataProvider
$dataProvider = new CActiveDataProvider(‘ItemActiveRecord’);
但是,前提是ItemActiveRecord必须是一个CActiveRecord子类。如果我的数据来源是数据库,你们我可以新建一个ItemActiveRecord,但是如果不是的话,这种方法就不行了。但是Yii的代码重用性是我见过的框架中最高的,完全可以自己制作一个DataProvider。下面我就制作一个ModulesDataProvier,主要提供当前的模块列表数据。
首先,需要继承CDataProvider类
class ModulesDataProvider extends CDataProvider
然后需要实现下面的方法
protected function fetchData(){$app = Yii::app();$data = array();
$modules = Yii::app()->getModules();
foreach ($modules as $id=>$module) {$object = $app->getModule($id);$item = array(
‘id’=>$object->getId(),‘primaryKey’=>$object->getId(),‘path’=>$object->getBasePath(),‘name’=>$object->getName(),‘hasConfig’=>is_file($object->getBasePath().DIRECTORY_SEPARATOR.’config’.DIRECTORY_SEPARATOR.’configs.php’),‘hasPermission’=>is_file($object->getBasePath().DIRECTORY_SEPARATOR.’config’.DIRECTORY_SEPARATOR.’permissions.php’),);$data[] = new CAttributeCollection($item);}return $data;}
protected function fetchKeys(){$keys=array();foreach($this->getData() as $i=>$data)$keys[$i]=$data->id;return $keys;}
这个方法返回当前查询出来的所有数据的主键值。
然后是方法
protected function calculateTotalItemCount() {
return count($this->getData());}
这个方法返回数据的总数目,是符合条件的所有数据,而不是符合条件并被查询出来的数据。
这样,一个DataProvider就制作成功了。你可以给CGridView使用了。

