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