找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1386|回复: 0

[分享] dede栏目大循环加小循环调用方法分享

[复制链接]
发表于 2018-1-27 18:58:37 | 显示全部楼层 |阅读模式 来自 中国–河南–新乡
dede的栏目只能循环一次。所以需要修改,在织梦5.7中试验了一下可以用。  修改文件:\include\taglib目录下的channel.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.         $cacheid = trim($cacheid);
  10.     if($cacheid !='') {
  11.         $likeType = GetCacheBlock($cacheid);
  12.         if($likeType != '') return $likeType;
  13.     }
  14.     $reid = 0;
  15.     $topid = 0;
  16.     if(empty($typeid) && $envs['typeid']!=0)
  17.     {
  18.         $typeid = $envs['typeid'];
  19.         $reid = $envs['reid'];
  20.     }else{
  21.         $reid=0;
  22.     }
  23.     if($type==''||$type=='sun') $type="son";
  24.     if($innertext=='') $innertext = GetSysTemplets("channel_list.htm");
  25.     if($reid==0 && $typeid>0)
  26.     {
  27.         $dbrow = $dsql->GetOne("Select reid From dede_arctype where id='$typeid' ");
  28.         if(is_array($dbrow)) $reid = $dbrow['reid'];
  29.     }
  30.     $likeType = '';
  31.     if($type=='top')
  32.     {
  33.         $sql = "Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
  34.           From dede_arctype where reid=0 And ishidden<>1 order by sortrank asc limit 0,$row";
  35.     }
  36.     else if($type=="son")
  37.     {
  38.         //if($_sys_globals['typeid']>0) $typeid = $_sys_globals['typeid'];
  39.         if($typeid==0) {
  40.             return '';
  41.         }
  42.         $sql = "Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
  43.           From dede_arctype where reid='$typeid' And ishidden<>1 order by sortrank asc limit 0,$row";
  44.     }
  45.     else if($type=="self")
  46.     {
  47.         if($reid==0) {
  48.             return '';
  49.         }
  50.         $sql = "Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
  51.             From `dede_arctype` where reid='$reid' And ishidden<>1 order by sortrank asc limit 0,$row";
  52.     }
  53.     //And id<>'$typeid'
  54.     $needRel = false;
  55.     $dtp2 = new DedeTagParse();
  56.     $dtp2->SetNameSpace("field","[","]");
  57.     $dtp2->LoadSource($innertext);
  58.     $dsql2 = clone $dsql;
  59.     $dsql->SetQuery($sql);
  60.     $dsql->Execute();
  61.     $line = $row;
  62.         //检查是否有子栏目,并返回rel提示(用于二级菜单)
  63.     if(ereg(':rel', $innertext)) $needRel = true;
  64.    
  65.     if(empty($sql)) return '';
  66.     $dsql->SetQuery($sql);
  67.     $dsql->Execute();
  68.    
  69.     $totalRow = $dsql->GetTotalRow();
  70.     $GLOBALS['autoindex'] = 0;
  71.     for($i=0;$i < $line;$i++)
  72.     {
  73.         if($col>1) $likeType .= "<dl>\r\n";
  74.         for($j=0;$j<$col;$j++)
  75.         {
  76.             if($col>1) $likeType .= "<dd>\r\n";
  77.             if($row=$dsql->GetArray())
  78.             {
  79.                             $row['sonids'] = $row['rel'] = '';
  80.                 if($needRel)
  81.                 {
  82.                     $row['sonids'] = GetSonIds($row['id'], 0, false);
  83.                     if($row['sonids']=='') $row['rel'] = '';
  84.                     else $row['rel'] = " rel='dropmenu{$row['id']}'";
  85.                 }
  86.                 //处理同级栏目中,当前栏目的样式
  87.                 if( ($row['id']==$typeid || ($topid==$row['id'] && $type=='top') ) && $currentstyle!='' )
  88.                 {
  89.                     if($currentstyle!='')
  90.                     {
  91.                     $linkOkstr = $currentstyle;
  92.                     $row['typelink'] = GetOneTypeUrlA($row);
  93.                     $linkOkstr = str_replace("~rel~",$row['rel'],$linkOkstr);
  94.                     $linkOkstr = str_replace("~id~",$row['id'],$linkOkstr);
  95.                     $linkOkstr = str_replace("~typelink~",$row['typelink'],$linkOkstr);
  96.                     $linkOkstr = str_replace("~typename~",$row['typename'],$linkOkstr);
  97.                     $likeType .= $linkOkstr;
  98.                     }
  99.                 }else
  100.                 {
  101.                     $row['typelink'] = $row['typeurl'] = GetOneTypeUrlA($row);
  102.                     if(is_array($dtp2->CTags))
  103.                     {
  104.                         foreach($dtp2->CTags as $tagid=>$ctag){
  105.                             if(isset($row[$ctag->GetName()]))
  106.                             {
  107.                                 $dtp2->Assign($tagid,$row[$ctag->GetName()]);
  108.                             }
  109.                             elseif (preg_match('/^sonchannel[0-9]*$/',$ctag->GetName()))
  110.                             {
  111.                                 $dtp2->Assign($tagid,lib_channel_son($ctag,$row['id'],$dsql2));
  112.                             }
  113.                         }
  114.                     }
  115.                     $likeType .= $dtp2->GetResult();
  116.                 }
  117.             }
  118.             if($col>1) $likeType .= "</dd>\r\n";
  119.             $GLOBALS['autoindex']++;
  120.         }//Loop Col
  121.         if($col>1)
  122.         {
  123.             $i += $col - 1;
  124.             $likeType .= "    </dl>\r\n";
  125.         }
  126.     }//Loop for $i
  127.     reset($dsql2);
  128.     $dsql->FreeResult();
  129.     return $likeType;
  130. }
  131. function lib_channel_son($ctag,$typeid = 0,$dsql2)
  132. {
  133.     $attlist = "row|100,col|1,currentstyle|";
  134.     FillAttsDefault($ctag->CAttribute->Items,$attlist);
  135.     extract($ctag->CAttribute->Items, EXTR_SKIP);
  136.     $innertext = $ctag->GetInnerText();
  137.     $dsql3 = clone $dsql2;
  138.     $likeType = '';
  139.     //if($_sys_globals['typeid']>0) $typeid = $_sys_globals['typeid'];
  140.     if($typeid==0) {
  141.         return '';
  142.     }
  143.     $sql = "Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
  144.           From dede_arctype where reid='$typeid' And ishidden<>1 order by sortrank asc limit 0,$row";
  145.     //And id<>'$typeid'
  146.     $dtp2 = new DedeTagParse();
  147.     $dtp2->SetNameSpace("field","[","]");
  148.     $dtp2->LoadSource($innertext);
  149.     $dsql2->SetQuery($sql);
  150.     $dsql2->Execute();
  151.     $line = $row;
  152.     for($i=0;$i < $line;$i++)
  153.     {
  154.         if($col>1) $likeType .= "<dl>\r\n";
  155.         for($j=0;$j<$col;$j++)
  156.         {
  157.             if($col>1) $likeType .= "<dd>\r\n";
  158.             if($row=$dsql2->GetArray())
  159.             {
  160.                 $row['typelink'] = $row['typeurl'] = GetOneTypeUrlA($row);
  161.                 if(is_array($dtp2->CTags))
  162.                 {
  163.                     foreach($dtp2->CTags as $tagid=>$ctag){
  164.                         if(isset($row[$ctag->GetName()]))
  165.                         {
  166.                             $dtp2->Assign($tagid,$row[$ctag->GetName()]);
  167.                         }
  168.                         elseif (preg_match('/^sonchannel[0-9]*$/',$ctag->GetName()))
  169.                         {
  170.                             $dtp2->Assign($tagid,lib_channel_son($ctag,$row['id'],$dsql3));
  171.                         }
  172.                     }
  173.                 }
  174.                 $likeType .= $dtp2->GetResult();
  175.             }
  176.             if($col>1) $likeType .= "</dd>\r\n";
  177.         }//Loop Col
  178.         if($col>1)
  179.         {
  180.             $i += $col - 1;
  181.             $likeType .= "    </dl>\r\n";
  182.         }
  183.     }//Loop for $i
  184.     reset($dsql3);
  185.     $dsql2->FreeResult();
  186.     return $likeType;
  187. }
  188. ?>
复制代码


模板调用    [field:sonchannel0]  [/field:sonchannel0]  这个是用来取子栏目用得(使用[sonchannel+数字]  作为标签名是为了防止嵌套的时候无法正确解析标签)
这个的作用就是当你的栏目有很多子栏目 无限分级的时候方便你取子栏目的
例子:
{dede:channel type='son' typeid='22'}  
[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}  

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-11-24 02:49 , Processed in 0.046825 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表