在列表模板(list_*.htm)中获取当前栏目ID
在列表页模板中,你通常需要获取当前正在浏览的栏目的ID,以便用于高亮导航、调用相关内容等。

(图片来源网络,侵删)
方法1:使用全局变量 $typeid (最常用、最推荐)
这是最直接、最简单的方法,DedeCMS在解析列表页时,已经将当前栏目的ID赋值给了全局变量 $typeid。
示例代码:
<p>当前栏目ID是:{ $typeid }</p>
完整示例(在列表页中调用当前栏目的名称):
<h1>{ dede:field name='typename'/ }</h1>
<p>您正在浏览的是栏目ID为 <strong>{ $typeid }</strong> 的列表页。</p>
{ dede:list pagesize='10' }
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:list}
模板(article_*.htm)中获取所属栏目ID
页,你可能需要获取这篇文章所属的栏目的ID。

(图片来源网络,侵删)
方法1:使用全局变量 $typeid (同样适用)
和列表页类似,在内容页模板中,全局变量 $typeid 也被自动赋值为当前文章所属栏目的ID。
示例代码:
<p>这篇文章所属的栏目ID是:{ $typeid }</p>
方法2:使用 { dede:field }
你也可以使用 { dede:field } 标签来获取,'typeid' 是字段名称。
示例代码:
<p>这篇文章所属的栏目ID是:{ dede:field name='typeid'/ }</p>
完整示例(在内容页调用当前栏目的链接):
<h1>{ dede:field.title/ }</h1>
<!-- 获取当前文章ID -->
<p>文章ID: { dede:field.id/ }</p>
<!-- 获取所属栏目ID (两种方法都可以) -->
<p>栏目ID (方法1): { $typeid }</p>
<p>栏目ID (方法2): { dede:field name='typeid'/ }</p>
<!-- 获取所属栏目名称 -->
<p>栏目名称: { dede:field name='typename'/ }</p>
<!-- 获取所属栏目链接 (非常有用) -->
<p><a href="{ dede:field name='typeurl'/ }">返回 { dede:field.name='typename'/ } 栏目</a></p>
{ dede:field.body/ }
在自定义PHP文件或独立页面中获取栏目ID
当你需要在一个自定义的PHP文件(plus/myphp.php)或者一个独立页面(单页面)中获取栏目ID时,你需要手动从URL参数或全局变量中获取。
方法1:从URL获取(适用于列表页和内容页)
DedeCMS的URL结构通常是 plus/list.php?tid=[栏目ID] 或者 plus/view.php?aid=[文章ID],你可以通过 PHP 的 $_GET 超全局变量来获取。
示例代码 (在自定义PHP文件中):
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
// 获取URL中的栏目ID tid
$tid = isset($_GET['tid']) ? intval($_GET['tid']) : 0;
// 获取URL中的文章ID aid
$aid = isset($_GET['aid']) ? intval($_GET['aid']) : 0;
if ($tid > 0) {
echo "通过URL获取到的栏目ID是:" . $tid;
// 你可以使用这个ID去查询数据库
$row = $dsql->GetOne("SELECT * FROM `#@__arctype` WHERE id = $tid");
if (is_array($row)) {
echo "<br>栏目名称是:" . $row['typename'];
}
}
if ($aid > 0) {
echo "<br>通过URL获取到的文章ID是:" . $aid;
}
?>
方法2:使用全局变量 $typeid (如果上下文正确)
在某些情况下,例如你在一个被DedeCMS框架加载的文件中,全局变量 $typeid 可能已经被设置好了,你可以直接使用,但为了安全,最好先检查它是否存在。
示例代码:
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
// 检查全局变量是否存在
if (isset($GLOBALS['typeid'])) {
$current_typeid = $GLOBALS['typeid'];
echo "通过全局变量获取到的栏目ID是:" . $current_typeid;
} else {
echo "无法获取到全局栏目ID变量。";
}
?>
通过已知栏目名称获取栏目ID
有时候你可能不知道栏目ID,但知道栏目名称,想通过名称来获取ID,这时你需要直接查询DedeCMS的数据库。
示例代码:
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
$typename = "新闻中心"; // 假设这是你要查询的栏目名
// 使用SQL查询,注意对名称进行转义以防SQL注入
$typename = addslashes($typeid);
$row = $dsql->GetOne("SELECT id FROM `#@__arctype` WHERE typename = '$typename'");
if (is_array($row)) {
$typeid_from_name = $row['id'];
echo "通过栏目名称 '$typename' 查询到的栏目ID是:" . $typeid_from_name;
} else {
echo "未找到名称为 '$typename' 的栏目。";
}
?>
总结与推荐
场景
推荐方法
示例代码
列表页模板
使用全局变量 $typeid
{ $typeid }
自定义PHP文件
从 $_GET 超全局变量获取
$tid = isset($_GET['tid']) ? intval($_GET['tid']) : 0;
通过名称查ID
直接查询数据库 #@__arctype 表
$dsql->GetOne("SELECT id FROM#@__arctypeWHERE typename = '$typename'");
核心要点:
- 在模板文件中,优先使用
{ $typeid },这是最简单高效的方式。
- 在PHP代码中,根据上下文决定是从
$_GET 获取还是查询数据库。
- 始终进行安全处理:从
$_GET 获取参数时,使用 intval() 函数将其转换为整数,可以有效防止SQL注入和非法参数。
你也可以使用 { dede:field } 标签来获取,'typeid' 是字段名称。
示例代码:
<p>这篇文章所属的栏目ID是:{ dede:field name='typeid'/ }</p>
完整示例(在内容页调用当前栏目的链接):
<h1>{ dede:field.title/ }</h1>
<!-- 获取当前文章ID -->
<p>文章ID: { dede:field.id/ }</p>
<!-- 获取所属栏目ID (两种方法都可以) -->
<p>栏目ID (方法1): { $typeid }</p>
<p>栏目ID (方法2): { dede:field name='typeid'/ }</p>
<!-- 获取所属栏目名称 -->
<p>栏目名称: { dede:field name='typename'/ }</p>
<!-- 获取所属栏目链接 (非常有用) -->
<p><a href="{ dede:field name='typeurl'/ }">返回 { dede:field.name='typename'/ } 栏目</a></p>
{ dede:field.body/ }
在自定义PHP文件或独立页面中获取栏目ID
当你需要在一个自定义的PHP文件(plus/myphp.php)或者一个独立页面(单页面)中获取栏目ID时,你需要手动从URL参数或全局变量中获取。
方法1:从URL获取(适用于列表页和内容页)
DedeCMS的URL结构通常是 plus/list.php?tid=[栏目ID] 或者 plus/view.php?aid=[文章ID],你可以通过 PHP 的 $_GET 超全局变量来获取。
示例代码 (在自定义PHP文件中):
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
// 获取URL中的栏目ID tid
$tid = isset($_GET['tid']) ? intval($_GET['tid']) : 0;
// 获取URL中的文章ID aid
$aid = isset($_GET['aid']) ? intval($_GET['aid']) : 0;
if ($tid > 0) {
echo "通过URL获取到的栏目ID是:" . $tid;
// 你可以使用这个ID去查询数据库
$row = $dsql->GetOne("SELECT * FROM `#@__arctype` WHERE id = $tid");
if (is_array($row)) {
echo "<br>栏目名称是:" . $row['typename'];
}
}
if ($aid > 0) {
echo "<br>通过URL获取到的文章ID是:" . $aid;
}
?>
方法2:使用全局变量 $typeid (如果上下文正确)
在某些情况下,例如你在一个被DedeCMS框架加载的文件中,全局变量 $typeid 可能已经被设置好了,你可以直接使用,但为了安全,最好先检查它是否存在。
示例代码:
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
// 检查全局变量是否存在
if (isset($GLOBALS['typeid'])) {
$current_typeid = $GLOBALS['typeid'];
echo "通过全局变量获取到的栏目ID是:" . $current_typeid;
} else {
echo "无法获取到全局栏目ID变量。";
}
?>
通过已知栏目名称获取栏目ID
有时候你可能不知道栏目ID,但知道栏目名称,想通过名称来获取ID,这时你需要直接查询DedeCMS的数据库。
示例代码:
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
$typename = "新闻中心"; // 假设这是你要查询的栏目名
// 使用SQL查询,注意对名称进行转义以防SQL注入
$typename = addslashes($typeid);
$row = $dsql->GetOne("SELECT id FROM `#@__arctype` WHERE typename = '$typename'");
if (is_array($row)) {
$typeid_from_name = $row['id'];
echo "通过栏目名称 '$typename' 查询到的栏目ID是:" . $typeid_from_name;
} else {
echo "未找到名称为 '$typename' 的栏目。";
}
?>
总结与推荐
| 场景 | 推荐方法 | 示例代码 |
|---|---|---|
| 列表页模板 | 使用全局变量 $typeid |
{ $typeid } |
| 自定义PHP文件 | 从 $_GET 超全局变量获取 |
$tid = isset($_GET['tid']) ? intval($_GET['tid']) : 0; |
| 通过名称查ID | 直接查询数据库 #@__arctype 表 |
$dsql->GetOne("SELECT id FROM#@__arctypeWHERE typename = '$typename'"); |
核心要点:
- 在模板文件中,优先使用
{ $typeid },这是最简单高效的方式。 - 在PHP代码中,根据上下文决定是从
$_GET获取还是查询数据库。 - 始终进行安全处理:从
$_GET获取参数时,使用intval()函数将其转换为整数,可以有效防止SQL注入和非法参数。
