Эффективность PHP кода в меню - PullRequest
0 голосов
/ 26 февраля 2011

У меня в данный момент ОЧЕНЬ длинный код для меню, которое я использую на своем сайте. Мой сайт Это почти 2000 строк, лол.Я думаю, что я могу использовать переключатель, но я пытался и не могу реализовать его для правильной работы.

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

if($subject == 'art') {
echo '<div id="spacer2"><br></div>';
echo '<div class="idName2" id="menu2">';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=all&listtype='.$listtype.'">All</a>';
echo '<div id="spacer2"><br></div>';
echo '</div>';
echo '<div class="idName3" id="menu3">';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=art&listtype='.$listtype.'">Art</a>';
echo '</div>';
echo '<div class="idName2" id="menu2">';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=biology&listtype='.$listtype.'">Biology</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=english&listtype='.$listtype.'">English</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=chemistry&listtype='.$listtype.'">Chemistry</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=mathematics&listtype='.$listtype.'">Mathematics</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=history&listtype='.$listtype.'">History</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=religion&listtype='.$listtype.'">Religion</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=geography&listtype='.$listtype.'">Geography</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=music&listtype='.$listtype.'">Music</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=philosophy&listtype='.$listtype.'">Philosophy</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=psychology&listtype='.$listtype.'">Psychology</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=economics&listtype='.$listtype.'">Economics</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=sociology&listtype='.$listtype.'">Sociology</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=technology&listtype='.$listtype.'">Technology</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=electronics&listtype='.$listtype.'">Electronics</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=food&listtype='.$listtype.'">Food</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=law&listtype='.$listtype.'">Law</a>';
echo '<a href="browse.php?alphabet='.$alphabet.'&subject=politics&listtype='.$listtype.'">Politics</a>';
echo '</div>';
}

elseif($subject == 'biology') {

, и затем есть много других "elseifs", поскольку есть пункты меню, которые заканчиваются в общей сложности 2000 строками кода, что очевидноочень неэффективно, и это также делает невероятно трудоемким изменение чего-либо ... может кто-то указать мне правильное направление в том, что мне нужно сделать, пожалуйста!

Ответы [ 3 ]

1 голос
/ 26 февраля 2011

Навигация - это всегда боль.Вот простое решение, которое может помочь.

Поместите все в массив, например:

$menu = array(
    'All' => '/browse ...',
    'Art' => '/browse ... art',
    'Biology' => '/browse ... biology',
    // etc.
)

Затем вы можете построить все ссылки на основе текущей темы:

$subject = 'Art';

foreach ($menu as $title => $url) {
    if ($title == $subject) {
        echo "<b>$title</b><br>\n";
    } else {
        echo "<a href=\"$url\">$title</a><br>\n";
    }
}

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

Другое решение, на которое вы можете посмотреть, - это Zend_Navigation.http://framework.zend.com/manual/en/zend.navigation.introduction.html

1 голос
/ 26 февраля 2011

Что-то вроде:

$subjects = array('art', 'biology', 'english', 'chemistry' /*, etc */);
foreach ($subjects as $current_subject)
{
    if ($current_subject == $subject)
    {
        //write it the id="menu3" way
    }
    else
    {
        //write it another way
    }
}

Вы можете преобразовать 'биологию' в 'биологию', используя функцию ucfirst.Также обратите внимание, что не может быть двух или более элементов с одинаковым идентификатором (menu2 в вашем случае).

0 голосов
/ 26 февраля 2011

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

Придерживаясь простого подхода, вы должны представлять свое меню без внешнего ресурса:

$menus = array('Art', 'Biology', 'English', ...);

Вы можете создать подменю «A» - «Z» с помощью простой команды диапазона: range('A', 'Z')

То есть ваш код, отображающий меню, будет выглядеть примерно так:

<?php
  $current_letter = $_REQUEST['letter'];
  $current_menu = $_REQUEST['menu'];
  $letters = range('A', 'Z');

  foreach($letters as $letter) :
    $class = $current_letter == $letter ? 'class="active"' : '';
?>
  <a <?php echo $class; ?> href="browse.php?letter=<?php echo $letter; ?>&menu=<?php echo $current_menu; ?>&listtype=<?php echo $listtype"><?php echo $letter; ?></a>

<?php endforeach; ?>

Показывает верхнюю строку меню (ссылки A-Z). Для бокового меню, вот как отобразить ваши категории:

<?php    
  foreach($menus as $menu) :
    $class = $current_menu == $menu ? 'class="active"' : '';
?>
  <a <?php echo $class; ?> href="browse.php?letter=<?php echo $current_letter; ?>&menu=<?php echo $menu; ?>&listtype=<?php echo $listtype"><?php echo $menu; ?></a>

<?php endforeach; ?>

Не проверял его, но помимо возможных опечаток этот подход должен работать для вас.

Кстати, пожалуйста, не бросайте мне вещи за то, что я не проверял ввод и использовал $ _REQUEST напрямую. Это должно быть сделано, но это совсем другая тема.

...