CActiveDataProvider, CArrayDataProvider, CSqlDataProvider做为gridview挂件的数据提供者的使用经验

首先构造测试数据 创建两个表:

--
-- 表的结构 `tbl_user`
--
 
CREATE TABLE IF NOT EXISTS `tbl_user` (
  `uid` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(20) NOT NULL,
  `password` VARCHAR(70) NOT NULL,
  PRIMARY KEY  (`uid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
 
--
-- 转存表中的数据 `tbl_user`
--
 
INSERT INTO `tbl_user` (`uid`, `username`, `password`) VALUES
(1, 'syang', 'syang');
 
-- --------------------------------------------------------
 
--
-- 表的结构 `tbl_userinfo`
--
 
CREATE TABLE IF NOT EXISTS `tbl_userinfo` (
  `infoid` INT(11) NOT NULL AUTO_INCREMENT,
  `nickname` VARCHAR(20) NOT NULL,
  `uid` INT(11) NOT NULL,
  PRIMARY KEY  (`infoid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
 
--
-- 转存表中的数据 `tbl_userinfo`
--
 
INSERT INTO `tbl_userinfo` (`infoid`, `nickname`, `uid`) VALUES
(1, 'Song Yang', 1);

通过gii创建两个模型文件 User.php 和 Userinfo.php
修改User.php,添加关联代码

	public function relations()
	{
		return array(
		    'info'=> array(self::HAS_ONE, 'Userinfo', 'uid')
		);
	}

下面,我们建一个新的控制器,名为TestController.php,代码如下:

<?php
/**
 * Description of TestController
 *
 * @author syang
 */
class TestController extends Controller {
	public function actionIndex() {
 
		//AR数据提供
		$ar_provider = new CActiveDataProvider('User', array(
 
		));
 
		//Sql数据提供
		$sql = "select * from tbl_user, tbl_userinfo where tbl_user.uid=tbl_userinfo.uid";
		$count = User::model()->findBySql($sql)->count();
		$sql_provider = new CSqlDataProvider($sql, array(
		    'keyField'=>'uid',	//必须指定一个作为主键
		    'totalItemCount'=>$count,	//分页必须指定总记录数
		));
 
		//Array数据提供
		$sql = "select * from tbl_user, tbl_userinfo where tbl_user.uid=tbl_userinfo.uid";
		$array_data = Yii::app()->db->createCommand($sql)->queryAll();
		$array_provider = new CArrayDataProvider($array_data, array(
		    'keyField'=>'uid',	//必须指定一个作为主键
		));
 
		$this->render('index', array(
						'ar_provider'=>$ar_provider,
						'sql_provider'=>$sql_provider,
						'array_provider'=>$array_provider
 
					));
	}
}
?>

我们在view下建一个以控制器id命名的目录,如上为test,并在test目录下建立一个index.php的模块文件
代码如下:

<?php
 
echo "AR关联查询,示例:";
 
 $this->widget('zii.widgets.grid.CGridView', array(
 
	'id'=>'ar',
 
	'dataProvider'=>$ar_provider,
 
	'columns'=>array(
 
		'uid',
 
		array('header'=>'用户名', 'name'=>'username'),       //name对应字段名
 
		array('header'=>'密码', 'value'=>'$data->password'),  //用value这样写也可以
 
		'info.infoid',
		array('header'=>'昵称', 'name'=>'info.nickname'),
		//或者这样array('header'=>'昵称', 'value'=>'$data->info->nickname'),
 
		array(
 
			'class'=>'CButtonColumn',
 
		),
 
	),
 
));
 
echo "Sql 查询,示例:";
 
$this->widget('zii.widgets.grid.CGridView', array(
 
	'id'=>'sql',
 
	'dataProvider'=>$sql_provider,
 
	'columns'=>array(
 
		'uid',
 
		array('header'=>'用户名', 'name'=>'username'),
 
		array('header'=>'密码', 'value'=>'$data["password"]'),
 
		'infoid',
 
		array('header'=>'昵称', 'name'=>'nickname'),
 
		array(
 
			'class'=>'CButtonColumn',
 
		    	'viewButtonUrl'=>'Yii::app()->controller->createUrl("view",array("id"=>$data["uid"]))',
 
			'updateButtonUrl'=>'Yii::app()->controller->createUrl("update",array("id"=>$data["uid"]))',
 
			'deleteButtonUrl'=>'Yii::app()->controller->createUrl("delete",array("id"=>$data["uid"]))',
 
		),
 
	),
 
));
 
echo "Array 数据,示例:";
 
$this->widget('zii.widgets.grid.CGridView', array(
 
	'id'=>'array',
 
	'dataProvider'=>$array_provider,
 
	'columns'=>array(
 
		'uid',
 
		array('header'=>'用户名', 'name'=>'username'),
 
		array('header'=>'密码', 'value'=>'$data["password"]'),
 
		'infoid',
 
		array('header'=>'昵称', 'name'=>'nickname'),
 
		array(
 
			'class'=>'CButtonColumn',
 
		    	'viewButtonUrl'=>'Yii::app()->controller->createUrl("view",array("id"=>$data["uid"]))',
 
			'updateButtonUrl'=>'Yii::app()->controller->createUrl("update",array("id"=>$data["uid"]))',
 
			'deleteButtonUrl'=>'Yii::app()->controller->createUrl("delete",array("id"=>$data["uid"]))',
 
		),
 
	),
 
)); ?>

总结:上面的示例演示了,使用CActiveDataProvider, CArrayDataProvider, CSqlDataProvider的例子
最简单的就是使用CActiveDataProvider,其他两个,在使用gridview挂件时,需要稍微修改一下,因为gridview原有button列上的连接使用的是$data->这种对象的方式
由于sql与array返回的数据都是数组,所以后面的地方改成数组就可以了。本例还演示了模型关联时使用CActiveDataProvider与gridview的列子。读者可以反复测试体会Yii的强大功能。

发表评论

电子邮件地址不会被公开。 必填项已用*标注