bootstrap菜单完美解决---原创

Posted on 2014-11-18 15:27  南岗V哥  阅读(5418)  评论(0编辑  收藏  举报

       由于bootstrap的各方优点,偶的“点金项目细化分包管理平台”决定采用它。但在使用中遇到了一些问题,比如菜单的问题,这个菜单是用的一个JQuery的一个效果,点击后,所点击的链接处的class要加active,以标明哪里点击了,高亮表现,并且该链接的上级菜单项也会高亮(如果菜单项仅为一级时,其点击后亦高亮),如果采用iframe的方式,在一个页面中写JQ是能完成的,但会丧失bootstrap自动排版的特性。所以还是要在点击后跳转不同的页面的方式来处理,见过用JS来实现的,这里用PHP实现,先定义一个菜单数组(如果有需求写在数据表里也可以),这个菜单数级分两级,一级为一级菜单项,二级为一级菜单项对应的二级菜单项,通过KEY来标识,二级菜单里的LINK是指的页面中的链接如果点击了之后仍然需求将该二级菜单项及其所在的一级菜单项至为ACTIVE的CLASS。具体见下方的运行效果及代码(此代码未经过优化,只是简单实现,应该还有更好的写法):

 

<?php

function checkstr($beinclude,$uri){
    $tmparray = explode($uri,$beinclude);
    if(count($tmparray)>1){
        return true;
    } else{
        return false;
    }
}

function outputmenu($uri,$useremail)
{
    $data = array(
                    '1' =>array('name'=>'看板 Dashboard','icon'=>'iconfa-laptop','url'=>'dashboard'),
                    '2' =>array('name'=>'全站项目','icon'=>'iconfa-book','url'=>''),
                    '3' =>array('name'=>'我的项目 Site Project','icon'=>'iconfa-pencil"','url' =>''),
                    '4'=>array('name'=>'我的接单 All Project','icon'=>'iconfa-briefcase','url' => ''),
                    '5'=>array('name'=>'我的管理 Request','icon'=>'iconfa-user','url'=>''),
                    '6'=>array('name'=>'站内服务','icon'=>'iconfa-th-list','url'=>''),
                    '7'=>array('name'=>'需知及帮助','icon'=>'iconfa-envelope','url'=>''),
                    '8'=>array('name'=>'Admin 管理入口','icon'=>'iconfa-wrench','url'=>''),
                    );
    
    $menulst = array(
                    '1'=>array(array('name'=>'','icon'=>'','url'=>''),),
                    '2'=>array(
                                    array('name'=>'项目总览 All Projects','icon'=>'','url'=>'project',
                                            'link'=>array('project/detail','modules/modlst','','')),//link为打开页面中的链接
                                    array('name'=>'最新需求列表 Request','icon'=>'','url'=>'request',
                                            'link'=>array('request/viewdetail','request/reqinitlst')),
                                    array('name'=>'总体设计招揽','icon'=>'','url'=>'222','link'=>array()),
                                    array('name'=>'详细设计招揽','icon'=>'','url'=>'333','link'=>array()),
                                    array('name'=>'开发招揽','icon'=>'','url'=>'444','link'=>array()),
                                    array('name'=>'测试招揽','icon'=>'','url'=>'555','link'=>array()),
                                    array('name'=>'排名榜单','icon'=>'','url'=>'666','link'=>array()),
                    ),
                    .....................................//自己定义
                    '8'=>array(
                            array('name'=>'项目维护 Maintenance','icon'=>'','url'=>'','link'=>array()),
                            array('name'=>'发包方合同管理 Contracts','icon'=>'','url'=>'','link'=>array()),
                    ),
    
    );
    foreach ($data as $key => $row)
    {
         if ($useremail != 'admin' AND $key == '8' )
             break;//如果用户名不为admin并且循环至第8个主导航链接时直接退出

        //当一级菜单项下有子菜单项时
        if ($row['url'] == "")
        {
            //做一次循环,如果二级菜单的链接被点击,就打在一级菜单上active和display标志
            $flag1 = 0;
            foreach ($menulst[$key] as $i=>$val)
            {
                //当二级菜单项中的URL和当前点击的一致时
                if (strcmp($val['url'],$uri) == 0)
                {
                    $flag1 = 1;
                    break;
                }
             }
             
             //再做一次循环,如果二级链接的页面中的链接被点击,即和URI相同时,做标记
             $flag2 = 0;
             foreach ($menulst[$key] as $i=>$val)
             {
                $arrlength=count($val['link']);
                 for($x = 0; $x < $arrlength; $x++)
                 {
                     //echo stripos($uri,$val['link'][$x])."<br/>";
                     if (stripos($uri,$val['link'][$x]) !== false)
                     {
                         $flag2 = 1;
                         break;
                     }
                 }
             }
            
            
            if ($flag1 == 1 || $flag2 == 1)
            {
                echo "<li class=\"dropdown active\"><a href=\"\"><span class=\"".$row['icon']."\"></span>".$row['name']."</a>";
                echo "<ul style=\"display: block\">";        
            }
            else
            {
                echo "<li class=\"dropdown\"><a href=\"\"><span class=\"".$row['icon']."\"></span>".$row['name']."</a>";
                echo "<ul>";
            }

            foreach ($menulst[$key] as $i=>$val)
            {
                //如果二级页面中链接包含在URI中,就将其二级链接中加Active
                $flag3 = 0;
                $arrlength = count($val['link']);
                for($x = 0; $x < $arrlength; $x++)
                {
                    //echo stripos($uri,$val['link'][$x])."<br/>";
                    if (stripos($uri,$val['link'][$x]) !== false)
                    {
                        $flag3 = 1;
                        break;
                    }
                }
                
                if (strcmp($val['url'],$uri) == 0 || $flag3 == 1 )
                {
                    echo "<li class='active'><a href=\"".base_url()."index.php/".$val['url']."\">".$val['name']."</a></li>";
                }
                else
                {
/*                        //如果传值中包含点击的二级页面链接时
                    $arrlength=count($val['link']);
                    $flag3 = 0;
                    for($x = 0;$x < $arrlength; $x++)
                    {
                         if (strpos($val['link'][$x],$uri) == 0 )
                        {
                            //echo "<li class='active'><a href=\"".base_url()."index.php/".$val['url']."\">".$val['name']."</a></li>";
                            $flag3 = 1;
                            //echo "val:".$val['link'][$x]."<br/>";
                            //echo "uri:".$uri."<br/>";
                            break;
                        }                            
                    } */
                    //if ($flag3 == 0)
                     echo "<li><a href=\"".base_url()."index.php/".$val['url']."\">".$val['name']."</a></li>";
                }
            }
            echo "</ul></li>";
        }
        else
        {
            //当有且仅有一级菜单项时,比对链接和传值    
            if (strcmp($row['url'],$uri) == 0)
            {
                echo "<li class=\"active\"><a href=\"".base_url()."index.php/".$row['url']."\"><span class=\"".$row['icon']."\"></span>".$row['name']."</a></li>";
            }
            else
            {
                echo "<li><a href=\"".base_url()."index.php/".$row['url']."\"><span class=\"".$row['icon']."\"></span>".$row['name']."</a></li>";
            }
        }
        //echo "<br/>".$row['url']."<br/>";

    }//foreachEnd    
    
    
    
    
    /*
     * 做循环输出,根据传入的$url给第一级array加active和其本身加active的class
     */
    //    $json_str=json_encode($tmparr);
    
//     foreach($data as $key=>$value)
//     {
//         $i = 1;
//         foreach($value as $key1=>$value1)
//         {
//             //如果为第一级且仅有一级
//             if (count($value) == 1)
//             {
//                 if (strpos($value1,$uri))
//                 {
//                     echo "<li><a href=\"".base_url()."index.php/".$value1."\"><span class=\"iconfa-laptop\"></span>".$key1."</a></li>";
//                 }
//                 else
//                 {
//                     echo "<li class=\"active\"><a href=\"".base_url()."index.php/".$value1."\"><span class=\"iconfa-laptop\"></span>".$key1."</a></li>";
//                 }
//             }
//             else//如果为多级时
//             {
//                   if ($i == 1)
//                       echo "<li class=\"dropdown \" id=\"allsiteproject\"><a href=\"\"><span class=\"iconfa-book\"></span>".$key1."</a><ul style=\"\">";
//             }
//             $i++;
//         }
//     }
    
}