使用 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) 是最应该优先掌握和使用的,它既能满足需求,又保持了代码的简洁和可维护性。
