dede分页省略号如何实现或优化?

99ANYc3cd6
预计阅读时长 38 分钟
位置: 首页 DEDE建站 正文

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

dede 分页省略号
(图片来源网络,侵删)

实现省略号主要有两种方法:

  1. 直接修改核心分页函数:一劳永逸,但升级时可能会被覆盖。
  2. 使用自定义函数:更推荐的方法,安全、灵活,不会影响核心文件。

修改核心分页函数(include/arc.archives.class.php

这种方法会直接修改 DedeCMS 的核心文件,实现起来直接,但缺点是当你升级 DedeCMS 时,这些修改可能会被覆盖,需要重新修改。

操作步骤:

  1. 找到核心文件 打开你的 DedeCMS 根目录,找到 include/arc.archives.class.php 文件,这个文件是处理文章列表、分页等逻辑的核心类文件。

    dede 分页省略号
    (图片来源网络,侵删)
  2. 定位分页函数arc.archives.class.php 文件中,找到 GetPageList() 函数,这个函数很长,我们主要关注生成页码列表的部分,通常在函数的末尾。

  3. 修改代码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),我们需要对这个逻辑进行优化。

    dede 分页省略号
    (图片来源网络,侵删)
  4. 优化后的代码(推荐替换原逻辑)

    你可以将 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 的核心文件,而是创建一个新的函数来调用,非常安全,升级无忧。

操作步骤:

  1. 创建自定义函数文件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;
    }
  2. 在模板中调用新函数 打开你使用了分页的模板文件(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 的情况
自定义函数 安全、灵活、不影响升级 需要额外创建和调用函数 所有项目,尤其是商业项目或需要长期维护的项目

强烈推荐使用方法二(自定义函数),这是最规范、最安全的做法,能有效避免因系统升级导致的问题。

-- 展开阅读全文 --
头像
dede如何正确部署到子目录?
« 上一篇 今天
C语言程序设计如何快速入门?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]