вторник, 7 июня 2011 г.

Подсветка активного пункта меню

Реализовал поведение главного меню и меню пользователей (выбор категории товара).
Главное меню:
Когда мы в любом месте каталога – выделен пункт меню Catalog.
Меню пользователей:
Когда отображаются все товары – выделен пункт Show All.
Когда отображаются товары конкретной категории – выделен пункт этой категории.
Когда выбран конкретный товар – выделен пункт категорий этого товара.


Мне помогли на форуме http://yiiframework.ru/forum/viewtopic.php?f=3&t=3269&p=19941#p19941

Итак:
Главное меню. В файле Z:\home\catalog.loc\www\protected\views\layouts\main.php исправил только одну строчку:
widget('zii.widgets.CMenu',array(
'items'=>array(
array('label'=>'Catalog', 'url'=>array('/assortiment/'), 
'active' => Yii::app()->controller->getId() == 'assortiment'),

array('label'=>'About', 'url'=>array('/site/page', 'view'=>'about')),

array('label'=>'Contact', 'url'=>array('/site/contact')),

array('label'=>'Login', 'url'=>array('/site/login'),
'visible'=>Yii::app()->user->isGuest),

array('label'=>'Manage Category', 'url'=>array('/category/admin'),
'visible'=>!Yii::app()->user->isGuest),

array('label'=>'Manage Assortiment', 'url'=>array('/assortiment/admin'),
'visible'=>!Yii::app()->user->isGuest),                                          

array('label'=>'Logout', 'url'=>array('/site/logout'),
 'visible'=>!Yii::app()->user->isGuest)
),
)); ?>


Теперь первый пункт меню активен в любом действии контроллера assortiment.

Меню выбора категорий:
Изменения произошли толь в функции All_shown() файла Z:\home\catalog.loc\www\protected\models\Category.php
/**
* Returns all shown category.
* @return all category where shown = yes
*/
public static function All_shown()
{

$r[] =   array('label'=>'Show all', 'url'=>array('/assortiment'), 
'active' => ((Yii::app()->controller->getId() == 
'assortiment')and(!$_GET['category']) and 
(!$_GET['id'])));      
$models = Category::model()->findAll(
array('order' => 'name',
'condition' => 'shown = "yes"',
)
);
foreach($models as $val)
{
$model = Assortiment::model()->findByPk((int)$_GET['id']); 

$r[] =   array('label'=>$val->name, 
'url'=>array('/assortiment/index','category'=>$val->id), 
'active' => (($val->id == $model->category_id)or
($val->id == (int)$_GET['category'])));
}

return $r;
}
Принцип такой же:
свойство 'active' типа правда/ложь и условие при котором определяется, будет пункт активным или нет.
Например в случае
'active' => (($val->id == $model->category_id)or
($val->id == (int)$_GET['category']))
Если индекс категории пункта меню равен индексу категории выбранного товара или индекс категории пункта меню равен индексу выбранной такегории, то выражение примет значение "1" и пункт меню этой категории станет выделенным как активный.
Продолжение следует.

2 комментария:

  1. Ошибка :(
    Undefined index: category
    Подсвечивает в All_shown()
    (!$_GET['category']) and (!$_GET['id'])));

    ОтветитьУдалить
  2. Если сделатьв статье подсветка активного пункта меню,
    public static function All_shown()
    {
    $r[] = array('label'=>'Show all', 'url'=>array('/assortiment/index'),
    'active' => ((Yii::app()->controller->getId() == 'assortiment')
    and
    (!Yii::app()->request->getParam('category'))
    and
    (!Yii::app()->request->getParam('id'))));

    $models = Category::model()->findAll(array('order' => 'name','condition' => 'shown = "1"',));
    foreach($models as $val)
    {
    $model = Assortiment::model()->findByPk(Yii::app()->request->getParam('id'));
    $r[] = array('label'=>$val->name,
    'url'=>array('/assortiment/index','category'=>$val->id),
    'active' => (($val->id == $model->category_id)
    or
    ($val->id == Yii::app()->request->getParam('category'))));

    }
    return $r;
    }
    ТО выдаёт ошибку PHP notice

    Trying to get property of non-object

    ОтветитьУдалить