我们在用CMS建站、二次开发的时候,一般是根据HTML结构镶入具体的数据调用标签,相比而言,织梦DEDE的标签和PHpcms V9类似,基本上是通过{dede: ***}来实现,而在二级菜单、子菜单调用方面,DEDE明显没有Phpcms V9方便。在这里与大家分享DedeCMS二级菜单导航自定义调用方法。
先来对比下PC v9跟Dede调用二级菜单的差别:
Phpcms v9调用一二级菜单代码:
{pc:content action="category" catid="0" num="25" siteid="$siteid" order="listorder ASC" return="nav"} <ul class="dropmenu"> <li class="home"><a class="topmenu" href="{APP_PATH}"><span>首 页</span></a></li> {loop $nav $r} <li class="cat-{$r[catid]}"><a class="topmenu" href="{$r[url]}"><span>{$r[catname]}</span></a> {pc:content action="category" catid="$r[catid]" num="20" siteid="$siteid" order="listorder ASC" return="submenu"} {if $submenu} <ul class="submenus narnav"> {loop $submenu $v} <li><a href="{$v[url]}"><span>{$v[catname]}</span></a></li> {/loop} </ul> {/if} {/pc} </li> {/loop} </ul> {/pc} {php echo runhook('glogal_menu')}
大家可以注意下标红色的代码,Phpcms v9可以判断是否子菜单,然后可以自定一级菜单的栏目id,一二级栏目分别调用的数据,具体调用的方式具体到栏目名称、栏目URL,可以说是真正自定义。
DedeCMS调用一二级菜单代码:
<div id="navMenu"> <ul> <li><a href='{dede:global.cfg_cmsurl/}/'><span>主页</span></a></li> {dede:channel type='top' row='10' currentstyle="<li class='hover'><a href='~typelink~' ~rel~><span>~typename~</span></a></li>"} <li><a href='[field:typeurl/]' [field:rel/]><span>[field:typename/]</span></a></li> {/dede:channel} </ul> </div>
以上是官方演示默认模板调用一级菜单的代码,也有网友衍生出调用二级方法:
{dede:channelartlist typeid='top' cacheid='channelsonlist'}<ul id="dropmenu{dede:field.typeid/}" class="dropMenu"> {dede:channel type='son' noself='yes'} <li><a href="[field:typelink/]">[field:typename/]</a></li> {/dede:channel} </ul> {/dede:channelartlist}
但是,总体来说DEDE二级导航做起来比较麻烦,不能能灵活使用,而我们需要让它变得灵活起来,来满足我们的各种需求。
下面是灵活自定义调用二级导航的代码:
{dede:channelartlist row=10 typeid='top'} <li><a class="hide" href="{dede:field name='typeurl'/}" title="{dede:field name='typename'/}">{dede:field name='typename'/}</a> {dede:field name='id' runphp='yes'} global $dsql; $sql = "Select typedir,typename from dede_arctype where reid=".@me." order by sortrank limit 0,10"; $dsql->SetQuery($sql);//将SQL查询语句格式化 $dsql->Execute();//执行SQL操作 $ns = $dsql->GetTotalRow(); if($ns>0){ //通过循环输出执行查询中的结果 $xinfo='<ul>'; while($row = $dsql->GetArray()){ $xinfo.='<li><a href="'.str_replace('{cmspath}','',$row['typedir']).'">'.$row['typename'].'</a></li>'; } $xinfo.='</ul>'; @me=$xinfo; }else{@me='';} {/dede:field} </li> {/dede:channelartlist}
这样,采用查询数据库,自定义SQL的方式做到一二级菜单自定义调用。