Страница 1 из 1

Добавить class к тегу <a></a> CMenu

СообщениеДобавлено: 27 авг 2014, 13:01
REM
Подскажите, при изменении дизайна, мне необходимо добавить class к ссылке в верхнем меню.
В описаниях я читал что можно это сделать так:
Код: Выделить всё
$this->myMenu = array(
'id'=>'myMenu',
'items'=>array(
    array(
        
'label'=>'Home',
        
'url'=>array('site/index'),
        
'itemOptions'=>array('class'=>'visited'),
        
'linkOptions'=>array('class'=>'bar'),
    ),
    array(
'label'=>'Sign Out''url'=>array('site/signout')),
),
); 

Но на деле открыв файл main.php я встретил такой код:
Код: Выделить всё
<?php
                
                    $this
->widget('zii.widgets.CMenu',array(
                        
'id' => 'sf-menu-id',
                        
'items' => $this->aData['topMenuItems'],
                        
'htmlOptions' => array('class' => 'sf-menu'),
                        
'encodeLabel' => false,
                    ));
                
?>

Как мне стало понятно, для тега <ul> существует и id и class.
Но сколько я не пытался добавить class к ссылке у меня выводится ошибка.
необходимо получить следующий код HTML:
Код: Выделить всё
<ul>
<
li><a id="menu-150" class="item" href="">Главная<i></i></a></li>
<
li><a id="menu-151" class="item" href="">Объекты<i></i></a>
<
div class="wrapper">
<
div id="menu-151-submenu" class="sub" style="display: none;">
<
div class="menu-sub-bg"></div>
<
div><class="" href="novostryki.htm">Квартиры</a></div>
<
div><class="" href="comnedvigimost.htm">Коммерческая недвижимость</a></div>
<
div><class="" href="parking.htm">Паркинги</a></div>
<
div class="end"><class="" href="">Земельные участки</a></div>
</
div>
</
div>
</
li>
<
li><a id="menu-164" class="item" href="about_company.htm">О компании<i></i></a></li>
<
li><a id="menu-165" class="item" href="">Инфраструктура<i></i></a><div class="wrapper">
<
div id="menu-165-submenu" class="sub" style="display: none;">
<
div class="menu-sub-bg"></div>
<
div><class="" href="">Торговый центр</a></div>
<
div><class="" href="">Медицинские учереждения</a></div>
<
div><class="" href="">Детски сады</a></div>
<
div><class="" href="">Школа</a></div>
<
div><class="" href="">Пункты питания</a></div>
<
div class="end"><class="" href="">Сквер</a></div>
</
div>
</
div>
</
li>
<
li><a id="menu-152" class="item" href="contacts.htm">Контакты<i></i></a></li>
<
li><a id="menu-153" class="item" href="feedback.htm">Купить<i></i></a></li>
</
ul

Помогите если не трудно, заранее спасибо.

Re: Добавить class к тегу <a></a> CMenu

СообщениеДобавлено: 27 авг 2014, 13:18
Xpycm
Соощение оформили абсолютно нечитабельно. Для кода есть отдельный тэг [code] при добавлении сообщения.

https://www.google.ru/search?q=yii+CMenu+link+class

Re: Добавить class к тегу <a></a> CMenu

СообщениеДобавлено: 27 авг 2014, 16:36
REM
Действительно наверно не читабельно. В гугл я сам могу пошарить, и кстати пишу об этом, и даже пример привожу.
Спасибо за отклик "капитан очевидность".
но все же хотелось бы получить грамотную помощь.
Код: Выделить всё
<?php

$this
->widget('zii.widgets.CMenu',array(
'id' => 'sf-menu-id',
'items' => $this->aData['topMenuItems'],
'htmlOptions' => array('class' => 'sf-menu'),
'encodeLabel' => false,
));
?>

ЭТО КОД в файле main.php
куда я должен вставить
Код: Выделить всё
'linkOptions'=>array('class'=>'item'), 

Как я понимаю все должно выглядеть как то так:
Код: Выделить всё
<?php

$this
->widget('zii.widgets.CMenu',array(
'items' => $this->aData['topMenuItems'],
'linkOptions''=>array('class'=>'item'),
'
encodeLabel' => false,
));
?>

Но не работает

Re: Добавить class к тегу <a></a> CMenu

СообщениеДобавлено: 27 авг 2014, 18:20
Xpycm
Вижу, поправили форматирование первого сообщения. И сразу проснулось желание помочь.

Расскажу как сделать наверняка и иметь возможность задавать любой класс к разным ссылкам:

В файле themes\classic\views\layouts\main.php формирование меню идёт через стандартный Yii виджет CMenu
Код: Выделить всё
$this->widget('zii.widgets.CMenu',array(
    'id' => 'sf-menu-id',
    'items' => $this->aData['topMenuItems'],
    'htmlOptions' => array('class' => 'sf-menu'),
    'encodeLabel' => false,
));
 


в качестве элементов меню выступает массив $this->aData['topMenuItems'].

В свою очередь он формируется в файле protected\components\Controller.php
Код: Выделить всё
$this->aData['topMenuItems'] = $this->infoPages; 


В этом же файле ищем что же такое "$this->infoPages". Чуть выше находим код:
Код: Выделить всё
$this->infoPages = Menu::getMenuItems(true); 


Если используете IDE с добавлением всех файлов проекта, то легко при клике по методу "getMenuItems" перейдёте в файл protected\modules\menumanager\models\Menu.php
Если нет, то открываете файл вручную.

Находите метод getMenuItems.
Идёт выборка элементов из базы и дальнейшая "нормализация" в методе normalizeMenuItems.

Собственно, вставляет нужный класс в методе normalizeMenuItems:
Код: Выделить всё
$menu[$i]['linkOptions'] = array('class' => 'item'); 

Re: Добавить class к тегу <a></a> CMenu

СообщениеДобавлено: 27 авг 2014, 20:06
REM
Спасибо.
Я недавно начал изучать Yii и пока еще дилетант.
Почти разобрался, есть еще один нюанс, но пока покалякаю сам. Опыт - его надо накапливать :-)

Re: Добавить class к тегу <a></a> CMenu

СообщениеДобавлено: 27 авг 2014, 20:28
Xpycm
Не за что.

Отлично, главное не забрасывайте изучение.
Первые 2-3 проекта на Yii будут медленнее, нежели на нативном PHP ( если раньше только на нём писали ).
Зато потом ... в общем, в разы быстрее будете "клепать" сайты.

Re: Добавить class к тегу <a></a> CMenu

СообщениеДобавлено: 27 авг 2014, 20:46
REM
После всех манипуляций пропало отображение страницы в разделе админки Управление пунктами меню
Сообщение о порядке работы есть, а самого "дерева с ссылками" нет. Что могло пойти не так?
Я исправил :
main.php убрал id и class у тега
Код: Выделить всё
<ul

Код: Выделить всё
<?php
                
                    $this
->widget('zii.widgets.CMenu',array(
                        
                        
'items' => $this->aData['topMenuItems'],
                        
                        
'encodeLabel' => false,
                    ));
                
?>


Menu.php добавил
Код: Выделить всё
 $menu[$k]['linkOptions'] = array('class' => 'item');  

Код: Выделить всё
public static function getMenuItems($parentId$depth 0){
        
# не выводим более 3 уровней
        
if ($depth self::MAX_LEVEL) {
            return array();
        }

        
$pages self::model();
        
$pages $pages->findAll(array(
            
//'select'=>'id, parentId, title_'.Yii::app()->language.' AS title, special, href_'.Yii::app()->language.' AS href, type',
            
'condition'=>"parentId = :parentId AND active = :active",
            
'params'=>array(
                
'parentId' => $parentId,
                
'active' => 1,
            ),
            
'order'=>'t.number',
        ));

        if(!
count($pages)) return array();

        
$menu = array();
        foreach (
$pages as $k => $v) {
            
$menu[$k] = array();
            
$children self::getMenuItems($v->id$depth 1);

            
$menu[$k]['label'] = $v->getTitle().'<i></i>';
            
$menu[$k]['url'] = $v->getUrl();
                
$menu[$k]['linkOptions'] = array('class' => 'item'); 

            if (
$v->is_blank && $v->type == self::LINK_NEW_MANUAL) {
                
$menu[$k]['linkOptions'] = array('target' => '_blank');
            }

            if (
$children)
                
$menu[$k]['items'] = $children;
        }

        return 
$menu;
    }
 

Re: Добавить class к тегу <a></a> CMenu

СообщениеДобавлено: 29 авг 2014, 12:54
REM
Огромное спасибо Xpycm , но в его примере мой класс добавился ко всем ссылкам и к тем которые находятся в выпадающем меню, а если мне необходимо добавить другие классы к меню второго уровня, да еще плюсом правило для последнего пункта например скругленные углы снизу , как быть с этим?

Re: Добавить class к тегу <a></a> CMenu

СообщениеДобавлено: 29 авг 2014, 13:27
Xpycm
В вашем распоряжении, как минимум: переменная $depth, условие if-else и голова на плечах ( навеяло вашей "подписью" )