thinkPHP分页功能实例详解

5年以前  |  阅读数:363 次  |  编程语言:PHP 

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

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

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例