DEDECMS 默认标签中的channel标签是无法嵌套输出子栏目信息的,而且dedecms 默认标签也不支持嵌套输出,下面是实现的嵌套栏目输出的channel标签增强版本,遗憾的是这一版删除了标准版的一些不常用到的属性,单基本上不影响我们正常使用DEDECMS。
好了,下面开始。我们找到 include/taglib/channel.lib.php 文件,用下面代码替换这个文件里面的所有内容,以免出错,请先备份一下原文件。
<?php |
<?php |
function lib_channel(&$ctag,&$refObj) |
{ |
global $_sys_globals,$envs,$dsql; |
$attlist = "typeid|0,reid|0,row|100,col|1,type|son,currentstyle|"; |
FillAttsDefault($ctag->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 `#@__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
`#@__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
`#@__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,sitepath,description |
From
`#@__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 .= "<dl>\r\n"; |
for($j=0;$j<$col;$j++) |
{ |
if($col>1) $likeType .= "<dd>\r\n"; |
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); |
$linkOkstr =str_replace("~typename~",$row['typename'],$linkOkstr); |
$likeType .= $linkOkstr; |
} |
}else |
{ |
$row['typelink']
= $row['typeurl']
= GetOneTypeUrlA($row); |
if(is_array($dtp2->CTags)) |
{ |
foreach($dtp2->CTags as $tagid=>$ctag){ |
if(isset($row[$ctag->GetName()])) |
{ |
$dtp2->Assign($tagid,$row[$ctag->GetName()]); |
} |
elseif (preg_match('/^sonchannel[0-9]*$/',$ctag->GetName())) |
{ |
$dtp2->Assign($tagid,lib_channel_son($ctag,$row['id'],$dsql2)); |
} |
} |
} |
$likeType .= $dtp2->GetResult(); |
} |
} |
if($col>1) $likeType .= "</dd>\r\n"; |
$GLOBALS['autoindex']++; |
}//Loop
Col |
if($col>1) |
{ |
$i += $col -
1; |
$likeType .= "
</dl>\r\n"; |
} |
}//Loop
for $i |
reset($dsql2); |
$dsql->FreeResult(); |
return $likeType; |
} |
function lib_channel_son($ctag,$typeid =
0,$dsql2) |
{ |
$attlist = "row|100,col|1,currentstyle|"; |
FillAttsDefault($ctag->CAttribute->Items,$attlist); |
extract($ctag->CAttribute->Items,
EXTR_SKIP); |
$innertext = $ctag->GetInnerText(); |
$dsql3 =
clone $dsql2; |
$likeType = ''; |
//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
`#@__arctype` where reid='$typeid' And
ishidden<>1 order by sortrank asc limit 0,$row"; |
//And
id<>'$typeid' |
$dtp2 = new DedeTagParse(); |
$dtp2->SetNameSpace("field","[","]"); |
$dtp2->LoadSource($innertext); |
$dsql2->SetQuery($sql); |
$dsql2->Execute(); |
$line = $row; |
for($i=0;$i < $line;$i++) |
{ |
if($col>1) $likeType .= "<dl>\r\n"; |
for($j=0;$j<$col;$j++) |
{ |
if($col>1) $likeType .= "<dd>\r\n"; |
if($row=$dsql2->GetArray()) |
{ |
$row['typelink']
= $row['typeurl']
= GetOneTypeUrlA($row); |
if(is_array($dtp2->CTags)) |
{ |
foreach($dtp2->CTags as $tagid=>$ctag){ |
if(isset($row[$ctag->GetName()])) |
{ |
$dtp2->Assign($tagid,$row[$ctag->GetName()]); |
} |
elseif (preg_match('/^sonchannel[0-9]*$/',$ctag->GetName())) |
{ |
$dtp2->Assign($tagid,lib_channel_son($ctag,$row['id'],$dsql3)); |
} |
} |
} |
$likeType .= $dtp2->GetResult(); |
} |
if($col>1) $likeType .= "</dd>\r\n"; |
}//Loop
Col |
if($col>1) |
{ |
$i += $col -
1; |
$likeType .= "
</dl>\r\n"; |
} |
}//Loop
for $i |
reset($dsql3); |
$dsql2->FreeResult(); |
return $likeType; |
} |
//应用的实例: |
//{dede:channel
type='son' typeid='2'} |
//[field:typename/] |
//<ul> |
//
[field:sonchannel0] |
//
<li><a href="[field:typelink/]">[field:typename/]</a></li> |
//
[field:sonchannel1] |
//
<li><a href="[field:typelink/]">---[field:typename/]</a></li> |
//
[field:sonchannel2] |
//
<li><a href="[field:typelink/]">===[field:typename/]</a></li> |
//
[field:sonchannel3] |
//
<li><a href="[field:typelink/]">===[field:typename/]</a></li> |
//
[/field:sonchannel3] |
//
[/field:sonchannel2] |
//
[/field:sonchannel1] |
//
[/field:sonchannel0] |
//</ul> |
//{/dede:channel} |
?> |
下面是应用实例:
{dede:channel
type='son' typeid='2'} |
[field:typename/] |
<ul> |
[field:sonchannel0] |
<li><a href="[field:typelink/]">[field:typename/]</a></li> |
[field:sonchannel1] |
<li><a href="[field:typelink/]">---[field:typename/]</a></li> |
[field:sonchannel2] |
<li><a href="[field:typelink/]">===[field:typename/]</a></li> |
[field:sonchannel3] |
<li><a href="[field:typelink/]">===[field:typename/]</a></li> |
[/field:sonchannel3] |
[/field:sonchannel2] |
[/field:sonchannel1] |
[/field:sonchannel0] |
</ul> |
{/dede:channel} |
也可以下载此修改后的文件直接替换即可。下载地址:http://pan.baidu.com/share/link?shareid=92057&uk=353171678
本文介绍如何增强DEDECMS的channel标签功能,实现栏目信息的嵌套输出,包括修改核心文件的具体步骤及应用实例。

2206

被折叠的 条评论
为什么被折叠?



