Есть ли более чистый способ сделать боковую панель активной для каждой страницы?


У меня есть этот код боковой панели

    <li><a href="/restaurant_pos"><span>Restaurant POS Systems</span></a>
<ul>
    <li><a href="/restaurant_pos">Restaurant POS Systems</a></li>
    <li><a href="/bar_nightclub_pos">Bar and Nightclub POS Systems</a></li>
    <li><a href="/bbq-restaurant-pos">BBQ Restaurant POS</a></li>
    <li><a href="/bowling-alley-pos-system">Bowling Alley Point of Sale</a></li>
    <li><a href="/cafe-pos">Cafe Point of Sale Systems</a></li>
    <li><a href="/chinese-restaurant-pos">Chinese Restaurant POS Systems</a></li>
    <li><a href="/fine-dining-pos">Fine Dining Point of Sale Systems</a></li>
    ....
    ....

И я хочу добавить активный класс на текущую страницу, поэтому я выбрал такой подход

    <li><a href="/restaurant_pos"><span>Restaurant POS Systems</span></a>
<ul>
    <li><a <?php if($_SERVER['REQUEST_URI'] == '/restaurant_pos/'){
        echo "class='active' ";
    } 
    ?> href="/restaurant_pos">Restaurant POS Systems</a></li>
    <li><a 
        <?php if($_SERVER['REQUEST_URI'] == '/bar_nightclub_pos/'){
            echo "class='active' ";
        } 
        ?>
        href="/bar_nightclub_pos">Bar and Nightclub POS Systems</a></li>
    <li><a href="/bbq-restaurant-pos">BBQ Restaurant POS</a></li>
    <li><a href="/bowling-alley-pos-system">Bowling Alley Point of Sale</a></li>
    <li><a href="/cafe-pos">Cafe Point of Sale Systems</a></li>
    <li><a href="/chinese-restaurant-pos">Chinese Restaurant POS Systems</a></li>
    <li><a href="/fine-dining-pos">Fine Dining Point of Sale Systems</a></li>
    ....
    ....

Но я чувствую, что должен быть лучший и более чистый способ сделать это...любые идеи

Author: Matt Elhotiby, 2011-07-19

4 answers

Это может быть проще сделать в JavaScript/jQuery. Сохранение взаимодействия на стороне клиента также сэкономит на запросах сервера (хотя это может быть более серьезной проблемой на сайтах с более высокой нагрузкой).

Что-то вроде этого - возможно, вам придется изменить положение массива url на основе URL-адреса вашего сайта:

Jsfiddle: http://jsfiddle.net/g_thom/AXm6e/2/

var pathname = window.location.href;
var partsArray = pathname.split('/');
var url = '/' + partsArray[3];
var a_s = $('li a');
a_s.removeClass('active');
a_s.each(function () {
   if ($(this).attr('href') == url) {
       $(this).addClass('active');
   } 
}); 
 1
Author: g_thom, 2011-07-19 14:39:58

Конечно,

  1. Поместите все ссылки и их тексты в массив.

  2. Затем выполните итерацию по массиву, чтобы выполнить вывод.

  3. Если результат будет таким, каким вы его знаете, без активной функциональности, вы можете перейти к следующему шагу.

  4. Введите проверку соответствия текущего запроса ссылке, и если это произойдет, добавьте класс в вывод.

Вы решили свою проблему с помощью итерации. Применяется тот же метод к тем же данным, помещая данные в повторяющуюся (циклическую) структуру. Не повторяйте код, повторяйте данные. Надеюсь, это поможет.

 5
Author: hakre, 2011-07-19 14:18:03

Цикл по массиву данных в цикле foreach

<?php
$links = array(
    array('/restaurant_pos','Restaurant POS Systems'),
    array('/bar_nightclub_pos/','Bar and Nightclub POS Systems')
);
foreach($links as $k => $v){
    if($_SERVER['REQUEST_URI'] == '/bar_nightclub_pos/'){ $class = ' class="active"'; } else { $class = ''; }
    echo '<li><a href="'.$v[0].'"'.$class.'>'.$v[1].'</a></li>';
};
?>

Выходные данные:

 1
Author: Billy Moon, 2011-07-19 14:33:51

Я бы сделал что-то вроде этого:

<?php
$restaurants = array(
    array('label' => 'Restaurant POS Systems', 'url' => '/restaurant_pos'),
    array('label' => 'Bar and Nightclub POS Systems', 'url' => '/bar_nightclub_pos'),
    ...
);

/*set active restaurant*/
foreach ($restaurants as &$r) {
    $r['active'] = ($_SERVER['REQUEST_URI'] == $r['url'])? 'active': '';
}
unset($r);
?>
<ul>
<?php foreach ($restaurants as $r) { ?>
    <li><a href="<?php echo $r['url']; ?>" class="<?php echo $r['active']; ?>"><?php echo $r['label']; ?></a></li>
<?php } ?>
</ul>

Как правило, рекомендуется иметь как можно меньше логики программирования в той части кода, которая генерирует HTML.

 1
Author: August Karlstrom, 2011-07-19 14:39:04