为你的CGridView自定义CDataProvider

2010年6月13日 | 分类: PHP | 标签: , ,

在阅读之前,你需要了解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;
}
这个fetchData()方法返回所有的数据给列表。在CAvtiveDataProvider中实现了getCriteria()和setCriteria()方法,然后在fetchData()中使用,这就是CAvtiveDataProvider可以根据查询条件来返回数据库的原因。而这里的fetchData()方法没有使用getCriteria(),仅仅是简单地返回了所有的数据。当然,你可以根据此写复杂一点的。
然后,需要实现fetchKeys()方法
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使用了。

目前还没有任何评论.