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性能优化 产生高度优化代码
Jul 22 PHP
php之Memcache学习笔记
Jun 17 PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
Jul 19 PHP
PHP把MSSQL数据导入到MYSQL的方法
Dec 27 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
PHP里的单例类写法实例
Jun 25 PHP
PHP微信开发之二维码生成类
Jun 26 PHP
在php中设置session用memcache来存储的方法总结
Jan 14 PHP
php使用curl通过代理获取数据的实现方法
May 16 PHP
PHP+Ajax实现验证码的实时验证
Jul 20 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 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
PHP编写daemon process详解及实例代码
2016/09/30 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
动态加载jquery库的方法
2014/02/12 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
js实现具有高亮显示效果的多级菜单代码
2015/09/01 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
Javascript中的几种继承方式对比分析
2016/03/22 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
flag和jq on 的绑定多个对象和方法(必看)
2017/02/27 Javascript
详解angular2实现ng2-router 路由和嵌套路由
2017/03/24 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
python中实现指定时间调用函数示例代码
2017/09/08 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
基于python 凸包问题的解决
2020/04/16 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
简述数据库的设计过程
2015/06/22 面试题
研究生导师推荐信
2014/09/06 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
党员个人总结自评
2015/02/14 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
公司新员工欢迎词
2015/09/30 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript