Условно отображать элементы виджета Nav

Я хочу добавить условие к элементам меню, поэтому, когда пользователь входит в систему, он будет видеть меню в зависимости от его user_type. Вот мой код.

Nav::widget([
    'encodeLabels' => false,
    'options' => ['class' => 'sidebar-menu'],
    'items' => [
    // I want to insert condition here
    [
        'label' => '<span class="fa fa-fw fa-globe"></span> Menu1',
        'url' => ['/menu1'],
    ],
    [
        'label' => '<span class="fa fa-fw fa-list-alt"></span> Menu2',
        'url' => ['/menu2'],
    ],
]);

Некоторые пользователи могут получить доступ к menu1, а другие могут получить доступ только к menu2.


person beginner    schedule 14.04.2015    source источник


Ответы (2)


1) Для отдельного элемента используйте свойство visible (информация доступна здесь):

[
    'label' => '<span class="fa fa-fw fa-globe"></span> Menu1',
    'url' => ['/menu1'],
    'visible' => $condition,
],

2) В качестве альтернативы вы можете построить массив перед рендерингом виджета и условно включать/исключать некоторые элементы массива в зависимости от условий.

$items = [];

if ($condition) {
    $items[] = ...
} else {
    ...
}

echo Nav::widget([
    'items' => $items,
]);

Посмотрите, например, как формируются пункты меню в расширенный внешний вид шаблона.

person arogachev    schedule 14.04.2015
comment
условие истинно или ложно? - person beginner; 14.04.2015
comment
Да, вы можете передать туда любое выражение, которое возвращает значение boolean. Так что это может быть либо true, либо false. - person arogachev; 14.04.2015

Я сделал что-то подобное, расширив класс Nav, используя собственную функцию проверки доступа.


class AccessNav extends Nav
{
    public function renderItem($item)
    {
        $url = ArrayHelper::getValue($item, 'url', '#');
        if( PermissionManager::checkAccessByUrl($url))
        {
            return parent::renderItem($item);
        }
    }
}
person Krzysztof Gał    schedule 14.04.2015