" />

DEDECMS(织梦)二级栏目调用及判断输出

shape
shape
shape
shape
shape
shape
shape
shape
DEDECMS(织梦)二级栏目调用及判断输出缩略图

情景介绍:

DEDECMS(织梦)(下文简称dede)没有单独的标签可以直接调用出顶级和二级栏目名。这样在做站点导航的时候,没有二级栏目确实很不爽。虽然可以通过标签的套用来达到目的,这个现在已经不是什么难题了,简单的调用使用如下的几行代码即可达到目的:

PHP

012345 {dede:channelartlist typeid=‘top’}<a href=“{dede:field name=’typeurl’/}”>{dede:field name=‘typename’/}</a>{dede:channel type=‘son’ noself=‘yes’}<div><a href=“[field:typelink/]”>[field:typename/]</a></div>{/dede:channel}{/dede:channelartlist}

但是如果想要在导航里给二级栏目加上效果美化呢?有的时候就会比较棘手,比如说如下的情况:

DEDECMS(织梦)二级栏目调用及判断输出插图

二级目录加特效

这里给ul标签加上了一些效果,如果还是按照简单的调用方式,那代码应该写成这样:

PHP

012345678 {dede:channelartlist typeid=‘top’}<li><a href=“{dede:field name=’typeurl’/}”>{dede:field name=‘typename’/}</a><ul>{dede:channel type=‘son’ noself=‘yes’}<li><a href=“[field:typelink/]”>[field:typename/]</a></li>{/dede:channel}</ul></li>{/dede:channelartlist}

DEDECMS(织梦)二级栏目调用及判断输出插图1

上段代码效果如图

虽然 js的效果依然在,而且二级栏目也调用出来了,但是仔细观察代码可以发现,没有二级栏目的就会多出一个<ul style:”display:none;”</ul>,并且实际显示的时候也有多余的<span></span>。仔细观察代码就能发现,产生这个问题的原因在于最外层的{dede:channelartlist}标签循环。这样不仅影响美观,无形中也增加代码的冗余,这肯定是我们不想见到的。 所以笔者想到两种可行的办法,第一种,是在js和css上面下文章,这样的好处就如前文所说,对效率影响不大,有可能会牺牲效果;但是今我们不讨论这种方法了,走种极端路线,就是要这样的效果,不改动js以及css的情况下,只好用第二种方法,就是在模版文件里面加上判断,对每个要在导航栏里面调用出来的顶级栏目都进行判断,判断是否有二级栏目。这样做,多少都会影响一点效率,毕竟增加了对数据库的操作,不过想必一般的网站导航里的顶级栏目和二级栏目不会很多,小数量的查找,效率的影响基本可以忽略不计了,并且如果全站都使用静态的话,那影响就会更小。 在dede的模版里加入判断是否含有二级栏目,笔者在百度和Google上寻找了许久,竟然没有找到,好吧,那就只有自己动手来做,因此才有了下面的解决方案。

进入正题:

首先想到的是模版里不用sql,不用php,就用dede已有的dede标签通过不同的嵌套来达到目的。努力尝试了很多,有方法倒是可以解决,只是简单的方式影响效率:每个顶级栏目下的二级栏目要被重复遍历3次;如果用复杂的方式,虽说不用遍历这么多次,但遍历时取出的无用信息实在太多,心有不甘啊,无奈之下,只好求助于dede下万能标签{dede:php}和{dede:sql}。——如果想要{dede:php}在模版里起作用,需要在dede后台进行设置,设置方式见下图:

DEDECMS(织梦)二级栏目调用及判断输出插图2

dede后台——系统——系统基本参数——其他选项

进入到dede后台,在dede后台——系统——系统基本参数——其他选项 里面,第二个参数默认模版引擎禁用标签里有php,在这里将php去掉然后点击下面的确定即可让{dede:php}标签生效。 经过笔者多次测试及代码优化,最后可以判断 是否含有二级栏目的调用方法如下:

PHP

01234567891011121314151617 {dede:channelartlist typeid=‘top’}<li><a href=“{dede:field name=’typeurl’/}”>{dede:field name=‘typename’/}</a>{dede:php}$id = $refObj->Fields[‘id’];$sql = (“SELECT * FROM dede_arctype where reid =’$id'”);$db->SetQuery($sql);$db->Execute();if($db->GetTotalRow()){echo ‘<ul>’;while($row = $db->GetArray()){$url = str_replace(‘{cmspath}’,,($row[typedir]));echo “<li><a href=”.$url.“>”.($row[typename]).“</a></li>”;};echo ‘</ul>’;};{/dede:php}</li>{/dede:channelartlist}

代码实现效果如图:

DEDECMS(织梦)二级栏目调用及判断输出插图3

dede判断是否含有二级目录效果

部分代码释义:

1、$id = $refObj->Fields[‘id’]; 此段代码取得的id是由上层{dede:channelartlist typeid=’top’}标签循环出来的当前顶级栏目id,只有将当前的id放入下面的sql语句中,才能配合循环判断相应的顶级栏目下是否含有二级栏目,如果将id固定,将无法完成循环判定;

2、$db->GetTotalRow();此语句取得的是执行完sql查询后得到的查询总记录条数,在这里用来做判定是否含有二级栏目的条件;

3、$url = str_replace(‘{cmspath}’,”,($row[typedir]));从数据库里查出来的二级栏目地址带有{cmspath},直接从数据库取出后{cmspath}在模版里将无法被解析,所以如果在此处不加处理,连接将会发生错误。这里这个语句要根据自己站点的实际情况进行配置,如果在后台添加二级栏目的时候,路径没有使用系统默认的,那这里就不需要处理了。说明下这个{cmspath},这个其实就是dede的安装路径,这个在dede后台——系统——系统基本参数——核心设置里第一个参数DedeCMS安装目录 这个里面的就是解析出来的路径。

DEDECMS(织梦)二级栏目调用及判断输出插图4

dede后台——系统——系统基本参数——核心设置

发表评论