|
Cake-PHP.ru Форум программистов CakePHP (на сайт)
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Никита
Зарегистрирован: 24 Окт 2007 14:00:40 Сообщения: 39 Откуда: Новосибирск
|
Добавлено: 28 Окт 2007 09:50:16 Заголовок сообщения: Выделение активного пункта в меню |
|
|
Не доходит, как в меню на сайте выделить активный пункт.
Нет, именно как выделить то я знаю (визуально), а вот как с помощью Cake'а определить, какой пункт сейчас активен - не понимаю. |
|
Вернуться к началу |
|
|
VolCh
Зарегистрирован: 21 Окт 2007 07:17:33 Сообщения: 47 Откуда: Санкт-Петербург
|
Добавлено: 28 Окт 2007 10:43:46 Заголовок сообщения: |
|
|
Тут и без кейка можно обойтись, простым PHP или даже JS.
Сравнивать текущий URL с ссылкой в меню, если разные, то не трогать, если совпадают - вывести с другим стилем, например.
Как конкретно реализовать под Cake:
1. Во вью или лайауте при выводе очередного пункта сравнивать с текущим URL (не очень хорошо с точки зрения MVC, ИМХО).
2. В контролере сравнивать и кроме, например, подготовки массива с меню $menu_items['id']['name'|'link'] добавить в него элемент $menu_items['current_id'], а уж во вью сравнивать .
З.Ы. Подразумевается, что меню динамически формируется, если просто в лайауте или вью статический HTML код, то, наверное, JS надо юзать для изменения стиля
Последний раз редактировалось: VolCh (28 Окт 2007 10:53:41), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
Никита
Зарегистрирован: 24 Окт 2007 14:00:40 Сообщения: 39 Откуда: Новосибирск
|
Добавлено: 28 Окт 2007 10:46:59 Заголовок сообщения: |
|
|
Цитата: | Сравнивать текущий URL с ссылкой в меню, если разные, то не трогать, если совпадают - вывести с другим стилем, например |
Вот я тоже так подумал, но технически реализовать это сравнение не могу Помоги... |
|
Вернуться к началу |
|
|
VolCh
Зарегистрирован: 21 Окт 2007 07:17:33 Сообщения: 47 Откуда: Санкт-Петербург
|
Добавлено: 28 Окт 2007 11:25:27 Заголовок сообщения: |
|
|
В контролере:
Код: |
...
var $menu=array ('items' => array(
array('id' => 0, 'name' => 'главная', 'link' => '/'),
array('id' => 0, 'name' => 'статьи', 'link' => '/topics/'),
array('id' => 0, 'name' => 'ссылки', 'link' => '/links/'),
array('id' => 0, 'name' => 'о сайте', 'link' => '/abouts/')
)); //если с базы берем, то соответствующий FindAll(); используем
foreach ($menu['items'] as $menu_item) {
if ($_SERVER['REQUEST_URI']==$menu_item['link'] {
$menu['current_item_id']=$menu_item['id'];
break;
}
}
$this->set('menu',$menu);
...
|
Во вью:
Код: |
echo '<ul id="menu">';
foreach ($menu['items'] as $menu_item) {
echo '<li';
if (isset($menu['current_menu_id']) && $menu_item['id']==$menu['current_menu_id']) {
echo ' id="current"';
}
echo '><a href="'.$menu_item['link'].'">'.$menu_item['name'].'</a></li>';
}
echo '</ul>';
...
|
ну и в css что-то вроде
Код: |
#menu a {
color:#000;
}
#menu a#current {
color:#999;
text-decoration:none;
}
|
P.S. Писал "с головы", но принцип, думаю, понятен. |
|
Вернуться к началу |
|
|
Антон Исайкин Site Admin
Зарегистрирован: 08 Окт 2007 12:02:56 Сообщения: 150 Откуда: Санкт-Петербург
|
Добавлено: 28 Окт 2007 11:33:37 Заголовок сообщения: |
|
|
Если пункт меню указывает на /manual/, а мы зашли на /manual/one, то при этом раскладе он не будет подсвечен, поэтому думаю использовать два варианта:
1. Код: |
<? foreach ($this->viewVars['menu'] as $item) { ?>
<? if (@$this->params['pass'][0] != $item['Manual']['uri']) { ?>
<li><a href="/<? echo $item['Manual']['uri'] ?>" ><? echo $item['Manual']['title'] ?></a></li>
<? } else { ?>
<li><? echo $item['Manual']['title'] ?></li>
<? } ?>
<? } ?>
|
Это если мы конкретно знаем о каком уровне вложенности идет речь (в примере о первом).
2. Используем strpos(), в которой указываем url ссылки и url текущий. |
|
Вернуться к началу |
|
|
Никита
Зарегистрирован: 24 Окт 2007 14:00:40 Сообщения: 39 Откуда: Новосибирск
|
Добавлено: 28 Окт 2007 11:39:31 Заголовок сообщения: |
|
|
Ууу... |
|
Вернуться к началу |
|
|
VolCh
Зарегистрирован: 21 Окт 2007 07:17:33 Сообщения: 47 Откуда: Санкт-Петербург
|
Добавлено: 28 Окт 2007 11:41:17 Заголовок сообщения: |
|
|
|
|
Вернуться к началу |
|
|
Никита
Зарегистрирован: 24 Окт 2007 14:00:40 Сообщения: 39 Откуда: Новосибирск
|
Добавлено: 28 Окт 2007 11:53:14 Заголовок сообщения: |
|
|
Пытаюсь разобраться, что тут написано. |
|
Вернуться к началу |
|
|
Никита
Зарегистрирован: 24 Окт 2007 14:00:40 Сообщения: 39 Откуда: Новосибирск
|
Добавлено: 28 Окт 2007 12:35:25 Заголовок сообщения: |
|
|
VolCh,
Цитата: | В контролере:
Код:
...
var $menu=array ('items' => array(
array('id' => 0, 'name' => 'главная', 'link' => '/'),
array('id' => 0, 'name' => 'статьи', 'link' => '/topics/'),
array('id' => 0, 'name' => 'ссылки', 'link' => '/links/'),
array('id' => 0, 'name' => 'о сайте', 'link' => '/abouts/')
)); //если с базы берем, то соответствующий FindAll(); используем
foreach ($menu['items'] as $menu_item) {
if ($_SERVER['REQUEST_URI']==$menu_item['link'] {
$menu['current_item_id']=$menu_item['id'];
break;
}
}
$this->set('menu',$menu); |
В каком контроллере именно? Я увязать в голове не могу всего. |
|
Вернуться к началу |
|
|
VolCh
Зарегистрирован: 21 Окт 2007 07:17:33 Сообщения: 47 Откуда: Санкт-Петербург
|
Добавлено: 28 Окт 2007 19:30:13 Заголовок сообщения: |
|
|
В котором ты готовишь данные для вида, то есть отображения Например blog->index();
Можно оформить этот код в виде метода, если в других контролерах он не используется, а в других методах этого контролера используется, или просто для удобства. Или даже в виде компонента можно сделать, если он и в других контролерах нужен будет.
А код во вью можешь сделать в виде элемента, тогда сможешь включать его и в другие виды. По идее я сейчас так и делаю всё - миниконтролеры (котрые вызывают обычные контролеры) для блоков меню, баннеров, новостей и т.п. оформляю как компоненты, а вывод этих блоков как элементы. В результате layout у меня состоит из HTML кода (дивы в основном), вызова элементов в разных дивах, а в "центральный" див вывод готовит вью обычный. В контролере тоже не отвлекаюсь на блоки, только загрузка компонентов, их вызов и передача данных во вью. В результате, если что-то решу изменить в логике или виде блоков, то меняю только код компонентов/элементов, если дизайн, то только лайаут. В общем CakePHP мне нравится все больше и больше Страшно даже на 1.2 переходить , говорят он еще лучше |
|
Вернуться к началу |
|
|
Антон Исайкин Site Admin
Зарегистрирован: 08 Окт 2007 12:02:56 Сообщения: 150 Откуда: Санкт-Петербург
|
Добавлено: 28 Окт 2007 21:09:35 Заголовок сообщения: |
|
|
Да мы уж с ним по асе проблему решили.
Решили запихать заполнение массива в app_controller.php:
Код: | <?
class AppController extends Controller {
function beforeFilter () {
$header_menu = array('/' => 'Главная', 'news/' => 'Новости');
$this->set('header_menu', $header_menu);
}
}
?> |
|
|
Вернуться к началу |
|
|
|
|
Вы можете начинать темы Вы можете отвечать на сообщения Вы можете редактировать свои сообщения Вы можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group Русская поддержка phpBB
|