Kohana 3: Как найти активный элемент в динамическом меню - PullRequest
1 голос
/ 11 марта 2010

Может быть, не лучшее объяснение, но выслушай меня.Скажем, у меня есть следующее в файле конфигурации с именем menu.php :

// Default controller is 'home' and default action is 'index'
return array(
   'items' => array(
      'Home' => '',
      'News' => 'news',
      'Resources' => 'resources',
   ),
);

Теперь я хочу напечатать это как меню, которое довольно просто:

foreach(Kohana::config('menu.items') as $title => $uri)
{
    echo '<li>' . HTML::anchor($uri, $title) . '</li>';
}

Однако я хочу найти $uri, который соответствует текущему контроллеру и действию.И если это действие по умолчанию или нет.Я хочу закончить тем, что пункт меню должен иметь id="active-item", если это ссылка на текущий контроллер, но действие по умолчанию.И id="active-subitem, если он связан с текущим контроллером и действие не является заданным по умолчанию.Надеюсь, это имело смысл ...

Кто-нибудь может мне здесь помочь?Как в том, как это сделать в Кохане 3, так и в том, как это должно быть сделано в Кохане 3. Я уверен, что есть много способов, но да ... любая помощь приветствуется:)


Примеры:

  • domain.com - Home должно быть active-item , поскольку это контроллер по умолчанию
  • domain.com / home - Home должен быть active-item
  • domain.com / home / index - Home долженбыть active-item , поскольку index является действием по умолчанию
  • domain.com / resources - Resources должно быть active-item
  • domain.com / resources / get / 7 - Resources должно быть active-subitem , поскольку get не является значением по умолчаниюдействие

1 Ответ

1 голос
/ 12 марта 2010

Вы можете сделать это несколькими способами

CSS

Я часто использую этот метод. Я прикрепляю класс к элементу тела каждой страницы, чтобы идентифицировать.

HTML

<style type="text/css">
body.home #home-link {
    border: 3px solid red;
}
</style>

<body class="home">
<ul>
    <li id="home-link">Home</li>
</ul>
</body>

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

Добавить через контроллер

Вы также можете добавить через контроллер

Контроллер

public function action_about() {

    $this->template->active = 'about';

}

View

foreach(Kohana::config('menu.items') as $title => $uri)
{
    echo '<li' . (($active === $uri) ? ' class="active"' : NULL) . '>' . HTML::anchor($uri, $title) . '</li>';
}

Тогда, конечно, вы просто стилизуете элемент списка с классом active. Преимущества в том, что вы определяете CSS только один раз.

...