Spec-Zone.ru › Yii 1.1

CMenu

Пакет zii.widgets
Наследование class CMenu » CWidget » CBaseController » CComponent
С момента 1.1
Исходный код framework/zii/widgets/CMenu.php
CMenu отображает многоуровневое меню с использованием вложенных HTML-списков.

Основным свойством CMenu является items, которое определяет возможные пункты меню. Элемент меню имеет три основных свойства: visible, active и items. Свойство "visible" указывает, отображается ли элемент меню в данный момент. Свойство "active" указывает, выбран ли элемент меню в данный момент. А свойство "items" определяет дочерние элементы меню.

Следующий пример показывает, как использовать CMenu:
$this->widget('zii.widgets.CMenu', array(
    'items'=>array(
        // Important: you need to specify url as 'controller/action',
        // not just as 'controller' even if default action is used.
        array('label'=>'Home', 'url'=>array('site/index')),
        // 'Products' menu item will be selected no matter which tag parameter value is since it's not specified.
        array('label'=>'Products', 'url'=>array('product/index'), 'items'=>array(
            array('label'=>'New Arrivals', 'url'=>array('product/new', 'tag'=>'new')),
            array('label'=>'Most Popular', 'url'=>array('product/index', 'tag'=>'popular')),
        )),
        array('label'=>'Login', 'url'=>array('site/login'), 'visible'=>Yii::app()->user->isGuest),
    ),
));

Общедоступные свойства

Свойство Тип Описание Определено
actionPrefix строка префикс к идентификаторам действий. CWidget
activateItems логическое автоматически активировать элементы в зависимости от того, соответствует ли их маршрут текущему запрошенному маршруту. CMenu
activateParents логическое активировать родительские элементы меню, когда один из соответствующих дочерних элементов меню активен. CMenu
activeCssClass строка CSS-класс, добавляемый к активному элементу меню. CMenu
controller CController Возвращает контроллер, к которому принадлежит этот виджет. CWidget
encodeLabel логическое следует ли кодировать метки элементов меню в HTML. CMenu
firstItemCssClass строка CSS-класс, который будет присвоен первому элементу в главном меню или каждом подменю. CMenu
hideEmptyItems логическое скрывать ли пустые элементы меню. CMenu
htmlOptions массив HTML-атрибуты для тега корневого контейнера меню CMenu
id строка Возвращает ID виджета или генерирует новый, если запрошено. CWidget
itemCssClass строка CSS-класс, который будет присвоен каждому элементу. CMenu
itemTemplate строка шаблон, используемый для отображения отдельного элемента меню. CMenu
items массив список элементов меню. CMenu
lastItemCssClass строка CSS-класс, который будет присвоен последнему элементу в главном меню или каждом подменю. CMenu
linkLabelWrapper строка имя HTML-элемента, который будет использоваться для обертывания метки всех ссылок меню. CMenu
linkLabelWrapperHtmlOptions массив HTML-атрибуты для элемента обертки ссылок, указанного в linkLabelWrapper. CMenu
owner CBaseController Возвращает владельца/создателя этого виджета. CWidget
skin смешанный тип имя используемой темы для этого виджета. CWidget
submenuHtmlOptions массив HTML-атрибуты для тега контейнера подменю. CMenu
viewPath строка Возвращает каталог, содержащий файлы представления для этого виджета. CWidget

Публичные методы

Метод Описание Определено в
__call() Вызывает именованный метод, который не является методом класса. CComponent
__construct() Конструктор. CWidget
__get() Возвращает значение свойства, список обработчиков событий или поведение в зависимости от его имени. CComponent
__isset() Проверяет, является ли значение свойства нулевым. CComponent
__set() Устанавливает значение свойства компонента. CComponent
__unset() Устанавливает свойство компонента в значение null. CComponent
actions() Возвращает список действий, используемых этим виджетом. CWidget
asa() Возвращает объект поведения с указанным именем. CComponent
attachBehavior() Прикрепляет поведение к этому компоненту. CComponent
attachBehaviors() Прикрепляет список поведений к компоненту. CComponent
attachEventHandler() Прикрепляет обработчик событий к событию. CComponent
beginCache() Начинает кэширование фрагмента. CBaseController
beginClip() Начинает запись клипа. CBaseController
beginContent() Начинает рендеринг содержимого, которое должно быть оформлено указанным представлением. CBaseController
beginWidget() Создаёт виджет и выполняет его. CBaseController
canGetProperty() Определяет, может ли свойство быть прочитано. CComponent
canSetProperty() Определяет, может ли свойство быть установлено. CComponent
createWidget() Создаёт виджет и инициализирует его. CBaseController
detachBehavior() Отсоединяет поведение от компонента. CComponent
detachBehaviors() Отсоединяет все поведения от компонента. CComponent
detachEventHandler() Отсоединяет существующий обработчик событий. CComponent
disableBehavior() Отключает прикреплённое поведение. CComponent
disableBehaviors() Отключает все прикреплённые к этому компоненту поведения. CComponent
enableBehavior() Включает прикреплённое поведение. CComponent
enableBehaviors() Включает все прикреплённые к этому компоненту поведения. CComponent
endCache() Завершает кэширование фрагмента. CBaseController
endClip() Завершает запись клипа. CBaseController
endContent() Завершает рендеринг содержимого. CBaseController
endWidget() Завершает выполнение указанного виджета. CBaseController
evaluateExpression() Вычисляет выражение PHP или обратный вызов в контексте этого компонента. CComponent
getController() Возвращает контроллер, к которому принадлежит этот виджет. CWidget
getEventHandlers() Возвращает список прикреплённых обработчиков событий для события. CComponent
getId() Возвращает идентификатор виджета или генерирует новый, если запрошено. CWidget
getOwner() Возвращает владельца/создателя этого виджета. CWidget
getViewFile() Ищет файл шаблона представления в соответствии с именем представления. CWidget
getViewPath() Возвращает каталог, содержащий файлы представлений для этого виджета. CWidget
hasEvent() Определяет, определено ли событие. CComponent
hasEventHandler() Проверяет, есть ли у указанного события прикреплённые обработчики. CComponent
hasProperty() Определяет, определено ли свойство. CComponent
init() Инициализирует виджет меню. CMenu
raiseEvent() Вызывает событие. CComponent
render() Рендерит представление. CWidget
renderFile() Рендерит файл представления. CBaseController
renderInternal() Рендерит файл представления. CBaseController
run() Вызывает renderMenu для рендеринга меню. CMenu
setId() Устанавливает идентификатор виджета. CWidget
widget() Создаёт виджет и выполняет его. CBaseController

Защищённые методы

Метод Описание Определено в
isItemActive() Проверяет, является ли элемент меню активным. CMenu
normalizeItems() Нормализует свойство items так, чтобы состояние «активен» правильно определялось для каждого элемента меню. CMenu
renderMenu() Рендерит элементы меню. CMenu
renderMenuItem() Рендерит содержимое элемента меню. CMenu
renderMenuRecursive() Рекурсивно рендерит элементы меню. CMenu

Подробное описание свойств

activateItems свойство (доступно с версии 1.1.3)

public boolean $activateItems;

автоматически активировать элементы в зависимости от того, соответствует ли их параметр маршрута текущему запрошенному маршруту. По умолчанию значение true.

activateParents свойство

public boolean $activateParents;

активировать родительские элементы меню, когда один из соответствующих дочерних элементов меню активен. У активированных родительских элементов меню будут добавлены CSS-классы, присоединённые к activeCssClass. По умолчанию значение false.

activeCssClass свойство

public string $activeCssClass;

класс CSS, который будет добавлен к активному пункту меню. По умолчанию равен 'active'. Если пустой, класс CSS пунктов меню не будет изменён.

encodeLabel свойство

public boolean $encodeLabel;

необходимо ли кодировать метки пунктов меню в HTML. По умолчанию равно true.

firstItemCssClass свойство (доступно начиная с v1.1.4)

public string $firstItemCssClass;

класс CSS, который будет назначен первому пункту в главном меню или каждом подменю. По умолчанию null, что означает, что такой класс CSS не будет назначен.

hideEmptyItems свойство

public boolean $hideEmptyItems;

нужно ли скрывать пустые пункты меню. Пустым пунктом меню считается тот, у которого опция 'url' не задана и который не содержит видимых дочерних пунктов меню. По умолчанию true.

htmlOptions свойство

public array $htmlOptions;

HTML-атрибуты для тега корневого контейнера меню

itemCssClass свойство (доступно начиная с v1.1.9)

public string $itemCssClass;

класс CSS, который будет назначен каждому пункту. По умолчанию null, что означает, что такой класс CSS не будет назначен.

itemTemplate свойство (доступно начиная с v1.1.1)

public string $itemTemplate;

шаблон, используемый для отображения отдельного пункта меню. В этом шаблоне маркер "{menu}" будет заменён соответствующей ссылкой или текстом меню. Если это свойство не установлено, каждое меню будет отображаться без декораций. Это свойство будет переопределено опцией 'template', установленной в отдельных пунктах меню через {@items}.

items свойство

public array $items;

список пунктов меню. Каждый пункт меню задаётся как массив пар имя-значение. Возможные имена опций включают следующие:

  • label: строка, необязательно, задаёт метку пункта меню. При encodeLabel или собственной опции encodeLabel, метка будет закодирована в HTML. Если метка не указана, по умолчанию она пустая строка.
  • encodeLabel: boolean, необязательно, указывает, необходимо ли кодировать метку пункта меню в HTML. При установке этой опции, она переопределит глобальное значение encodeLabel. Эта опция доступна начиная с версии 1.1.15.
  • url: строка или массив, необязательно, указывает URL пункта меню. Передаётся в CHtml::normalizeUrl для генерации корректного URL. Если не установлено, пункт меню будет отображён как текст span.
  • visible: boolean, необязательно, указывает, отображается ли этот пункт меню. По умолчанию true. Это может использоваться для управления видимостью пунктов меню в зависимости от прав пользователя.
  • items: массив, необязательно, задаёт пункты подменю. Его формат такой же, как у родительских пунктов.
  • active: boolean, необязательно, указывает, активен ли этот пункт меню (в настоящее время выбран). Если пункт меню активен и activeClass не пустой, его класс CSS будет дополнен activeClass. Если эта опция не установлена, пункт меню будет автоматически установлен активным, когда текущий запрос инициирован url. Обратите внимание, что параметры GET, не указанные в опции 'url', будут проигнорированы.
  • template: строка, необязательно, шаблон, используемый для отображения этого пункта меню. При установке этой опции, она переопределит глобальное значение itemTemplate. Подробнее см. itemTemplate. Эта опция доступна начиная с версии 1.1.1.
  • linkOptions: массив, необязательно, дополнительные HTML-атрибуты, которые должны быть отображены для тега ссылки или span пункта меню.
  • itemOptions: массив, необязательно, дополнительные HTML-атрибуты, которые должны быть отображены для тега контейнера пункта меню.
  • submenuOptions: массив, необязательно, дополнительные HTML-атрибуты, которые должны быть отображены для контейнера подменю, если у этого пункта меню есть подменю. При установке этой опции, свойство submenuHtmlOptions будет проигнорировано для этого подменю. Эта опция доступна начиная с версии 1.1.6.

lastItemCssClass свойство (доступно начиная с v1.1.4)

public string $lastItemCssClass;

класс CSS, который будет назначен последнему пункту в главном меню или каждом подменю. По умолчанию null, что означает, что такой класс CSS не будет назначен.

linkLabelWrapper свойство (доступно начиная с v1.1.4)

public string $linkLabelWrapper;

имя HTML-элемента, который будет использоваться для обертывания метки всех ссылок меню. Например, если это свойство установлено как 'span', пункт меню может быть отображён как <li><a href="url"><span>метка</span></a></li>. Это полезно при реализации пунктов меню с помощью техники сдвигающего окна. По умолчанию null, что означает, что тег обертки не будет сгенерирован.

linkLabelWrapperHtmlOptions свойство (доступно начиная с v1.1.13)

public array $linkLabelWrapperHtmlOptions;

HTML-атрибуты для элемента обертки ссылок, указанного в linkLabelWrapper.

submenuHtmlOptions свойство

public array $submenuHtmlOptions;

HTML-атрибуты для тега контейнера подменю.

Подробное описание методов

init() метод

public void init()
Исходный код: framework/zii/widgets/CMenu.php#154 (показать)
public function init()
{
    if(isset(
$this->htmlOptions['id']))
        
$this->id=$this->htmlOptions['id'];
    else
        
$this->htmlOptions['id']=$this->id;
    
$route=$this->getController()->getRoute();
    
$this->items=$this->normalizeItems($this->items,$route,$hasActiveChild);
}

Инициализирует виджет меню. Этот метод в основном нормализует свойство items. Если этот метод переопределён, убедитесь, что вызвана родительская реализация.

isItemActive() метод

protected boolean isItemActive(array $item, string $route)
$item массив пункт меню, который нужно проверить
$route строка маршрут текущего запроса
{return} boolean активен ли пункт меню
Исходный код: framework/zii/widgets/CMenu.php#312 (показать)
protected function isItemActive($item,$route)
{
    if(isset(
$item['url']) && is_array($item['url']) && !strcasecmp(trim($item['url'][0],'/'),$route))
    {
        unset(
$item['url']['#']);
        if(
count($item['url'])>1)
        {
            foreach(
array_splice($item['url'],1) as $name=>$value)
            {
                if(!isset(
$_GET[$name]) || $_GET[$name]!=$value)
                    return 
false;
            }
        }
        return 
true;
    }
    return 
false;
}

Проверяет, является ли пункт меню активным. Это делается путём проверки, сгенерирован ли текущий запрашиваемый URL опцией 'url' пункта меню. Обратите внимание, что параметры GET, не указанные в опции 'url', будут проигнорированы.

normalizeItems() метод

protected array normalizeItems(array $items, string $route, boolean &$active)
$items массив пункты меню для нормализации
$route строка маршрут текущего запроса
$active boolean есть ли активный дочерний пункт меню
{return} массив нормализованные пункты меню
Исходный код: framework/zii/widgets/CMenu.php#263 (показать)
protected function normalizeItems($items,$route,&$active)
{
    foreach(
$items as $i=>$item)
    {
        if(isset(
$item['visible']) && !$item['visible'])
        {
            unset(
$items[$i]);
            continue;
        }
        if(!isset(
$item['label']))
            
$item['label']='';
        
$encodeLabel = isset($item['encodeLabel']) ? $item['encodeLabel'] : $this->encodeLabel;
        if(
$encodeLabel)
            
$items[$i]['label']=CHtml::encode($item['label']);
        
$hasActiveChild=false;
        if(isset(
$item['items']))
        {
            
$items[$i]['items']=$this->normalizeItems($item['items'],$route,$hasActiveChild);
            if(empty(
$items[$i]['items']) && $this->hideEmptyItems)
            {
                unset(
$items[$i]['items']);
                if(!isset(
$item['url']))
                {
                    unset(
$items[$i]);
                    continue;
                }
            }
        }
        if(!isset(
$item['active']))
        {
            if(
$this->activateParents && $hasActiveChild || $this->activateItems && $this->isItemActive($item,$route))
                
$active=$items[$i]['active']=true;
            else
                
$items[$i]['active']=false;
        }
        elseif(
$item['active'])
            
$active=true;
    }
    return 
array_values($items);
}

Нормализует свойство items таким образом, чтобы состояние 'active' правильно определялось для каждого пункта меню.

renderMenu() метод

protected void renderMenu(array $items)
$items массив пункты меню. Каждый пункт меню будет массивом с, как минимум, двумя элементами: 'label' и 'active'. Он может содержать три других необязательных элемента: 'items', 'linkOptions' и 'itemOptions'.
Исходный код: framework/zii/widgets/CMenu.php#177 (показать)
protected function renderMenu($items)
{
    if(
count($items))
    {
        echo 
CHtml::openTag('ul',$this->htmlOptions)."\n";
        
$this->renderMenuRecursive($items);
        echo 
CHtml::closeTag('ul');
    }
}

Отображает пункты меню.

renderMenuItem() метод (доступно начиная с v1.1.6)

protected string renderMenuItem(array $item)
$item массив пункт меню для отображения. См. items для данных, которые могут содержаться в пункте.
{return} строка
Исходный код: framework/zii/widgets/CMenu.php#245 (показать)
protected function renderMenuItem($item)
{
    if(isset(
$item['url']))
    {
        
$label=$this->linkLabelWrapper===null ? $item['label'] : CHtml::tag($this->linkLabelWrapper, $this->linkLabelWrapperHtmlOptions, $item['label']);
        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']);
}

Отображает содержимое пункта меню. Обратите внимание, что контейнер и подменю здесь не отображаются.

renderMenuRecursive() метод

protected void renderMenuRecursive(array $items)
$items массив пункты меню для рекурсивного отображения
Исходный код: framework/zii/widgets/CMenu.php#191 (показать)
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===1 && $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);
        }

        echo 
CHtml::openTag('li', $options);

        
$menu=$this->renderMenuItem($item);
        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";
    }
}

Рекурсивно отображает пункты меню.

run() метод

public void run()
Исходный код: framework/zii/widgets/CMenu.php#167 (показать)
public function run()
{
    
$this->renderMenu($this->items);
}

Вызывает renderMenu для отрисовки меню.

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CMenu

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API