typeid 是织梦模板引擎中用于获取和显示特定栏目内容的核心属性,它的作用就是告诉系统:“我需要获取 ID 为 typeid 值的那个栏目的信息或列表。”

(图片来源网络,侵删)
typeid 的基本作用和用途
typeid 主要用在以下几种场景:
- 获取指定栏目的基本信息:如栏目名称、栏目描述、栏目链接、栏目封面图等。
- 获取指定栏目的文章列表:显示某个特定栏目下的所有文章或子栏目。
- 面包屑导航:在页面中生成从首页到当前栏目的导航路径。
- 作为列表页和内容页的全局变量:在列表页和文章内容页,系统会自动将当前栏目ID赋值给
typeid变量。
typeid 的核心语法
typeid 通常与织梦的内置函数一起使用,最常用的函数是 GetTopTypename() 和 GetTypeLink()。
获取栏目名称
这是最常见的用法,通常用于面包屑导航或页面标题。
-
语法:
(图片来源网络,侵删){dede:field name='typename'/}- 说明: 这个标签会直接输出当前栏目的名称,它不需要
typeid参数,因为在列表页和内容页,系统已经自动将当前栏目ID赋给了typeid,但在其他非当前栏目页面,你需要手动指定。
- 说明: 这个标签会直接输出当前栏目的名称,它不需要
-
手动指定
typeid获取栏目名称: 如果你需要在首页或其他页面显示某个特定栏目的名称,你需要结合typeid和GetTopTypename()函数。{dede: typeid='栏目ID', function='GetTopTypename(@me)'/}- 示例: 假设“公司新闻”栏目的ID是
3,想在首页显示它。<a href="/plus/list.php?tid=3">公司新闻</a>
用织梦标签可以这样写(虽然直接写链接更简单,但这个方法能获取栏目名称):
<a href="{dede: typeid='3', function='GetTypeUrl(@me)'/}">{dede: typeid='3', function='GetTopTypename(@me)'/}</a> - 更简洁的写法: 我们更常用
{dede:arclist}或{dede:channel}等标签来获取栏目信息,而不是单独用typeid。
- 示例: 假设“公司新闻”栏目的ID是
获取栏目链接
- 语法:
{dede:field name='typeurl'/}- 说明: 同样,这个标签在列表页和内容页会自动输出当前栏目的链接,它不需要手动指定
typeid。
- 说明: 同样,这个标签在列表页和内容页会自动输出当前栏目的链接,它不需要手动指定
在列表标签中使用 typeid
这是 typeid 最强大的应用场景之一,你可以使用 typeid 来指定 {dede:arclist}(文章列表)或 {dede:channel}(栏目列表)等标签的数据来源。
-
在
{dede:arclist}中使用typeid:- 作用: 只显示指定栏目及其所有子栏目的文章。
- 语法:
{dede:arclist typeid='栏目ID' titlelen='30' row='10'} <li> <a href="[field:arcurl/]">[field:title/]</a> <span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span> </li> {/dede:arclist} - 示例: 在首页显示“产品中心”(ID为
5)栏目下的所有文章。<h2>产品中心</h2> <ul> {dede:arclist typeid='5' titlelen='30' row='8'} <li> <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a> </li> {/dede:arclist} </ul> - 重要提示:
typeid指定的栏目有子栏目,{dede:arclist}默认会同时显示该栏目和其所有下级栏目的文章,如果只想显示当前栏目本身的文章,需要添加channelid属性,并且其值与typeid相同。{dede:arclist typeid='5' channelid='5' ...}这里的
channelid用于限定频道模型,与typeid结合使用可以精确控制范围。
-
在
{dede:channel}中使用typeid:- 作用: 只显示指定栏目及其所有子栏目。
- 语法:
{dede:channel typeid='栏目ID' type='son' row='8'} <li> <a href="[field:typeurl/]">[field:typename/]</a> </li> {/dede:channel} - 参数说明:
typeid: 指定父栏目的ID。type='son': 表示只显示子栏目。type='self',则只显示栏目本身(无子栏目)。
- 示例: 在“关于我们”(ID为
2)页面,显示其所有子栏目(如“公司简介”、“发展历程”等)。<h3>更多内容</h3> <ul> {dede:channel typeid='2' type='son'} <li><a href="[field:typeurl/]">[field:typename/]</a></li> {/dede:channel} </ul>
typeid 在不同页面中的默认值
理解 typeid 的默认行为非常重要:
-
首页 (
index.html):typeid默认为0,代表“首页”这个顶级栏目,使用typeid='0'通常可以获取全站的顶级栏目。
-
列表页 (
plus/list.php?tid=xxx):typeid的值就是URL中的tid参数值,即当前栏目的ID,所有{dede:field name='...'}和不需要指定typeid的列表标签,都默认基于这个值工作。
-
内容页 (
plus/view.php?aid=xxx):typeid的值是当前文章所属的栏目ID,这使得在文章页面包屑导航{dede:field name='position'/}和调用相关文章时,系统能准确定位。
typeid 与 typeid2 的区别
typeid: 用于单级栏目分类,它指定一个主栏目ID。typeid2: 用于二级栏目或多级联动分类,它指定的是二级栏目的ID,通常与typeid配合使用,表示typeid是一级栏目,typeid2是从属于typeid的二级栏目。
示例场景: 一个房产网站,有“区域”(一级栏目)和“房型”(二级栏目)两个联动分类。
typeid: 区域ID (如10代表“浦东”)typeid2: 房型 ID (如20代表“两房”)
在搜索或列表标签中,你可以同时使用它们来筛选数据。
最佳实践与常见问题
如何在首页调用指定栏目及其子栏目的文章?
这是非常常见的需求,结合 typeid 和 channelid 即可。
<!-- 假设“新闻动态”栏目ID为 4 -->
<h2>新闻动态</h2>
<ul>
{dede:arclist typeid='4' channelid='4' row='10' titlelen='40'}
<li>
<span class="date">[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
</li>
{/dede:arclist}
</ul>
typeid='4': 告诉arclist从ID为4的栏目及其子栏目取数据。channelid='4': 限定只取“文章”模型(假设4是文章模型栏目)下的数据,避免混入其他模型。
为什么我的 typeid 指定后没有内容?
- 检查ID是否正确: 确保你填写的
typeid值是正确的栏目ID,可以去后台“栏目管理”里核对。 - 检查栏目是否有内容: 确保该栏目下已经发布了文章。
- 检查标签语法: 确保标签没有拼写错误,如
typeid写成了typeid。 - 检查模型是否匹配: 如果使用了
channelid,确保typeid指定的栏目模型与channelid匹配。
typeid 是织梦CMS中连接模板与数据的核心桥梁,掌握它的用法,是进行织梦二次开发和模板制作的基础,记住以下几点:
- 核心功能: 指定栏目ID,用于获取栏目信息或文章列表。
- 自动赋值: 在列表页和内容页,
typeid会自动被设置为当前栏目的ID。 - 手动指定: 在首页等非栏目页面,需要手动给
typeid赋值来调用特定栏目的数据。 - 结合函数: 常与
GetTopTypename(),GetTypeUrl()等函数配合使用。 - 精确控制: 在
{dede:arclist}中使用channelid可以精确控制文章的来源范围。
