dede列表页如何实现多种排序方式?

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

下面我将为你提供一种最常用、最稳定且兼容性最好的方法,通过修改 list_article.htm 模板文件来实现。

dede织梦列表页多种排序
(图片来源网络,侵删)

核心思路

  1. 修改模板:在列表页模板中,添加一个排序导航栏(按发布时间、按点击量、按评论数等)。
  2. 修改标签:将原来的普通列表调用标签 {dede:list} 替换为支持排序的自定义函数标签 {dede:arclist}
  3. 处理URL:通过URL参数(如 ? orderby=click)来告诉系统用户选择了哪种排序方式。
  4. 编写PHP代码:在 include/extend.func.php 文件中添加一个自定义函数,这个函数会根据URL参数动态生成排序后的SQL语句。

详细步骤

第一步:创建自定义函数 GetOrderSql

这个函数是实现排序功能的核心。

  1. 打开你的DedeCMS后台目录,找到并打开 include/extend.func.php 文件。
  2. 在文件的最后面(?> 之前)添加以下PHP代码:
/**
 * 根据URL参数获取排序的SQL子句
 * @return string 排序的SQL子句,如 ' ORDER BY click DESC'
 */
function GetOrderSql()
{
    // 获取排序方式参数,默认为按发布时间降序
    $orderby = isset($_GET['orderby']) ? trim($_GET['orderby']) : 'pubdate';
    // 定义允许的排序字段和对应的SQL排序方式
    $orderMap = array(
        'hot'    => 'click DESC', // 按点击量(热门)降序
        'score'  => 'scores DESC', // 按评分降序
        'good'   => 'goodpost DESC', // 按好评降序
        'bad'    => 'badpost DESC', // 按差评降序
        'rand'   => 'rand()', // 随机排序
        'pubdate'=> 'pubdate DESC', // 按发布时间降序
        'lastpost' => 'lastpost DESC', // 按最后评论时间降序
    );
    // 检查请求的排序方式是否在允许的列表中
    if (isset($orderMap[$orderby])) {
        return ' ORDER BY ' . $orderMap[$orderby];
    }
    // 如果不在列表中,则使用默认排序
    return ' ORDER BY pubdate DESC';
}

代码解释:

  • 我们通过 $_GET['orderby'] 获取URL中的排序参数。
  • $orderMap 数组定义了所有允许的排序方式,键是URL中的值(如 hot),值是对应的数据库排序语句(如 click DESC)。
  • 使用 isset() 来检查用户请求的排序方式是否安全有效,防止SQL注入。
  • 最后返回一个完整的SQL排序子句,如 ORDER BY click DESC

第二步:修改列表页模板 list_article.htm

现在我们来修改模板文件,添加排序链接并调用新的函数。

  1. 进入DedeCMS后台,【模板】->【默认模板管理】,找到你当前使用的列表页模板(通常是 list_article.htm),点击【修改】。
  2. 在模板中合适的位置(通常是列表标题的上方或下方)添加排序导航的HTML代码。
<div class="sort-nav">
    <span>排序方式:</span>
    <a href="{dede:global.cfg_cmspath/}/plus/list.php?tid={dede:field.id/}" {dede:global name='orderby' function='IsOrderThis(@me, "pubdate")'/}>默认</a>
    |
    <a href="{dede:global.cfg_cmspath/}/plus/list.php?tid={dede:field.id/}&orderby=hot" {dede:global name='orderby' function='IsOrderThis(@me, "hot")'/}>最热</a>
    |
    <a href="{dede:global.cfg_cmspath/}/plus/list.php?tid={dede:field.id/}&orderby=score" {dede:global name='orderby' function='IsOrderThis(@me, "score")'/}>评分</a>
    |
    <a href="{dede:global.cfg_cmspath/}/plus/list.php?tid={dede:field.id/}&orderby=rand" {dede:global name='orderby' function='IsOrderThis(@me, "rand")'/}>随机</a>
</div>

代码解释:

dede织梦列表页多种排序
(图片来源网络,侵删)
  • {dede:global.cfg_cmspath/}:获取网站根目录,确保链接正确。
  • ?tid={dede:field.id/}:获取当前栏目的ID,确保链接跳转到正确的列表页。
  • &orderby=hot:这是我们自定义的排序参数,点击这个链接就会调用我们第一步中定义的 GetOrderSql 函数,并生成 ORDER BY click DESC 的SQL。
  • {dede:global name='orderby' function='IsOrderThis(@me, "hot")'/}:这是一个辅助函数,用于给当前选中的排序项添加高亮样式(比如加粗或改变颜色),我们需要在下一步创建它。

第三步:创建高亮辅助函数 IsOrderThis

为了让用户知道当前正在使用哪种排序方式,我们需要一个函数来给对应的链接添加样式。

  1. 同样在 include/extend.func.php 文件中,添加以下函数:
/**
 * 用于判断当前排序方式是否与指定方式匹配,如果匹配则返回样式,否则返回空
 * @param string $currentOrder 当前页面的排序方式
 * @param string $targetOrder 需要判断的目标排序方式
 * @return string 如果匹配返回 'class="current"',否则返回空字符串
 */
function IsOrderThis($currentOrder, $targetOrder)
{
    // 从URL中获取实际的orderby参数,如果没有则默认为'pubdate'
    $orderby = isset($_GET['orderby']) ? trim($_GET['orderby']) : 'pubdate';
    if ($orderby == $targetOrder) {
        return 'class="current"';
    }
    return '';
}
  1. 修改第二步中的HTML,为 <a> 标签应用这个函数:
<a href="..." {dede:global name='orderby' function='IsOrderThis(@me, "hot")'/}>最热</a>
  1. 在CSS文件中为 .current 类添加样式,
.sort-nav a.current {
    color: #ff6600; /* 当前项的颜色 */
    font-weight: bold; /* 当前项加粗 */
    text-decoration: none; /* 去掉下划线 */
}

第四步:替换列表调用标签

这是最后也是最关键的一步,将原来的 {dede:list} 标签替换为 {dede:arclist},并应用我们自定义的排序函数。

  1. list_article.htm 模板中,找到原来的列表调用代码,它看起来大概是这样的:
{dede:list pagesize='20'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:click/]</span>
    </li>
{/dede:list}

将其替换为以下代码:

{dede:arclist pagesize='20' titlelen='60'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>点击:[field:click/]</span>
    </li>
{/dede:arclist}

重要提示:

dede织梦列表页多种排序
(图片来源网络,侵删)
  • {dede:list}{dede:arclist} 的字段调用方式(如 [field:title/])是基本相同的。
  • 我们直接去掉了 {dede:list} 标签中默认的 orderby='' 属性,因为我们通过自定义函数 GetOrderSql 来动态控制排序。
  • 确保你的列表页模板使用的是 {dede:arclist},而不是 {dede:list},很多模板默认就是 arclist,所以这一步可能只是确认。

完成以上四个步骤后,你的DedeCMS列表页就已经成功实现了多种排序功能。

流程回顾:

  1. extend.func.php:添加 GetOrderSql() 函数生成排序SQL,添加 IsOrderThis() 函数实现当前项高亮。
  2. list_article.htm
    • 添加排序导航的HTML链接,链接中包含 &orderby=xxx 参数。
    • 使用 {dede:global name='orderby' function='IsOrderThis(...)'} 为当前链接添加高亮样式。
    • 将列表调用标签从 {dede:list} 改为 {dede:arclist}
  3. CSS:为高亮样式(如 .current)添加CSS定义。

这种方法的好处是代码清晰、修改范围小、不涉及核心文件,升级DedeCMS时不容易丢失修改。

-- 展开阅读全文 --
头像
dede友情链接织梦链怎么用?
« 上一篇 今天
dede主栏目如何显示在主页?
下一篇 » 今天

相关文章

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

目录[+]