在列表页或内容页获取当前栏目的ID
这是最常见的需求,比如在列表页调用当前栏目下的子栏目,或在文章页获取当前文章所属的栏目ID。
方法1:使用全局变量 $typeid (最常用、最推荐)
织梦在解析页面时,会自动将当前页面的栏目ID存储在全局变量 $typeid 中,你可以在任何需要的地方直接调用它。
适用页面:
- *列表页 (`list_.php`)**:当前正在显示的栏目ID。
- *内容页 (`article_.php`)**:当前文章所属的栏目的ID。
- 首页 (
index.php):在首页,$typeid的值为0。
示例代码:
你可以直接在模板文件(.htm)的任意位置使用 {$typeid}。
示例1:在列表页的标题中显示当前栏目ID
<h2>当前栏目ID是:{$typeid}</h2>
示例2:在内容页调用当前栏目下的文章 假设你在文章详情页,想调用与当前文章同属一个栏目的其他文章(相关文章)。
{dede:arclist typeid='{$typeid}' titlelen='30' row='10'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
这里的 typeid='{$typeid}' 就使用了当前文章的栏目ID。
方法2:使用PHP代码获取
如果你需要在PHP代码块({dede:type} 标签内或自定义PHP函数)中获取栏目ID,可以直接使用 $typeid 变量。
示例:
{dede:type typeid=''}
当前栏目ID是:[field:id/]
<hr>
通过PHP变量获取,当前栏目ID是:<?php echo $typeid; ?>
{/dede:type}
注意:在 {dede:type} 标签内部,$typeid 指的是标签指定的 typeid,如果标签没有指定,则继承页面的 $typeid。
调用指定栏目的ID
你知道栏目的名称或者别名,需要获取它的ID。
方法1:通过栏目名称获取
这个需要你在模板文件中嵌入一小段PHP代码来实现。
示例代码: 假设你想获取一个名称为“公司简介”的栏目的ID。
<?php
// 引入数据库配置文件,确保$dbname等变量可用
// 通常在织梦模板中,这个环境已经存在,无需重复引入
// require_once(DEDEROOT.'/data/config.php');
// 定义要查询的栏目名称
$typename = '公司简介';
// 执行SQL查询
$dsql = new DedeSql(false);
$dsql->SetQuery("SELECT id FROM `#@__arctype` WHERE typename LIKE '{$typename}'");
$dsql->Execute('me');
if($row = $dsql->GetArray('me')) {
$target_id = $row['id'];
echo "找到的栏目ID是:" . $target_id;
} else {
echo "未找到名称为 '{$typename}' 的栏目";
}
$dsql->Close();
?>
方法2:通过栏目别名获取
与方法1类似,只是查询条件从 typename 改为 typedir(注意:typedir 存储的是完整路径,/about/gsjj/,而 alias 才是纯别名,通常我们用 typedir 来判断)。
示例代码:
假设你想获取一个路径为 /about/gsjj/ 的栏目的ID。
<?php
// 定义要查询的栏目路径
$typedir = '/about/gsjj/';
// 执行SQL查询
$dsql = new DedeSql(false);
$dsql->SetQuery("SELECT id FROM `#@__arctype` WHERE typedir LIKE '{$typedir}'");
$dsql->Execute('me');
if($row = $dsql->GetArray('me')) {
$target_id = $row['id'];
echo "找到的栏目ID是:" . $target_id;
} else {
echo "未找到路径为 '{$typedir}' 的栏目";
}
$dsql->Close();
?>
更推荐的方式是使用 alias (纯别名) 字段,因为它更简洁,你需要在后台栏目管理中为每个栏目设置别名。
// 使用 alias 查询
$alias = 'gsjj'; // 假设别名为 gsjj
$dsql->SetQuery("SELECT id FROM `#@__arctype` WHERE alias = '{$alias}'");
// ... 后续代码相同
调用顶级栏目ID
你当前在一个子栏目页,但需要获取它所属的顶级栏目的ID。
织梦的 #@__arctype 表中有一个 topid 字段,它存储了该栏目的顶级栏目ID,如果它本身就是顶级栏目,topid 的值就是它自己的ID。
示例代码: 在子栏目列表页或内容页,获取顶级栏目ID。
顶级栏目ID是:{$topid}
如果当前页面是顶级栏目,{$topid} 的值就是 {$typeid}。
总结与最佳实践
| 场景 | 推荐方法 | 代码示例 | 说明 |
|---|---|---|---|
| 获取当前页面的栏目ID | 全局变量 $typeid |
{$typeid} |
最常用、最简单,适用于列表页、内容页等。 |
| 通过名称/路径获取指定栏目ID | PHP + SQL 查询 | 见上方代码 | 灵活,但需要编写少量PHP代码,适用于模板中调用固定栏目的情况。 |
| 获取当前栏目的顶级栏目ID | 全局变量 $topid |
{$topid} |
适用于需要面包屑导航或判断上级栏目的场景。 |
| 在循环标签内获取栏目ID | 标签属性 typeid 或 [field:id] |
{dede:arclist typeid='1'} 或 [field:id] |
在 {dede:type} 等循环标签内,[field:id] 获取的是当前循环项的ID。 |
重要提示:
- 模板修改:请务必在后台的【模板管理】->【模板文件列表】中修改对应的
.htm文件,而不是直接修改PHP程序文件。 - 缓存问题:修改模板后,如果页面没有更新,请去后台【生成】->【更新HTML】中重新生成对应页面,或者清除浏览器缓存。
- 安全:在使用PHP查询数据库时,如果变量来自用户输入(如URL参数),请务必进行过滤和转义,以防SQL注入,但上述示例中的变量(如栏目名)通常是硬编码或由系统本身提供,风险较低。
希望这份详细的指南能帮助你解决织梦动态调取栏目ID的问题!
