0

我已经浏览了这里的所有问题,但找不到这个问题的答案。

我相信这是一个简单的答案。

我有导航菜单,它是一个 PHP 文件,包含在每个页面中。

我使用以下代码添加了一个类active(我实际上称它为当前类):

<a class="menu-nav <?php if (basename($_SERVER["REQUEST_URI"]) == '/past-events/index.php') echo "current";?>" href="http://website.com.au/past-events">PAST EVENTS</a>

这适用于所有其他页面,因为它们位于根目录中,(实际上与我使用的其他页面basename($_SERVER["SCRIPT_NAME"] ) 但与上面的页面一样,因为它位于“过去事件”目录中,所以它不起作用。

我努力了:

<a class="menu-nav <?php if (basename($_SERVER["REQUEST_URI"]) == '/past-events/') echo "current";?>" href="http://website.com.au/past-events">PAST EVENTS</a>

但无济于事。

我应该提到代码位于一个名为 nav.php 的文件中,该文件位于一个名为“includes”的文件夹中,并使用 php include 将其带入需要它的每个文件中

谁能看到我在这里做错了什么?

干杯,艾尔

4

5 回答 5

1

您可以使用explode()而不是basename().

爆炸函数文档: http: //nl3.php.net/manual/en/function.explode.php

一个例子:

// Remove the two consecutive slashes and everything preceding them.
$uri = preg_replace(/.*(\/\/)/, '', $SERVER["REQUEST_URI"]);

// Explode each part of the uri in its own array position.
$uri_parts = $explode('/', $uri);

// The count of how many parts you got back.
$uri_parts_count = count($uri_parts);

// The index before the last one is the containing folder.
$uri_folder = $uri_parts[$uri_parts_count-1];

// The last index is the file that was requested.
$uri_file = $uri_parts[$uri_parts_count];

另一种选择是使用__DIR__dirname(__FILE__)取决于您正在使用的 PHP 版本。这两种方法中的任何一种都将返回 PHP 执行的文件所在的文件夹名称。

实现与上面类似,唯一的区别是您试图找出访问的是哪个文件,而不是请求了哪个 URI(更好的做法和更安全的)。

我希望这能为你清除一点。

于 2014-01-10T13:29:41.040 回答
0

我建议采用更通用的方法,尝试获取 uri 然后使用explode

假设您的网址www.abc.com/blah1/blah2/page.php

所以$_SERVER["REQUEST_URI"] = "www.abc.com/blah1/blah2/page.php"

所以,(仔细理解这一点

你可以explode,uri,基于/,所以所有的 url 部分都可供你以通用格式进行比较

$my_url = $_SERVER["REQUEST_URI"];
$url_pieces = explode("/", $my_url);
$len = count($url_pieces);


echo $url_pieces[0]; // it has `www.abc.com`
echo $url_pieces[1]; // it has `blah1`
.
.
.
echo $url_pieces[$len-1]; /* this has page name */

现在要比较,就用最后的部分来比较吧!!!

所以对于 index.php,你可以写类似

if($url_pieces[$len-1] == "index.php") echo "current"

以及过去事件文件夹中的所有其他人

if($url_pieces[$len-1] != "index.php" && $url_pieces[$len-2] == "past-events" ) echo "current"

编辑

要获得完整的 url,您可以使用以下代码(没有任何标签被剥离或无需担心 http/https 协议):

$url = "http" . (($_SERVER['SERVER_PORT']==443) ? "s://" : "://") . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
于 2014-01-10T13:30:37.220 回答
0

试试这个它会工作

$basename=substr(strtolower(basename($_SERVER['PHP_SELF'])),0,strlen(basename($_SERVER['PHP_SELF']))-4);

<a class="menu-nav  <?php if ($basename== 'index') echo "current"; ?>" 

href="http://website.com.au/index.php">home</a>
于 2014-01-10T12:58:58.997 回答
0

感谢大家花费时间和精力来帮助我。

我最终添加了:

<?php print $_SERVER["REQUEST_URI"]; ?>

到页面/past-events/index.php,发现它打印了'/past-events/'

所以我需要做的就是摆脱 basename() 并且它工作正常:

<a class="menu-nav <?php if ($_SERVER["REQUEST_URI"] == "/past-events/") echo "current";?>" href="http://website.com/past-events">PAST EVENTS</a>

这当然意味着该目录中的所有文件都将获得 class="current" 但这很适合我的设计。

再次感谢您花时间帮助我。干杯,艾尔。

于 2014-01-10T14:31:24.080 回答
0

所以基本上只是把函数变成一个变量,然后在实际的导航栏或任何地方使用他。将其包含在 header.php 文件的顶部或从包含中调用它

$activePageClean = basename($_SERVER['PHP_SELF'], ".php");
$activePage = htmlspecialchars($activePageClean);

然后在您的导航菜单中像这样:

<div class="collapse navbar-collapse justify-content-end" id="navbarSupportedContent">
    <ul class="navbar-nav justify-content-end">
      <li class="nav-item <?= ($activePage == 'index') ? 'active':''; ?>">
        <a class="nav-link" href="/">Home</a>
      </li>

等以获取更多列表项。完美运行 PHP 7+。然后,如果我们愿意,我们可以根据会话或我们选择的任何内容渲染更多导航项。你明白了。只需替换 $activePage == '?' 对于您要检查的内容,如果结果为真,则添加活动类或您选择的任何类名

<?php if (isset($_SESSION['id'])) {
    echo ' <li class="nav-item '?><?= ($activePage == 'add-contact') ? 'active':''; ?><?php echo '">
    <a class="nav-link" href="/add-contact.php">Add Contacts</a>
  </li>
  <li class="nav-item '?><?= ($activePage == 'create-csv') ? 'active':''; ?><?php echo '">
  <a class="nav-link" href="/create-csv.php">Create CSV</a>
  </li>
  <li class="nav-item '?><?= ($activePage == 'search-database') ? 'active':''; ?><?php echo '">
  <a class="nav-link" href="/search-database.php">Search Database</a>
  </li> ';
   }
  ?>
于 2019-05-13T03:54:56.897 回答