Изменение HTML шаблона главного меню

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

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

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

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

Изменение HTML шаблона главного меню

Сообщение Alvian » 10 июн 2013, 15:01

Всем доброго времени суток!
Необходимо изменить шаблон вывода основного меню (там где кнопки - Главная, Новости, Вопросы-ответы, .....). Все перелопатил, но никак не найду где меняется HTML шаблон этого меню. Помогите пожалуйста!!!! Ниже привел пример как стандартно выводится меню и то что мне надо сделать.

В оригинале:
Код: Выделить всё
<ul class="dropDownNav" id="dropDownNav">
  <li class="active"><a href="/">Главная</li>
  <li class=""><a onclick="return false;" href="/">Пункт</a>
    <ul class="sub_menu_dropdown" style="visibility: hidden;">
      <li class=""><a href="#">Подпункт</a></li>
    </ul>
  </li>
</
ul>
 


То что мне необходимо сделать:
Код: Выделить всё
<ul class="nav" id="dropDownNav">
  <li class="active"><a href="/">Главная</li>
  <li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="#">Пункт</a>
    <ul class="dropdown-menu">
      <li><a href="#">Подпункт</a></li>
    </ul>
  </li>
</
ul>
 


Причем обязательно надо поменять именно таким образом!!!(((
Alvian
Незнакомец
 
Сообщения: 6
Зарегистрирован: 10 июн 2013, 14:31
Очки репутации: 0

Re: Изменение HTML шаблона главного меню

Сообщение Xpycm » 10 июн 2013, 15:07

Вызов меню и передача массива с данными для отображения в файле protected/views/layouts/main.php
Код: Выделить всё
$this->widget('zii.widgets.CMenu',array(
    'id' => 'dropDownNav',
    'items'=>CMap::mergeArray($this->aData['topMenuItems'], array(array('label' => Yii::t('common', 'Logout'), 'url'=>array('/site/logout')))),
    'htmlOptions' => array('class' => 'dropDownNav adminTopNav'),
));
 


используется виджет CMenu - http://www.yiiframework.com/doc/api/1.1/CMenu

Меняете вызов на:
Код: Выделить всё
$this->widget('MyCMenu',array(
    'id' => 'dropDownNav',
    'items'=>CMap::mergeArray($this->aData['topMenuItems'], array(array('label' => Yii::t('common', 'Logout'), 'url'=>array('/site/logout')))),
    'htmlOptions' => array('class' => 'dropDownNav adminTopNav'),
));
 


в папке components создаёте новый файл MyCMenu, который расширяется от CMenu.
т.е код файла MyCmenu.php будет таким:
Код: Выделить всё
<?php

Yii
::import('zii.widgets.CMenu');

class NavMainMenu extends CMenu {
    // здесь свой код
} 

ну и по документации http://www.yiiframework.com/doc/api/1.1/CMenu и переопределением методов renderMenu, renderMenuRecursive, renderMenuItem творите что угодно
Dropbox
Open Real Estate CMS: FAQ | FAQ 2 | FAQ 3
Изображение
Xpycm
Разработчик
Разработчик
 
Сообщения: 1592
Зарегистрирован: 30 дек 2011, 11:06
Откуда: Йошкар-Ола
Очки репутации: 50

Re: Изменение HTML шаблона главного меню

Сообщение Alvian » 12 июн 2013, 12:57

Огромное вам спасибо за ответ, но не могли бы вы написать примерчик с кодом внутри этого файла? Я не такой уж специалист в этом вопросе. Весьма буду вам благодарен, ну и вашей карме зачтется:) Заранее большое вам спасибо!
Alvian
Незнакомец
 
Сообщения: 6
Зарегистрирован: 10 июн 2013, 14:31
Очки репутации: 0

Re: Изменение HTML шаблона главного меню

Сообщение Xpycm » 12 июн 2013, 14:33

Изменил класс dropDownNav на dropDownNav2 и nav на nav2, т.к к dropDownNav уже цепляется другое раскрывающееся меню и id элементов на страницах должны быть уникальными

Код: Выделить всё
$this->widget('MyCMenu',array(
    'id' => 'nav2',
    'items'=>$this->aData['topMenuItems'],
    'htmlOptions' => array('class' => 'dropDownNav2'),
));
 



В файле protected/modules/menumanager/models/Menu.php
Меняете:
Код: Выделить всё
if($subitems){
    $menu[] = array(
        'label' => $item['title'],
        'submenuOptions'=>array(
            'class'=>'sub_menu_dropdown'
        ),
        'url'=>array(''),
        'linkOptions'=>array('onclick'=>'return false;'),
        'items' => $subitems,
    );
}
 

На:
Код: Выделить всё
if($subitems){
    $menu[] = array(
        'label' => $item['title'],
        'submenuOptions'=>array(
            'class'=>'dropdown-menu'
        ),
        'url'=>array(''),
        'linkOptions'=>array('onclick'=>'return false;'),
        'items' => $subitems,
    );
}
 


Содержимое файла protected/components/MyCMenu.php
Код: Выделить всё
<?php
Yii
::import('zii.widgets.CMenu');

class MyCMenu extends CMenu {
    protected function renderMenuRecursive($items)
    {
        $count=0;
        $n=count($items);
        foreach($items as $item)
        {
            $count++;
            $options=isset($item['itemOptions']) ? $item['itemOptions'] : array();
            $class=array();
            if($item['active'] && $this->activeCssClass!='')
                $class[]=$this->activeCssClass;
            if($count===&& $this->firstItemCssClass!==null)
                $class[]=$this->firstItemCssClass;
            if($count===$n && $this->lastItemCssClass!==null)
                $class[]=$this->lastItemCssClass;
            if($this->itemCssClass!==null)
                $class[]=$this->itemCssClass;
            if($class!==array())
            {
                if(empty($options['class']))
                    $options['class']=implode(' ',$class);
                else
                    $options
['class'].=' '.implode(' ',$class);
            }

            if(isset($item['items']) && count($item['items'])) {
                echo CHtml::openTag('li', array('class' => 'dropdown'));
                $menu=$this->renderMenuItem($item, true);
            }
            else {
                echo CHtml::openTag('li', $options);
                $menu=$this->renderMenuItem($item, false);
            }


            if(isset($this->itemTemplate) || isset($item['template']))
            {
                $template=isset($item['template']) ? $item['template'] : $this->itemTemplate;
                echo strtr($template,array('{menu}'=>$menu));
            }
            else
                echo $menu
;

            if(isset($item['items']) && count($item['items']))
            {
                echo "\n".CHtml::openTag('ul',isset($item['submenuOptions']) ? $item['submenuOptions'] : $this->submenuHtmlOptions)."\n";
                $this->renderMenuRecursive($item['items']);
                echo CHtml::closeTag('ul')."\n";
            }

            echo CHtml::closeTag('li')."\n";
        }
    }

    protected function renderMenuItem($item, $multi = false) {
        if(isset($item['url']))
        {
            $label=$this->linkLabelWrapper===null ? $item['label'] : CHtml::tag($this->linkLabelWrapper, $this->linkLabelWrapperHtmlOptions, $item['label']);
            if ($multi)
                return CHtml::link($label,$item['url'], array('class' => 'dropdown-toggle', 'data-toggle' => 'dropdown'));
            return CHtml::link($label,$item['url'],isset($item['linkOptions']) ? $item['linkOptions'] : array());
        }
        else
            return CHtml
::tag('span',isset($item['linkOptions']) ? $item['linkOptions'] : array(), $item['label']);
    }
}
 


В итоге получаем:
Код: Выделить всё
<ul id="nav2" class="dropDownNav2">
    <li class="active"><a href="/ore_dev/ru">Главная</a></li>
    <li><a href="/ore_dev/ru/news">Новости</a></li>
    <li><a href="/ore_dev/ru/faq">Вопросы-ответы</a></li>
    <li><a href="/ore_dev/ru/specialoffers">Спец.предложения</a></li>
    
    
<li class="dropdown"><a href="/ore_dev/ru" data-toggle="dropdown" class="dropdown-toggle">Дополнительно</a>
        <ul class="dropdown-menu">
            <li><a href="http://localhost/ore_dev/ru/page/Poisk-na-karte">Поиск на карте</a></li>
            <li><a href="/ore_dev/ru/sitemap">Карта сайта</a></li>
        </ul>
    </li>
</
ul> 
Dropbox
Open Real Estate CMS: FAQ | FAQ 2 | FAQ 3
Изображение
Xpycm
Разработчик
Разработчик
 
Сообщения: 1592
Зарегистрирован: 30 дек 2011, 11:06
Откуда: Йошкар-Ола
Очки репутации: 50

Re: Изменение HTML шаблона главного меню

Сообщение Alvian » 21 июл 2013, 20:01

Здравствуйте! А как добавить класс "li" в котором размещено субменю?

В оригинале:
Код: Выделить всё
<li class=""><a onclick="return false;" href="/">Пункт</a>

 


То что мне необходимо сделать:
Код: Выделить всё
<li class="dropdown"><a onclick="return false;" href="/">Пункт</a>

 


Заранее благодарю за ответ!
Alvian
Незнакомец
 
Сообщения: 6
Зарегистрирован: 10 июн 2013, 14:31
Очки репутации: 0

Re: Изменение HTML шаблона главного меню

Сообщение Foton » 22 июл 2013, 14:45

Файл \protected\modules\menumanager\models\Menu.php
Вместо:
Код: Выделить всё
foreach($menuItems as $tmpItem){
    if($tmpItem['subitems'] == $item['id']){
        if($tmpItem['type'] == self::LINK_DROPDOWN_MANUAL){
            if($tmpItem['special']){
                $tmpItem['href'] = array($tmpItem['href']);
            }
            $subitem = array(
                'label' => $tmpItem['title'],
                'url' => $tmpItem['href'],
            );

            $subitems[] = $subitem;
        }
        if($tmpItem['type'] == self::LINK_DROPDOWN_AUTO){
            $subitem = array(
                'label' => $tmpItem['title'],
                'url' => self::getUrlById($tmpItem['id']),
            );

            $subitems[] = $subitem;
        }
    }
}
 


Нужно:
Код: Выделить всё
foreach($menuItems as $tmpItem){
    if($tmpItem['subitems'] == $item['id']){
        if($tmpItem['type'] == self::LINK_DROPDOWN_MANUAL){
            if($tmpItem['special']){
                $tmpItem['href'] = array($tmpItem['href']);
            }
            $subitem = array(
                'label' => $tmpItem['title'],
                'url' => $tmpItem['href'],
                'itemOptions' => array('class' => 'dropdown'),
            );

            $subitems[] = $subitem;
        }
        if($tmpItem['type'] == self::LINK_DROPDOWN_AUTO){
            $subitem = array(
                'label' => $tmpItem['title'],
                'url' => self::getUrlById($tmpItem['id']),
                'itemOptions' => array('class' => 'dropdown'),
            );

            $subitems[] = $subitem;
        }
    }
}
 
Foton
Разработчик
Разработчик
 
Сообщения: 431
Зарегистрирован: 26 янв 2012, 14:58
Очки репутации: 8

Re: Изменение HTML шаблона главного меню

Сообщение Alvian » 22 июл 2013, 18:28

Огромное вам спасибо! помогло. Правда таким образом пункт субменю получает класс, но я нашел как добавить класс родителю подменю... Чуть ниже вышеупомянутого кода есть такой код:

Код: Выделить всё
if($subitems){
                        
$menu[] = array(
                            
'label' => $item['title'],
                            
'submenuOptions'=>array(
                                
'class'=>'dropdown-menu'
                            
),
                            
'url'=>array(''),
                            
'linkOptions'=>array('class'=>'dropdown-toggle','data-toggle'=>'dropdown'),
                            
'items' => $subitems,
                        ); 


В предпоследней строке отрывка надо добавить то что вы рекомендовали:
Код: Выделить всё
'itemOptions' => array('class' => 'dropdown'), 


...и получится вот так:):
Код: Выделить всё
if($subitems){
                        
$menu[] = array(
                            
'label' => $item['title'],
                            
'submenuOptions'=>array(
                                
'class'=>'dropdown-menu'
                            
),
                            
'url'=>array(''),
                            
'linkOptions'=>array('class'=>'dropdown-toggle','data-toggle'=>'dropdown'),
                            
'items' => $subitems,
                            
'itemOptions' => array('class' => 'dropdown'),
                        ); 
Alvian
Незнакомец
 
Сообщения: 6
Зарегистрирован: 10 июн 2013, 14:31
Очки репутации: 0


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

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

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

cron