下面我将从基础读取到进阶应用,详细讲解如何在 DedeCMS 中实现。

基础读取:获取单个栏目的基本信息
这是最常用的情况,比如在首页显示“公司简介”栏目的名称和描述。
方法1:使用 GetTopNav() 函数(推荐用于顶级栏目)
这个函数主要用于获取网站顶部的导航栏,但它也可以用来获取单个顶级栏目的信息,它通常需要一个栏目ID作为参数。
示例代码:
假设我们要获取栏目ID为 1 的栏目信息。
{dede:global name='typeid' runphp='yes'}
// 如果当前页面已经有栏目ID(如在列表页),可以直接使用
// $typeid = @me;
// 否则,手动指定ID,1
$typeid = 1;
// 调用GetTopNav函数
$topnav = GetTopNav($typeid);
// 输出栏目名称
@me = $topnav['typename'];
{/dede:global}
{dede:global name='typeid' runphp='yes'}
$typeid = 1;
$topnav = GetTopNav($typeid);
// 输出栏目描述
@me = $topnav['description'];
{/dede:global}
更简洁的写法(直接调用函数):
如果你确定栏目ID,可以直接这样写,不需要 runphp。

<?php
$typeid = 1; // 目标栏目ID
$topnav = GetTopNav($typeid);
echo $topnav['typename']; // 输出栏目名称
echo $topnav['description']; // 输出栏目描述
echo $topnav['typedir']; // 输出栏目链接
?>
方法2:使用 GetOneType() 函数(通用性更强)
GetOneType() 是更底层、更通用的函数,它可以获取任意层级(顶级、子栏目)的栏目信息。
示例代码:
获取栏目ID为 1 的栏目信息。
<?php
$typeid = 1; // 目标栏目ID
$typeinfo = GetOneType($typeid);
// 输出栏目名称
echo $typeinfo['typename'];
// 输出栏目描述
echo $typeinfo['description'];
// 输出栏目链接(非常重要)
echo $typeinfo['typedir'];
// 输出栏目封面图地址
echo $typeinfo['typeimg'];
// 输出栏目关键词
echo $typeinfo['keywords'];
// 输出栏目SEO标题
echo $typeinfo['seotitle'];
?>
进阶应用:获取当前栏目的信息
在列表页(list_article.htm页(article_article.htm)的模板中,我们常常需要获取当前栏目本身的信息。
在列表页 (list_article.htm) 中
DedeCMS 在列表页中已经定义了全局变量 typeid,它存储了当前列表页的栏目ID,我们可以直接利用这个变量。

示例代码(在 list_article.htm 中):
<h1>{dede:field name='typename'/}</h1>
<p>{dede:field name='description'/}</p>
<a href="{dede:field name='typedir'/}">查看更多</a>
这里的 {dede:field name='typename'} 等标签是 DedeCMS 为列表页预设的,它们会自动获取当前栏目 ($typeid) 对应的信息,这是最简单、最推荐的方式。
页 (article_article.htm) 中
页,获取当前栏目信息也很常见,比如面包屑导航。
示例代码(在 article_article.htm 中):
同样,DedeCMS 在内容页也预设了 {dede:field name='typename'/} 等标签来直接获取文章所属栏目的信息。
<!-- 面包屑导航 -->
{dede:field name='position'/}
<!-- 文章标题 -->
<h1>{dede:field name='title'/}</h1>
<!-- 所属栏目名称 -->
<p>栏目:<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></p>
获取子栏目列表
有时候我们不仅需要读取栏目的信息,还需要显示它下面的所有子栏目。
方法1:使用 {dede:channel} 标签(推荐)
{dede:channel} 是专门用于获取栏目列表的标签,功能非常强大。
示例代码:
获取栏目ID为 2 的所有一级子栏目。
<ul>
{dede:channel type='son' typeid='2'}
<li>
<a href="[field:typedir/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
{dede:channel} 标签常用属性:
typeid='2': 指定从哪个栏目下获取子栏目,如果省略,默认从顶级栏目获取。type='son': 获取指定栏目的直接子栏目(一级子栏目)。type='self': 获取指定栏目本身(不常用,通常用{dede:field})。type='top': 获取顶级栏目。row='10': 显示的栏目数量。currentstyle='<li class="active"><a href~class="this">~</a></li>': 高亮当前样式。
方法2:使用 {dede:sql} 自定义查询(灵活性最高)
{dede:channel} 无法满足你的需求(比如需要复杂的条件筛选),你可以直接写 SQL 查询。
示例代码:
获取顶级栏目(topid=0)且排序号大于 5 的栏目。
<ul>
{dede:sql sql='SELECT id,typename,typedir FROM `dede_arctype` WHERE topid=0 AND sortrank > 5 ORDER BY sortrank ASC'}
<li>
<a href="[field:typedir/]">[field:typename/]</a>
</li>
{/dede:sql}
</ul>
注意: 使用 {dede:sql} 需要对数据库表结构非常熟悉,并且要注意SQL注入风险,不要直接使用用户提交的变量。
获取栏目封面图并显示
很多模板会用到栏目封面图,获取方法和获取普通字段一样。
在模板中直接调用:
<!-- 方法1:在列表页或内容页直接调用当前栏目的封面图 -->
<img src="{dede:field.typeimg/}" alt="{dede:field.typename/}">
<!-- 方法2:在自定义页面或首页,通过PHP调用指定ID的封面图 -->
<?php
$typeid = 3; // 目标栏目ID
$typeinfo = GetOneType($typeid);
$typeimg = $typeinfo['typeimg'];
// 判断封面图是否存在,如果不存在则使用默认图
if(empty($typeimg)){
$typeimg = '/images/default.jpg';
}
echo '<img src="' . $typeimg . '" alt="栏目封面">';
?>
总结与最佳实践
| 需求场景 | 推荐方法 | 备注 |
|---|---|---|
| 获取当前列表页/内容页的栏目信息 | {dede:field name='typename'} |
最简单,直接使用DedeCMS内置标签。 |
| 获取指定ID的栏目信息(顶级或子栏目) | GetOneType() 函数 |
灵活,可在任何模板文件中通过PHP调用。 |
| 获取指定栏目的子栏目列表 | {dede:channel type='son' typeid='X'} |
功能专一,代码简洁,是获取栏目列表的首选。 |
| 获取网站顶部导航栏 | GetTopNav() 函数 |
主要用于顶部导航,也可用于获取顶级栏目信息。 |
| 需要自定义复杂查询时 | {dede:sql} |
灵活性最高,但需要SQL知识,注意安全。 |
核心要点:
- 利用好DedeCMS的内置标签:在列表页和内容页,优先使用
{dede:field name='...'},它已经为你处理好了当前栏目ID的获取。 - PHP函数用于灵活场景:在首页、自定义页面等非标准页面,使用
GetOneType()、GetTopNav()等PHP函数可以让你自由地获取任何栏目的信息。 - 理解标签属性:特别是
{dede:channel}的typeid和type属性,它们决定了你获取的是哪个栏目的哪种类型的栏目(顶级、子级、自身)。
希望这份详细的指南能帮助你熟练地在 DedeCMS 中读取和使用栏目内容!
