CMenu
| Пакет | zii.widgets |
|---|---|
| Наследование | class CMenu » CWidget » CBaseController » CComponent |
| С момента | 1.1 |
| Исходный код | framework/zii/widgets/CMenu.php |
Основным свойством 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() |
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 | активен ли пункт меню |
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} | массив | нормализованные пункты меню |
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'. |
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} | строка | |
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 | массив | пункты меню для рекурсивного отображения |
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() |
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