使用php突出显示当前打开的菜单项

时间:2015-07-21 06:53:38

标签: php html css menuitem

我正在尝试使用PHP突出显示当前打开的菜单项。

我的菜单项的HTML。

<ul class="menu">
    <li><a href="index.php?p=edit-profile&error=message">Edit Profile</a></li>
    <li><a href="index.php?p=edit-contact">Edit Contact</a></li>
    <li><a href="index.php?p=edit-facilities">Edit Facilities</a></li>
    <li><a href="index.php?p=edit-location">Edit Location</a></li>
    <li><a href="index.php?p=edit-images">Manage Images</a></li>        
</ul>

这是我在PHP中尝试的方式:

if ($_SERVER['QUERY_STRING']) {
    list($queryString) = explode('&',$_SERVER['QUERY_STRING']);
    $openPage = $queryString;
    list($key, $value) = explode('=',$openPage);
    $currentPage = $value;

    // Determine what menu item to be highlight:
    switch ($currentPage) {
            case 'edit-profile':
                $class1 = 'class="active"';
                break;                      
            case 'edit-contact':
                $class2 = 'class="active"';
                break;                                              
            case 'edit-facilities':
                $class3 = 'class="active"';

            -----------

            // Default is to include the main page.
            default:
                $class = 'class=""';
                break;

    } // End of main switch.

} else {
    //Determine The Index page
    $path = $_SERVER['PHP_SELF'];
    $indexPage = basename($path);
    $indexPage = basename($path, '.php');
}

这就是我在菜单中回显这些类的方法:

<li <?php if(isset($class1)) echo $class1; ?>><a href="index.php?p=edit-profile">Edit Profile</a></li>
<li <?php if(isset($class2)) echo $class2; ?>><a href="index.php?p=edit-contact">Edit Contact</a></li>

这是解决方案对我有用。但我的问题是,如果我有很多页面,我需要在SWITCH case中使用许多类变量。

有人能告诉我是否有替代解决方案来最小化我的PHP代码?

希望有人可以帮助我。

谢谢。

5 个答案:

答案 0 :(得分:1)

一个简单的解决方案是将菜单项存储在地图中,并迭代它们:

$menuItems = [
    'edit-profile' => [
        'url'  => 'index.php?p=edit-profile&error=message', 
        'name' => 'Edit Profile'
    ],
    'edit-contact' => [
        'url'  => 'index.php?p=edit-contact', 
        'name' => 'Edit Contacts'
    ],
    ...
]

然后迭代这些项目。

<ul class="menu">
    <?php
     foreach($menuItems as $menuItem => $desc) {
        // You get $currentPage from the query string
        $class = ($currentPage === $menuItem)? 'class="active"': '';
        echo '<li '.$class.'><a href="'.$desc['url'].'">'.$desc['name'].'</a></li>';
     }
    ?>
</ul>

答案 1 :(得分:0)

有了这个,你不需要SWITCH案例。

<li <?php if($currentPage=='edit-profile') echo 'class="active"'; ?>><a href="index.php?p=edit-profile">Edit Profile</a></li>
<li <?php if($currentPage=='edit-contact') echo 'class="active"'; ?>><a href="index.php?p=edit-contact">Edit Contact</a></li>

答案 2 :(得分:0)

不要完成所有这些操作,只需将所有菜单项放在一个数组中并循环遍历它。

您正在发送带变量的页面参数。

因此,在发送时可以控制它。

页面数组将页面标题作为键,页面url作为值。

这样,你不需要单独的变量,循环中的单个变量将为这项工作提供服务。

<?php
$pages = array(); // Get all page titles and urls in array.
$pages['Edit Profile'] = 'edit-profile&error=message';
$pages['Edit Contact'] = 'edit-contact';
$pages['Edit Facilities'] = 'edit-facilities';
$pages['Edit Location'] = 'edit-location';
$pages['Manage Images'] = 'edit-images';
if (! empty($pages)) {
  $current = (isset($_GET['p'])) ? $_GET['p'] : '';
  ?> 
  <ul>  
  <?php  
  foreach ($pages as $title => $url) {
    $active = ($current == $url) ? 'active' : '';
   ?>
   <li><a href="index.php?p=<?php echo $url;?>" class="<?php echo $active;?>"><?php echo $title;?></a></li>
   <?php
  }
  ?>
  </ul>
  <?php
}
?>

答案 3 :(得分:0)

您可以使用数组并尝试这样

if ($_SERVER['QUERY_STRING']) {
    list($queryString) = explode('&',$_SERVER['QUERY_STRING']);
    $openPage = $queryString;
    list($key, $value) = explode('=',$openPage);
    $currentPage = $value;

    // Determine what menu item to be highlight:
    // Store in array, you will be having only one item in array
    $class[$currentPage] = 'class="active"';

} else {
    //Determine The Index page
    $path = $_SERVER['PHP_SELF'];
    $indexPage = basename($path);
    $indexPage = basename($path, '.php');
}

,菜单可以

<li <?php if(isset($class['edit-profile'])) echo $class['edit-profile']; ?>><a href="index.php?p=edit-profile">Edit Profile</a></li>
<li <?php if(isset($class['edit-contact'])) echo $class['edit-contact']; ?>><a href="index.php?p=edit-contact">Edit Contact</a></li>

注意:这没有经过测试,因为我现在无法访问PHP。

答案 4 :(得分:0)

使用PHP生成自己的菜单结构,但为了突出显示,我们可以使用Jquery。

见下面的例子:

        <style>
        .active{ background-color:#3F6}
        </style>

        <ul class="menu">
            <li><a href="testmenu.php">Home</a></li>
            <li><a href="testmenu.php?p=edit-profile&error=message">Edit Profile</a></li>
            <li><a href="testmenu.php?p=edit-contact">Edit Contact</a></li>
            <li><a href="testmenu.php?p=edit-facilities">Edit Facilities</a></li>
            <li><a href="testmenu.php?p=edit-location">Edit Location</a></li>
            <li><a href="testmenu.php?p=edit-images">Manage Images</a></li>        
        </ul>

        <script type='text/javascript' src='//code.jquery.com/jquery-1.11.0.js'></script>
        <script>
        var aurl = window.location.href; // Get the absolute url
        $('.menu li a').filter(function() { 
            return $(this).prop('href') === aurl;
        }).parent('li').addClass('active');
        </script>