thinkPHP分页功能实例详解


Posted in PHP onMay 05, 2017

本文实例讲述了thinkPHP分页功能。分享给大家供大家参考,具体如下:

interface ServiceInterFace:

<?php
/**
 * InterFaceService
 * @author yhd
 */
namespace Red;
interface ServiceInterFace {
  /**
   * 实例化当前类
   */
  public static function getInstance();
}

StaticService 静态服务类:

<?php
/**
 * 静态服务类
 * StaticService
 * @author yhd
 */
namespace Red;
class StaticService{
  protected static $data;
  /**
   * 设置静态数据
   * @param string $key key
   * @param mixed $data data
   * @return mixed
   */
  public static function setData($key,$data){
    self::$data[$key] = $data;
    return self::$data[$key];
  }
  /**
   * 通过引用使用静态数据
   * @param string $key key
   * @return mixed
   */
  public static function & getData($key){
    if(!isset(self::$data[$key])){
      self::$data[$key] = null;
    }
    return self::$data[$key];
  }
  /**
   * 缓存实例化过的对象
   * @param string $name 类名
   * @return 对象
   */
  public static function getInstance($name){
    $key = 'service_@_'.$name;
    $model = &self::getData($key);
    if($model === null){
      $model = new $name();
    }
    return $model;
  }
  /**
   * html转义过滤
   * @param mixed $input 输入
   * @return mixed
   */
  public static function htmlFilter($input){
    if(is_array($input)) {
      foreach($input as & $row) {
        $row = self::htmlFilter($row);
      }
    } else {
      if(!get_magic_quotes_gpc()) {
        $input = addslashes($input);
      }
      $input = htmlspecialchars($input);
    }
    return $input;
  }
}

abstract AbProduct  抽象商品管理类:

<?php
/**
* 抽象商品管理类
* AbProduct.class.php
* @lastmodify 2015-8-17
* @author yhd
*/
namespace Red\Product;
abstract class AbProduct{
  public $errorNum;
  /*
  *返回错误信息
  *@param $errorNum 错误代码
  */
  public function GetStatus(){
    $errorNum = $this->errorNum;
    switch($errorNum){
        case 0:
            $data['status'] = 0;
            $data['message'] = '收藏成功';
            break;
        case 1:
            $data['status'] = 1;
            $data['message'] = '收藏失败';
            break;
        case 2:
            $data['status'] = 2;
            $data['message'] = '已收藏';
            break;
        case 3:
            $data['status'] = 3;
            $data['message'] = '未登陆';
            break;
        case 4:
            $data['status'] = 4;
            $data['message'] = '缺少参数';
            break;
        default:
            $data['status'] = 200;
            $data['message'] = '未知错误';
    }
    return $data;
  }

MemberModel 会员模型:

<?php
/**
* 会员模型
* MemberModel.class.php
* @copyright (C) 2014-2015 red
* @license http://www.red.com/
* @lastmodify 2015-8-17
* @author yhd
*/
namespace Red\Passport\Models;
use Think\Model;
use Red\ServiceInterFace;
use Red\StaticService;
class MemberModel extends Model implements ServiceInterFace{
  protected $userId;
  protected $error;
  protected function _initialize(){
    $this->userId = getUserInfo(0);
  }
   /**
   * 实例化本类
   * @return MemberModel
   */
  public static function getInstance() {
    return StaticService::getInstance(__CLASS__);
  }
   /**
   *  获取登录用户信息
   * @param string  $data 查询条件
   * @return array
   */
  public function getUser($data = '') {
    if(empty($data)){
      return $this->where("id=".$this->userId)->find();
    }else{
      return $this->field($data)->where("id=".$this->userId)->find();
    }
  }
  /**
   * 修改用户信息
   * @param array $data
   * @param array $where 查询条件
   */
  public function editUserInfo($data, $where = '') {
    if( $this->_before_check($data) === false ){
      return $this->error['msg'];
    }
    if(!empty($where) && is_array($where)){
      $condition[ $where[0] ] = array('eq', $where[1]);
      return $this->where($condition)->save($data);
    }
    return $this->where("id=".$this->userId)->save($data);
  }
  /**
   * 获取用户信息
   * @param string $data 用户名
   * return array()
   */
  public function checkUserInfo($str, $field = ''){
    //注册类型
    $info = CheckType($str);
    $condition[$info] = array('eq',$str);
    if(!empty($field)){
      return $this->field($field)->where($condition)->find();
    }
    return $this->where($condition)->find();
  }
  /**
   * 获取用户信息
   * @param array $data 用户名
   * return array()
   */
  public function getAccount($data){
    //注册类型
    $info = CheckType($data);
    $condition['id'] = array('eq',$this->userId);
    $condition[$info] = array('eq',$data);
    return $this->where($condition)->find();
  }
  /**
   * 修改用户密码
   * @param array $data['id']用户ID
   * @param $data['passWord']用户密码
   * return true or false
   */
  public function upUserPassById($data){
    $condition['id'] = array('eq',$data['id']);
    $status = $this->where($condition)->save(array("password"=>md5($data['password'])));
    if($status){
        return TRUE;
    }else {
        return FALSE;
    }
  }
  /**
   * 校验用户的账号或者密码是否正确
   * @param $data['username'] 用户名
   * @param $data['password'] 密码
   * return true or false
   */
  public function checkUserPasswd($data= array()){
      $type = CheckType($data['username']);
      $condition[$type] = array('eq',$data['username']);
      $condition['password'] = array('eq',md5($data['password']));
       return $this->where($condition)->find();
  }
  /**
   * 网页登录校验token
   * @param token string
   * return bool
   */
  public function checkToken($token){
      return $this->autoCheckToken($token);
  }
  /**
   * 后台封号/解封
   * param int $user_id
   */
  public function changeStatus($data){
    if($this->save($data)){
      return true;
    }else{
      return false;
    }
  }
  protected function _before_check(&$data){
    if(isset($data['username']) && empty($data['username'])){
      $this->error['msg'] = '请输入用户名';
      return false;
    }
    if(isset($data['nickname']) && empty($data['nickname'])){
      $this->error['msg'] = '请输入昵称';
      return false;
    }
    if(isset($data['realname']) && empty($data['realname'])){
      $this->error['msg'] = '请输入真名';
      return false;
    }
    if(isset($data['email']) && empty($data['email'])){
      $this->error['msg'] = '请输入邮箱';
      return false;
    }
    if(isset($data['mobile']) && empty($data['mobile'])){
      $this->error['msg'] = '请输入手机号码';
      return false;
    }
    if(isset($data['password']) && empty($data['password'])){
      $this->error['msg'] = '请输入密码';
      return false;
    }
    if(isset($data['headimg']) && empty($data['headimg'])){
      $this->error['msg'] = '请上传头像';
      return false;
    }
    return true;
  }
}

ProductModel 商品模型:

<?php
/**
* 商品模型
* ProductModel.class.php
* @lastmodify 2015-8-17
* @author yhd
*/
namespace Red\Product\Models;
use Think\Model;
use Red\ServiceInterFace;
use Red\StaticService;
class ProductModel extends Model implements ServiceInterFace{
  /**
   * 实例化本类
   * @return ProductModel
   */
  public static function getInstance() {
    return StaticService::getInstance(__CLASS__);
  }
  /**
   * 单个商品
   * @param string $id
   * @param integer $status 状态 1:有效 2:无效
   * @param integer $onsale 是否上架 1:是 2:否
   * @return array 一维数组
   */
  public function getProOne($id, $status = 1 , $onsale = 1){
    $condition['onsale'] = array('eq', $onsale); //是否上架
    $condition['status'] = array('eq', $status); //状态
    $condition['id'] = array('eq',$id);
    return $this->where($condition)->find();
  }
  /**
   * 商品列表
   * @param string $limit 查询条数
   * @param array $data 查询条件
   * @return array 二维数组
   */
  public function getProList($data = ''){
    $condition['onsale'] = array('eq', $data['onsale']); //是否上架
    $condition['status'] = array('eq', $data['status']); //状态
    $condition['type'] = array('eq', $data['type']);  //分类
    if(isset($data['limit']) && isset($data['order']) ){
      $return =$this->where($condition)->limit($data['limit'])->order($data['order'])->select();
    }else{
      $return =$this->where($condition)->select();
    }
    return $return;
  }
  /**
   * 添加商品
   * @param array $data
   * @return int
   */
  public function addProduct($data){
    return $this->add($data);
  }
  /**
   * 删除商品
   *
   */
  public function delProduct($id){
    $condition['id'] = array('eq', $id);
    return $this->where($condition)->delete();
  }
  /**
   * 修改商品
   * @param string|int $id
   * @param array $data
   * @return
   */
  public function editProdcut($id, $data){
    $condition['id'] = array('eq', $id);
    return $this->where($condition)->save($data);
  }
  public function getProductInfo($product){
    if(empty($product) || !isset($product['product_id'])){
      return array();
    }
    $info = $this->getProOne($product['product_id']);
    $product['name'] = $info['name'];
    $product['store_id'] = $info['store_id'];
    $product['price'] = $info['price'];
    $product['m_price'] = $info['m_price'];
    return $product;
  }
}

ProductManage 商品管理类:

<?php
namespace User\Controller;
use Red\Product\ProductManage;
class FavoriteController extends AuthController {
public function index($page=1){
$limit=1;
$list = ProductManage::getInstance()->getCollectList($page,$limit);
$showpage = create_pager_html($list['total'],$page,$limit);
$this->assign(get_defined_vars());
$this->display();
}
public function cancelCollect(){
$ids = field('ids');
$return = ProductManage::getInstance()->cancelProductCollect($ids);
exit(json_encode($return));
}
}

functions.php 分页函数:

<?php
/**
 * 分页
 * @param $total 总条数
 * @param $page 第几页
 * @param $perpage 每页条数
 * @param $url 链接地址
 * @param $maxpage 最大页码
 * @return string 最多页数
*/
function create_pager_html($total, $page = 1, $perpage = 20, $url = '', $maxpage = null) {
  $totalcount = $total;
  if (empty($url) || !is_string($url)) {
    $url = array();
    foreach ($_GET as $k => $v) {
      if ($k != 'page') {
        $url[] = urlencode($k) . '=' . urlencode($v);
      }
    }
    $url[] = 'page={page}';
    $url = '?' . implode('&', $url);
  }
  if ($total <= $perpage)
    return '';
  $total = ceil($total / $perpage);
  $pagecount = $total;
  $total = ($maxpage && $total > $maxpage) ? $maxpage : $total;
  $page = intval($page);
  if ($page < 1 || $page > $total)
    $page = 1;
    $pages = '<div class="pages"><a href="' . str_replace('{page}', $page - 1 <= 0 ? 1 : $page - 1, $url) . '" rel="external nofollow" title="上一页" class="page_start">上一页</a>';
  if ($page > 4 && $page <= $total - 4) {
    $mini = $page - 3;
    $maxi = $page + 2;
  } elseif ($page <= 4) {
    $mini = 2;
    $maxi = $total - 2 < 7 ? $total - 2 : 7;
  } elseif ($page > $total - 4) {
    $mini = $total - 7 < 3 ? 2 : $total - 7;
    $maxi = $total - 2;
  }
  for ($i = 1; $i <= $total; $i++) {
    if ($i != $page) {
      $pages .= '<a class="page-num" href="' . str_replace('{page}', $i, $url) . '" rel="external nofollow" >' . $i . '</a>';
    } else {
      $pages .= '<span class="page_cur">' . $i . '</span>';
    }
    if ($maxi && $i >= $maxi) {
      $i = $total - 2;
      $maxi = 0;
    }
    if (($i == 2 or $total - 2 == $i) && $total > 10) {
      $pages .= '';
    }
    if ($mini && $i >= 2) {
      $i = $mini;
      $mini = 0;
    }
  }
  $pages .= '<a href="' . str_replace('{page}', $page + 1 >= $total ? $total : $page + 1, $url) . '" rel="external nofollow" title="下一页" class="page_next">下一页</a><span class="pageOp"><span class="sum">共' . $totalcount .
      '条 </span><input type="text" class="pages_inp" id="pageno" value="' . $page . '" onkeydown="if(event.keyCode==13 && this.value) {window.location.href=\'' . $url . '\'.replace(/\{page\}/, this.value);return false;}"><span class="page-sum">/ ' .
      $total . '页 </span><input type="button" class="pages_btn" value="GO" onclick="if(document.getElementById(\'pageno\').value>0)window.location.href=\'' . $url . '\'.replace(/\{page\}/, document.getElementById(\'pageno\').value);"></span></div>';
  return $pages;
}

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

PHP 相关文章推荐
PHP中文汉字验证码
Apr 08 PHP
php 8小时时间差的解决方法小结
Dec 22 PHP
PHP 事务处理数据实现代码
May 13 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
May 02 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
Sep 15 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
May 20 PHP
PHP微商城开源代码实例
Mar 27 PHP
laravel实现按月或天或小时统计mysql数据的方法
Oct 09 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 PHP
php操作redis常见方法示例【key与value操作】
Apr 14 PHP
php实现简易计算器
Aug 28 PHP
php cli模式下获取参数的方法
May 05 #PHP
ajax调用返回php接口返回json数据的方法(必看篇)
May 05 #PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 #PHP
PHP实现Session入库/存入redis的方法
May 04 #PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
May 04 #PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
May 04 #PHP
PHP调用Mailgun发送邮件的方法
May 04 #PHP
You might like
CodeIgniter基本配置详细介绍
2013/11/12 PHP
php 启动报错如何解决
2014/01/17 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
PHP中Memcache操作类及用法实例
2014/12/12 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
js中document.write的那点事
2014/12/12 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
其实你可以少写点if else与switch(推荐)
2019/01/10 Javascript
在vue项目中使用sass语法问题
2019/07/18 Javascript
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
python基于queue和threading实现多线程下载实例
2014/10/08 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
Python3的socket使用方法详解
2020/02/18 Python
python 通过 pybind11 使用Eigen加速代码的步骤
2020/12/07 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
初三学习计划书范文
2014/04/30 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
幽灵公主观后感
2015/06/09 职场文书
任命书格式模板
2015/09/22 职场文书