CMenu - активный пункт при открытии "синонима" страницы

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Ответить
Аватара пользователя
Inpassor
Сообщения: 10
Зарегистрирован: 2013.02.14, 00:23
Откуда: Санкт-Петербург

CMenu - активный пункт при открытии "синонима" страницы

Сообщение Inpassor »

Суть такова: на сайте используется для формирования основного меню виджет CMenu. Дочерних пунктов меню нет, но необходимо при открытии страниц, идентичных по логике, чтобы пункт меню становился активным. Т.е. например, в основном меню есть пункт "Пользователи", ссылающийся на "/user/index". Нужно, чтобы при открытии страниц "/user/create", "/user/view", и.т.д., пункт меню "Пользователи" был активным.

Стандартного решения я не нашел, поэтому пришлось немного расширить виджет. Вот что получилось:

Menu.php:

Код: Выделить всё

Yii::import('zii.widgets.CMenu');
class Menu extends CMenu
{
    protected function isItemActive($item,$route)
    {
        if (isset($item['syn']))
            foreach ($item['syn'] as $syn)
                if (!strcasecmp(trim($syn,'/'),$route))
                    return true;
        return parent::isItemActive($item,$route);
    }
}
К виджету добавилось свойство "syn": array() - массив "синонимов" страницы. Меню формируется таким образом:

Код: Выделить всё

$this->widget('Menu',array(
    'items'=>array(
        array('label'=>'Home', 'url'=>array('/site/index')),
        array('label'=>'Users', 'url'=>array('/user/index'), 'visible'=>!Yii::app()->user->isGuest, 'syn'=>array('user/create','user/admin','user/update','user/view')),
        array('label'=>'Registration', 'url'=>array('/user/registration'), 'visible'=>Yii::app()->user->isGuest),
        array('label'=>'Login', 'url'=>array('/user/login'), 'visible'=>Yii::app()->user->isGuest),
        array('label'=>'Logout'.' ('.Yii::app()->user->name.')', 'url'=>array('/user/logout'), 'visible'=>!Yii::app()->user->isGuest),
    ),
));
Если изобрел костыль, сильно не пинайте - только начал изучение Yii.
Надеюсь, эта тема кому-нибудь поможет.
Dismal
Сообщения: 247
Зарегистрирован: 2011.10.16, 13:25

Re: CMenu - активный пункт при открытии "синонима" страницы

Сообщение Dismal »

По модулям группировать можно так:

Код: Выделить всё

array('label'=>'Users', 'url'=>'/user/backend/user', 'active'=>(Yii::app()->controller->module->id == 'user')),
По контроллерам:

Код: Выделить всё

array('label'=>'Users', 'url'=>'/user/backend/user', 'active'=>($this->uniqueId == 'modulename/controllername')),
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: CMenu - активный пункт при открытии "синонима" страницы

Сообщение SpiLLeR »

Есть же еще activateParents
http://www.yiiframework.com/doc/api/1.1 ... nts-detail
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
Inpassor
Сообщения: 10
Зарегистрирован: 2013.02.14, 00:23
Откуда: Санкт-Петербург

Re: CMenu - активный пункт при открытии "синонима" страницы

Сообщение Inpassor »

Все это не подходит. Постановка задачи ТАКАЯ:
Inpassor писал(а):Суть такова: на сайте используется для формирования основного меню виджет CMenu. Дочерних пунктов меню нет, но необходимо при открытии страниц, идентичных по логике, чтобы пункт меню становился активным. Т.е. например, в основном меню есть пункт "Пользователи", ссылающийся на "/user/index". Нужно, чтобы при открытии страниц "/user/create", "/user/view", и.т.д., пункт меню "Пользователи" был активным.
Так что пока единственное решение - описанное мною в первом посте.
Dismal писал(а):По модулям группировать можно так:
...
По контроллерам:
...
Спасибо, полезная информация, но не то, что нужно.
В моем меню есть пункты "Users", "Login' и "Logout", которые ссылаются на один контроллер. Так же в этом контроллере есть действия по редактированию, удалению пользователей, и т.д. Мне нужно при выборе всех этих действий активировать только пункт меню "Users", а если сгруппировать по контроллеру, то активируются так же и пункты меню "Login' и "Logout".
SpiLLeR писал(а):Есть же еще activateParents
http://www.yiiframework.com/doc/api/1.1 ... nts-detail
1)
Inpassor писал(а):Дочерних пунктов меню нет
2)
public boolean $activateParents;
whether to activate parent menu items when one of the corresponding child menu items is active.
И? Предложите мне, пожалуйста, адекватное решение поставленной задачи с использованием свойства activateParents.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: CMenu - активный пункт при открытии "синонима" страницы

Сообщение yan »

не понял зачем трогать CMenu, чем
Inpassor писал(а):

Код: Выделить всё

'syn'=>array('user/create','user/admin','user/update','user/view')
лучше чем

Код: Выделить всё

'active'=>in_array($this->route,array('user/create','user/admin','user/update','user/view'))
 
?
Ответить