Меню

Вечер добрый…

Я создаю свой виджет меню, и столкнулся с вопросом …

Как известно бывают такие ситуации что один пункт меню должен быть подсвечен на нескольких страницах…

Т.е. к примеру на странице 1 и странице 2 должны быть активным один и тот же пункт меню.

В принципе я это виже добавлением некоего списка тех страниц на которых конкретный пункт должен быть помечен как активный, но как другие это решают ??

Спасибо.

Судя с ваших топиков вы уже достаточно искушонный прогер. Зачем пустой флуд ?

Будут конкретные вопросы, задавайте. А если типа "собрать для чайников" то явно не тот форум.

Я бы тоже с удовольствием посмотрел бы на красивое решение без списка страниц и регулярных выражений (своего нет).

У меня один пункт меню — один контроллер. Вероятно надо проверять на значение текущего контроллера (не знаю как) и согласно этого подкрашивать пункты. Есть идеи?

Смотрите стандартный модуль (который генерируется автоматически) и используйте его в качестве основы. Еще можете посмотреть в расширениях.

Тоже стандартный переделал.

Вот мой вариант:




<?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)

	),

)); ?>



BorisMor

Совершенно не ясен смысл такой переделки. Стандартный вариант может все тоже самое(смотрите параметр ‘pattern’). А вы потеряли возможность передавать GET параметры запроса. К тому же в стандартном варианте вместо




array('label'=>'Пользователи', 'url'=>array('user/index','user/add','user/update')),



можно просто




array('label'=>'Пользователи', 'url'=>array('/user')),



Если так смущает preg*, используйте кеширование вывода. Зачем калечить функционал и уродовать использование?

То что потерял GET согласен (но мне пока и не нужно).

Переделан что бы пункт меню реагировал на разные контролы => просто перечисляем контрол и экшен при которых пункт активен.

Это все есть в стандартной реализации. Тоже самое, я же написал про параметр ‘pattern’. Точно также просто перечисляем контроллер и действие при которых пункт активен, при всем при этом ещё и имеем GET.