织梦调用四级栏目可以使用标签{dede:channel type=’top’}来获取顶级栏目,然后通过嵌套使用{dede:channel type=’son’}来获取子栏目。
在织梦中调用四级栏目,首先需要修改文件:includetaglib
目录下的channel.lib.php
,以下是详细的步骤和代码示例:
1、修改channel.lib.php
文件:
打开channel.lib.php
文件,并将以下代码复制替换到该文件中:
CAttribute>Items,$attlist);
extract($ctag>CAttribute>Items, EXTR_SKIP);
$innertext = $ctag>GetInnerText();
$cacheid = trim($cacheid);
if($cacheid !='') {
$likeType = GetCacheBlock($cacheid);
if($likeType != '') return $likeType;
}
$reid = 0;
$topid = 0;
if(empty($typeid) && $envs['typeid']!=0)
{
$typeid = $envs['typeid'];
$reid = $envs['reid'];
}else{
$reid=0;
}
if($type==''||$type=='sun') $type="son";
if($innertext=='') $innertext = GetSysTemplets("channel_list.htm");
if($reid==0 && $typeid>0)
{
$dbrow = $dsql>GetOne("Select reid From dede_arctype where id='$typeid' ");
if(is_array($dbrow)) $reid = $dbrow['reid'];
}
$likeType = '';
if($type=='top')
{
$sql = "Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
From dede_arctype where reid=0 And ishidden<>1 order by sortrank asc limit 0,$row";
}
else if($type=="son")
{
//if($_sys_globals['typeid']>0) $typeid = $_sys_globals['typeid'];
if($typeid==0) {
return '';
}
$sql = "Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
From dede_arctype where reid='$typeid' And ishidden<>1 order by sortrank asc limit 0,$row";
}
else if($type=="self")
{
if($reid==0) {
return '';
}
$sql = "Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitesitepath,description
Fromdede_arctype
where reid='$reid' And ishidden<>1 order by sortrank asc limit 0,$row";
}
//And id<>'$typeid'
$needRel = false;
$dtp2 = new DedeTagParse();
$dtp2>SetNameSpace("field","[","]");
$dtp2>LoadSource($innertext);
$dsql2 = clone $dsql;
$dsql>SetQuery($sql);
$dsql>Execute();
$line = $row;
//检查是否有子栏目,并返回rel提示(用于二级菜单)
if(ereg(':rel', $innertext)) $needRel = true;
if(empty($sql)) return '';
$dsql>SetQuery($sql);
$dsql>Execute();
$totalRow = $dsql>GetTotalRow();
$GLOBALS['autoindex'] = 0;
for($i=0;$i < $line;$i++)
{
if($col>1) $likeType .= "
r
";
for($j=0;$j<$col;$j++)
{
if($col>1) $likeType .= "- r
";
if($row=$dsql>GetArray())
{
$row['sonids'] = $row['rel'] = '';
if($needRel)
{
$row['sonids'] = GetSonIds($row['id'], 0, false);
if($row['sonids']=='') $row['rel'] = '';
else $row['rel'] = " rel='dropmenu{$row['id']}'";
}
//处理同级栏目中,当前栏目的样式
if( ($row['id']==$typeid || ($topid==$row['id'] && $type=='top') ) && $currentstyle!='' )
{
if($currentstyle!='')
{
$linkOkstr = $currentstyle;
$row['typelink'] = GetOneTypeUrlA($row);
$linkOkstr = str_replace("~rel~",$row['rel'],$linkOkstr);
$linkOkstr = str_replace("~id~",$row['id'],$linkOkstr);
$linkOkstr = str_replace("~typelink~",$row['typelink'],$linkOkstr);
}
}
}
}
}
return $likeType;
}
2、调用四级栏目:
使用{dede:channel row='5' type='self'}
标签可以调用同级栏目,而不需要指定 ID。
{dede:channel row='5' type='self'}
- [field:typename/]
{/dede:channel}
3、调用文章列表:
使用{dede:arclist row='条数' typeid='all' orderby='pubdate'}
标签可以调用文章列表。
{dede:arclist row='8' typeid='top' orderby='pubdate'}
[field:title/]
{/dede:arclist}
相关问答FAQs
1、问:如何确保修改后的channel.lib.php
文件生效?
答:确保修改后的channel.lib.php
文件生效,你需要刷新织梦后台缓存,可以通过后台管理界面找到“系统设置” > “SQL命令运行工具”,然后执行一条简单的SQL语句,如SELECT 1
,这样就能清除缓存并使新修改的文件生效。
2、问:如何在模板中调用特定类型的栏目及其子栏目?
答:在模板中调用特定类型的栏目及其子栏目,可以使用{dede:channel type='son' typeid='父栏目ID'}
标签,要调用父栏目ID为1的所有子栏目,可以使用以下代码:
“`html
{dede:channel type=’son’ typeid=’1′}
- [field:typename/]
{/dede:channel}
“`
步骤 |
代码示例 |
1. 获取顶级栏目ID |
$cid = 1; // 假设顶级栏目ID为1 |
2. 获取二级栏目列表 |
$child_list = GetChildList($cid); |
3. 循环二级栏目,获取三级栏目ID |
foreach ($child_list as $v) { $sec_cid = $v['id']; ... } |
4. 获取三级栏目列表 |
$sec_list = GetChildList($sec_cid); |
5. 循环三级栏目,获取四级栏目ID |
foreach ($sec_list as $v) { $third_cid = $v['id']; ... } |
6. 获取四级栏目信息 |
$cat_info = GetCategory($third_cid); |
在代码示例中,GetChildList()
函数用于获取指定栏目的子栏目列表,GetCategory()
函数用于获取指定栏目的详细信息。
代码仅为示例,实际使用时请根据实际情况进行调整。