ecshop导航栏自动显示三级或多级子栏目,多级频道分类,并实现css高亮显示

ecshop导航要达到的目标:

一,比如上图,当我访问三级分类,响应式布局,这个栏目时,最顶级的元件这个分类,要高亮显示

二,如果导航上面有商品或文章频道, 并且他们有子栏目,则全自动显示所有的子栏目.

三,如果这个导航有子分类,则统一显示下拉三角标志.

代码如下

一,在includes/lib_main.php 文件中,修改掉或另外重命名并重定义一个这个get_navigator()函数,修改后的内容如下,另外get_categories_tree()这个函数为系统自带的在lib_goods.php中

/**
 * 取得自定义导航栏列表
 * @param   string      $type    位置,如top、bottom、middle
 * @return  array         列表
 */
function get_navigator($ctype = ‘‘, $catlist = array())
{
    $sql = ‘SELECT * FROM ‘. $GLOBALS[‘ecs‘]->table(‘nav‘) . ‘
            WHERE ifshow = \‘1\‘ ORDER BY  vieworder‘;
    $res = $GLOBALS[‘db‘]->query($sql);
    $cur_url = substr(strrchr($_SERVER[‘REQUEST_URI‘],‘/‘),1);
    if (intval($GLOBALS[‘_CFG‘][‘rewrite‘]))
    {
        if(strpos($cur_url, ‘-‘))
        {
            preg_match(‘/([a-z]*)-([0-9]*)/‘,$cur_url,$matches);
            $cur_url = $matches[1].‘.php?id=‘.$matches[2];
        }
    }
    else
    {
        $cur_url = substr(strrchr($_SERVER[‘REQUEST_URI‘],‘/‘),1);
    }

    $noindex = false;
    $active = 0;
	$has_suv=0;
    $navlist = array(
        ‘top‘ => array(),
        ‘middle‘ => array(),
        ‘bottom‘ => array()
    );
    while ($row = $GLOBALS[‘db‘]->fetchRow($res)){
		if($row[‘ctype‘]==‘a‘){//如果是文章类的栏目
			$row3=get_article_tree_for_nav($row[‘cid‘]);//列出所有子文章分类
		$navlist[$row[‘type‘]][] = array(
			‘name‘      =>  $row[‘name‘],
            ‘opennew‘   =>  $row[‘opennew‘],
            ‘url‘       =>  $row[‘url‘],
            ‘ctype‘     =>  $row[‘ctype‘],
            ‘cid‘       =>  $row[‘cid‘],
			 ‘has_suv‘       =>  1,//文章类用1
			  ‘sub_nav‘       =>  $row3,
			);	   
	}elseif($row[‘ctype‘]==‘c‘){//商品类的栏目
			$row4=get_categories_tree($row[‘cid‘]);//使用系统默认的函数即可.商品子类
		$navlist[$row[‘type‘]][] = array(
			‘name‘      =>  $row[‘name‘],
            ‘opennew‘   =>  $row[‘opennew‘],
            ‘url‘       =>  $row[‘url‘],
            ‘ctype‘     =>  $row[‘ctype‘],
            ‘cid‘       =>  $row[‘cid‘],
			 ‘has_suv‘       =>  2,//与文章的导航做区分
			  ‘sub_nav‘       =>  $row4,
			);	   
	}else{
		$navlist[$row[‘type‘]][] = array(//单页面等栏目,比如about.php等
			‘name‘      =>  $row[‘name‘],
            ‘opennew‘   =>  $row[‘opennew‘],
            ‘url‘       =>  $row[‘url‘],
            ‘ctype‘     =>  $row[‘ctype‘],
            ‘cid‘       =>  $row[‘cid‘]
			);
	}
    }
    /*遍历自定义是否存在currentPage*/
    foreach($navlist[‘middle‘] as $k=>$v){
        $condition = empty($ctype) ? (strpos($cur_url, $v[‘url‘]) === 0) : (strpos($cur_url, $v[‘url‘]) === 0 && strlen($cur_url) == strlen($v[‘url‘]));//单页,如about.php等,$ctype的值没有被传入
		//当前网址与数据库中循环出的网址相同
        if ($condition)//如果相同
        {
            $navlist[‘middle‘][$k][‘active‘] = 1;//是否为当前页,追加到数组中
            $noindex = true;//非首页
        }
    }
    if(!empty($ctype))//文章或商品页面.在其控制器上传入了本栏目的类型,商品类,用c表示,或文章类,用a表示
    {
		//print_r($catlist);exit;即当前访问分类id
        foreach($catlist as $key => $val){
		$parent_arr=get_top_cat_id_arr($val,$ctype);//当前被访问的分类id的所有父栏目组成的数组
		//print_r($parent_arr);exit;
            foreach($navlist[‘middle‘] as $k=>$v)
            {
                if(!empty($v[‘ctype‘]) && $v[‘ctype‘] == $ctype && ($v[‘cid‘] == $val ||in_array($v[‘cid‘],$parent_arr)))
                {//in_array($v[‘cid‘],$parent_arr),这句表示,如果本导航条上显示的频道id,包含在了当前访问的栏目的所有父栏目id数组中,则本导航条可高亮显示
                    $navlist[‘middle‘][$k][‘active‘] = 1;//高亮关键字
                    $noindex = true;   
                }
            }
        }
    }
    if ($noindex == false) {
        $navlist[‘config‘][‘index‘] = 1;
    }
//print_r($navlist);exit;
    return $navlist;
}

二,同样在includes/lib_main.php 文件中,增加以下函数

/**
 * 获得指定分类同级的所有分类以及该分类下的子分类
 *
 * @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 
    */
    $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_cat_id_arr($cat_id,‘a‘);//当前访问的栏目的所有上级栏目id,所组成的数组
		array_pop($cat_cur);//去除最顶级的栏目,防止干扰高亮
		$cat_loop=get_top_cat_id_arr($row[‘cat_id‘],‘a‘);//循环时,本栏目的所有上级栏目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_cat_id_arr( $nid ,$ctype=‘c‘){
	if($ctype==‘c‘){$table=$GLOBALS[‘ecs‘]->table( "category" );}else{$table=$GLOBALS[‘ecs‘]->table( "article_cat" );}
	$sql = "select parent_id from ".$table." 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 ".$table." where cat_id = ".$pid."";
	$pid2 = $GLOBALS[‘db‘]->getOne( $sql2 );
		if($pid2==0){
			return $temp_arr;
		}else{
			$temp_arr[]=$pid2 ;
			$sql3 = "select parent_id from ".$table." where cat_id = ".$pid2."";
	$pid3 = $GLOBALS[‘db‘]->getOne( $sql3 );
	if($pid3==0){
			return $temp_arr;
		}else{
			$temp_arr[]=$pid3 ;
			$sql4 = "select parent_id from ".$table." where cat_id = ".$pid3."";
	$pid4 = $GLOBALS[‘db‘]->getOne( $sql4 );
	if($pid4==0){
			return $temp_arr;
		}else{
			$temp_arr[]=$pid4;
			$sql5 = "select parent_id from ".$table." where cat_id = ".$pid4."";
	$pid5 = $GLOBALS[‘db‘]->getOne( $sql5 );
	if($pid5==0){
			return $temp_arr;
		}else{
			$temp_arr[]=$pid5;
			$sql6 = "select parent_id from ".$table." where cat_id = ".$pid5."";
	$pid6 = $GLOBALS[‘db‘]->getOne( $sql6 );
			if($pid6==0){
			return $temp_arr;
		}else{
			$temp_arr[]=$pid6;
			return $temp_arr;
		}}}}}}}

三,相应header模板中增加示例代码,具体可自己修改,如果要增加层级,在模板上继续嵌套即可.同时后面的这个函数也可以增加层级function get_top_cat_id_arr()

<ul id="nav2" class="nav2 clearfix">
		<li class="nLi  {if $navigator_list.config.index eq 1}on{/if}"> <a  href="index.php"><span class="text">后易首页</span></a> </li>
			    <!-- {foreach name=nav_middle_list from=$navigator_list.middle item=nav} -->
        <li class="nLi  {if $nav.active eq 1}on{/if}"> <a  href="{$nav.url}" {if $nav.opennew eq 1}target="_blank" {/if}>{$nav.name} {if $nav.has_suv gt 0}<span class="arrow"></span>{/if}</a> 
		{if $nav.has_suv eq 1}
		<ul class="sub">
		 <!-- {foreach name=sub_nav from=$nav.sub_nav item=child} -->
		<li><a href="{$child.url}">{$child.name}</a>

		<ul class="sub">
		<!--{foreach from=$child.cat_id item=child1 }-->
		<li><a href="{$child1.url}">----{$child1.name}</a>

		<ul class="sub">
		 <!-- {foreach name=sub_nav from=$child1.cat_id item=child2} -->
		<li><a href="{$child2.url}">========{$child2.name}</a></li>
		<!-- {/foreach} --> 
		</ul>
		</li>  
		<!-- {/foreach} --> 
		</ul>
		</li>  
               <!-- {/foreach} -->  
			   </ul>
			   {/if}
 {if $nav.has_suv eq 2}
		<ul class="sub">
		 <!-- {foreach name=sub_nav from=$nav.sub_nav item=child} -->
		<li><a href="{$child.url}">{$child.name}</a>
		<ul class="sub">
		<!--{foreach from=$child.cat_id item=child1 }-->
		<li><a href="{$child1.url}">----{$child1.name}</a>

		<ul class="sub">
		 <!-- {foreach name=sub_nav from=$child1.cat_id item=child2} -->
		<li><a href="{$child2.url}">========{$child2.name}</a></li>
		<!-- {/foreach} --> 
		</ul>
		</li>  
		<!-- {/foreach} --> 
		</ul>
		</li>  
               <!-- {/foreach} -->  
			   </ul>
			   {/if}	   
		</li><!-- {/foreach} -->
		</ul>
时间: 2024-10-05 20:25:25

ecshop导航栏自动显示三级或多级子栏目,多级频道分类,并实现css高亮显示的相关文章

js监听网页页面滑动滚动事件,实现导航栏自动显示或隐藏

/** * 页面滑动滚动事件 * @param e *///0为隐藏,1为显示var s = 1; function scrollFunc(e) { // e存在就用e不存在就用windon.event e = e || window.event;// 先判断是什么浏览器 if (e.wheelDelta) { // 浏览器IE,谷歌 if (e.wheelDelta > 0) {//当滑轮向上滚动时// console.log("滑轮向上滚动"); if (s == 0) {

Ecshop导航栏标题栏的伪静态设置

当Ecshop的伪静设置成功之后,左侧的分类标签,包括具体的产品页面都可以顺利的打开伪静态页面,但是点击导航栏,或者标题栏的时候,却还是之前的数据库标签页的方式,这是怎么一回事呢? 这是由于,Ecshop的默认模板的导航栏,是采用直接指定页面的方式来制定的,所以当伪静态设置成功了之后,需到后台手动修改导航栏的链接页面,就可以了,具体操作顺序如下: 找到“系统设置”的“自定义导航栏”栏目,点击进入: 找到自己需要修改的导航栏目,点“编辑”: 如下,手动修改链接地址,或者修改系统栏目到指定的相关栏目

双击导航栏自动滑动ListView到顶部

有些app都实现了双击导航栏让页面的list自动滑动到顶部的feature. 先实现一个继承于OnTouchListener的监听多次点击事件的监听器,通过callback把连续点击的次数返回给客户代码,代码见gist:MultiTouchListener.java. https://gist.github.com/Viyu/d06eda19f9bcf7223f6b 然后给导航栏添加下面这个OnTouchListener的实现: OnMultiTouchListener mOnMultiTouc

改良版 导航栏自动跟随

css部分: .container { /*最外层div定宽*/ position: relative; width: 15rem; height: 1rem; margin-top: 20rem; } .con { /*第二层div,设置溢出为滚动条*/ overflow-x: scroll; overflow-y: hidden; height: 1rem; font-size: 0.4rem; width: 15rem; position: absolute; top: 0; } .nav

iOS解决隐藏导航栏后,打开照片选择器后导航栏不显示的问题以及更换导航栏背景色

问题描述: 遇到一种情况,在一个控制器上(隐藏了导航栏),打开照片选择器 UIImagePickerController后,照片选择器头部一片空白,且上滑相册时,信息会有错乱效果. 原因分析: 通过查看层次图,发现导航栏其实有的,那么问题是因为导航栏透明了导致的 解决办法: UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceT

织梦(dedecms)循环调用多级子栏目如二级栏目下三级栏目

本文是关于织梦DedeCMS调用多级子栏目的,拿来分享下. 后台已经建好栏目,对于产品展示栏 栏目导航如下图所示:  复制代码 代码如下: {dede:channelartlist cacheid='channelsonlist' typeid=3 } <dd> <dl> <dt><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>&l

vue 侧边导航栏递归显示

import axios from "axios"; import tabs1 from "../tab_content/tab1.vue"; import myTree from "./items.vue"; export default { data() { return { theModel: [], }; props: ["tabs"] }, components: { myTree }, methods: { tab

关于iOS导航控制器隐藏和显示会出现返回键失效,导航栏标题动画异常

最近做的demo  bug出现了,我觉得这个bug出现得很经典所以贴出来给大家看看, bug演示就是:点击返回键失效出现如下gif图演示的内容 为啥会出现如此奇葩的bug,系统的返回键居然失效了,尴尬症又犯了,愣是点了很久也不知所措 bug出现的源头:从不隐藏导航栏进行手势返回的时候,手势返回一半松手,回到不隐藏导航栏的页面,在push其他页面,就会出现返回键失效的问题 出现bug的重要步骤:手势返回一半又松手 进行页面隐藏导航栏的代码如下 //显示导航栏 [self.navigationCon

UI: 在导航栏显示一张图片

问题: 在导航控制器的当前视图中的标题中用一张图片代替文本 使用导航项目中视图控制器中 navigation item 的 titleView 属性: - (void)viewDidLoad{ [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; /* Create an Image View to replace the Title View */ UIImageView *imageView =[[UII