1. 程式人生 > >ecshop文章側邊欄導航,自動呼叫文章多級子欄目分類並且當前欄目及父欄目高亮顯示

ecshop文章側邊欄導航,自動呼叫文章多級子欄目分類並且當前欄目及父欄目高亮顯示

效果圖

介紹:

一,比如訪問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);