文档章节

ecshop文章侧边栏导航,自动调用文章多级子栏目子分类并且当前栏目及父栏目高亮显示

越野小生
 越野小生
发布于 2015/11/30 23:37
字数 1552
阅读 153
收藏 0
点赞 0
评论 0

效果图


介绍:

一,比如访问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);


© 著作权归作者所有

共有 人打赏支持
越野小生
粉丝 3
博文 113
码字总数 32174
作品 0
杨浦
ecshop导航栏自动显示三级或多级子栏目,多级频道分类,并实现css高亮显示

ecshop导航要达到的目标: 一,比如上图,当我访问三级分类,响应式布局,这个栏目时,最顶级的元件这个分类,要高亮显示 二,如果导航上面有商品或文章频道, 并且他们有子栏目,则全自动显示所有的子...

越野小生 ⋅ 2015/12/01 ⋅ 0

ecshop 完美解决动态ip登录超时和购物车清空问题

ECSHOP模板/ecshop开发中心(www.68ecshop.com) / 2014-05-06 前一段时间,ECSHOP开发中心的一个客户说自己的ecshop网店出了状况,就是有时候登录的时候会自动退出。而且购物车也没规律的会清...

thinkyoung ⋅ 2015/06/24 ⋅ 0

ecshop 工作流程加载配置介绍

ecshop 工作流程加载配置介绍 分类: ecshop2014-09-14 09:36 729人阅读 评论(2) 收藏 举报 模板引擎工作流 这里简单介绍下echsop工作流程: 首先,你会发现一般的echsop的php文件都会引入i...

thinkyoung ⋅ 2015/05/21 ⋅ 0

linux下安装ecshop,

本文参考https://blog.csdn.net/fuwei52406/article/details/50547366,略有修改。 感谢原作者。 安装apache服务器,php服务器,mysql服务器 yum install httpd yum install php 卸载掉原有mys...

云中栖 ⋅ 05/28 ⋅ 0

ecshop session丢失问题

ecshop session丢失问题 电子商务PHP 用ecshop搭建了一个电子商务的系统,本地测试一切正常。放到服务器上出现问题: 症状: 点着点着经常无故退出,感觉session被清空了。查找原因:ecshop中...

thinkyoung ⋅ 2015/06/29 ⋅ 0

第三方支付接口现号,第三方支付接口对接,第三方支付接口申请

第三方支付公司太多,到目前为止一共有5批206家拿牌支付公司:国付宝,支付宝,环迅,汇潮,易宝,快钱,智付,等等不管您从事与哪家,我们都必须面对这些事实,每家支付公司都有自己的优势跟...

alaimaro ⋅ 04/26 ⋅ 0

PHPCMS常用及其调用方法

1、可视化编辑器的调用方法 需要用到editor函数,editor($textareaid = 'content', $toolbar = 'phpcms', $width = 500, $height = 400) $textareaid 为文本框 id $toolbar 为工具按钮样式,...

皇冠小丑 ⋅ 2016/03/11 ⋅ 0

PHPCMSV9父栏目调用子栏目的方法

我们在做模板时有时候需要用到调用栏目的子栏目,下面这个文章将教大家实现目的,挺简单的。代码如下: 在二级栏目列表页调用: 代码如下: <!-- 获取子栏目 @param $parentid 父级id * @par...

名字已被取 ⋅ 2016/03/28 ⋅ 0

织梦dedecms获取当前内容页栏目id号的方法

一,可在内容模板中直接这样写{dede:field.typeid/} 可显示本栏目的id 二,也可这样写 {dede:type}[field:ID /]{/dede:type} 三, 如果是在{dede:sql}里面调用当前栏目ID的话,调用方法如下: 代...

越野小生 ⋅ 2015/12/28 ⋅ 0

帝国CMS自定义导航栏目支持当前栏目高亮的又一教程

自定义导航栏目,不是标签调用显示的导航, 就是手动写死的栏目也能支持高亮。 第一步: 打开 /e/class/userfun.php 加入以下函数代码: 1 第二步: 使用这个代码可以调用出当前一级栏目ID ...

ziluopao ⋅ 2016/11/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何使用serverchan微信推送告警

之前实现推送告警信息到微信的方法有如下几种: 1、通过企业公众号实现----收费: 2、通过QQ邮箱,在微信平台上开启收到邮件进行提醒; 3、第三方告警平台API,一般也是收费的; 不过最近看文...

问题终结者 ⋅ 24分钟前 ⋅ 0

TCP的RPC

RPC就是远程方法调用(Remote Process Call ),包含了客户端和服务端,涉及了对象的序列化传输。 1.服务端启动,注册远程调用的类2.客户端发送请求信息包含类、方法、参数的一些信息、序列化传...

Cobbage ⋅ 45分钟前 ⋅ 0

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 55分钟前 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 今天 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 今天 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 今天 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 今天 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部