Yii的两种分页方法(模型层Model&&SQL语句)分页的样式

  •   
  • 4277
  • PHP
  • 6
  • super_dodo
  • 2014/08/21

分页类已经成为了每个网站开发所必须的类了,Yii也提供了非常好的分页类。稍加改进,则可以展示优美的界面效果和功能了。

第一种方法:主要借助model里面的一些方法,包括查询和等.直接上代码。

// 查询列表--带分页的
public function getList($model, $isAll = false) {
	$request = Yii::app()->request;						//请求
	$pager = new CPagination();							//实例化分页类
	$data = array('list'=>array(), 'pager'=>array());	//组装两个数组,列表和分页的信息
	$data['filter'] = $model->getFilter($model->attributes, $isAll);	//得到查询的数组,可返回前端,提供默认选中
	$criteria = $model->getCriteria($data['filter']);		//查询的条件

	$page = max($request->getParam('page', 0), 1);
	$count = $model->count($criteria);
	if($count == 0) return $data;
	$uPageSize = $request->getParam('uPageSize',null);	//获取页面传递的分页单条的记录数
	if(!empty($uPageSize)){								//如果前端传递了分页参数,则采用用户自定义
		$pager->pageSize = intval($uPageSize);
	}else{												//如果前端未传递分页参数,则采用系统默认配置20条
		$pager->pageSize = '20';
	}
	$pageCount = ceil($count / $pager->pageSize);
	$page = min($page, $pageCount);
	$criteria->offset = ($page - 1) * $pager->pageSize;
	$criteria->limit = $pager->pageSize;

	$list = $model->findAll($criteria);
	$data['pager'] = array(
		'page'=>$page,
		'count'=>$count,
		'pageCount'=>$pageCount
	);
	$data['list'] = $list;
	return $data;
}

//使用的方法
//控制器里面
$data = $this->getList(PostList::model());
echo '<pre>';
print_r($data);
//$this->render('index', array('data' => $data));
//模型层
// 过滤器
public function getFilter() {
	$request = Yii::app()->request;
	$filter = $this->attributes;
	foreach($this->attributes as $key => $val) {
		$filter[$key] = $request->getParam($key, null);
	}
	return $filter;
}

// 筛选器
public function getCriteria($filter) {
	$criteria=new CDbCriteria;
	foreach($this->attributes as $key => $val) {
		$fuzzy = in_array($key, array('name'));
		if($filter[$key] !== null) $criteria->compare($key, $filter[$key], $fuzzy);
	}
	$criteria->order = ' sort DESC,id DESC';
	return $criteria;
}

第二种:有些时候需要连表查询或者一些其他的查询,用sql比较好处理的时候,可以直接使用sql语句进行分页的查询。

// 查询列表-通过传入的sql语句
public function getListBySql($sql,$uPageSize='10') {
	$request = Yii::app()->request;
	$data = array('list'=>array(), 'pager'=>array());
	$result = Yii::app()->db->createCommand($sql)->query();
	if($result->rowCount == '0') return $data;
	$pager = new CPagination($result->rowCount);
	$page = max($request->getParam('page', 0), 1);		//前端传来的当前页码
	if(!empty($uPageSize)){								//如果前端传递了分页参数,则采用用户自定义
		$pager->pageSize = intval($uPageSize);
	}else{												//如果前端未传递分页参数,则采用系统默认配置20条
		$pager->pageSize = '10';
	}
	$models =Yii::app()->db->createCommand($sql.' LIMIT :offset, :limit');
	$models->bindValue(':offset', ($page - 1) * $pager->pageSize);
	$models->bindValue(':limit', $pager->pageSize);
	$pageCount = ceil($result->rowCount / $pager->pageSize);
	$data['pager'] = array(
		'page'=>$page,
		'count'=>$result->rowCount,
		'pageCount'=>$pageCount
	);
	if($page > $pageCount){
		$data['list'] = '';
	}else{
		$data['list'] = $models->queryAll();	
	}
	return $data;
}

//使用方法
$sql = "SELECT * FROM post_list WHERE {$where} ORDER BY id DESC ";
$data = $this->getListBySql($sql);
echo '<pre>';
print_r($data);

建议把以上两个方法放在你的基础controller里面。这样你在控制器里面 直接调用即可。。

分页类的界面和样式请移步 http://www.dodobook.net/php/804 点击进入查看

别惹我,我疯起来连我自己都打!