DEDECMS(织梦)(下文简称dede)没有单独的标签可以直接调用出顶级和二级栏目名。这样在做站点导航的时候,没有二级栏目确实很不爽。虽然可以通过标签的套用来达到目的,这个现在已经不是什么难题了,简单的调用使用如下的几行代码即可达到目的:
0
1
2
3
4
5
|
{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}
|
但是如果想要在导航里给二级栏目加上效果美化呢?有的时候就会比较棘手,比如说如下的情况:
二级目录加特效
这里给ul标签加上了一些效果,如果还是按照简单的调用方式,那代码应该写成这样:
0
1
2
3
4
5
6
7
8
|
{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}
|
上段代码效果如图
虽然 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后台进行设置,设置方式见下图:
dede后台——系统——系统基本参数——其他选项
进入到dede后台,在 dede后台——系统——系统基本参数——其他选项 里面,第二个参数默认模版引擎禁用标签里有php,在这里将php去掉然后点击下面的确定即可让{dede:php}标签生效。 经过笔者多次测试及代码优化,最后可以判断 是否含有二级栏目的调用方法如下:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
{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}
|
代码实现效果如图:
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安装目录 这个里面的就是解析出来的路径。
dede后台——系统——系统基本参数——核心设置
热门源码