效果图
介绍:
一,比如访问ecshop的国内新闻(上图没显示),及子分类,如山东新闻,临沂新闻,上海新闻等,都会自动显示上图所示的侧导航条.
二,另外,如果我访问子导航,比如居民小区,则平凉新闻的兄弟栏目,父栏目,子栏目,都可以*设置高亮显示.而山东新闻及其子栏目则不会高亮显示,这正是本文的关键所在.具体可通过css自定义.
三,本演示是五级导航,可以无限增加,其实,上海新闻和山东新闻上面还有一级为国内新闻.上图默认不显示.如果要显示最*的国内新闻,则需要自己通过其它方式调用.与本函数分开才行.
ecshop文章栏目页的使用方法,
一修改根目录的article_cat.php文件,搜索article_categories,找到,对比替换成下面的.
$smarty->assign('article_categories', get_article_tree($cat_id)); //文章分类树
二,修改模板article_cat.dwt,增加以下测试代码,具体自己修改
<style> a{font-size:18px;color:black} .current{color:red} .current2{color:blue} .current3{color:green} .bold{font-weight:bold;font-size:22px} </style> <ul class="nav-category-list"> <!--{foreach from=$article_categories item=cat name=cat}--> <a class="<!-- {if $cat_id eq $cat.id}--> current <!-- {/if} --> <!-- {if $cat.active eq 1}--> bold <!-- {/if} -->" href="{$cat.url}">{$cat.name|escape:html}</a><br/> <!--{foreach from=$cat.cat_id item=child name=cat_cat_id}--> <a class="<!-- {if $cat_id eq $child.id}--> current2 <!-- {/if} --> <!-- {if $child.active eq 1}--> bold <!-- {/if} -->" href="{$child.url}">----{$child.name|escape:html}</a><br/> <!--{foreach from=$child.cat_id item=child2 name=cat_cat_id2}--> <a class="<!-- {if $cat_id eq $child2.id}--> current3 <!-- {/if} --> <!-- {if $child2.active eq 1}--> bold <!-- {/if} -->" href="{$child2.url}">--------{$child2.name|escape:html}</a><br/> <!--{foreach from=$child2.cat_id item=child3 name=cat_cat_id3}--> <a class="<!-- {if $cat_id eq $child3.id}--> current <!-- {/if} --> <!-- {if $child3.active eq 1}--> bold <!-- {/if} -->" href="{$child3.url}">-----------------{$child3.name|escape:html}</a><br/> <!--{/foreach}--> <!--{/foreach}--> <!--{/foreach}--> <!--{/foreach}--> </ul>
三,在includes/lib_main.php 或其它自定义的全局引用的文件中,加入以下几个函数.具体原理,注释上有说明.
//得到本分类的其中一个下级分类id function get_one_child_cat($cat_id = 0){ $sql = "select cat_id from ".$GLOBALS['ecs']->table( "article_cat" )." where parent_id = ".$cat_id.""; $cid = $GLOBALS['db']->getOne( $sql ); if ($cid){return $cid;} } /** * 获得指定分类同级的所有分类以及该分类下的子分类 * * @access public * @param integer $cat_id 分类编号 * @return array */ function get_article_tree($cat_id = 0){ if ($cat_id > 0)//$cat_id当前分类 { $parent_id=get_top_art_cat_id($cat_id); } else { $parent_id = 0; } /* 判断当前分类中,是否是底级分类, 如果是取出底级分类上级分类, 如果不是取当前分类及其下的子分类v 如 国内新闻(是*分类,所以,他的父栏目id为0) ----山东新闻 --------威海新闻 ------------环萃区新闻 ----江苏酒瘾 --------南京新闻 国际新闻 ----欧洲新闻 --------东欧新闻 */ $sql = 'SELECT count(*) FROM ' . $GLOBALS['ecs']->table('article_cat') . " WHERE parent_id = '$parent_id'";// if ($GLOBALS['db']->getOne($sql)|| $parent_id == 0){ /* 如果当前分类有子分类,获取当前分类及其子分类 */ //$sql = 'SELECT cat_id, cat_name, sort_order FROM ' . $GLOBALS['ecs']->table('article_cat') ."WHERE cat_type=1 and cat_id = '$parent_id' ORDER BY sort_order ASC, cat_id ASC";//包含*本身,国内新闻 $sql = 'SELECT cat_id, cat_name, sort_order FROM ' . $GLOBALS['ecs']->table('article_cat') ."WHERE cat_type=1 and parent_id = '$parent_id' ORDER BY sort_order ASC, cat_id ASC";//除排*分类,只显示山东新闻,江苏新闻及子分类 //两种方式,这里得到的$row['cat_id']都是目标catid,即需要高亮显示的 $res = $GLOBALS['db']->getAll($sql); $cat_arr = array(); foreach ($res AS $row) { $cat_arr[$row['cat_id']]['id'] = $row['cat_id']; $cat_arr[$row['cat_id']]['name'] = $row['cat_name']; $cat_arr[$row['cat_id']]['url'] = build_uri('article_cat', array('acid' => $row['cat_id']), $row['cat_name']); $parent_id2=get_top_art_cat_id($row['cat_id']);//得到最*父栏目id if ($parent_id2>0) { $cat_arr[$row['cat_id']]['cat_id'] =get_article_tree_child($row['cat_id'],$cat_id);//第二个参数.传入浏览器的当前页面分类号 $cat_id2=get_one_child_cat($row['cat_id']); $cat_arr[$row['cat_id']]['active']=$cat_arr[$row['cat_id']]['cat_id'][$cat_id2]['active'];//如果本栏目的其中任何一级子栏目是当前访问的栏目,则本栏目的所有父栏目 active=1,即可以高亮显示. } } } //print_r($cat_arr);exit; return $cat_arr; } function get_article_tree_child($tree_id = 0,$cat_id){ $three_arr = array(); $sql = 'SELECT count(*) FROM ' . $GLOBALS['ecs']->table('article_cat') . ' WHERE parent_id = '.$tree_id; if ($GLOBALS['db']->getOne($sql) || $tree_id == 0) { $child_sql = 'SELECT cat_id, cat_name, parent_id' . ' FROM ' . $GLOBALS['ecs']->table('article_cat') . "WHERE parent_id = '$tree_id' ORDER BY sort_order ASC, cat_id ASC"; $res = $GLOBALS['db']->getAll($child_sql); foreach ($res AS $row) { $cat_cur=$cat_loop=array(); $active=0; $cat_cur=get_top_art_cat_id2($cat_id);//当前访问的栏目的所有上级栏目id,所组成的数组 array_pop($cat_cur);//去除最*的栏目,防止干扰高亮 $cat_loop=get_top_art_cat_id2($row['cat_id']);//循环时,本栏目的所有上级栏目id,所组成的数组 array_pop($cat_loop);//去除最*栏目id if(count(array_intersect($cat_cur,$cat_loop))>0){ //如果当前访问的栏目的父栏目数组与循环栏目得到的父栏目数组,有交集, //则访问的栏目与其所有父栏目都是$active=1;方便前台高亮 $active=1; } $three_arr[$row['cat_id']]['active'] = $active; $three_arr[$row['cat_id']]['id'] = $row['cat_id']; $three_arr[$row['cat_id']]['name'] = $row['cat_name']; $three_arr[$row['cat_id']]['url'] = build_uri('article_cat', array('acid' => $row['cat_id']), $row['cat_name']); if (isset($row['cat_id']) != NULL) { $three_arr[$row['cat_id']]['cat_id'] = get_article_tree_child($row['cat_id'],$cat_id); } } } return $three_arr; } //得到其最上级分类的id function get_top_art_cat_id( $nid ){ $sql = "select parent_id from ".$GLOBALS['ecs']->table( "article_cat" )." where cat_id = ".$nid.""; $temp_id = 0; $pid = $GLOBALS['db']->getOne( $sql ); if ( 0 < $pid ) { $temp_id = get_top_art_cat_id( $pid ); return $temp_id; } $temp_id = $nid; return $temp_id; } //本分类对应的所有上级分类的数组 function get_top_art_cat_id2( $nid ){ $sql = "select parent_id from ".$GLOBALS['ecs']->table( "article_cat" )." where cat_id = ".$nid.""; $temp_id = 0; $temp_arr=array(); $pid = $GLOBALS['db']->getOne( $sql ); if ( $pid==0 ) { return $temp_arr; }else{ $temp_arr[]=$pid ; $sql2 = "select parent_id from ".$GLOBALS['ecs']->table( "article_cat" )." where cat_id = ".$pid.""; $pid2 = $GLOBALS['db']->getOne( $sql2 ); if($pid2==0){ return $temp_arr; }else{ $temp_arr[]=$pid2 ; $sql3 = "select parent_id from ".$GLOBALS['ecs']->table( "article_cat" )." where cat_id = ".$pid2.""; $pid3 = $GLOBALS['db']->getOne( $sql3 ); if($pid3==0){ return $temp_arr; }else{ $temp_arr[]=$pid3 ; $sql4 = "select parent_id from ".$GLOBALS['ecs']->table( "article_cat" )." where cat_id = ".$pid3.""; $pid4 = $GLOBALS['db']->getOne( $sql4 ); if($pid4==0){ return $temp_arr; }else{ $temp_arr[]=$pid4; $sql5 = "select parent_id from ".$GLOBALS['ecs']->table( "article_cat" )." where cat_id = ".$pid4.""; $pid5 = $GLOBALS['db']->getOne( $sql5 ); if($pid5==0){ return $temp_arr; }else{ $temp_arr[]=$pid5; $sql6 = "select parent_id from ".$GLOBALS['ecs']->table( "article_cat" )." where cat_id = ".$pid5.""; $pid6 = $GLOBALS['db']->getOne( $sql6 ); if($pid6==0){ return $temp_arr; }else{ $temp_arr[]=$pid6; return $temp_arr; } } } } } } }
四,如果要在文章内容页上调用,原理一样,不过.在调用分类树之前,要先得到这个文章所属的分类id号 才行,打开根目录的article.php文件,如下
在找到这句后,在他下面
$catlist = array(); foreach(get_article_parent_cats($article['cat_id']) as $k=>$v) { $catlist[] = $v['cat_id']; }
增加下面几句
$cat_id=$catlist[0]; //print_r($cat_id);exit; $smarty->assign('article_categories', get_article_tree($cat_id)); //文章分类树 $smarty->assign('cat_id',$cat_id);