使用php basename激活导航菜单类($ _ SERVER [" REQUEST_URI"]

时间:2014-01-10 12:39:12

标签: php request-uri

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

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

我有导航菜单,这是一个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"] ) 但是使用上面的页面,因为它位于'past-events'目录中,所以它不起作用。

我试过了:

<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将其带入需要它的每个文件中

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

干杯,Al

5 个答案:

答案 0 :(得分: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(更好的做法和更安全)。

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

答案 1 :(得分: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>

答案 2 :(得分:0)

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

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

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

所以,(仔细理解

你可以explode,uri,/,所以所有的网址部分都可供你用于通用格式的比较

$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"

修改

要获取完成者网址,您可以使用以下代码(不删除任何标记或不用担心http / https协议):

$url = "http" . (($_SERVER['SERVER_PORT']==443) ? "s://" : "://") . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

答案 3 :(得分: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”,但这很适合我的设计。

再次感谢您抽出宝贵时间帮助我。 干杯,Al。

答案 4 :(得分:0)

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

$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 =='?'添加到您要检查的内容,如果结果为true,则它将添加活动类或您选择的任何类名

<?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> ';
   }
  ?>