YII 分页和YII排序详解

jerry Yii 2015年08月12日 收藏
//某一页的记录列表  
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)->tableName();  
    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();  
PostController.php
<?php  
class PostController extends Controller  
{  
    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(    
            'number',  
            'get_time'    
        );  
        $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  
        )    
    ),  
));?>

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文件名。  
    ),   
));?>