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

Вопросы и ответы по изменению функционала, смене дизайна, переносу сайта и т.п.

Модераторы: Xpycm, Koduc

Правила форума
ВНИМАНИЕ! Форум не является средством гарантированной поддержки клиентов и пользователей. Поэтому на быстрый ответ тут рассчитывать не нужно, как и на ответ вообще. Сотрудники отвечают по мере своих возможностей.

На форуме действует ограничение в 3 сообщения / сутки.
Если Вы хотите сказать "спасибо", то воспользуйтесь функцией "Повысить репутацию" - зелёная иконка "плюс" под ником ответившего.

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

Сообщение REM » 27 авг 2014, 13:01

Подскажите, при изменении дизайна, мне необходимо добавить 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

Помогите если не трудно, заранее спасибо.
Последний раз редактировалось REM 27 авг 2014, 17:08, всего редактировалось 1 раз.
Мысль - это оргазм мозга. Те, кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать. (М.Кундера)
Аватара пользователя
REM
Гражданин
Гражданин
 
Сообщения: 153
Зарегистрирован: 28 мар 2014, 07:06
Откуда: Первоуральск
Очки репутации: 5

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

Сообщение Xpycm » 27 авг 2014, 13:18

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

https://www.google.ru/search?q=yii+CMenu+link+class
Dropbox
Open Real Estate CMS: FAQ | FAQ 2 | FAQ 3
Изображение
Xpycm
Разработчик
Разработчик
 
Сообщения: 1592
Зарегистрирован: 30 дек 2011, 11:06
Откуда: Йошкар-Ола
Очки репутации: 50

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

Сообщение REM » 27 авг 2014, 16:36

Действительно наверно не читабельно. В гугл я сам могу пошарить, и кстати пишу об этом, и даже пример привожу.
Спасибо за отклик "капитан очевидность".
но все же хотелось бы получить грамотную помощь.
Код: Выделить всё
<?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,
));
?>

Но не работает
Мысль - это оргазм мозга. Те, кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать. (М.Кундера)
Аватара пользователя
REM
Гражданин
Гражданин
 
Сообщения: 153
Зарегистрирован: 28 мар 2014, 07:06
Откуда: Первоуральск
Очки репутации: 5

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

Сообщение Xpycm » 27 авг 2014, 18:20

Вижу, поправили форматирование первого сообщения. И сразу проснулось желание помочь.

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

В файле 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'); 
Dropbox
Open Real Estate CMS: FAQ | FAQ 2 | FAQ 3
Изображение
Xpycm
Разработчик
Разработчик
 
Сообщения: 1592
Зарегистрирован: 30 дек 2011, 11:06
Откуда: Йошкар-Ола
Очки репутации: 50

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

Сообщение REM » 27 авг 2014, 20:06

Спасибо.
Я недавно начал изучать Yii и пока еще дилетант.
Почти разобрался, есть еще один нюанс, но пока покалякаю сам. Опыт - его надо накапливать :-)
Мысль - это оргазм мозга. Те, кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать. (М.Кундера)
Аватара пользователя
REM
Гражданин
Гражданин
 
Сообщения: 153
Зарегистрирован: 28 мар 2014, 07:06
Откуда: Первоуральск
Очки репутации: 5

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

Сообщение Xpycm » 27 авг 2014, 20:28

Не за что.

Отлично, главное не забрасывайте изучение.
Первые 2-3 проекта на Yii будут медленнее, нежели на нативном PHP ( если раньше только на нём писали ).
Зато потом ... в общем, в разы быстрее будете "клепать" сайты.
Dropbox
Open Real Estate CMS: FAQ | FAQ 2 | FAQ 3
Изображение
Xpycm
Разработчик
Разработчик
 
Сообщения: 1592
Зарегистрирован: 30 дек 2011, 11:06
Откуда: Йошкар-Ола
Очки репутации: 50

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

Сообщение REM » 27 авг 2014, 20:46

После всех манипуляций пропало отображение страницы в разделе админки Управление пунктами меню
Сообщение о порядке работы есть, а самого "дерева с ссылками" нет. Что могло пойти не так?
Я исправил :
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;
    }
 
Мысль - это оргазм мозга. Те, кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать. (М.Кундера)
Аватара пользователя
REM
Гражданин
Гражданин
 
Сообщения: 153
Зарегистрирован: 28 мар 2014, 07:06
Откуда: Первоуральск
Очки репутации: 5

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

Сообщение REM » 29 авг 2014, 12:54

Огромное спасибо Xpycm , но в его примере мой класс добавился ко всем ссылкам и к тем которые находятся в выпадающем меню, а если мне необходимо добавить другие классы к меню второго уровня, да еще плюсом правило для последнего пункта например скругленные углы снизу , как быть с этим?
Мысль - это оргазм мозга. Те, кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать. (М.Кундера)
Аватара пользователя
REM
Гражданин
Гражданин
 
Сообщения: 153
Зарегистрирован: 28 мар 2014, 07:06
Откуда: Первоуральск
Очки репутации: 5

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

Сообщение Xpycm » 29 авг 2014, 13:27

В вашем распоряжении, как минимум: переменная $depth, условие if-else и голова на плечах ( навеяло вашей "подписью" )
Dropbox
Open Real Estate CMS: FAQ | FAQ 2 | FAQ 3
Изображение
Xpycm
Разработчик
Разработчик
 
Сообщения: 1592
Зарегистрирован: 30 дек 2011, 11:06
Откуда: Йошкар-Ола
Очки репутации: 50


Вернуться в Вопросы и помощь по изменениям

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

cron