在使用Dedecms CMS模板时,创建无限级栏目列表菜单是一项常见的需求。然而,很多用户在尝试实现这一功能时可能会遇到困难。本文将详细介绍如何通过自定义标签来实现这一功能,确保您的网站能够高效地展示多级栏目。
### 第一步:创建自定义标签文件 为了实现无限级栏目的调用,我们需要在Dedecms的`includetaglib`目录下创建一个新的PHP文件,命名为`randomartlist.lib.php`。以下是该文件的具体内容:

CAttribute->Items,$attlist);
    extract($ctag->CAttribute->Items, EXTR_SKIP);
    $revalue = '';
    // 读取固定的缓存块
    $cacheid = trim($cacheid);
    if($cacheid !='') {
        $revalue = GetCacheBlock($cacheid);
        if($revalue != '') return $revalue;
    }
    // 如果属性里没指定栏目id,从引用类里获取栏目信息
    if(empty($typeid))
    {
        if( isset($refObj->TypeLink->TypeInfos['id']) )
        {
            $typeid = $refObj->TypeLink->TypeInfos['id'];
            $reid = $refObj->TypeLink->TypeInfos['reid'];
            $topid = $refObj->TypeLink->TypeInfos['topid'];
        }
        else {
          $typeid = 0;
      }
    }
    else
    {
        $row2 = $dsql->GetOne("SELECT reid,topid,channeltype,ispart FROM `dede_arctype` WHERE reid='$topid' ");
        if(!is_array($row2))
        {
            $typeid = $reid = $topid = $channeltype = $ispart = 0;
        } else {
            $reid = $row2['reid'];
            $channeltype = $row2['channeltype'];
            $ispart = $row2['ispart'];
            $typepid = $row2['id'];
        }
    }
    // 调用Typeid
    if( !empty($topid) )
    {
        $topQuery = "SELECT id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath FROM `dede_arctype` WHERE reid='$topid' And ishidden<>1 order by sortrank asc";
    }
    $dsql->Execute('t', $topQuery);
    while($row = $dsql->GetArray('t'))
    {
        $row['typelink'] = GetOneTypeUrlA($row);
        if( $row['id']==$typeid && $currentstyle!='' )
        {
            $linkOkstr = $currentstyle;
            $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);
            $revalue .= $linkOkstr;
        }
        else
        {
          $revalue .= "    
  • $row[typename]
  • n"; } randomartlistSon($row['id'],$typeid,$currentstyle, $revalue); } if($cacheid !='') { WriteCacheBlock($cacheid, $revalue); } return $revalue; } function randomartlistSon($id,$typeid,$currentstyle,&$revalue) { global $dsql; $query = "SELECT id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath FROM `dede_arctype` WHERE reid='{$id}' And ishidden<>1 order by sortrank asc"; $dsql->Execute($id, $query); $thisv = ''; while($row = $dsql->GetArray($id)) { $row['typelink'] = GetOneTypeUrlA($row); if( $row['id']==$typeid && $currentstyle!='' ) { $linkOkstr = $currentstyle; $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); $thisv .= $linkOkstr; } else { $thisv .= "
  • $row[typename]
  • n"; } randomartlistSon($row['id'],$typeid,$currentstyle, $thisv); } if($thisv!='') $revalue .= "
      n$thisv
    n"; }

    ### 第二步:调用自定义标签 在模板中,您可以使用以下代码来调用新创建的标签:
    
    

    ### 第三步:CSS样式设置 为了美化您的无限级栏目列表,可以添加以下CSS样式:
    
    .alist{}
    /* 第一层修饰 */
    .alist ul {}
    .alist ul li {}
    .alist ul li a{}
    .alist ul li a:hover,.alist ul li .thisclass{}
    
    /* 第二层修饰 */
    .alist ul li ul{}
    .alist ul li ul li{}
    .alist ul li ul li a{}
    .alist ul li ul li a:hover,.alist ul li ul li  .thisclass{}
    
    通过以上步骤,您可以在Dedecms中轻松实现无限级栏目的调用和展示。这种方法不仅提高了开发效率,还增强了网站的可维护性和扩展性。希望这篇文章对您有所帮助!