`
hudeyong926
  • 浏览: 2016043 次
  • 来自: 武汉
社区版块
存档分类
最新评论

YII 分页排序

 
阅读更多

'defaultOrder'=>array('title' => false), false是升序,true是倒叙

1.自定义分页

使用CPagination呈现相关信息到页码. 当数据需要渲染到多页时,我们可能使用去呈现信息,诸如itemCount, pageSize, currentPage,等等. 这些信息被传递到pagers

//某一页的记录列表
public function getPagerList($modelClass, $page = 1, $where = '')
{
    $pageSize = Yii::app()->params['pagesize'];
    $offset = ($page - 1) * $pageSize;
    
    $sql = $this->_listSql($modelClass, $where, '*');
    $command = Yii::app()->db->createCommand($sql . " LIMIT :offset,:limit");
    $command->bindValue(':offset', $offset);
    $command->bindValue(':limit', $pageSize);
    return $command->queryAll();
}

private function _listSql($modelClass, $where, $field = 'COUNT(*)')
{
    $sql = "SELECT $field FROM " . CActiveRecord::model($modelClass)->tableSchema->name;
    if ($where) $sql .= " WHERE {$where}";
    return $sql;
}
//记录总数
public function getCount($modelClass, $where = "")
{
    $sql = $this->_listSql($modelClass, $where);
    return Yii::app()->db->createCommand($sql)->queryScalar();
}

$pages = new CPagination($count);              
$pages->pageSize = 4;
//$pages->setCurrentPage($page-1);
$pdata =Yii::app()->db->createCommand($sql." LIMIT :offset,:limit");
$pdata->bindValue(':offset', $pages->getOffset();
$pdata->bindValue(':limit', $pages->getLimit());
$info = $pdata->queryAll();

CActiveDataProvider不使用分页,取所有记录

$model = Orders::model();
if (isset($_GET['Orders'])) {
    $model->attributes = $_GET['Orders'];
}
$dataProvider = $model->search();
$dataProvider->setPagination(false); //禁用分页
$listAll = $dataProvider->getData();

PostController.php

function actionIndex()
{
    $criteria = new CDbCriteria();
    $criteria->compare("log_id", ">0");
    $count = Ipad3SerialNumber::model()->count($criteria);

    $pages = new CPagination($count);
    // elements per page  
    $pages->pageSize = 2;
    $pages->applyLimit($criteria);

    // sorting  
    $sort = new CSort('Ipad3SerialNumber');
    $sort->attributes = array(
        'title',
    );
    $sort->defaultOrder = array('get_time' => true);
    $sort->applyOrder($criteria);

    $models = Ipad3SerialNumber::model()->findAll($criteria);
    $this->render('list', array(
        'models' => $models,
        'pages' => $pages,
        'sort' => $sort,
    ));
}

 view

<?php
<p><?php echo $sort->link('id')?></p>
<p><?php echo $sort->link('title')?></p>
<ol>
<?php foreach($models as $model):?>
<li>
<h2><?php echo $model->id?> - <?php echo $model->title?></h2>
</li>
<?php endforeach?>
</ol>
<?php $this->widget('CLinkPager', array(
	'pages' => $pages,
	'header'=>''
));
$this->widget('CListPager', array(  
	'pages'=>$pages, 
	'header'=>'-'
));
?>

点击$sort的link可以动态排序

 

2系统也有封装的分页 ,排序GRIDView 覆盖public $pager = 'CardPager'属性和renderPager()方法

enableSorting=false全部禁用排序,单列禁用排序sortable =false,enablePagination=false

public function actionAR(){
	/****用法一:*****/
	$criteria = new CDbCriteria();  
	$criteria->compare('serviceType',$arr);
	$dataProvider=new CActiveDataProvider('Post',array(
		'criteria' => $criteria,
	));

	/****用法二:*****/
	$dataProvider=new CActiveDataProvider('Post', array(
		/*'criteria'=>array(
			'condition'=>'status=1 AND tags like :tags',
			'params'=>array(':tags'=>$_GET['tags']),
			'order'=>'create_time DESC',
			'with'=>array('author'),
		),*/
		'pagination'=>array(
			'pageSize'=>100,
		),
		'sort'=>array(
			'defaultOrder'=> array('title'=>true),
		),
	));
	$this->render('index', array(
		'dataProvider' => $dataProvider,
	));
}

public function actionArray(){ //推荐不用,数组大内存溢出
	$rawData= array(array(
		'name'=>'István Beregszászi',
		'duty'=>'core framework development',
		'active'=>false,
	));
    //$rawData=Yii::app()->db->createCommand($sql)->queryAll();
	$dataProvider = new CArrayDataProvider($rawData, array(
		'sort'=>array(
			'attributes'=>array('name', 'id', 'active'),
			'defaultOrder'=>array('active' => true, 'name' => false),
		),
		'pagination'=>array(
			'pageSize'=>10,
		),
	));
	$this->render('index', array(
		'dataProvider' => $dataProvider,
	));
}

public function actionSQL(){
	$count = Yii::app()->db->createCommand('SELECT COUNT(*) FROM film')->queryScalar();
	$sql = 'SELECT film_id,title FROM film';
	$dataProvider=new CSqlDataProvider($sql,array(
		'keyField'=>'film_id',  //sql in select table column default id
		'totalItemCount'=>$count,
		'sort'=>array(
			'attributes'=>array('title'), //sql table columns
			'defaultOrder'=>array('title' => true),
		),
		'pagination'=>array(
			'pageSize'=>100,
		),
	));
	$this->render('index', array(
		'dataProvider' => $dataProvider,
	));
}

 view

<?php foreach($dataProvider->data as $film):?>
<?php echo $film->title?>
<?php endforeach?>
<?php $this->widget('CLinkPager',array('pages'=>$dataProvider->pagination))?>

也可以套CGridView(推荐) summaryText,{summary}自定义总计信息

<?php
$this->widget('zii.widgets.grid.CGridView', array(
	'dataProvider'=>$dataProvider,
	'template'=>'{items}{summary}{pager}',
	'summaryText'=>"第{start}-{end}条, 共 {count} 条,页数:{page}/{pages}页",
	'columns'=>array(
		array(  
			'name' => 'title',   
			'header' => '订单号', 
			'value'=>'$data[title]',  //if is_array
		)  
	),
));?>

<?php $this->widget('application.components.widgets.grid.GridView', array(
    'dataProvider'=>$dataProvider,
    'template' => "{pager}",
)); ?>

3分页扩展

mypager是 一个非常简单的 扩展 结合在一个 CListPager CLinkPager 允许 用户选择 他们想要 或者 点击 一个页面 按钮 CLinkPager 选择 下拉列表中 页面 CListPager CGridView
CLinkPager首页,末页CSS默认不显示
/**
 * Hide first and last buttons by default.
 */
ul.yiiPager .first,
ul.yiiPager .last
{
	display:none;
}

 

<?php $this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'customer-grid',
	'dataProvider'=>$model->search(),
	'pager'=>array(
		//'class'=>'CLinkPager', //LinkListPager
		'maxButtonCount'=>8,
		'firstPageLabel'=>'首页',
		'lastPageLabel'=>'末页',
		'nextPageLabel'=>'下一页',
		'prevPageLabel'=>'上一页',
		'header'=>'',
		'cssFile'=>false,    //如果使用主css文件,那么这里可以写false,如果使用其它附加css文件,我们这里填写css文件名。
	), 
));?>
视图的代码
<ul class="pagination">
    <?php
    $firstPage = '<li class="hidden-xs">'.CHtml::link('1', array('', 'page'=>1)).'</li>';
    $lastPage = '<li>'.CHtml::link($pageCount, array('', 'page'=>$pageCount)).'</li>';
    $prevPage = '<li>'.CHtml::link('上一页', array('', 'page'=>$currentPage-1)).'</li>';
    $nextPage = '<li>'.CHtml::link('下一页', array('', 'page'=>$currentPage+1)).'</li>';
    $morePage = '<li class="disabled hidden-xs"><span>...</span></li>';

    if($currentPage > 1)
        echo $prevPage;

    if($currentPage > 3)
        echo $firstPage.$morePage;

    for($i = $currentPage-2; $i <= $currentPage+2; $i++) {

        $liStr = '<li class="hidden-xs">'.CHtml::link($i, array('', 'page'=>$i)).'</li>';
        if($i<1 || $i>$pageCount)
            $liStr = '';

        if($currentPage == $i)
            $liStr = '<li class="active">'.CHtml::link($i.' <span class="sr-only">(current)</span>',
                    array('', 'page'=>$i)).'</li>';

        echo $liStr;
    }

    if($currentPage < $pageCount-2)
        echo $morePage;

    if($currentPage < $pageCount)
        echo $nextPage;
    ?>
</ul>
 
 
 
分享到:
评论
1 楼 2007lf 2012-04-18  
感谢博主,很受用。

相关推荐

    yii框架使用分页的方法分析

    本文实例讲述了yii框架使用分页的方法。分享给大家供大家参考,具体如下: yii中使用分页很方便,如下两种方法: 在控制器中: 1、 $criteria = new CDbCriteria(); //new cdbcriteria数据库 $criteria-&gt;id = 'id...

    Yii2中文手册(中文教程完整版)

    待定中 排序(Sorting) 编撰中 数据提供器 编撰中 数据小部件 编撰中 主题 安全 编撰中 认证(Authentication) 编撰中 授权(Authorization) 编撰中 处理密码 待定中 客户端认证 待定中 安全领域的最佳实践 缓存 ...

    Yii2.0小部件GridView(两表联查/搜索/分页)功能的实现代码

    当我们在一个网格视图中显示活动数据的时候,你可能会遇到这种情况,就是显示关联表的列的值,为了使关联列能够排序,你需要连接关系表,以及添加排序规则到数据提供者的排序组件中,对数据进行搜索,排序。...

    Yii CGridView用法实例详解

    它支持排序,分页,和AJAX数据请求。 CGridView最好使用 data provider,最好是 CActiveDataProvider 。 简单代码如下: $dataProvider=new CActiveDataProvider('Post'); $this-&gt;widget('zii.widgets.grid....

    PHP工作笔记.zip

    [第一例 留言板][第二例 WebUpload文件上传][第三例 UEditor文本编辑器][第四例 验证码][第五例 ThinkPHP自定义分页模板][第六例 加密...容器使用][四四例 打印工具][四五例 配置云服务器解析域名][四六例 Yii2的Gii]

    基于FMDB数据库操作类PYFMDB.zip

    //取第一页,每页10条按条件查询数据,指定字段,设置分页,设置排序,返回结果为NSArray 排序中 desc 代表 降序,asc代表升序 单个字段排序 如 id desc 多个字段排序 如 id,wheel ascNSString *where = @"name='...

    (全)传智播客PHP就业班视频完整课程

    选择排序 插入排序 快速排序 8-24 4.顺序查找 二分查找 8-24 5.多维数组 数组作业评讲② 8-24 6.数组作业评讲③ 8-24 7.类与对象的基本概念 8-26 1.成员属性 如何创建对象 8-26 2.对象在内存中存在形式 函数传递对象...

    史上最全韩顺平传智播客PHP就业班视频,10月份全集

    选择排序 插入排序 快速排序 8-24 4.顺序查找 二分查找 8-24 5.多维数组 数组作业评讲② 8-24 6.数组作业评讲③ 8-24 7.类与对象的基本概念 8-26 1.成员属性 如何创建对象 8-26 2.对象在内存中存在形式 函数传递对象...

    韩顺平PHP JS JQUERY 所有视频下载种子 货真价实

    选择排序 插入排序 快速排序 8-24 3.选择排序 插入排序 快速排序 8-24 4.顺序查找 二分查找 8-24 5.多维数组 数组作业评讲② 8-24 6.数组作业评讲③ 8-24 7.类与对象的基本概念 8-26 1.成员属性 如何创建对象 8-26 2...

    史上最全传智播客PHP就业班视频课,8月份视频

    选择排序 插入排序 快速排序 8-24 4.顺序查找 二分查找 8-24 5.多维数组 数组作业评讲② 8-24 6.数组作业评讲③ 8-24 7.类与对象的基本概念 8-26 1.成员属性 如何创建对象 8-26 2.对象在内存中存在形式 函数传递对象...

    史上最全韩顺平传智播客PHP就业班视频,9月份全集

    选择排序 插入排序 快速排序 8-24 4.顺序查找 二分查找 8-24 5.多维数组 数组作业评讲② 8-24 6.数组作业评讲③ 8-24 7.类与对象的基本概念 8-26 1.成员属性 如何创建对象 8-26 2.对象在内存中存在形式 函数传递对象...

    gridview:从结果集创建表

    受 Yii 的 CGridView 的启发,这个类力求成为一种从数组生成表的简单方法,即; 一个数据库结果集。 它适用于数组数组或对象数组。 您决定要显示哪些数组列或对象属性。 它不会重写查询或处理分页,这取决于您。 ...

Global site tag (gtag.js) - Google Analytics