Есть ли лучший способ сделать этот код PHP? - PullRequest
0 голосов
/ 21 августа 2009

Мой сайт 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

Я опубликовал вопрос, похожий на этот, но это было до того, как я сделал приведенный ниже код, и он не получил большого отклика, ответ, который он все-таки упомянул, используя массивы, но это было до того, как появились новые, у меня были подменю. 1012 *

Так кто-нибудь видит лучший способ добавить класс 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 ]

2 голосов
/ 21 августа 2009

Я бы порекомендовал сделать все это более управляемым данными. Создайте многомерный массив параметров меню, а затем выполните итерацию по всему массиву, выводя правильный 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 голос
/ 21 августа 2009

Во-первых, я бы предложил создать класс меню для обработки этого меню и вызвать метод класса в вашем index.php. Это отделяет код от представления, обеспечивает абстракцию и т. Д. Когда вы вызываете его, вы можете передать ему страницу, а класс позаботится о реализации и вернет полное меню обратно.

Во-вторых, я бы предложил использовать оператор 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.

1 голос
/ 21 августа 2009

Ваш 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');?>

Для несоответствующих имен страниц вам нужно будет использовать специальные условия или вы можете изменить соглашение об именах.

0 голосов
/ 21 августа 2009

Я бы посоветовал взглянуть на MVC-фреймворк, такой как CodeIgniter (хотя в пространстве PHP их много, CI - мой выбор).

Вы находитесь на пути написания своего собственного с нуля ... с помощью такой инфраструктуры, как CI, вы можете повторно использовать почти всю существующую логику, и просто структурировать ее немного по-другому, получая четкое разделение интересов и твердые шаблоны.

0 голосов
/ 21 августа 2009

Здесь можно многое улучшить (удобство обслуживания и расширяемость довольно низкие), но я бы начал с устранения некоторых из этих условий ... например, в первом вы можете проверить, является ли строка начинается с 'users', которая позаботится обо всех особых случаях 'user'.

if(strpos($p, 'users') !== false) { ... }

То же самое можно сказать и о некоторых других случаях.

Во всяком случае, я предлагаю вам взглянуть на структуру вашего серверного скрипта. Обычно вы можете найти более общее решение для этого материала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...