默认情况下,DedeCMS 的分页函数 GetPageList() 是不会显示省略号的,它会直接列出所有页码,当页数很多时,这会严重影响页面美观和用户体验。

实现省略号主要有两种方法:
- 直接修改核心分页函数:一劳永逸,但升级时可能会被覆盖。
- 使用自定义函数:更推荐的方法,安全、灵活,不会影响核心文件。
修改核心分页函数(include/arc.archives.class.php)
这种方法会直接修改 DedeCMS 的核心文件,实现起来直接,但缺点是当你升级 DedeCMS 时,这些修改可能会被覆盖,需要重新修改。
操作步骤:
-
找到核心文件 打开你的 DedeCMS 根目录,找到
include/arc.archives.class.php文件,这个文件是处理文章列表、分页等逻辑的核心类文件。
(图片来源网络,侵删) -
定位分页函数 在
arc.archives.class.php文件中,找到GetPageList()函数,这个函数很长,我们主要关注生成页码列表的部分,通常在函数的末尾。 -
修改代码 在
GetPageList()函数中,找到生成页码列表的for循环,默认代码可能类似这样(具体版本可能略有差异):// ... 前面的代码 ... $listdd = ''; $totalpage = ceil($this->TotalResult / $this->PageSize); $totalpage = min($totalpage, $maxpages); $perpage = ceil($totalpage / $plistnum); for($j=1;$j<=$perpage;$j++) { $listpage = ''; $pageoffset = ($plistnum-1)/2; $startpage = $this->PageNo - $pageoffset; $endpage = $this->PageNo + $pageoffset; if($pageoffset < $plistnum/2) { $endpage = $plistnum; } if(($totalpage - $this->PageNo) < $pageoffset) { $endpage = $totalpage; $startpage = $totalpage - $plistnum + 1; } $startpage = max($startpage,1); if($j == 1) { for($i=$startpage;$i<=$endpage;$i++) { if($i==$this->PageNo) { $listdd .= "<li class='thisclass'><a>$i</a></li>\r\n"; } else { $listdd .= "<li><a href='".$purl."-$i".$geturl."'>".$i."</a></li>\r\n"; } } } else { $listdd .= "<li><a href='".$purl."-".($startpage-1).$geturl."'>...</a></li>\r\n"; for($i=$startpage;$i<=$endpage;$i++) { if($i==$this->PageNo) { $listdd .= "<li class='thisclass'><a>$i</a></li>\r\n"; } else { $listdd .= "<li><a href='".$purl."-$i".$geturl."'>".$i."</a></li>\r\n"; } } } } // ... 后面的代码 ...上面的代码其实已经包含了生成省略号的逻辑,即
$listdd .= "<li><a href='".$purl."-".($startpage-1).$geturl."'>...</a></li>\r\n";这一行,DedeCMS 的默认样式和逻辑可能不够完善,导致省略号不按预期显示。为了让省略号更符合常规逻辑(
1 ... 5 6 7 [8] 9 10 11 ... 50),我们需要对这个逻辑进行优化。
(图片来源网络,侵删) -
优化后的代码(推荐替换原逻辑)
你可以将
GetPageList()函数中生成$listdd的整个逻辑块,替换为下面这个更健壮、更符合习惯的版本:// 在 GetPageList 函数中,找到生成列表的部分,替换如下代码 $listdd = ''; $totalpage = ceil($this->TotalResult / $this->PageSize); $totalpage = min($totalpage, $maxpages); // 定义显示的页码数 $page_list_len = 8; // 总共显示多少个页码 $half_len = floor($page_list_len / 2); // 中间值 $start_page = 1; $end_page = $totalpage; if ($totalpage > $page_list_len) { // 当前页码靠近首页 if ($this->PageNo <= $half_len) { $end_page = $page_list_len; } // 当前页码靠近尾页 elseif ($this->PageNo >= $totalpage - $half_len) { $start_page = $totalpage - $page_list_len + 1; } // 当前页码在中间 else { $start_page = $this->PageNo - $half_len + 1; $end_page = $this->PageNo + $half_len; } } // 生成页码 for ($i = $start_page; $i <= $end_page; $i++) { if ($i == $this->PageNo) { $listdd .= "<li class='thisclass'><a>$i</a></li>\r\n"; } else { $listdd .= "<li><a href='".$purl."-$i".$geturl."'>".$i."</a></li>\r\n"; } } // 添加首页和上一页 if ($this->PageNo > 1) { $listdd = "<li><a href='".$purl."-1".$geturl."'>首页</a></li>\r\n" . $listdd; $listdd = "<li><a href='".$purl."-".($this->PageNo-1).$geturl."'>上一页</a></li>\r\n" . $listdd; } else { $listdd = "<li class='disabled'><a>首页</a></li>\r\n" . $listdd; $listdd = "<li class='disabled'><a>上一页</a></li>\r\n" . $listdd; } // 添加省略号(仅在开头需要时) if ($start_page > 1) { $listdd = "<li><a href='".$purl."-1".$geturl."'>1</a></li>\r\n" . "<li><span>...</span></li>\r\n" . $listdd; } // 添加尾页和下一页 if ($this->PageNo < $totalpage) { $listdd .= "<li><a href='".$purl."-".($this->PageNo+1).$geturl."'>下一页</a></li>\r\n"; $listdd .= "<li><a href='".$purl."-$totalpage".$geturl."'>末页</a></li>\r\n"; } else { $listdd .= "<li class='disabled'><a>下一页</a></li>\r\n"; $listdd .= "<li class='disabled'><a>末页</a></li>\r\n"; } // 添加省略号(仅在结尾需要时) if ($end_page < $totalpage) { $listdd .= "<li><span>...</span></li>\r\n" . "<li><a href='".$purl."-$totalpage".$geturl."'>".$totalpage."</a></li>\r\n"; }
注意:上面的代码只是一个示例,你需要根据你 DedeCMS 版本中 GetPageList 函数的上下文(如变量名 $purl, $geturl 等)进行微调,直接替换整个逻辑块是比较安全的做法。
使用自定义函数(强烈推荐)
这种方法完全不会修改 DedeCMS 的核心文件,而是创建一个新的函数来调用,非常安全,升级无忧。
操作步骤:
-
创建自定义函数文件 在
include/extend.func.php文件中添加自定义函数,如果这个文件不存在,就在include目录下创建一个,这个文件专门用来存放用户自定义的函数。打开
include/extend.func.php,在末尾添加以下函数:/** * 获取带省略号的分页列表 * @param object $ctname 对象,如 $this * @param int $list_len 列表显示长度 * @return string 分页HTML */ function GetPageListEx($ctname, $list_len = 6) { global $cfg_rewrite; $prepage = $nextpage = ''; $prepagenum = $this->PageNo - 1; $nextpagenum = $this->PageNo + 1; if ($prepagenum < 1) { $prepage = "<li class='disabled'><a>上一页</a></li>\r\n"; } else { $url = $ctname->GetCurUrl(); if ($cfg_rewrite) { $prepage = "<li><a href='" . str_replace('.html', '-'.$prepagenum.'.html', $url) . "'>上一页</a></li>\r\n"; } else { $prepage = "<li><a href='" . $url . "-$prepagenum" . $ctname->GetMakeItem() . "'>上一页</a></li>\r\n"; } } if ($nextpagenum > $this->TotalPage) { $nextpage = "<li class='disabled'><a>下一页</a></li>\r\n"; } else { $url = $ctname->GetCurUrl(); if ($cfg_rewrite) { $nextpage = "<li><a href='" . str_replace('.html', '-'.$nextpagenum.'.html', $url) . "'>下一页</a></li>\r\n"; } else { $nextpage = "<li><a href='" . $url . "-$nextpagenum" . $ctname->GetMakeItem() . "'>下一页</a></li>\r\n"; } } $listdd = ''; totalpage = $ctname->TotalPage; $half_len = floor($list_len / 2); $start_page = 1; $end_page = $totalpage; if ($totalpage > $list_len) { if ($ctname->PageNo <= $half_len) { $end_page = $list_len; } elseif ($ctname->PageNo >= $totalpage - $half_len) { $start_page = $totalpage - $list_len + 1; } else { $start_page = $ctname->PageNo - $half_len + 1; $end_page = $ctname->PageNo + $half_len; } } // 首页 $indexpage = "<li><a href='" . $ctname->GetFirstUrl() . "'>首页</a></li>\r\n"; if ($ctname->PageNo != 1) { $listdd = $indexpage; } // 中间页码 for ($i = $start_page; $i <= $end_page; $i++) { if ($i == $ctname->PageNo) { $listdd .= "<li class='thisclass'><a>$i</a></li>\r\n"; } else { $url = $ctname->GetCurUrl(); if ($cfg_rewrite) { $listdd .= "<li><a href='" . str_replace('.html', '-' . $i . '.html', $url) . "'>$i</a></li>\r\n"; } else { $listdd .= "<li><a href='" . $url . "-$i" . $ctname->GetMakeItem() . "'>$i</a></li>\r\n"; } } } // 尾页 $endpage = "<li><a href='" . $ctname->GetLastUrl() . "'>末页</a></li>\r\n"; if ($ctname->PageNo != $totalpage) { $listdd .= $endpage; } // 添加省略号 $dot = "<li><span>...</span></li>\r\n"; if ($start_page > 1) { $listdd = $indexpage . $dot . $listdd; } if ($end_page < $totalpage) { $listdd = $listdd . $dot . $endpage; } $plist = ''; if ($ctname->TotalPage > 1) { $plist = $prepage . $listdd . $nextpage; } return $plist; } -
在模板中调用新函数 打开你使用了分页的模板文件(
article_list.htm)。 找到原来调用分页的地方,它通常是这样的:{dede:pagelist listsize='4' listitem='info,index,end,pre,next,pageno' function='cn_substr(@me,8)'/}将其替换为调用我们新创建的函数:
{dede:pagelist listsize='4' listitem='info,index,end,pre,next,pageno' function='GetPageListEx(@me, 6)'/}这里的
@me代表了分页对象本身,6是传递给GetPageListEx函数的$list_len参数,即中间显示的页码数量,你可以根据需要调整。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 修改核心文件 | 实现直接,一次性修改 | 升级 DedeCMS 时会丢失,需重做 | 个人项目,不打算升级 DedeCMS 的情况 |
| 自定义函数 | 安全、灵活、不影响升级 | 需要额外创建和调用函数 | 所有项目,尤其是商业项目或需要长期维护的项目 |
强烈推荐使用方法二(自定义函数),这是最规范、最安全的做法,能有效避免因系统升级导致的问题。
