dede 获取指定栏目

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

使用 GetOneTypeArt 函数(推荐,获取栏目及其下的文章)

这是最常用、最灵活的方法,它不仅能获取栏目的基本信息,还能同时获取该栏目下的文章列表,你可以在首页、列表页甚至文章页的任意位置调用。

函数原型

function GetOneTypeArt($typeid, $row = 10, $col = 1, $titlelen = 30, $infolen = 160, $imgwidth = 120, $imgheight = 90, $typestyle = '', $innertext = '', $aid = 0, $channelid = 0, $isweight = 'N')

参数详解

参数 说明 示例
$typeid (必需) 要获取的栏目ID 1
$row 获取的文章数量 10
$col 每行显示几篇文章 1
$titlelen 标题长度(字符数) 30
$infolen 文章简介长度 160
$imgwidth 缩略图宽度 120
$imgheight 缩略图高度 90
$typestyle 栏目样式(通常用模板标记代替)
$innertext (非常重要) 单篇文章的模板,用于循环显示 '[field:title/]'
$aid 排除的文章ID 0
$channelid 指定频道ID,0为所有频道 0
$isweight 是否按权重排序 'N'

使用示例

假设我们要获取栏目ID为 2 的栏目,并显示其下的 5 篇文章,每篇文章只显示标题。

场景: 在首页或其他页面的某个位置调用。

代码:

{dede:channelartlist typeid='2'}
    <h2>{dede:field name='typename'/}</h2>  <!-- 显示这个栏目的名称 -->
    <ul>
        {dede:getarclist titlelen='30' row='5'}
        <li>
            <a href="[field:arcurl/]">[field:title/]</a>
        </li>
        {/dede:getarclist}
    </ul>
{/dede:channelartlist}

代码解释:

  • {dede:channelartlist typeid='2'}: 这是最外层的标签,用于指定栏目ID为 2 的栏目,它会循环一次,因为我们只指定了一个栏目。
  • {dede:field name='typename'/}: 在 channelartlist 标签内,使用这个标签可以获取当前栏目的名称,也就是ID为2的栏目的名称。
  • {dede:getarclist ...}: 这个标签是在 channelartlist 内部使用的,用于获取该栏目下的文章列表。
    • titlelen='30': 设置文章标题长度为30个字符。
    • row='5': 只获取5篇文章。
  • [field:arcurl/][field:title/]: 这是文章的底层模板变量,分别代表文章的链接和标题。

使用 SQL 查询(最灵活,适用于复杂需求)

当你需要获取栏目信息,但不一定需要文章,或者需要获取一些 channelartlist 默认不提供的字段时,直接使用 SQL 查询是最佳选择。

获取单个栏目的基本信息

场景: 只想获取栏目ID为 1 的栏目名称、链接和简介。

代码:

<?php
// 1. 获取栏目ID
$typeid = 1; // 假设我们要获取ID为1的栏目
// 2. 执行SQL查询
$dsql = new DedeSql(false);
$dsql->SetQuery("SELECT * FROM `#@__arctype` WHERE id = '$typeid'");
$dsql->Execute('type');
// 3. 循环输出结果(这里只循环一次)
while($row = $dsql->GetArray('type'))
{
    $typename = $row['typename'];      // 栏目名称
    $typedir = $row['typedir'];        // 栏目目录
    $description = $row['description']; // 栏目描述
    echo "<h3><a href='".$typedir."'>".$typename."</a></h3>";
    echo "<p>".$description."</p>";
}
// 4. 关闭连接
$dsql->Close();
?>

代码解释:

  • new DedeSql(false): 创建一个数据库连接对象。
  • SetQuery("..."): 设置要执行的SQL语句。
    • #@__arctype: 这是 DedeCMS 的表前缀机制,#@__ 会被替换为你数据库中配置的前缀(如 dede_)。
    • WHERE id = '$typeid': 查询条件,根据栏目ID查找。
  • Execute('type'): 执行查询,'type' 是一个结果集别名,用于后续获取数据。
  • GetArray('type'): 获取查询结果的一行数据,并将其关联到一个数组 $row 中。
  • $row['typename']: 通过数组的键来访问栏目的各个字段,如 typename(名称)、typedir(目录)、description(描述)、id(ID)等。

获取栏目及其下的文章(高级用法)

如果你需要同时获取栏目和文章,并且希望自定义复杂的逻辑,可以一次性查出所有数据,然后在PHP中处理。

<?php
$typeid = 1; // 指定栏目ID
$dsql = new DedeSql(false);
// 使用 JOIN 关联查询,一次性获取栏目和文章信息
$sql = "SELECT a.*, t.typedir 
        FROM `#@__archives` a 
        LEFT JOIN `#@__arctype` t ON a.typeid = t.id 
        WHERE a.typeid = '$typeid' 
        ORDER BY a.pubdate DESC 
        LIMIT 5";
$dsql->SetQuery($sql);
$dsql->Execute('artlist');
// 循环输出文章
while($row = $dsql->GetArray('artlist'))
{
    $title = $row['title'];
    $arcurl = GetArcUrl($row['aid'],$row['typeid'],$row['senddate'],$row['title'],$row['ismake'],$row['arcrank'],$row['channel'],$row['namerule'],$row['typedir'],$row['money'],$row['filename']); // 获取文章链接
    echo "<li><a href='".$arcurl."'>".$title."</a></li>";
}
$dsql->Close();
?>

使用 {dede:type} 标签(在列表页/内容页获取当前栏目信息)

这个标签主要用于在列表页内容页的模板文件中,获取当前正在浏览的栏目的信息。

标签形式

{dede:type}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:type}

在PHP中调用

如果你在PHP文件中需要获取当前页面的栏目ID,可以通过全局变量 $typeids

场景: 在列表页 list_article.htm 的PHP代码部分获取当前栏目ID。

<?php
// 这个PHP代码通常放在模板文件的最顶部
if(!defined('DEDEINC')) exit('Request Error!');
// 获取当前栏目ID
$currentTypeId = $typeids; // 这是在列表页模板中可用的全局变量
if($currentTypeId > 0)
{
    echo "当前栏目ID是: " . $currentTypeId;
    // 然后你可以用这个ID去执行任何你想做的操作,比如查询
    $dsql = new DedeSql(false);
    $dsql->SetQuery("SELECT typename FROM `#@__arctype` WHERE id = '$currentTypeId'");
    $dsql->Execute('t');
    $typename = $dsql->GetOne('t');
    $dsql->Close();
    echo "<br>当前栏目名称是: " . $typename['typename'];
}
?>

总结与对比

方法 优点 缺点 适用场景
GetOneTypeArt / channelartlist 简单、高效、模板化,官方推荐 灵活性相对较低,只能获取预设的字段 大多数常规需求,如首页调用指定栏目文章、侧边栏推荐等
SQL 查询 极度灵活,可获取任意字段,可编写复杂逻辑 需要写SQL代码,对新手不友好,有一定安全风险(需注意防注入) 需要获取特定字段、复杂关联查询、或与PHP逻辑紧密结合的场景
{dede:type} 在特定页面(列表/内容页)获取当前栏目信息最方便 只能用于列表页和内容页模板 在列表页或内容页中需要显示当前栏目名称、链接等信息的场景

对于绝大多数用户来说,方法一 (channelartlist + getarclist) 是最应该优先掌握和使用的,它既能满足需求,又保持了代码的简洁和可维护性。

-- 展开阅读全文 --
头像
织梦电子行业网站模板如何快速搭建?
« 上一篇 今天
dede 按id 排序
下一篇 » 今天

相关文章

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

目录[+]