一、前言:
这是真实有效的Discuz!帖子分页功能,网上也有其他的文章模块分页方法,但没有帖子的。我自己的资源网站需要做分页,无奈discuz官方一直都不搞分页的,唯有自己DIY一波了。这几天我也百度了很多资料,才最终研究出来,现在把经验分享给大家!
下面大家按我的节奏来,我会先添加一个新的独立页面 ,如果你不需要就可以省略!
二、分页方法:
1、在网站根目录新建一个名为code.php的入口文件 ,代码如下:- <?php
-
- /**
- * 新增加的code.php入口文件
- */
-
- define('APPTYPEID', 2);
- define('CURSCRIPT', 'code');
-
- require './source/class/class_core.php';
- require DISCUZ_ROOT.'./source/function/function_code.php';
-
- /*创建及初始化对象*/
- $discuz = C::app();
- $discuz->reject_robot();
- $discuz->init();
- /*分类数组*/
- $modarray = array('1', '2','3','4','5','6','7','8','9','10');
- if(empty($_GET['mod']) || !in_array($_GET['mod'],$modarray)){
- $_GET['mod'] = 'index';
- }
-
- /*------------------------设置常量-------------------------*/
- /*DIY模块标识*/
- define('DIY_MOD', $_GET['mod']);
- /*DIY模块id(注明:下面的495是我帖子DIY模块的id,查看方法:在DIY模式下,把鼠标放到模块上,右上角会显示这个id值出来)*/
- define('DIY_BID', isset($_GET['bid'])?$_GET['bid']:495);
- /*每页显示多少条数据*/
- define('DIY_SIZE', isset($_GET['size'])?$_GET['size']:10);
- /*---------------------------------------------------------*/
-
- /*执行钩子*/
- runhooks();
-
- /*论坛说明*/
- $navtitle = str_replace('{bbname}', $_G['setting']['bbname'], $_G['setting']['SEOtitle']['code']);
- $_G['disabledwidthauto'] = 1;
-
- /*转向控制器*/
- require_once libfile('code/index', 'module');
- ?>
复制代码 2、source\function\下新建 function_code.php (感觉这文件可有可无,还是按要求写一下吧),代码如下:- <?php
- /**
- * 定义不同的mod方法
- */
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
-
- ?>
复制代码 3、source\module\下创建code文件夹,code文件夹里新建code_index.php,(这个是后端控制器)代码如下:- <?php
- /**
- * 后端控制器
- */
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
-
- list($navtitle, $metadescription, $metakeywords) = get_seosetting('portal');
- if(!$navtitle) {
- $navtitle = $_G['setting']['navs'][1]['navname'];
- $nobbname = false;
- } else {
- $nobbname = true;
- }
- if(!$metakeywords) {
- $metakeywords = $_G['setting']['navs'][1]['navname'];
- }
- if(!$metadescription) {
- $metadescription = $_G['setting']['navs'][1]['navname'];
- }
-
- //============================分页 start ============================//
- require_once libfile('function/discuzcode');
- require_once libfile('function/home');
- //DIY模块标识
- $mod=DIY_MOD;
- //DIY模块id
- $bid=DIY_BID;
- //每页显示条数
- $perpage = DIY_SIZE;
- //允许显示的最大页数
- $maxpages = 0;
- //最多显示多少页码(超过就用...隐藏)
- $page = 10;
-
- //所有记录数量
- $count = C::t('code')->fetch_count_sql($bid);
- if($count>0){
- // 计算总页数
- $totalPage = (int)(($count + $perpage -1) / $perpage);
-
- //页码控制
- $curpage = isset($_GET['page'])?$_GET['page']:1;
- if($curpage<1) $curpage = 1;
- if($totalPage<(int)$curpage) $curpage = $totalPage;
-
- //开始记录
- $start = ($curpage-1)*$perpage;
- //分页判断
- ckstart($start, $perpage);
-
- //此数组用于显示具体页数
- $pageArray=array();
- for ($i=1; $i<=$totalPage; $i++)
- {
- array_push($pageArray,$i);
- }
- }
- //跳转的路径
- $mpurl = 'code.php?mod='.$mod.'&bid='.$bid;
- //最后一页,自动跳转
- $autogoto = FALSE;
- //是否简洁模式(简洁模式不显示上一页、下一页和页码跳转)
- $simple = FALSE;
- //分页
- $multipage = multi($count, $perpage, $curpage, $mpurl, $maxpages , $page, $autogoto, $simple);
- /**
- * 分页函数multi()说明
- * @param $count - 总数
- * @param $perpage - 每页数
- * @param $curpage - 当前页
- * @param $mpurl - 跳转的路径
- * @param $maxpages - 允许显示的最大页数
- * @param $page - 最多显示多少页码(超过就用...隐藏)
- * @param $autogoto - 最后一页,自动跳转
- * @param $simple - 是否简洁模式(简洁模式不显示上一页、下一页和页码跳转)
- * @return - 返回分页代码
- */
- //============================分页 end ============================//
- //跳转到前端视图
- include_once template('diy:code/'.$mod);
- ?>
复制代码 4、\source\class\table\下新建table_code.php,(这个是数据访问层)代码如下:- <?php
- require_once libfile('function/home');
- /**
- * code.php页面的分页查询
- */
-
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
-
- class table_code extends discuz_table
- {
- public function __construct() {
-
- $this->_table = 'common_block_item';//表名
- $this->_pk = 'itemid'; //表的主键
-
- parent::__construct();
- }
- //查询记录总条数
- public function fetch_count_sql($bid) {
- $where="where bid=".$bid." ORDER BY itemid DESC";
- return DB::result_first('SELECT COUNT(*) FROM %t %i ', array($this->_table, $where));
- }
- //查询数据
- public function fetch_all_by_sql($start, $limit,$bid) {
- return DB::fetch_all('SELECT * FROM %t where bid='.$bid.' ORDER BY itemid DESC'.DB::limit($start, $limit), array($this->_table));
- }
- }
-
- ?>
复制代码 5、打开\source\class\table\下的table_common_block_item.php,这个文件是查询DIY帖子模块的,找到function fetch_all_by_bid($bids, $sort = false)方法,修改成下面的代码:- public function fetch_all_by_bid($bids, $sort = false) {
- $sql='SELECT * FROM '.DB::table($this->_table).' WHERE '.DB::field('bid', $bids).($sort ? ' ORDER BY displayorder, itemtype DESC' : ' ORDER BY itemid DESC');
- /*===========================帖子模块增加分页功能 start =========================*/
- if(in_array(DIY_BID,$bids)){
- /*获取当前页*/
- $page = isset($_GET['page'])?$_GET['page']:0;
- if($page<1){
- $page=1;
- }
- /*每页显示多少条*/
- $limit=DIY_SIZE;
- /*开始记录*/
- $start = ($page-1)*$limit;
- $sql.=DB::limit($start, $limit);
- /* runlog("sql","sql语句:".$sql); */
- }
- /*=================================== end ======================================*/
- $result=DB::fetch_all($sql, null, $this->_pk);
- return $result;
- }
复制代码 6、模板目录 template\default\下创建code文件夹,code文件夹里新建index.htm,(这个是前端视图)代码如下:7. 重要的一点,需要关掉redis缓存才能使用分页,修改config/config_global.php里$_config['memory']['redis']的配置,如下:- // -------------------------- CONFIG MEMORY --------------------------- //
- /*--- 这里不建议开启redis缓存,因为开了之后,就不能实现分页实时显示了。---*/
- $_config['memory']['prefix'] = 'uXJfik_';
- //$_config['memory']['redis']['server'] = '127.0.0.1';
- $_config['memory']['redis']['server'] = '';
- $_config['memory']['redis']['port'] = 6379;
- $_config['memory']['redis']['pconnect'] = 1;
- $_config['memory']['redis']['timeout'] = '0';
- $_config['memory']['redis']['requirepass'] = '';
- $_config['memory']['redis']['serializer'] = 1;
- $_config['memory']['memcache']['server'] = '';
- $_config['memory']['memcache']['port'] = 11211;
- $_config['memory']['memcache']['pconnect'] = 1;
- $_config['memory']['memcache']['timeout'] = 1;
- $_config['memory']['apc'] = '0';
- //$_config['memory']['apcu'] = '1';
- $_config['memory']['apcu'] = '0';
- $_config['memory']['xcache'] = '0';
- $_config['memory']['eaccelerator'] = '0';
- $_config['memory']['wincache'] = '0';
- $_config['memory']['yac'] = '0';
- //$_config['memory']['file']['server'] = 'data/cache/filecache';
- $_config['memory']['file']['server'] = '';
-
- // -------------------------- CONFIG SERVER --------------------------- //
复制代码 |