使用php显示当前页面的活动导航

4

我正在尝试使用$current_url = basename($_SERVER['PHP_SELF']);来确定我当前所在的页面,考虑到我的导航(html)存储在一个php文件中,并包含在每个页面中。下面是我用来确定哪个导航选项应该处于活动状态的代码:

<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/no-background.css">

<ul>
<?php
    $current_url = basename($_SERVER['PHP_SELF']);
    $active = "class=\"active\"";
?>
<?php if ($current_url == "globaluser.php") { ?>
    <li <?php echo $active;?> > <?php } ?> <a href="globaluser.php?Agent=<?php echo $Agent;?>">Overview</a></li>
<?php if ($current_url == "search.php") { ?>
    <li <?php echo $active;?> > <?php } ?> <a href="search.php?Agent=<?php echo $Agent?>">Add new client</a></li>
<?php if ($current_url == "viewadmins.php") { ?>
    <li <?php echo $active;?> > <?php } ?> <a href="viewadmins.php?Agent=<?php echo $Agent?>">View admins</a></li>
    <li class="border-right"><a href="emails.php?Agent=<?php echo $Agent?>">E-mails</a></li>
    <li class="right border-right"><a href="logout.php"><?php echo $Agent?></a>
        <ul class="drop1">
            <li><a href="earnings.php?Agent=<?php echo $Agent?>">Earnings</a></li>
            <li id="hover-trigger"><a href="#">Change Password</a>
                <ul class="drop2">
                    <li>
                        <form action="changepass.php?Agent=<?php echo $Agent?>" method="POST">
                            <input type="password" name="1" placeholder="Enter new password">
                            <input type="password" name="2" placeholder="Repeat new password">
                    </li>
                    <li>
                            <input type="submit" name="changepw" class="button" value="Change">
                        </form>
                    </li>
                </ul>
            </li>
        <li>
            <form action="logout.php">
                <input type="submit" class="button" value="Log out">
            </form>
        </li>
        </ul>
    </li>

但是它没有起作用。它显示活动页面为活动状态,但是它将2个页面显示为简单超链接。它看起来像这样:

Navigation errors

有人知道为什么会发生这种情况吗?对于2个页面它有效,但对于另外2个页面却失败了,代码完全相同。谢谢。
3个回答

4
你应该这样做:
<li <?php echo ($current_url == "globaluser.php") ? $active : ''?> ><a href="globaluser.php?Agent=<?php echo $Agent;?>">Overview</a></li>

因为现在你正在条件化开头的 <li> 标签的存在


那就是诀窍,谢谢。只有一个问题,你使用的语法...我理解括号中的IF,但我不理解:? $active : '' 为什么有问号和active后面的所有内容?它起作用了,你救了我! - Predrag Beocanin
1
@koala_dev正在使用三元运算符。这是一种更短的方式来编写表达式,如果您根据条件分配两个值中的一个,则可以使用它。例如,您可以使用$letter = ($foo == 'bar') ? 'a' : 'z'; 代替if($foo == 'bar') { $letter = 'a'; } else{ $letter = 'z'; } - djheru
@SamFisher 你也可以写成 <?php if($current_url == "globaluser.php"){echo $active} ?>,但我个人认为使用三元运算符比单行if更易读,只需注意else部分(即:后面的内容)是必须的,这就是为什么我添加了一个空字符串的原因。 - omma2289
是的,我喜欢代码很短,这就是为什么我问它的原因 =) 谢谢你们! - Predrag Beocanin

1
你在错误的位置使用了<?php } ?>
它应该在以下代码之后:
<a href="search.php?Agent=<?php echo $Agent?>">Add new client</a></li>

更新后的代码如下:

   <link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/no-background.css">

<ul>
<?php
    $current_url = basename($_SERVER['PHP_SELF']);
    echo $current_url;
    $active = "class=\"active\"";
?>
<?php if ($current_url == "globaluser.php") { ?>
    <li <?php echo $active;?> > <?php } ?> <a href="globaluser.php?Agent=<?php echo $Agent;?>">Overview</a></li>
<?php if ($current_url == "search.php") { ?>
    <li <?php echo $active;?> > <a href="search.php?Agent=<?php echo $Agent?>">Add new client</a></li> <?php } ?> 
<?php if ($current_url == "viewadmins.php") { ?>
    <li <?php echo $active;?> >  <a href="viewadmins.php?Agent=<?php echo $Agent?>">View admins</a></li><?php } ?>
    <li class="border-right"><a href="emails.php?Agent=<?php echo $Agent?>">E-mails</a></li>
    <li class="right border-right"><a href="logout.php"><?php echo $Agent?></a>
        <ul class="drop1">

            <li><a href="earnings.php?Agent=<?php echo $Agent?>">Earnings</a></li>

            <li id="hover-trigger"><a href="#">Change Password</a>

                <ul class="drop2">
                    <li>
                        <form action="changepass.php?Agent=<?php echo $Agent?>" method="POST">
                            <input type="password" name="1" placeholder="Enter new password">
                            <input type="password" name="2" placeholder="Repeat new password">
                    </li>
                    <li>

                            <input type="submit" name="changepw" class="button" value="Change">
                        </form>
                    </li>
                </ul>
            </li>
            <li>
                <form action="logout.php">
                <input type="submit" class="button" value="Log out">
                </form>
            </li>
        </ul>
    </li>

我实际上是在调整li本身的开头,就像上面提到的那样。但还是谢谢你的帮助! - Predrag Beocanin

0

你也可以使用 preg_replace() 函数来添加 class="active"

ob_start();
echo '<ul>
  <li><a href="page1.php">Page 1</a></li>
  <li><a href="page2.php">Page 2</a></li>
  </ul>';
$output = ob_get_clean();
$pattern = '~<li><a href="'.$url.'">~';
$replacement = '<li class="active"><a href="'.$url.'">';
echo preg_replace($pattern, $replacement, $output);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接