Список форумов Cake-PHP.ru Cake-PHP.ru
Форум программистов CakePHP
(на сайт)
 
 Watched TopicsWatched Topics   FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Выделение активного пункта в меню

 
Начать новую тему   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Cake-PHP.ru -> Общий
Предыдущая тема :: Следующая тема  
Автор Сообщение
Никита



Зарегистрирован: 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 с ссылкой в меню, если разные, то не трогать, если совпадают - вывести с другим стилем, например


Вот я тоже так подумал, но технически реализовать это сравнение не могу Smile Помоги...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
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    Заголовок сообщения: Ответить с цитатой

Ууу... Sad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
VolCh



Зарегистрирован: 21 Окт 2007 07:17:33
Сообщения: 47
Откуда: Санкт-Петербург

СообщениеДобавлено: 28 Окт 2007 11:41:17    Заголовок сообщения: Ответить с цитатой

Question
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Никита



Зарегистрирован: 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    Заголовок сообщения: Ответить с цитатой

В котором ты готовишь данные для вида, то есть отображения Smile Например blog->index(); Smile

Можно оформить этот код в виде метода, если в других контролерах он не используется, а в других методах этого контролера используется, или просто для удобства. Или даже в виде компонента можно сделать, если он и в других контролерах нужен будет.

А код во вью можешь сделать в виде элемента, тогда сможешь включать его и в другие виды. По идее я сейчас так и делаю всё - миниконтролеры (котрые вызывают обычные контролеры) для блоков меню, баннеров, новостей и т.п. оформляю как компоненты, а вывод этих блоков как элементы. В результате layout у меня состоит из HTML кода (дивы в основном), вызова элементов в разных дивах, а в "центральный" див вывод готовит вью обычный. В контролере тоже не отвлекаюсь на блоки, только загрузка компонентов, их вызов и передача данных во вью. В результате, если что-то решу изменить в логике или виде блоков, то меняю только код компонентов/элементов, если дизайн, то только лайаут. В общем CakePHP мне нравится все больше и больше Smile Страшно даже на 1.2 переходить , говорят он еще лучше Laughing
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Антон Исайкин
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);
     }
}
?>
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Cake-PHP.ru -> Общий Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы можете начинать темы
Вы можете отвечать на сообщения
Вы можете редактировать свои сообщения
Вы можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB

Рейтинг@Mail.ru