我的PHP网站包含INDEX.PHP页面中包含的页眉,正文,页脚文件 在header.php文件中,我有一个像这样的菜单
<div id="bottomrow">
<div class="pad">
<ul class="menu left">
<li class="first <?=$current_home?>"><a href="/"><em>Home</em></a></li>
<li class="users drop <?=$current_users?>"><a href=""><em>Users</em></a><span class="drop"> </span>
<ul id="moreheader">
<li></li>
<li></li>
</ul>
</li>
<li class="<?=$current_forum?>"><a href=""><em>Forums</em></a></li>
<li class="drop <?=$current_more?>"><a href="/moreheader"><em>More</em></a><span class="drop"> </span>
<ul id="moreheader">
<li><a href=""><em>Widgets</em></a></li>
<li><a href=""><em>News</em></a></li>
<li><a href=""><em>Promote</em></a></li>
<li><a href=""><em>Development</em></a></li>
<li><a href=""><em>Bookmarks</em></a></li>
<li><a href=""><em>About</em></a></li>
</ul>
</li>
<li class="moneytabmenu <?=$current_money?>"><a href="/moneytabmenu"><em>Money:<span class="moneytabmenu-total">$0.00</span></em></a></li>
</ul>
<ul class="menu right">
<li class="drop myaccount <?=$current_myaccount?>"><a href="" class="first"><img class="avatar" src="http://gravatar.com/avatar.php?gravatar_id=7ab1baf18a91ab4055923c5fd01d68a2&rating=pg&size=80&default=" height="19" width="19" alt="you" /><em>My
Account</em></a><span class="drop"> </span>
<ul id="myaccount">
<li><a href=""><em>Dashboard</em></a></li>
<li><a href=""><em>Account Settings</em></a></li>
<li><a href=""><em>Settings</em></a></li>
</ul>
</li>
<li class="drop"><a href=""><em>Mail</em></a><span class="drop"> </span>
<ul id="mailboxheader">
<li><a href=""><em>InBox</em></a></li>
<li><a href=""><em>SentBox</em></a></li>
<li><a href=""><em>Trash</em></a></li>
<li><a href=""><em>Post Bulletin</em></a></li>
<li><a href=""><em>View Bulletins</em></a></li>
</ul>
</li>
<li class="drop <?=$current_more?>"><a href=""><em>More</em></a><span class="drop"> </span>
<ul id="moreheader">
<li><a href=""><em>Widgets</em></a></li>
<li><a href=""><em>News</em></a></li>
<li><a href=""><em>Promote</em></a></li>
<li><a href=""><em>Development</em></a></li>
<li><a href=""><em>Bookmarks</em></a></li>
<li><a href=""><em>About</em></a></li>
</ul>
</li>
</ul>
</div>
</div>
<!-- END div#bottomrow -->
</div>
菜单与上面类似,上面的菜单没有完成,但你可以看到它是如何设置的,有
如果用户在子菜单中的任何页面上,则应将“当前”css类添加到父菜单项。
下面是我的index.php页面,我可以使用$ _GET为变量index.php确定我在哪个页面?p = PAGE-NAME
我发布了一个类似于此问题的问题,但是在我执行下面的代码之前它并没有得到太多响应,它确实得到了所有使用数组提到的响应,但这是他们新的我有子菜单。 / p>
那么有没有人会根据我所在的页面看到更好的方法将css类“current”添加到上面的列表项中?
INDEX.php页面上的代码,用于处理应突出显示哪个菜单项
//set variables for menu item to appear as being SELECTED
$p = $_GET['p'];
$current_home = '';
$current_users = '';
$current_forum = '';
$current_more = '';
$current_money = '';
$current_myaccount = '';
$current_mail = '';
//if home then highlight home menu
if($p === 'home'){
$current_home = 'current';
}
if($p === 'users.online' || $p === 'users.location' || $p === 'users.featured' || $p === 'users.new' || $p === 'users.browse' || $p === 'users.search' $p === 'users.staff'){
$current_users = 'current';
}
if($p === 'forum'){
$current_forum = 'current';
}
if($p === 'widgets' || $p === 'news' || $p === 'promote' || $p === 'development' || $p === 'bookmarks' || $p === 'about'){
$current_more = 'current';
}
if($p === '=account.money' || $p === 'account.store' || $p === 'account.lottery' || $p === 'users.top.money'){
$current_money = 'current';
}
if($p === 'account'){
$current_myaccount = 'current';
}
if($p === 'mail.inbox' || $p === '=mail.sentbox' || $p === 'mail.trash' || $p === 'bulletins.post' || $p === 'bulletins.my' || $p === 'bulletins'){
$current_mail = 'current';
}
答案 0 :(得分:2)
我建议让整个事情更加数据化。创建菜单选项的多维数组,然后遍历数组,输出正确的HTML。
以下是我将如何做到这一点(这尚未经过测试,但这个想法是我想传达的):
<?
$p = $_GET['p'];
$navArray = array();
$navArray['home'] = array('main' => array('id'=>'home', 'url'=>'/', 'title'=>'Home'));
$navArray['more'] = array('main' => array('id'=>'more', 'url'=>null, 'title'=>'More'),
'pages'=> array(
array('id'=>'widgets', 'url'=>'/more-widgets.php', 'title'=>'Widgets'),
array('id'=>'news', 'url'=>'/news.php', 'title'=>'News')));
?>
<div id="bottomrow">
<div class="pad">
<ul class="menu left">
<? foreach($navArray as $navHeading) : ?>
<? $current = $navHeading['main']['id'] == $p ? 'current' : ''; ?>
<li class="first <?=$current?>"><a href="<?=$navHeading['main']['url']?>"><em><?=$navHeading['main']['title']?></em></a></li>
<? if (!empty($navHeading['pages'])) : ?>
<ul id="sub-<?=$navHeading['main']['id']?>">
<? foreach($navHeading['pages'] as $navPage) : ?>
<? $current = $navPage['id'] == $p ? 'current' : ''; ?>
<li class="<?=$current?>"><a href="<?=$navPage['url'];?>"><em><?=$navPage['title']?></em></a></li>
<? endforeach; ?>
</ul>
<? endif; ?>
<? endforeach; ?>
</ul>
</div>
</div>
答案 1 :(得分:1)
您的HTML无法进一步简化,但PHP可能会做得更好。使用全局变量通常是一个坏主意,但你可能会做这样的事情:
function current_tab($page) {
global $p;
// Check if $page is a prefix for $p
if ($page == substr($p, 0, strlen($page))) {
return "current";
}
}
然后在HTML中使用:
<?=current_tab('account');?>
对于不符合要求的页面名称,您将需要使用特殊条件,或者您可以更改命名约定。
答案 2 :(得分:1)
首先,我建议创建一个菜单类来处理此菜单的创建,并在index.php中调用class方法。这会将代码与表示分开,提供抽象等。当你调用它时,你可以将它传递给页面,然后该类负责实现并传回完整的菜单。
其次,我建议使用switch语句而不是if ... else有很多或条件。您可以通过不包括break关键字来级联案例:
switch( $page) {
case: 'home':
$current_home = 'current';
break;
case: 'users.online':
case: 'users.location':
case: 'users.featured':
.......
$current_users = 'current';
break;
}
就你的PHP用途而言,你的使用并不多。正如我在if语句中所说的那样,我认为切换会做得更好,$ page将被评估一次并匹配一次,与每个if不同。如果您可以使用循环菜单,它可以减少代码中实际文字HTML的数量。如果你创建了数组来保存每个主菜单(可能是其他主菜单的意思),那么你可以遍历数组并组合数组内容,一些html和你的变量来创建菜单系统。较少的文字HTML和更有效的PHP使用。
答案 3 :(得分:0)
这里有很多你可以改进的东西(可维护性和可扩展性都很低),但我首先要删除一些条件...例如,在第一个条件中,你可以检查是否有字符串以“用户”开头,它将负责“用户”的所有特定情况。
if(strpos($p, 'users') !== false) { ... }
同样适用于其他一些案例。
无论如何,我建议你看看你的服务器端脚本结构。通常,您可以找到更通用的解决方案。
答案 4 :(得分:0)
我建议看一下像CodeIgniter这样的MVC框架(尽管PHP空间中有很多,CI是我的选择)。
你正在努力从头开始编写自己的...使用类似CI的框架,你可以重复使用几乎所有现有的逻辑,只需将它构造得有点不同,从而获得清晰的关注点分离。坚实的模板。