yii 10种分页

一、

  1. class LinkPage extends CLinkPager  
  2. {  
  3.     public function run()  
  4.     {  
  5.         $pageLinks = $this->createPagePreAndNext();  
  6.         $topPage = CHtml::tag('div'array('class'=>'topPage'), $pageLinks);  
  7.         $form = $this->createForm();  
  8.         $toPage = CHtml::tag('div'array('class'=>'toPage'), $form);  
  9.         echo CHtml::tag('div'array('class'=>'page'), $topPage.$toPage);  
  10.     }  
  11.     /** 
  12.      * @desc 创建向前和向后的链接 
  13.      * @return string a标签和span标签的html代码 
  14.      */  
  15.     private function createPagePreAndNext()  
  16.     {  
  17.         $links = '';  
  18.         if ($this->pages->getCurrentPage()>=1) {  
  19.             $links .= CHtml::link($this->prevPageLabel, $this->createPageUrl($this->pages->getCurrentPage()-1), array('class'=>'prePage'));  
  20.         } elseif (0 == $this->pages->getCurrentPage()) {  
  21.             $links .= CHtml::tag('span'array('class'=>'prePage'), $this->prevPageLabel);  
  22.         }  
  23.         $links .= CHtml::tag('span'array('class'=>'pageNum'), $this->pages->getCurrentPage()+1 . '/' . ($this->pages->getPageCount()?$this->pages->getPageCount():1));  
  24.         if ($this->pages->getCurrentPage()+1 < $this->pages->getPageCount()) {  
  25.             $links .= CHtml::link($this->nextPageLabel, $this->createPageUrl($this->pages->getCurrentPage()+1), array('class'=>'pgNxt'));  
  26.         } elseif($this->pages->getCurrentPage()+1 >= $this->pages->getPageCount()) {  
  27.             $links .= CHtml::tag('span'array('class'=>'pgNxt'), $this->nextPageLabel);  
  28.         }  
  29.         return $links;  
  30.     }  
  31.     /** 
  32.      * @desc 创建跳转表单 
  33.      * @return string form的html代码 
  34.      */  
  35.     private function createForm()  
  36.     {  
  37.         $form = '';  
  38.         $url = $this->createPageUrl(0);  
  39.         $form .= CHtml::beginForm($url'get');  
  40.         $form .= CHtml::tag('span'array(), '跳转到');  
  41.         $form .= CHtml::textField('page'''array('class'=>'pageIn'));  
  42.         $form .= CHtml::tag('span'array(), '页');  
  43.         $form .= CHtml::tag('input'array('type'=>'submit''class'=>'pageSubBtn''value'=>'确定'));  
  44.         $form .= CHtml::endForm();  
  45.         return $form;  
  46.     }  
  47.     /** 
  48.      * @desc 创建分页url链接 
  49.      * @param int $page  链接指向的页数 
  50.      * @return string   url链接 
  51.      */  
  52.     public function createPageUrl($page)  
  53.     {  
  54.         if (is_null($this->pages->params)) {  
  55.             $this->pages->params = $_GET;  
  56.             foreach($this->pages->params as $key=>$value){  
  57.                 if (stripos($key'/') || stripos($key'\\')) {//去掉键中包含有 / 或者 \ 的param  
  58.                     unset($this->pages->params[$key]);  
  59.                 }  
  60.             }  
  61.         }  
  62.         return $this->pages->createPageUrl($this->getController(), $page);  
  63.     }  

二、

  1. class ListLinkPage extends CLinkPager  
  2. {  
  3.     public $listNum = 8;  
  4.     public $pageArr = array();  
  5.     public $startPage;  
  6.     public $endPage;  
  7.     public function run()  
  8.     {  
  9.         $this->listArr();  
  10.         $code  = $this->makeListHtml();  
  11.         $code .= $this->makePrevAndNext();  
  12.         echo $code;  
  13.     }  
  14.     public function getListNum()  
  15.     {  
  16.         return $this->listNum;  
  17.     }  
  18.     public function setListNum($num)  
  19.     {  
  20.         is_numeric($num) && $this->listNum = intval($num);  
  21.     }  
  22.     /** 
  23.      * 计算链接的起始和结束位置 
  24.      */  
  25.     private function listArr()  
  26.     {  
  27.         //计算数字下标,当前页标之前需要显示多少个下标 和  当前页标之后需要显示多少个下标  
  28.         $back    = ceil(($this->listNum - 1)/2);  
  29.         $pageNow = $this->pages->getCurrentPage() + 1;  
  30.         $count   = $this->pages->getPageCount();  
  31.         $this->endPage   = ($pageNow+$back>$count)?$count:$pageNow+$back;  
  32.         $this->startPage = ($pageNow+$back>$count)?(($count-$this->listNum)<1?1:($count-$this->listNum+1)):(($pageNow-$back+(($this->listNum%2)^1))<1?1:($pageNow-$back+(($this->listNum%2)^1)));  
  33.         ($this->endPage-$this->startPage < $this->listNum - 1) && $this->endPage = $this->listNum - $this->startPage + 1;  
  34.     }  
  35.     /** 
  36.      * 生成上一页和下一页的html代码 
  37.      */  
  38.     private function makePrevAndNext()  
  39.     {  
  40.         $htmlcode = '';  
  41.         (($this->pages->getCurrentPage()<=0) && ($htmlcode .= CHtml::tag('span'array(), $this->prevPageLabel))) || ($htmlcode .= CHtml::link($this->prevPageLabel, ''array()));  
  42.         (($this->pages->getCurrentPage()+1 < $this->pages->getPageCount()) && ($htmlcode .= CHtml::link($this->nextPageLabel, ''array()))) || ($htmlcode .= CHtml::tag('span'array(), $this->nextPageLabel));  
  43.         return $htmlcode;  
  44.     }  
  45.     /** 
  46.      * 生成列表链接的html代码 
  47.      * @return string 
  48.      */  
  49.     private function makeListHtml()  
  50.     {  
  51.         $htmlCode = '';  
  52.         for($step=$this->startPage;$step<=$this->endPage;$step++){  
  53.             (($step == $this->pages->getCurrentPage()+1) && ($htmlCode .= CHtml::tag('strong'array(), $step))) || ($htmlCode .= CHtml::link($step''array()));  
  54.         }  
  55.         return $htmlCode;  
  56.     }  

三、

  1. class pageList extends CLinkPager  
  2. {  
  3.     private $signEmBefore= false;  
  4.     private $signEmAfter = false;  
  5.     private $pageStart;  
  6.     private $pageEnd;  
  7.     private $pageNow;  
  8.     private $pageCount;  
  9.     private $pageShowCount=7;  
  10.     private $pagePosition=3;  
  11.   
  12.     public function run()  
  13.     {  
  14.         $this->pageNow = $this->pages->getCurrentPage()+1;  
  15.         $this->pageCount = $this->pages->getPageCount();  
  16.         0==$this->pagePosition && $this->pagePosition = 1;  
  17.         if ($this->pagePosition >= $this->pageShowCount) {  
  18.             echo '参数设置不合理';  
  19.             return ;  
  20.         }  
  21.         $this->makeSign();  
  22.         echo $this->makeHtml();  
  23.     }  
  24.     /** 
  25.      * 计算标记位置 
  26.      */  
  27.     public function makeSign()  
  28.     {  
  29.         if ($this->pageCount>$this->pageShowCount) {  
  30.             $this->pageStart = $this->pageNow-$this->pagePosition+1;  
  31.             ($this->pageStart < 2 && $this->pageStart = 2) || $this->signEmBefore = true;  
  32.             $this->pageEnd   = $this->pageShowCount+$this->pageStart-3;  
  33.             ($this->pageEnd >= $this->pageCount-1 && $this->pageEnd = $this->pageCount-1) || $this->signEmAfter = true;  
  34.             ($this->pageEnd-$this->pageShowCount+3 >= 2) && $this->pageStart = $this->pageEnd-$this->pageShowCount+3;  
  35.         } else {  
  36.             $this->pageEnd = $this->pageCount-1;  
  37.             $this->pageStart = 2;  
  38.         }  
  39.     }  
  40.     /** 
  41.      * 生成分页代码 
  42.      * @return [type] [description] 
  43.      */  
  44.     private function makeHtml()  
  45.     {  
  46.         $html = '';  
  47.         $html .= CHtml::tag('div'array('class'=>'page'), false);  
  48.         $html .= CHtml::tag('div'array('class'=>'topPage'), false);  
  49.         $html .= $this->makeLinkHtml();  
  50.         $html .= CHtml::closeTag('div');  
  51.         $html .= CHtml::tag('div'array('class'=>'toPage'), false);  
  52.         $html .= $this->createForm();  
  53.         $html .= CHtml::closeTag('div');  
  54.         $html .= CHtml::closeTag('div');  
  55.         return $html;  
  56.     }  
  57.     /** 
  58.      * 生成html代码 
  59.      * @return string 分页代码 
  60.      */  
  61.     public function makeLinkHtml()  
  62.     {  
  63.         $htmlCode = '';  
  64.         if (1==$this->pageNow) {  
  65.             $htmlCode .= CHtml::tag('span'array('class'=>'prePage'), $this->prevPageLabel);  
  66.             $htmlCode .= CHtml::tag('div'array('class'=>'pagaNumBox'), false);  
  67.             $htmlCode .= CHtml::tag('strong'array(), 1);  
  68.         } else {  
  69.             $htmlCode .= CHtml::link($this->prevPageLabel, $this->createPageUrl($this->pageNow-1), array('class'=>'prePage'));  
  70.             $htmlCode .= CHtml::tag('div'array('class'=>'pagaNumBox'), false);  
  71.             $htmlCode .= CHtml::link(1, $this->createPageUrl(1), array());  
  72.         }  
  73.         if ($this->signEmBefore) {  
  74.             $htmlCode .= CHtml::tag('em'array(), '...');  
  75.         }  
  76.         for($step=$this->pageStart;$step<=$this->pageEnd;$step++){  
  77.             if ($step==$this->pageNow) {  
  78.                 $htmlCode .= CHtml::tag('strong'array(), $step);  
  79.             } else {  
  80.                 $htmlCode .= CHtml::link($step$this->createPageUrl($step), array());  
  81.             }  
  82.         }  
  83.         if ($this->signEmAfter) {  
  84.             $htmlCode .= CHtml::tag('em'array(), '...');  
  85.         }  
  86.         if ($this->pageCount==$this->pageNow) {  
  87.             $this->pageEnd>0 && $htmlCode .= CHtml::tag('strong'array(), $this->pageCount);  
  88.             $htmlCode .= CHtml::closeTag('div');  
  89.             $htmlCode .= CHtml::tag('span'array('class'=>'pgNxt'), $this->nextPageLabel);  
  90.         } else {  
  91.             $this->pageEnd>0 && $htmlCode .= CHtml::link($this->pageCount, $this->createPageUrl($this->pageCount), array());  
  92.             $htmlCode .= CHtml::closeTag('div');  
  93.             $htmlCode .= CHtml::link($this->nextPageLabel, $this->createPageUrl($this->pageNow+1), array('class'=>'pgNxt'));  
  94.         }  
  95.         return $htmlCode;  
  96.     }  
  97.     /** 
  98.      * @desc 创建跳转表单 
  99.      * @return string form的html代码 
  100.      */  
  101.     private function createForm()  
  102.     {  
  103.         $form = '';  
  104.         $url = $this->createPageUrl(0);  
  105.         $form .= CHtml::beginForm($url'get');  
  106.         $form .= CHtml::tag('span'array(), '跳转到');  
  107.         $form .= CHtml::textField('page'''array('class'=>'pageIn'));  
  108.         $form .= CHtml::tag('span'array(), '页');  
  109.         $form .= CHtml::tag('input'array('type'=>'submit''class'=>'pageSubBtn''value'=>'确定'));  
  110.         $form .= CHtml::endForm();  
  111.         return $form;  
  112.     }  
  113.     /** 
  114.      * @desc 创建分页url链接 
  115.      * @param int $page  链接指向的页数 
  116.      * @return string   url链接 
  117.      */  
  118.     protected function createPageUrl($page)  
  119.     {  
  120.         if (is_null($this->pages->params)) {  
  121.             $this->pages->params = $_GET;  
  122.             foreach($this->pages->params as $key=>$value){  
  123.                 if (stripos($key'/') || stripos($key'\\')) {//去掉键中包含有 / 或者 \ 的param  
  124.                     unset($this->pages->params[$key]);  
  125.                 }  
  126.             }  
  127.         }  
  128.         return $this->pages->createPageUrl($this->getController(), --$page);  
  129.     }  

第一种:CListView分页  针对对象形式的数据分页Controller:代码如下:

第一种:CListView分页  针对对象形式的数据分页


Controller:
代码如下:


  
  
  1. public function actionAjax() { 
  2.         $criteria = new CDbCriteria(); 
  3.         //$criteria->order = 'news_id DESC'; 
  4.         $criteria->condition = 'user_id = 1'; 
  5.   
  6.         $dataProvider = new CActiveDataProvider('News', array( 
  7.                     'pagination' => array( 
  8.                         'pageSize' => Yii::app()->params['pagesize'], 
  9.                         'pageVar' => Yii::app()->params['pagevar'], 
  10.                     ), 
  11.                     'criteria' => $criteria, 
  12.                 )); 
  13.   
  14.   
  15.         $this->render('view', array( 
  16.             'dataProvider' => $dataProvider, 
  17.         )); 
  18. }
复制

View:
代码如下:


  
  
  1. <?php 
  2. $this->widget('zii.widgets.CListView', array( 
  3.     'dataProvider' => $dataProvider, //数据 
  4.     'itemView' => '_view', //显示的模版 
  5.     'id' => Yii::app()->controller->id, 
  6.     'itemsTagName' => 'ul', 
  7.     'ajaxVar' => '', //默认为page或ajax 去掉后url更简洁 
  8.     'htmlOptions' => array('class' => Yii::app()->controller->id), 
  9.     'loadingCssClass' => 'loading', //默认为list-view-loading 
  10.     //'template' => '{summary}{sorter}{items}{pager}',//显示的顺序 
  11.     //'ajaxUpdate' => false, //是否ajax分页  false或分页显示的容器id 
  12.     //'beforeAjaxUpdate' => 'before_ajax_update',   //回调函数 在common.js里完成 
  13.     //'afterAjaxUpdate' => 'after_ajax_update',   
  14.     'emptyText' => 
  15. <DIV class="alert alert-waning"> 
  16.     暂无数据! 
  17. </DIV> 
  18. ', //无数据时显示内容 
  19.                     'pagerCssClass' => 'pagination', //分页的class 
  20.                     'pager' => array( 
  21.                         'selectedPageCssClass' => 'active', //当前页的class 
  22.                         'hiddenPageCssClass' => 'disabled', //禁用页的class 
  23.                         'header' => '', //分页前显示的内容 
  24.                         'maxButtonCount' => 10, //显示分页数量 
  25.                         'htmlOptions' => array('class' => ''), 
  26.                         'firstPageLabel' => '首页', 
  27.                         'nextPageLabel' => '下一页', 
  28.                         'prevPageLabel' => '上一页', 
  29.                         'lastPageLabel' => '末页', 
  30.                     ), 
  31.                 )); 
  32. ?>
复制


第二种:CLinkPager  针对数组形式的数据分页


Controller:
代码如下:


  
  
  1. public function actionIndex() { 
  2.   
  3.         $criteria = new CDbCriteria(); 
  4.         $criteria->order = 'news_id DESC'; 
  5.         $criteria->condition = 'user_id = 1'; 
  6.   
  7.         $count = News::model()->count($criteria); 
  8.         $pages = new CPagination($count); 
  9.   
  10.         $pages->pageSize = 10; 
  11.         $pages->applyLimit($criteria); 
  12.         $list = News::model()->findAll($criteria); 
  13.   
  14.         $this->render('index', array('list' => $list, 'pages' => $pages)); 
  15. }
复制

View:
代码如下:


  
  
  1. <UL> 
  2.     <?php foreach ($list as $item): ?> 
  3.     <LI> 
  4.           
  5.         <DIV class=page-header> 
  6.             <?php echo $item--->news_title; ?> 
  7.         </DIV> 
  8.   
  9.         <DIV class=content> 
  10.             <?php echo $item--->news_intro; ?> 
  11.         </DIV> 
  12.   
  13.     </LI> 
  14. <?php endforeach; ?> 
  15. </UL> 
  16.   
  17. <DIV class=pagination> 
  18.     <?php 
  19.     $this--->widget('CLinkPager', array( 
  20.         'pages' => $pages, 
  21.         'selectedPageCssClass' => 'active', //当前页的class 
  22.         'hiddenPageCssClass' => 'disabled', //禁用页的class 
  23.         'header' => '', //分页前显示的内容 
  24.         'maxButtonCount' => 10, //显示分页数量 
  25.         'htmlOptions' => array('class' => ''), 
  26.         'firstPageLabel' => '首页', 
  27.         'nextPageLabel' => '下一页', 
  28.         'prevPageLabel' => '上一页', 
  29.         'lastPageLabel' => '末页', 
  30.             ) 
  31.     ); 
  32.     ?> 
  33. </DIV>
复制


第三种: DAO实现分页.


Controller层:
代码如下:


  
  
  1. public function actionReport()
  2. {
  3. $sql = "select remitdate, sum(rate) sumrate from td_delivery 
  4. group by remitdate 
  5. order by remitdate desc";
  6. $criteria=new CDbCriteria();
  7. $result = Yii::app()->db->createCommand($sql)->query();
  8. $pages=new CPagination($result->rowCount);
  9. $pages->pageSize=2; 
  10. $pages->applyLimit($criteria); 
  11. $result=Yii::app()->db->createCommand($sql." LIMIT :offset,:limit"); 
  12. $result->bindValue(':offset', $pages->currentPage*$pages->pageSize); 
  13. $result->bindValue(':limit', $pages->pageSize); 
  14. $posts=$result->query();
  15. $this->render('report',array( 
  16. 'posts'=>$posts, 
  17. 'pages'=>$pages, 
  18. ));
  19. }
复制

View层:
代码如下:


  
  
  1. <?php foreach($posts as $row):?> 
  2.  <?php echo CHtml::link($row["remitdate"],array('delivery/view','remitdate'=>$row["sumrate"]));?>
  3.  <?php echo $row["sumrate"]."<br />" ?>
  4.  <?php endforeach;?>
  5.  <?php 
  6.  //分页widget代码: 
  7.  $this->widget('CLinkPager',array('pages'=>$pages));
  8. ?>
复制

优点: DAO效率高; 缺点: view层需要自己写一些样式,稍显麻烦一点


第四种:widget实现分页


model层:
代码如下:


  
  
  1. /**
  2. * @var string attribute : 日运费 (统计用)
  3. * 需要对新增加的字段做个声明
  4. */
  5. public $dayrate;
  6. /*
  7. * 统计功能: 统计每日的运费
  8. */
  9. public function statistics()
  10. {
  11. $criteria = new CDbCriteria;
  12. $criteria->select = 'remitdate, sum(rate) AS dayrate';
  13. $criteria->group = 'remitdate';
  14. return new CActiveDataProvider(get_class($this), array(
  15. 'criteria'=>$criteria,
  16. 'sort'=>array(
  17. // 表头设置点击排序的字段
  18. 'attributes'=>array(
  19. 'remitdate',
  20. 'dayrate'=>array(
  21. 'asc'=>'dayrate',
  22. 'desc'=>'dayrate DESC',
  23. )
  24. ),
  25. 'defaultOrder'=>'remitdate desc',
  26. ),
  27. )); 
  28. }
复制

Controller层:
代码如下:


  
  
  1. /**
  2. * 运单统计功能:
  3. * 按日期统计
  4. */
  5. public function actionReport()
  6. {
  7. $model=new Delivery('statistics');
  8. $model->unsetAttributes(); // clear any default values
  9.   
  10. $this->render('report',array(
  11. 'model'=>$model,
  12. ));
  13. }
复制

View层:
代码如下:


  
  
  1. <?php $this->widget('zii.widgets.grid.CGridView', array(
  2. 'id'=>'delivery-grid',
  3. 'dataProvider'=>$model->statistics(),
  4. 'filter'=>$model,
  5. 'columns'=>array(
  6. 'remitdate',
  7. 'dayrate',
  8. array(
  9. 'class'=>'CButtonColumn',
  10. ),
  11. ),
  12. ));
  13. ?>
复制

优点: 可以使用自带的样式; 缺点: 效率略低.


第五种:Ajax分页


YII中ajax分页有多种实现方法,比较传统的就是在view中写JS来实现,大概的就是这样:
在view中js大概逻辑是这样
代码如下:


  
  
  1. $('#listview .yiiPager a').live('click',function(){
  2.         $.ajax({
  3.             url:$(this).attr('href'),
  4.             success:function(html){
  5.                 $('#listview').html(html);
  6.             }
  7.         });
  8.         return false;//阻止a标签
  9. });
  10. 然后在controller中判断ajax请求,再使用renderPartial方法渲染局部List视图,然后局部视图会被view中的ajax方法填充到局部刷新的div中。controller的大概逻辑是:
  11. 代码如下:
  12. if (Yii::app()->request->isAjaxRequest) {
  13. $this->renderPartial('_comments',array(
  14.     'model' => $model,
  15.     'comments' => $comments,//在局部视图中foreach得到每条数据
  16.     'pages' => $pages,
  17.    ));
  18.     Yii::app()->end();
  19. }
    复制

后来发现YII中的CListview更方便,封装了分页,foreach显示list,还支持数据排序。具体的可以在YII的API手册中发掘。使用CListview是默认ajax分页的,使用方法如下:
controller中:
代码如下:


  
  
  1. $criteria = new CDbCriteria();
  2. $criteria->order = '`create_time` DESC';
  3. $dataProvider = new CActiveDataProvider('Comments', array(
  4.     'pagination'=>array(
  5.       'pageSize'=>Yii::app()->params['commentsPerPage'],//设置分页条数以确定取出数据的条数
  6.   ),
  7.   'criteria'=>$criteria,
  8.   ));
  9. $this->render('comments',array(
  10.          'model' => $model,
  11.          'dataProvider' => $dataProvider,
  12. ));
    复制

然后在view中:
代码如下:


  
  
  1. <?php $this->widget('zii.widgets.CListView', array(
  2.   'dataProvider'=>$dataProvider,
  3.   'itemView'=>'_comments',
  4.   //'ajaxUpdate'=> false,//这样就不会AJAX翻页
  5.   'pager' => array(//pager 的配置信息。默认为<CODE>array('class'=>'CLinkPager')</CODE>.也可以自己配置
  6.    'nextPageLabel' => '下一页 »',
  7.    'prevPageLabel' => '« 上一页'
  8.   ),
  9. //在这里还可以配置一些排序规则,具体可以查阅手册
  10. ));
  11. ?>
    复制


第六种:自定义分页实现


视图文件调用cgridview,clistview时候调用自定义的分页方法
view


  
  
  1. <?php $this->widget('zii.widgets.grid.CGridView', array(  
  2.     'id'=>'news-grid',  
  3.     'dataProvider'=>$model->search(),  
  4.     'filter'=>$model,  
  5.     'template'=>'{items}{summary}{pager}',       
  6.      'selectableRows'=>2,     
  7.      'pager'=>'ZPager',  
  8.      'summaryText'=>'页数:{pages}/{page}页',   
  9.      'columns'=>array(  
  10.         array(  
  11.             'class'=>'CCheckBoxColumn',  
  12.             'footer'=>'<button onclink="deleteAll()">button</button>  
  13.                        <button onclink="refashAll()">button</button>',  
  14.             'footerHtmlOptions'=>array('colspan'=>5),  
  15.             'selectableRows'=>2,  
  16.         ),  
  17.         'id',  
  18.         array('name'=>'title',  
  19.              'htmlOptions'=>array('width'=>'20%'),  
  20.              'value'=>'mb_substr($data->title,0,10,"utf-8")',  
  21.             ),  
  22.         array('name'=>'content',  
  23.              'htmlOptions'=>array('width'=>'20%'),  
  24.              'value'=>'mb_substr(strip_tags($data->content),0,10,"utf-8")',  
  25.             ),  
  26.         array('name'=>'type',  
  27.              'value'=>'News::model()->getNewsType($data->type)',  
  28.             ),  
  29.         'user',  
  30.         array('name'=>'status',  
  31.              'value'=>'News::model()->getNewsStatus($data->status)',  
  32.              ),  
  33.         array(  
  34.             'class'=>'CButtonColumn',  
  35.             'buttons'=>array(  
  36.                 'view'=>array('visible'=>'false'),  
  37.                 //'delete'=>array('click'=>'true'),  
  38.             ),  
  39.         ),  
  40.     ),  
  41. ));
    复制

复制基类分页类文件,做修改成为自己的分页方法


  
  
  1. framework/web/widgets/pagers/CListPager.php复制并生命名到protected/components/zpager.php修改类名称  
  2. framework/web/widgets/pagers/pager.css复制对应样式文件到protected/components/css/pager.css
    复制

修改zpager.php的css加载目录  


  
  
  1. public static function registerCssFile($url=null)  
  2. {  
  3.     if($url===null)  
  4.         $url=CHtml::asset(Yii::getPathOfAlias('application.components.css.pager').'.css');  
  5.     Yii::app()->getClientScript()->registerCssFile($url);  
  6. }
    复制

通过修改Css样式文件,也可以修改生成列表的程序,达到修改分类的目的。


第七种:Yii-列表- 定义分页,分页方法


方法一:控制器定义


  
  
  1. function actionIndex(){  
  2.     $criteria = new CDbCriteria();  
  3.     $count=Article::model()->count($criteria);  
  4.     $pages=new CPagination($count);  
  5.   
  6.     // 返回前一页  
  7.     $pages->pageSize=10;  
  8.     $pages->applyLimit($criteria);  
  9.     $models = Post::model()->findAll($criteria);  
  10.   
  11.     $this->render('index', array(  
  12.     'models' => $models,  
  13.          'pages' => $pages  
  14.     ));  
  15. }
    复制

视图定义


  
  
  1. <?php foreach($models as $model): ?>  
  2.     // 显示一个模型  
  3. <?php endforeach; ?>  
  4.   
  5. // 显示分页  
  6. <?php $this->widget('CLinkPager', array(  
  7.     'pages' => $pages,  
  8. )) ?>
    复制

方法二:控制器定义


  
  
  1. public function actionIndex()  
  2. {  
  3.     $dataProvider=new CActiveDataProvider('News',array(  
  4.             'criteria'=>array(  
  5.                 'condition'=>'status=1',  
  6.                 'order'=>'create_time DESC',  
  7.                 'with'=>array('author'),  
  8.             ),  
  9.             'pagination'=>array(  
  10.                 'pageSize'=>20,  
  11.             ),  
  12.     ));  
  13.     $this->render('index',array(  
  14.         'dataProvider'=>$dataProvider,  
  15.     ));  
  16. }
    复制

视图文件


  
  
  1. <?php $this->widget('zii.widgets.CListView', array(  
  2.     'dataProvider'=>$dataProvider,  
  3.     'itemView'=>'_view',  
  4. )); ?>
    复制

方法三:视图文件


  
  
  1. <?php $this->widget('zii.widgets.grid.CGridView', array(  
  2.     'id'=>'news-grid',  
  3.     'dataProvider'=>$model->search(),  
  4.     'filter'=>$model,  
  5.     'template'=>'{items}{summary}{pager}',    
  6.      <span style="white-space:pre"> </span> 'pager'=>array(    
  7.             'class'=>'CLinkPager',   
  8.             'header'=>'分页:',    
  9.             'prevPageLabel'=>'上一页',    
  10.             'nextPageLabel'=>'下一页',  
  11.        ),       
  12.    <span style="white-space:pre">   </span> 'summaryText'=>'页数:{pages}/{page}页',   
  13. <span style="white-space:pre">  </span>'columns'=>array(  
  14.         'id',  
  15.         array('name'=>'title',  
  16.              'htmlOptions'=>array('width'=>'20%'),  
  17.              'value'=>'mb_substr($data->title,0,10,"utf-8")',  
  18.             ),  
  19.         array('name'=>'content',  
  20.              'htmlOptions'=>array('width'=>'20%'),  
  21.              'value'=>'mb_substr(strip_tags($data->content),0,10,"utf-8")',  
  22.             ),  
  23.         array('name'=>'type',  
  24.              'value'=>'News::model()->getNewsType($data->type)',  
  25.             ),  
  26.         'user',  
  27.         array('name'=>'status',  
  28.              'value'=>'News::model()->getNewsStatus($data->status)',  
  29.              ),  
  30.         array(  
  31.             'class'=>'CButtonColumn',  
  32.         ),  
  33.     ),  
  34. ));
    复制

数据模型类


  
  
  1. public function search()  
  2. {  
  3.     $criteria=new CDbCriteria;  
  4.   
  5.     $criteria->compare('id',$this->id);  
  6.     $criteria->compare('title',$this->title,true);  
  7.     $criteria->compare('content',$this->content,true);  
  8.     $criteria->compare('type',$this->type);  
  9.     $criteria->compare('user',$this->user,true);  
  10.     $criteria->compare('status',$this->status);  
  11.     $criteria->compare('create_data',$this->create_data,true);  
  12.   
  13.     return new CActiveDataProvider($this, array(  
  14.         'criteria'=>$criteria,  
  15.         'pagination'=>array(  
  16.             'pageSize'=>50,  
  17.         ),  
  18.     ));  
  19. }
    复制


第八种:Yii 中使用分页


方法中写法:


  
  
  1. public function actionIndex(){
  2.     $categoryModel = Category::model();
  3.     $criteria = new CDbCriteria();
  4.     $criteria->order = 'id ASC';
  5.     $criteria->addCondition('status=1');      //根据条件查询
  6.     $count = Category::model()->count($criteria);
  7.     $pager = new CPagination($count);
  8.     $pager->pageSize=2;
  9.     $pager->applyLimit($criteria);
  10.     $categoryInfo = Category::model()->findAll($criteria);
  11.     $this->render('index',array('pages'=>$pager,'categoryInfo'=>$categoryInfo));
  12. }
    复制

view视图中的调用:


  
  
  1. <?php $this->widget('CLinkPager',array(
  2.     'header' => '',
  3.     'firstPageLabel' => '首页',
  4.     'lastPageLabel' => '最后一页',
  5.     'prevPageLabel' => '上一页',
  6.     'nextPageLabel' => '下一页',
  7.     'pages' => $pages,
  8.     'maxButtonCount'=>3,
  9. ));?>
    复制


第八种:Yii 中分页设置


yii自己是带有自动分页功能的。只要在对应的controller里面,类似下面这样鞋代码,就会实现的


  
  
  1. $dataProvider=new CActiveDataProvider(
  2.     'Blog',
  3.     array(
  4.             'pagination'=>array('pageSize'=>10),
  5.             'criteria'=>array('order'=>'create_date DESC')
  6.         )
  7. );
    复制

但是样式还是yii中已经写好的,那么对于我,我要改掉这个样式,使用我提供的样式,可以像我下面这样写


  
  
  1. <?php
  2. $this->widget('zii.widgets.CListView', array(
  3.     'dataProvider'=>$dataProvider,
  4.     'itemView'=>'_view',
  5.         'summaryCssClass'=>'hide',
  6.         'pagerCssClass'=>'pagination',
  7.         'pager'=>array(
  8.             'class'=>'CLinkPager',
  9.             'nextPageLabel'=>'&raquo;',
  10.             'prevPageLabel'=>'&laquo;',
  11.             'firstPageLabel'=>'最前',
  12.             'lastPageLabel'=>'最后',
  13.             'htmlOptions'=>array('class'=>''),
  14.             'header'=>'',
  15.             'hiddenPageCssClass'=>'disabled',
  16.             'selectedPageCssClass'=>'active',
  17.             'previousPageCssClass'=>'',
  18.             'nextPageCssClass'=>'',
  19.     )
  20. ));
  21. ?>
    复制


第九种:yii的CListView和CGridView之分页


1,提供的dataProvider里面配置pagenation属性,例如


  
  
  1. return new CActiveDataProvider($this, array(
  2. 'criteria'=>$criteria,
  3. 'pagination'=>array('pageSize'=>3,),
  4. ));
    复制

或者在自己定义的CArrayDataProvider里面加上这些参数
2,在CListView的属性里面配置pager(不配置的话,是默认的分页,也可以自己配置)


  
  
  1. $this->widget('zii.widgets.CListView', array(
  2. 'dataProvider'=>$dataProvider,
  3. 'itemView'=>'_view',
  4. 'pager'=>array(
  5. 'class'=>'CLinkPager',//定义要调用的分页器类,默认是CLinkPager,需要完全自定义,还可以重写一个,参考我的另一篇博文:http://blog.sina.com.cn/s/blog_71d4414d0100yu6k.html
  6. // 'cssFile'=>false,//定义分页器的要调用的css文件,false为不调用,不调用则需要亲自己css文件里写这些样式
  7. 'header'=>'转往分页:',//定义的文字将显示在pager的最前面
  8. // 'footer'=>'',//定义的文字将显示在pager的最后面
  9. 'firstPageLabel'=>'首页',//定义首页按钮的显示文字
  10. 'lastPageLabel'=>'尾页',//定义末页按钮的显示文字
  11. 'nextPageLabel'=>'下一页',//定义下一页按钮的显示文字
  12. 'prevPageLabel'=>'前一页',//定义上一页按钮的显示文字
  13. //关于分页器这个array,具体还有很多属性,可参考CLinkPager的API
  14. ),
  15. ));
    复制

CGridView也是一模一样


  
  
  1. $this->widget('zii.widgets.grid.CGridView', array(
  2. 'id'=>'yii-test-user-info-grid',
  3. 'dataProvider'=>$model->search(),
  4. 'filter'=>$model,
  5. 'pager'=>array(
  6. 'class'=>'CLinkPager',//定义要调用的分页器类,默认是CLinkPager,需要完全自定义,还可以重写一个,参考我的另一篇博文:http://blog.sina.com.cn/s/blog_71d4414d0100yu6k.html
  7. // 'cssFile'=>false,//定义分页器的要调用的css文件,false为不调用,不调用则需要亲自己css文件里写这些样式
  8. 'header'=>'转往分页:',//定义的文字将显示在pager的最前面
  9. // 'footer'=>'',//定义的文字将显示在pager的最后面
  10. 'firstPageLabel'=>'首页',//定义首页按钮的显示文字
  11. 'lastPageLabel'=>'尾页',//定义末页按钮的显示文字
  12. 'nextPageLabel'=>'下一页',//定义下一页按钮的显示文字
  13. 'prevPageLabel'=>'前一页',//定义上一页按钮的显示文字
  14. //关于分页器这个array,具体还有很多属性,可参考CLinkPager的API
  15. ),
  16. 'columns'=>array(
  17. 'id',
  18. //     'sex',
  19. array(
  20. 'name'=>'sex',
  21. 'filter'=> YiiTestUserInfo::model()->getUserSex(),
  22. ),
  23. 'name',
  24. 'passwd',
  25. 'typeinfo',
  26. 'tel',
  27. 'xxxx',
  28. array(
  29. 'class'=>'CButtonColumn',
  30. ),
  31. ),
  32. ));
    复制


第十种:Yii实现分页的两种方法


一. DAO实现分页.
[Controller层]


  
  
  1.  public function actionReport()
  2.  {
  3.  $sql = "select remitdate, sum(rate) sumrate from td_delivery 
  4.  group by remitdate 
  5.  order by remitdate desc";
  6.  $criteria=new CDbCriteria();
  7.  $result = Yii::app()->db->createCommand($sql)->query();
  8.  $pages=new CPagination($result->rowCount);
  9.  $pages->pageSize=2; 
  10.  $pages->applyLimit($criteria); 
  11.  $result=Yii::app()->db->createCommand($sql." LIMIT :offset,:limit"); 
  12.  $result->bindValue(':offset', $pages->currentPage*$pages->pageSize); 
  13.  $result->bindValue(':limit', $pages->pageSize); 
  14.  $posts=$result->query();
  15.  $this->render('report',array( 
  16.  'posts'=>$posts, 
  17.  'pages'=>$pages, 
  18.  ));
  19.  }
    复制

[View层]


  
  
  1.    <?php foreach($posts as $row):?> 
  2.    <?php echo CHtml::link($row["remitdate"],array('delivery/view','remitdate'=>$row["sumrate"]));?> 
  3.    <?php echo $row["sumrate"]."<br />" ?>
  4.    <?php endforeach;?>
  5.    <?php 
  6.    //分页widget代码: 
  7.    $this->widget('CLinkPager',array('pages'=>$pages));
  8.    ?>
    复制

二. widget实现分页
[model层]


  
  
  1. /**
  2. * @var string attribute : 日运费 (统计用)
  3. * 需要对新增加的字段做个声明
  4. */
  5. public $dayrate;
  6.  
  7.  
  8. /*
  9. * 统计功能: 统计每日的运费
  10.  */
  11.  public function statistics()
  12.  {
  13.  $criteria = new CDbCriteria;
  14.  $criteria->select = 'remitdate, sum(rate) AS dayrate';
  15.  $criteria->group = 'remitdate';
  16.  
  17.  return new CActiveDataProvider(get_class($this), array(
  18.  'criteria'=>$criteria,
  19.  'sort'=>array(
  20.  // 表头设置点击排序的字段
  21.  'attributes'=>array(
  22.  'remitdate',
  23.  'dayrate'=>array(
  24.  'asc'=>'dayrate',
  25.  'desc'=>'dayrate DESC',
  26.  )
  27.  ),
  28.  'defaultOrder'=>'remitdate desc',
  29.  ),
  30.  )); 
  31.  }
    复制

[Controller层]


  
  
  1.  /**
  2.  * 运单统计功能:
  3.  * 按日期统计
  4.  */
  5.  public function actionReport()
  6.  {
  7.  $model=new Delivery('statistics');
  8.  $model->unsetAttributes(); // clear any default values
  9.   
  10.  $this->render('report',array(
  11.  'model'=>$model,
  12.  ));
  13.  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值