Yii框架分页实现方法详解


Posted in PHP onMay 20, 2017

本文实例讲述了Yii框架分页实现方法。分享给大家供大家参考,具体如下:

下家公司用的框架是yii,这几天看了下相关教程,今儿把分页教程写下,最后把tp的分页也给整合进了yii,因为个人觉得yii分页没有tp用的顺手。

首页,在models目录里创建个Auth.php的模型文件,里面写入

class Auth extends CActiveRecord {
  public static function model($className = __CLASS__) {
    return parent::model($className);
  }
  public function tableName() {
    return '{{auth}}';
  }
}

接着在controllers目录里创建IndexController.php的控制文件,里面写入

class IndexController extends Controller {
  public function actionList() {
    $criteria = new CDbCriteria();
    $criteria->order = 'a_id desc';
    $count = Auth::model()->count($criteria);
    $page = new CPagination($count);
    $page->pageSize = 10;
    $page->applyLimit($criteria);
    $auth = Auth::model()->findAll($criteria);
    $this->renderPartial('auth', array('page' => $page, 'list' => $auth));
  }
  public function actionList1() {
    $p = isset($_GET['page']) ? $_GET['page'] : 0;
    $criteria = new CDbCriteria();
    $criteria->select = "a_id,a_nickname";
    $criteria->condition='';
    $criteria->limit = 10;
    $criteria->offset = $p == 0 ? 0 : (($p-1)*10);
    $criteria->order = 'a_id desc';
    $auth = Auth::model()->findAll($criteria);
    $count = Auth::model()->count($criteria);
    $page = new CPagination($count);
    $page->pageSize = 10;
    $page->applyLimit($criteria);
    $this->renderPartial('auth', array('page' => $page, 'list' => $auth));
  }
}

其中actionList和actionList1是$criteria的两种写法

最后在views目录里添加index目录,并在index目录内添加auth.php文件,里面写入

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<div class="blogList">
<ul>
  <?php foreach($list as $key=>$value){ ?>
  <li>
    <a><?php echo $value['a_nickname'];?></a>
  </li>
  <?php } ?>
</ul>
</div>
<div id="page">
<?php
  $this->widget('CLinkPager',array(
    'firstPageLabel'=>'首页',
    'lastPageLabel'=>'末页',
    'prevPageLabel'=>'上一页',
    'nextPageLabel'=>'下一页',
    'pages'=>$page,
    'maxButtonCount'=>13,
    )
  );
?>
</div>

上面是yii自带的写法,这里引入tp的分页类,做个简单的改动,步骤如下

首先,把tp的AjaxPage.class.php和Page.class.php移动到yii的项目目录下的 protected/components下面,并且把文件名称分布改为AjaxPage.php和Page.php,分别进入两个文件,把里面的C方法去掉,也就是这一句

$this->varPage = C('VAR_PAGE') ? C('VAR_PAGE') : 'p' ;

改为

$this->varPage = 'p' ;

改完之后,这个两个文件是不需要引入的,因为yii在启动时会自动加载的。具体的可见protected/config.php/main.php的配置中的

// autoloading model and component classes
  'import'=>array(
    'application.models.*',
    'application.components.*',
  ),

其次,在protected/config.php/目录里新建一个common.php文件,这个文件就放些项目的公共函数,熟悉tp的朋友应该知道tp也有公共函数文件,很好用,这里借鉴下,yii应该也有吧,目前还没发现。在该文件写入

// 根据页码获取列表
function getListByPage($model, $select = '*', $condition = '', $limit = 10, $order = '', $p = '', $ajax = 0) {
  // 初始化参数
  $_GET['p'] = isset($_GET['p']) ? intval($_GET['p']) : 1;
  $limit = intval($limit) > 0 ? intval($limit) : 10;
  if ($p) {
    $_GET['p'] = intval($p) ? intval($p) : 1;
  }
  $criteria = new CDbCriteria();
  $count = $model->count($criteria);
  if ($ajax) {
    $Page = new AjaxPage($count, $limit);
  } else {
    $Page = new Page($count, $limit);
  }
  $result['page'] = trim($Page->show());
  $criteria->select = $select;
  $criteria->condition = $condition;
  $criteria->limit = $Page->listRows;
  $criteria->offset = $Page->firstRow;
  $criteria->order = $order;
  $list = $model->findAll($criteria);
  $result['list'] = $list;
  return $result;
}

这个文件可就要引入了,不然加载不了,可以在项目的入口文件index.php里自行引入,代码如下

require_once(dirname($config) . '/common.php');

最后在indexController.php中用到分页的地方调用该方法

public function actionPage() {
    $model = Auth::model();
    $info = getListByPage($model);
    $this->renderPartial('page', array('info' => $info));
}

封装了此方法,以后调用分页时,只需传几个参数,简单又快捷。在page.php页面上调用

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<div class="blogList">
<ul>
  <?php foreach($info['list'] as $key=>$value){ ?>
  <li>
    <a><?php echo $value['a_nickname'];?></a>
  </li>
  <?php } ?>
</ul>
</div>
<div id="page">
<?php
  echo $info['page'];
?>
</div>

同时利用findAll也可以实现分页的查询效果,代码如下

function getListByPage($model, $select = '*', $condition = '', $limit = 10, $order = '', $p = '', $ajax = 0) {
  if (!$model) {
    return array();;
  }
  // 初始化参数
  $_GET['p'] = isset($_GET['p']) ? intval($_GET['p']) : 1;
  $limit = intval($limit) > 0 ? intval($limit) : 10;
  if ($p) {
    $_GET['p'] = intval($p) ? intval($p) : 1;
  }
  $count = $model->count();
  if ($ajax) {
    $Page = new AjaxPage($count, $limit);
  } else {
    $Page = new Page($count, $limit);
  }
  $result['page'] = trim($Page->show());
  $result['list'] = $model->findAll(array(
    'select'    => $select,
    'condition'   => $condition,
    'order'     => $order,
    'limit'     => $Page->listRows,
    'offset'     => $Page->firstRow,
  ));
  return $result;
}

总结:

经历过ci、tp两个框架后,再看yii进度快很多。掌握某个框架,个人认为无非就是掌握mvc的使用规则,在model层调用数据库方法得到数据,controller层调用model层数据并进行逻辑处理,再传给view层,同时了解框架的模板操作,表单操作,分页操作,文件上传操作,cookie和session操作,url调用,这些掌握了,在经过项目的磨合,就差不多了,理解了常用操作之后,再去看看源码,对比并总结框架间的区别和共性,从而升华自己的技术,以后常用开发就不在话下,拿可观的薪水也是如此。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
攻克CakePHP系列一 连接MySQL数据库
Oct 22 PHP
php下批量挂马和批量清马代码
Feb 27 PHP
PHP判断远程图片或文件是否存在的实现代码
Feb 20 PHP
php数组删除元素示例
Mar 21 PHP
php生成随机数的三种方法
Sep 10 PHP
php+mysql大量用户登录解决方案分析
Dec 29 PHP
php中二分法查找算法实例分析
Sep 22 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
Mar 22 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
Oct 09 PHP
thinkPHP显示不出验证码的原因与解决方法分析
May 20 #PHP
yii2项目实战之restful api授权验证详解
May 20 #PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 #PHP
PHP那些琐碎的知识点(整理)
May 20 #PHP
PHP使用xpath解析XML的方法详解
May 20 #PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
May 20 #PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
May 20 #PHP
You might like
php 在windows下配置虚拟目录的方法介绍
2013/06/26 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
JQUERY获取form表单值的代码
2010/07/17 Javascript
jquery移动listbox的值原理及代码
2013/05/03 Javascript
jQuery提交多个表单的小例子
2013/06/30 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
微信小程序如何访问公众号文章
2019/07/08 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
解析Python中的二进制位运算符
2015/05/13 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
什么是就业协议书
2014/04/17 职场文书
关于安全的演讲稿
2014/05/09 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
学习经验交流会策划书
2015/11/02 职场文书
大学班长竞选稿
2015/11/20 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书
财产分割协议书
2016/03/22 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
golang 在windows中设置环境变量的操作
2021/04/29 Golang
PyQt5实现多张图片显示并滚动
2021/06/11 Python
Oracle中DBLink的详细介绍
2022/04/29 Oracle