在DedeCMS中获取三级栏目的方法
在DedeCMS中获取三级栏目可以通过多种方式实现,以下是几种常用的方法:
使用channel标签递归调用
{dede:channelartlist typeid='0'}
<div class="level1">
<h2>{dede:field name='typename'/}</h2>
{dede:channel type='son' noself='yes'}
<div class="level2">
<h3><a href="[field:typelink/]">[field:typename/]</a></h3>
{dede:channel type='son' noself='yes'}
<div class="level3">
<a href="[field:typelink/]">[field:typename/]</a>
</div>
{/dede:channel}
</div>
{/dede:channel}
</div>
{/dede:channelartlist}
使用SQL查询直接获取三级栏目
{dede:sql sql='SELECT
c1.id as id1, c1.typename as name1, c1.reid as reid1,
c2.id as id2, c2.typename as name2, c2.reid as reid2,
c3.id as id3, c3.typename as name3, c3.reid as reid3
FROM dede_arctype c1
LEFT JOIN dede_arctype c2 ON c2.reid = c1.id
LEFT JOIN dede_arctype c3 ON c3.reid = c2.id
WHERE c1.reid = 0 AND c1.ishidden <> 1
ORDER BY c1.id ASC, c2.id ASC, c3.id ASC'}
<div class="level1">
<h2>[field:name1/]</h2>
[field:global name=auto runphp='yes']
$str = '';
$d2 = '';
$d3 = '';
$arr = explode('@', @me);
if($arr[1]) $d2 = '<div class="level2"><h3><a href="'.GetOneTypeUrl($arr[1]).'">'.$arr[2].'</a></h3>';
if($arr[3]) $d3 = '<div class="level3"><a href="'.GetOneTypeUrl($arr[3]).'">'.$arr[4].'</a></div>';
@me = $d2.$d3.'</div>';
[/field:global]
</div>
{/dede:sql}
使用自定义函数获取三级栏目
在include/common.func.php中添加自定义函数:
function GetThreeLevelClass($typeid) {
global $dsql;
$str = '';
// 获取一级栏目
$dsql->SetQuery("SELECT id,typename,reid FROM dede_arctype WHERE id=$typeid OR reid=$typeid ORDER BY id");
$dsql->Execute();
while($row = $dsql->GetArray()) {
if($row['reid'] == 0) {
$str .= '<div class="level1"><h2>'.$row['typename'].'</h2>';
// 获取二级栏目
$dsql2->SetQuery("SELECT id,typename,reid FROM dede_arctype WHERE reid=".$row['id']);
$dsql2->Execute();
while($row2 = $dsql2->GetArray()) {
$str .= '<div class="level2"><h3><a href="'.GetOneTypeUrl($row2['id']).'">'.$row2['typename'].'</a></h3>';
// 获取三级栏目
$dsql3->SetQuery("SELECT id,typename,reid FROM dede_arctype WHERE reid=".$row2['id']);
$dsql3->Execute();
while($row3 = $dsql3->GetArray()) {
$str .= '<div class="level3"><a href="'.GetOneTypeUrl($row3['id']).'">'.$row3['typename'].'</a></div>';
}
$str .= '</div>';
}
$str .= '</div>';
}
}
return $str;
}
然后在模板中调用:
{dede:field name='typeid' function='GetThreeLevelClass(@me)'/}
注意事项
- 确保栏目结构正确,一级栏目的reid为0,二级栏目的reid为对应一级栏目的id,三级栏目的reid为对应二级栏目的id
- 如果栏目较多,建议使用缓存提高性能
- 根据实际需求调整CSS样式和HTML结构
- 对于大型网站,可能需要分页或限制显示数量
方法可以根据您的具体需求选择使用,方法一适合简单场景,方法二适合需要精确控制的情况,方法三适合需要复杂逻辑处理的场景。
