有没有更好的方法来做这个PHP代码?

时间:2009-08-20 22:27:45

标签: php

我的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">&nbsp;</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">&nbsp;</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&amp;rating=pg&amp;size=80&amp;default=" height="19" width="19" alt="you" /><em>My 
            Account</em></a><span class="drop">&nbsp;</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">&nbsp;</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">&nbsp;</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> 

菜单与上面类似,上面的菜单没有完成,但你可以看到它是如何设置的,有

  • 列表项组成一个菜单,有些列表项有SUB -LIST项目用于组成某些主菜单项的子菜单。

    如果用户在子菜单中的任何页面上,则应将“当前”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';
    }
    
  • 5 个答案:

    答案 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的框架,你可以重复使用几乎所有现有的逻辑,只需将它构造得有点不同,从而获得清晰的关注点分离。坚实的模板。