dede点击排序如何实现?

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

通过修改列表页模板文件,增加带有不同排序参数的链接,然后修改或调用相应的列表标签,使其能识别并响应这些参数。

dede 点击后排序
(图片来源网络,侵删)

下面我将分两种最常见的情况来讲解,并提供详细的代码和步骤。


文章列表页(最常见)

假设我们要在文章列表页(如 list_article.htm旁边增加一个“点击量”排序的链接。

第 1 步:修改列表页模板文件

打开你的文章列表模板文件,通常位于 /templets/你的默认模板目录/list_article.htm

找到你想要添加排序链接的位置,比如文章标题的 <h3> 标签旁边,加入以下代码:

dede 点击后排序
(图片来源网络,侵删)
<h3>
  <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
  <!-- 在这里添加排序链接 -->
  <span style="margin-left: 15px; font-size: 12px; color: #666;">
    排序:
    <a href="{dede:global.cfg_cmspath/}/special_sort.php?tid={dede:field.id/}&orderby=click">点击量</a>
  </span>
</h3>

代码解释:

  • {dede:global.cfg_cmspath/}:这是 DedeCMS 的全局变量,代表你的网站根目录,确保链接正确。
  • special_sort.php这是一个关键文件,DedeCMS 自带的一个专门用于处理排序功能的动态页面,我们不直接修改 list.php,而是通过它来调用,更规范。
  • tid={dede:field.id/}:传递当前栏目的 ID,确保排序的是当前栏目下的内容。
  • orderby=click:这是我们自己定义的排序参数。click 代表按点击量排序,你也可以换成 pubdate (发布时间)、hot (人气/点击量) 等。

为了让用户体验更好,我们还可以增加一个“升序/降序”切换和“默认排序”的链接。

<span style="margin-left: 15px; font-size: 12px; color: #666;">
  排序:
  <a href="{dede:global.cfg_cmspath/}/special_sort.php?tid={dede:field.id/}&orderby=click">点击量</a> |
  <a href="{dede:global.cfg_cmspath/}/special_sort.php?tid={dede:field.id/}&orderby=pubdate">发布时间</a> |
  <a href="{dede:global.cfg_cmspath/}/special_sort.php?tid={dede:field.id/}">默认排序</a>
</span>

第 2 步:创建或修改 special_sort.php 文件

如果你的网站根目录下没有 special_sort.php 文件,你需要手动创建一个,如果已有,则修改它。

创建文件: 在网站根目录()下新建一个文件,命名为 special_sort.php

dede 点击后排序
(图片来源网络,侵删)

编写代码: 将以下代码完整复制到 special_sort.php 文件中:

<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
require_once DEDEINC."/arc.partview.class.php";
$tid = isset($tid) && is_numeric($tid) ? $tid : 0;
$orderby = isset($orderby) ? trim($orderby) : '';
$keyword = isset($keyword) ? trim($keyword) : '';
if($tid == 0) {
    ShowMsg('栏目ID不能为空!', '-1');
    exit();
}
// 获取栏目信息
$channelType = GetChannelType($tid);
$channelType = $channelType == '-1' ? 'article' : $channelType;
// 构建查询条件
$addsql = '';
if (!empty($keyword)) {
    $addsql = " AND arc.title LIKE '%$keyword%'";
}
// 根据 orderby 参数构建排序 SQL
if (!empty($orderby)) {
    switch ($orderby) {
        case 'click':
            $ordersql = " ORDER BY arc.click DESC";
            break;
        case 'pubdate':
            $ordersql = " ORDER BY arc.pubdate DESC";
            break;
        case 'hot':
            $ordersql = " ORDER BY arc.hot DESC";
            break;
        case 'scores':
            $ordersql = " ORDER BY arc.scores DESC";
            break;
        case 'rand':
            $ordersql = " ORDER BY rand()";
            break;
        default:
            $ordersql = " ORDER BY arc.sortrank DESC"; // 默认按权重排序
    }
} else {
    $ordersql = " ORDER BY arc.sortrank DESC"; // 默认排序
}
// 设置分页参数
$PageSize = 20; // 每页显示多少条
$GetNums = " $addsql $ordersql ";
$ctag = new PartView();
$ctag->SetTemplet($cfg_basedir . $cfg_templets_dir . "/" . $cfg_df_style . "/list_article.htm");
$ctag->Display();
?>

代码解释:

  • require_once "include/common.inc.php";:加载 DedeCMS 的核心文件。
  • $tid = isset($tid) ...:获取并验证栏目 ID。
  • $orderby = isset($orderby) ...:获取我们通过链接传递过来的 orderby 参数。
  • switch ($orderby):这是核心逻辑,它会判断 $orderby 的值,然后构建对应的 SQL 排序语句,如 ORDER BY arc.click DESC (按点击量降序)。
  • $ctag = new PartView();:创建一个列表视图对象。
  • $ctag->SetTemplet(...):指定要使用的列表模板文件,这里我们直接使用了默认的 list_article.htm,你也可以指定其他模板。
  • $ctag->Display();:执行并显示列表内容。

第 3 步:更新栏目并测试

  1. 登录 DedeCMS 后台。
  2. 进入“[核心] -> [批量更新栏目HTML]”。
  3. 找到你刚才修改了模板的栏目,点击“开始更新”。
  4. 更新完成后,访问你的文章列表页,点击你添加的“点击量”排序链接,应该就能看到文章按照点击量重新排序了。

自定义列表标签(更灵活)

我们可能不想使用 special_sort.php,或者想在更复杂的地方使用排序功能,这时,可以直接在模板中使用 dede:list 标签,并通过 PHP 代码动态修改其 sql 属性。

注意: 这种方法通常需要开启模板的 PHP 支持,或者在 DedeCMS 5.7 版本中,dede:list 标签本身支持部分动态逻辑。

第 1 步:修改模板文件

同样,打开你的列表模板文件(如 list_article.htm)。

{dede:list} 标签之前,加入一段 PHP 代码来获取排序参数,并动态构建 SQL 语句。

{dede:php}
    // 获取排序参数
    $orderby = isset($orderby) ? trim($orderby) : 'sortrank';
    $ordersql = '';
    // 根据参数设置排序
    if ($orderby == 'click') {
        $ordersql = " ORDER BY arc.click DESC";
    } elseif ($orderby == 'pubdate') {
        $ordersql = " ORDER BY arc.pubdate DESC";
    } else {
        $ordersql = " ORDER BY arc.sortrank DESC";
    }
    // 将排序 SQL 注入到 list 标签中
    // 注意:这需要你的 list 标签有 sql 属性,或者通过其他方式实现
    // 在 DedeCMS 5.7 中,可以直接在 list 标签里写,但更推荐使用下面的方法
{/dede:php}
<!-- 使用 arclist 标签,它更灵活 -->
{dede:arclist titlelen='50' row='10' orderby='sortrank'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>点击:[field:click/]</span>
    </li>
{/dede:arclist}

更推荐的 arclist 方法:

{dede:arclist} 标签本身支持 orderby 属性,我们可以通过 PHP 动态设置它的值。

{dede:php}
    // 获取排序参数
    $globalOrderBy = isset($orderby) ? trim($orderby) : 'sortrank';
{/dede:php}
{dede:arclist titlelen='50' row='10' orderby='$globalOrderBy'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>点击:[field:click/]</span>
    </li>
{/dede:arclist}

然后在你的排序链接中,直接传递 orderby 参数即可:

<a href="{dede:field name='phpurl'/}/list.php?tid={dede:field.id/}&orderby=click">按点击量排序</a>
<a href="{dede:field name='phpurl'/}/list.php?tid={dede:field.id/}&orderby=pubdate">按时间排序</a>

这里的 {dede:field name='phpurl'/} 会自动输出你的 php 目录路径,比硬编码 special_sort.phplist.php 更好。


总结与注意事项

方法 优点 缺点 适用场景
special_sort.php 官方推荐,规范稳定,不依赖模板PHP支持,逻辑清晰。 需要额外创建一个文件。 绝大多数情况,特别是对新手来说最稳妥的方法。
arclist + PHP 非常灵活,可以直接在模板内控制,无需新文件。 需要模板支持PHP执行,对有一定基础的开发者更友好。 需要在模板内进行复杂逻辑判断,或不想创建新文件时。

重要提示:

  1. 文件路径:确保 special_sort.phplist.php 的路径正确。
  2. 栏目缓存:修改栏目后,一定要去后台“批量更新栏目HTML”,否则可能看不到效果。
  3. 模板缓存:如果排序不生效,可以尝试清空一下 DedeCMS 的模板缓存。
  4. SQL 安全special_sort.php 方法中的 switch 语句已经做了很好的过滤,但如果使用其他方法拼接 SQL,务必注意防止 SQL 注入。

希望这个详细的教程能帮助你成功实现 DedeCMS 的点击排序功能!

-- 展开阅读全文 --
头像
龙书浩织梦教程15,如何高效织出梦想?
« 上一篇 今天
c语言stack是什么
下一篇 » 今天

相关文章

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

目录[+]