spk
(Sitepodkluch)
November 24, 2009, 12:55pm
1
Вечер добрый…
Я создаю свой виджет меню, и столкнулся с вопросом …
Как известно бывают такие ситуации что один пункт меню должен быть подсвечен на нескольких страницах…
Т.е. к примеру на странице 1 и странице 2 должны быть активным один и тот же пункт меню.
В принципе я это виже добавлением некоего списка тех страниц на которых конкретный пункт должен быть помечен как активный, но как другие это решают ??
Спасибо.
Alecs
(Oleksiy74)
November 24, 2009, 1:06pm
2
Судя с ваших топиков вы уже достаточно искушонный прогер. Зачем пустой флуд ?
Будут конкретные вопросы, задавайте. А если типа "собрать для чайников" то явно не тот форум.
wra
(Wra)
November 24, 2009, 8:20pm
3
Я бы тоже с удовольствием посмотрел бы на красивое решение без списка страниц и регулярных выражений (своего нет).
У меня один пункт меню — один контроллер. Вероятно надо проверять на значение текущего контроллера (не знаю как) и согласно этого подкрашивать пункты. Есть идеи?
Rsol
(Slava Rudnev)
November 25, 2009, 4:09am
4
wra:
Я бы тоже с удовольствием посмотрел бы на красивое решение без списка страниц и регулярных выражений (своего нет).
У меня один пункт меню — один контроллер. Вероятно надо проверять на значение текущего контроллера (не знаю как) и согласно этого подкрашивать пункты. Есть идеи?
Смотрите стандартный модуль (который генерируется автоматически) и используйте его в качестве основы. Еще можете посмотреть в расширениях.
BorisMor
(Borismor)
November 25, 2009, 12:04pm
5
Тоже стандартный переделал.
Вот мой вариант:
<?php
class MainMenuEx extends CWidget
{
public $items=array();
public function run()
{
$items=array();
$controller=$this->controller; // контроллер
$action=$controller->action; // экшен для этого контроллера
foreach($this->items as $item)
{
if(isset($item['visible']) && !$item['visible'])
continue;
$item2=array();
$item2['label']=$item['label'];
if(is_array($item['url']) && $item['url'][0])
{
// создаем список тестовых url
foreach($item['url'] as $cur_url){
$item2['url_test'][]= explode('/', $cur_url);
}
// первое значение в массиве url, будет служить выводимой ссылкой
$item2['url'] = $controller->createUrl($item['url'][0]);
}
else
$item2['url']=$item['url'];
$item2['active']=$this->isActive($item2['url_test'], $controller->uniqueID, $action->id);
$items[]=$item2;
}
$this->render('mainMenu',array('items'=>$items));
}
public function isActive($test_url, $controllerID,$actionID){
if(!is_array($test_url) || !isset($test_url[0])) return false;
return in_array(array($controllerID,$actionID), $test_url);
}
}
?>
Юзается так
<?php
$this->widget('application.components.MainMenuEx',array(
'items'=>array(
array('label'=>'Права', 'url'=>array('user/role_show','user/role_update','user/role_add')),
array('label'=>'Пользователи', 'url'=>array('user/index','user/add','user/update')),
array('label'=>'Фирмы', 'url'=>array('company/index','company/update','company/add')),
array('label'=>'Города', 'url'=>array('filial/index','filial/update','filial/add')),
array('label'=>'Базы', 'url'=>array('listbases/index','listbases/update','listbases/add')),
array('label'=>'Войти', 'url'=>array('user/login'), 'visible'=>Yii::app()->user->isGuest),
array('label'=>'Выйти', 'url'=>array('site/logout'), 'visible'=>!Yii::app()->user->isGuest)
),
)); ?>
creocoder
(Creocoder)
November 25, 2009, 3:39pm
6
BorisMor
Совершенно не ясен смысл такой переделки. Стандартный вариант может все тоже самое(смотрите параметр ‘pattern’). А вы потеряли возможность передавать GET параметры запроса. К тому же в стандартном варианте вместо
array('label'=>'Пользователи', 'url'=>array('user/index','user/add','user/update')),
можно просто
array('label'=>'Пользователи', 'url'=>array('/user')),
Если так смущает preg*, используйте кеширование вывода. Зачем калечить функционал и уродовать использование?
BorisMor
(Borismor)
November 26, 2009, 3:57am
7
То что потерял GET согласен (но мне пока и не нужно).
Переделан что бы пункт меню реагировал на разные контролы => просто перечисляем контрол и экшен при которых пункт активен.
creocoder
(Creocoder)
November 26, 2009, 9:22am
8
Это все есть в стандартной реализации. Тоже самое, я же написал про параметр ‘pattern’. Точно также просто перечисляем контроллер и действие при которых пункт активен, при всем при этом ещё и имеем GET.