下面我将为你提供几种最常用、最可靠的方法,并附上详细的代码示例和解释。

(图片来源网络,侵删)
页(article_article.htm)中调用
这是最常见的情况,用户正在浏览一篇文章,你需要获取这篇文章所属的顶级栏目信息。
方法1:使用 GetTopid() 函数(最推荐、最简单)
织梦内置了一个非常强大的函数 GetTopid(),可以直接获取当前内容所属的顶级栏目ID,这是最简洁、最不容易出错的方法。
获取顶级栏目ID
{dede:field.id function="GetTopid(@me)"/}
@me:这是织梦模板中的特殊变量,代表当前标签的原始值。{dede:field.id}的原始值就是当前文章的栏目ID。function="GetTopid(@me)":对原始值(即当前栏目ID)执行GetTopid()函数,函数会返回这个ID所属的顶级栏目ID。
获取顶级栏目名称

(图片来源网络,侵删)
获取到顶级栏目ID后,我们可以使用 getTopTypename() 函数(自定义函数)来直接获取名称,或者通过查询栏目表来获取。
方案A:使用 getTopTypename() 自定义函数(推荐)
你需要在你的网站程序中确保这个函数存在,它通常位于 /include/common.func.php 文件里,如果你的文件里没有,可以手动添加进去:
// /include/common.func.php 文件末尾添加以下代码
/**
* 获取指定栏目ID的顶级栏目名称
* @param int $typeid 栏目ID
* @return string 顶级栏目名称
*/
function getTopTypename($typeid)
{
global $dsql;
$row = $dsql->GetOne("SELECT typename,topid FROM `#@__arctype` WHERE id='$typeid'");
if ($row['topid'] == '0') {
return $row['typename'];
} else {
$topRow = $dsql->GetOne("SELECT typename FROM `#@__arctype` WHERE id='" . $row['topid'] . "'");
return $topRow['typename'];
}
}
添加后,在模板中就可以这样调用了:

(图片来源网络,侵删)
顶级栏目名称:{dede:field.id function="getTopTypename(@me)"/}
方案B:通过 channel 标签查询(通用方法)
如果你不想修改PHP文件,可以直接在模板中使用 channel 标签进行二次查询。
{dede:field.id function="GetTopid(@me)"/} <!-- 先获取顶级ID -->
{dede:channel ArtList='0' typeid=''}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
typeid='':这里留空,因为我们是在循环内部使用,需要手动指定。function="GetTopid(@me)"的结果会作为typeid的值。ArtList='0':表示查询所有栏目。
综合示例:面包屑导航
一个典型的面包屑导航可以这样写:
<div class="breadcrumb">
<a href="{dede:global.cfg_cmsurl/}/">首页</a>
{dede:field.typeid function="GetTopid(@me)"/}
{dede:channel type='top' currentstyle="<a href='~typelink~' class='thisclass'>~typename~</a> > "}
<a href='[field:typelink/]'>[field:typename/]</a> >
{/dede:channel}
<a href="{dede:field name='arcurl'/}">{dede:field.title/}</a>
</div>
function="GetTopid(@me)"/:将顶级栏目ID传递给{dede:channel}type='top':channel标签只显示顶级栏目。currentstyle:为当前顶级栏目添加高亮样式。
在栏目列表页(category_*.htm)中调用
在栏目列表页,当前栏目ID可以直接通过 {dede:field.id/} 获取,如果当前栏目本身就是顶级栏目,那么它自己就是顶级栏目,如果不是,则需要向上查找。
方法1:使用 GetTopid() 函数(同样适用)
在列表页,{dede:field.id} 代表当前栏目的ID,使用 GetTopid() 函数同样可以获取其顶级ID。
当前顶级栏目ID:{dede:field.id function="GetTopid(@me)"/}
方法2:结合 channel 标签(推荐)
在列表页,使用 channel 标签是最直观的方式。
获取顶级栏目名称
{dede:channel type='top' currentstyle="<span>[field:typename/]</span>"}
<span>[field:typename/]</span>
{/dede:channel}
type='top':只显示顶级栏目。currentstyle:为当前所在的顶级栏目添加特殊样式,直接输出名称。
获取顶级栏目ID
如果你需要获取ID,可以在 currentstyle 里使用 [field:id/]。
顶级栏目ID:{dede:channel type='top' currentstyle="[field:id/]" /}
总结与对比
| 场景 | 目标 | 推荐方法 | 代码示例 |
|---|---|---|---|
| 文章页 | 获取顶级栏目ID | GetTopid() 函数 |
{dede:field.id function="GetTopid(@me)"/} |
| 文章页 | 获取顶级栏目名称 | getTopTypename() 自定义函数 |
{dede:field.id function="getTopTypename(@me)"/} |
| 文章页 | 获取顶级栏目名称(不修改PHP) | channel 标签查询 |
见上文综合示例 |
| 栏目页 | 获取顶级栏目ID | GetTopid() 函数 |
{dede:field.id function="GetTopid(@me)"/} |
| 栏目页 | 获取顶级栏目名称/ID | channel
|
核心要点:
GetTopid()是获取顶级ID的利器,在内容页和栏目页都适用。getTopTypename()是获取顶级名称的利器,但需要提前在/include/common.func.php中定义好。{dede:channel type='top'}是在模板中直接操作顶级栏目的强大标签,非常适合制作面包屑和当前栏目高亮。
对于大多数开发者来说,方法1(GetTopid())+ 方法2(getTopTypename()) 的组合是效率最高、代码最简洁的解决方案。
