DEDECMS获取无限栏目子分类的方法

做企业网站大部分是使用DEDECMS,今天在给客户设计网站时,把DEDE自动内链和URL全拼格式搞定后,又遇到了个小问题,因为产品分类最多有四级,客户要求在左侧有个弹出式菜单调用各级子分类出来,而DEDECMS默认只能调用一级分类。经过萧涵的努力,百度+GOOGLE+自己脑袋,终于搞定了这个东西,不敢独享,发出来给有需要的朋友分享。

首先要把/include/taglib/channerl.lib.php 文件的代码修改成以下的:

 
 
  1. <?php
  2. function lib_channel(&$ctag,&$refObj)
  3. {
  4. global $_sys_globals,$envs,$dsql;
  5. $attlist = “typeid|0,reid|0,row|100,col|1,type|son,currentstyle|”;
  6. FillAttsDefault($ctag->CAttribute->Items,$attlist);
  7. extract($ctag->CAttribute->Items, EXTR_SKIP);
  8. $innertext = $ctag->GetInnerText();
  9. if(empty($typeid) && $envs['typeid']!=0)
  10. {
  11. $typeid = $envs['typeid'];
  12. $reid = $envs['reid'];
  13. }else{
  14. $reid=0;
  15. }
  16. if($type==”||$type==’sun’) $type=”son”;
  17. if($innertext==”) $innertext = GetSysTemplets(“channel_list.htm”);
  18. if($reid==0 && $typeid>0)
  19. {
  20. $dbrow = $dsql->GetOne(“Select reid From ying_arctype where id=’$typeid’ “);
  21. if(is_array($dbrow)) $reid = $dbrow['reid'];
  22. }
  23. $likeType = ”;
  24. if($type==’top’)
  25. {
  26. $sql = “Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
  27. From ying_arctype where reid=0 And ishidden<>1 order by sortrank asc limit 0,$row”;
  28. }
  29. else if($type==”son”)
  30. {
  31. //if($_sys_globals['typeid']>0) $typeid = $_sys_globals['typeid'];
  32. if($typeid==0) {
  33. return ”;
  34. }
  35. $sql = “Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
  36. From ying_arctype where reid=’$typeid’ And ishidden<>1 order by sortrank asc limit 0,$row”;
  37. }
  38. else if($type==”self”)
  39. {
  40. if($reid==0) {
  41. return ”;
  42. }
  43. $sql = “Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
  44. From ‘ying_arctype’ where reid=’$reid’ And ishidden<>1 order by sortrank asc limit 0,$row”;
  45. }
  46. //And id<>’$typeid’
  47. $dtp2 = new DedeTagParse();
  48. $dtp2->SetNameSpace(“field”,”[","]“);
  49. $dtp2->LoadSource($innertext);
  50. $dsql2 = clone $dsql;
  51. $dsql->SetQuery($sql);
  52. $dsql->Execute();
  53. $line = $row;
  54. $GLOBALS['autoindex'] = 0;
  55. for($i=0;$i < $line;$i++)
  56. {
  57. if($col>1) $likeType .= “<dl>\r\n”;
  58. for($j=0;$j<$col;$j++)
  59. {
  60. if($col>1) $likeType .= “<dd>\r\n”;
  61. if($row=$dsql->GetArray())
  62. {
  63. if($type==’self’ && $row['id']==$typeid) //处理同级栏目中,当前栏目的样式
  64. {
  65. if($currentstyle!=”)
  66. {
  67. $linkOkstr = $currentstyle;
  68. $row['typelink'] = GetOneTypeUrlA($row);
  69. $linkOkstr = str_replace(“~typelink~”,$row['typelink'],$linkOkstr);
  70. $linkOkstr = str_replace(“~typename~”,$row['typename'],$linkOkstr);
  71. $likeType .= $linkOkstr;
  72. }
  73. }else
  74. {
  75. $row['typelink'] = $row['typeurl'] = GetOneTypeUrlA($row);
  76. if(is_array($dtp2->CTags))
  77. {
  78. foreach($dtp2->CTags as $tagid=>$ctag){
  79. if(isset($row[$ctag->GetName()]))
  80. {
  81. $dtp2->Assign($tagid,$row[$ctag->GetName()]);
  82. }
  83. elseif (preg_match(‘/^sonchannel[0-9]*$/’,$ctag->GetName()))
  84. {
  85. $dtp2->Assign($tagid,lib_channel_son($ctag,$row['id'],$dsql2));
  86. }
  87. }
  88. }
  89. $likeType .= $dtp2->GetResult();
  90. }
  91. }
  92. if($col>1) $likeType .= “</dd>\r\n”;
  93. $GLOBALS['autoindex']++;
  94. }//Loop Col
  95. if($col>1)
  96. {
  97. $i += $col – 1;
  98. $likeType .= ” </dl>\r\n”;
  99. }
  100. }//Loop for $i
  101. reset($dsql2);
  102. $dsql->FreeResult();
  103. return $likeType;
  104. }
  105. function lib_channel_son($ctag,$typeid = 0,$dsql2)
  106. {
  107. $attlist = “row|100,col|1,currentstyle|”;
  108. FillAttsDefault($ctag->CAttribute->Items,$attlist);
  109. extract($ctag->CAttribute->Items, EXTR_SKIP);
  110. $innertext = $ctag->GetInnerText();
  111. $dsql3 = clone $dsql2;
  112. $likeType = ”;
  113. //if($_sys_globals['typeid']>0) $typeid = $_sys_globals['typeid'];
  114. if($typeid==0) {
  115. return ”;
  116. }
  117. $sql = “Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
  118. From ying_arctype where reid=’$typeid’ And ishidden<>1 order by sortrank asc limit 0,$row”;
  119. //And id<>’$typeid’
  120. $dtp2 = new DedeTagParse();
  121. $dtp2->SetNameSpace(“field”,”[","]“);
  122. $dtp2->LoadSource($innertext);
  123. $dsql2->SetQuery($sql);
  124. $dsql2->Execute();
  125. $line = $row;
  126. for($i=0;$i < $line;$i++)
  127. {
  128. if($col>1) $likeType .= “<dl>\r\n”;
  129. for($j=0;$j<$col;$j++)
  130. {
  131. if($col>1) $likeType .= “<dd>\r\n”;
  132. if($row=$dsql2->GetArray())
  133. {
  134. $row['typelink'] = $row['typeurl'] = GetOneTypeUrlA($row);
  135. if(is_array($dtp2->CTags))
  136. {
  137. foreach($dtp2->CTags as $tagid=>$ctag){
  138. if(isset($row[$ctag->GetName()]))
  139. {
  140. $dtp2->Assign($tagid,$row[$ctag->GetName()]);
  141. }
  142. elseif (preg_match(‘/^sonchannel[0-9]*$/’,$ctag->GetName()))
  143. {
  144. $dtp2->Assign($tagid,lib_channel_son($ctag,$row['id'],$dsql3));
  145. }
  146. }
  147. }
  148. $likeType .= $dtp2->GetResult();
  149. }
  150. if($col>1) $likeType .= “</dd>\r\n”;
  151. }//Loop Col
  152. if($col>1)
  153. {
  154. $i += $col – 1;
  155. $likeType .= ” </dl>\r\n”;
  156. }
  157. }//Loop for $i
  158. reset($dsql3);
  159. $dsql2->FreeResult();
  160. return $likeType;
  161. }
  162. ?>

模板里面用 [field:sonchannel0] [/field:sonchannel0] 调用,这个是用来取子栏目用得(使用【sonchannel+数字】作为标签名是为了防止嵌套的时候无法正确解析标签),这个的作用就是当你的栏目有很多子栏目无限分级的时候方便你取子栏目的。实例一下:

 
 
  1. <ul id=”left_nav”>
  2. {dede:channel type=’son’ typeid=’16′}
  3. <li><a href=”[field:typelink/]“>[field:typename/]</a>
  4. <ul>
  5. [field:sonchannel0]
  6. <li><a href=”[field:typelink/]“>[field:typename/]</a>
  7. <ul>
  8. [field:sonchannel1]
  9. <li><a href=”[field:typelink/]“>[field:typename/]</a>
  10. <ul>
  11. [field:sonchannel2]
  12. <li><a href=”[field:typelink/]“>[field:typename/]</a>
  13. <ul>
  14. [field:sonchannel3]
  15. <li><a href=”[field:typelink/]“>[field:typename/]</a></li>
  16. [/field:sonchannel3]
  17. </ul>
  18. </li>
  19. [/field:sonchannel2]
  20. </ul>
  21. </li>
  22. [/field:sonchannel1]
  23. </ul>
  24. </li>
  25. [/field:sonchannel0]
  26. </ul>
  27. </li>
  28. {/dede:channel}
  29. </ul>

以上typeid中的数字改成你的大分类的ID即可,因为在DEDE官方论坛没找到,所以这里发上来,希望能方便有用者。(转自萧涵的博百优)

注意:未免出错修改文件前请做好备份,以上代码可能有些引号又被自动转成全角的了,请修改成半角的,或者可以找萧涵索取此修改后的文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值