我已经查看了这里的所有问题,但找不到这个问题的答案。
我确信这是一个简单的答案。
我有导航菜单,这是一个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
答案 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> ';
}
?>