Isolution666
@Isolution666
Full-Stack Developer

Yii2+меню, как грамотно настроить подсветку ссылки, и вывести выпадающее меню?

Здравствуйте.
--
Решил использовать стандартную модель меню в Yii2, и запихал туда код, который выводит пункты меню из БД. Посчитал, что так удобнее управлять менюшкой, не надо лезть в код, чтобы управлять разделами и подразделами. Вот что у меня получилось:
<?php
    use yii\helpers\Html;
    use yii\bootstrap\Nav;
    use yii\bootstrap\NavBar;
?>
<?php
    NavBar::begin([
        'brandLabel' => '<img src="/img/logo_black.png" alt="Логотип"/>',
        'brandUrl' => Yii::$app->homeUrl,
        'options' => [
            'class' => 'navbar navbar-default navbar-fixed-top',
        ],
    ]);
    foreach ($link as $l){
        ($_SERVER['REQUEST_URI'] == $l->href) ? $menuItems[] = ['label' => $l->name, 'url' => [''], 'options' => ['class' => 'active']] : $menuItems[] = ['label' => $l->name, 'url' => [$l->href]];
    }
    if (!Yii::$app->user->isGuest) {
        $menuItems[] = ['label' => '<i class="ionicons ion-android-create"></i>', 'url' => ['/admin']];
    }
    echo Nav::widget([
        'options' => ['class' => 'navbar-nav navbar-right'],
        'items' => $menuItems,
    ]);
    NavBar::end();
    ?>


Что тут не так? Спросите вы, да очень просто, надо заменить
$_SERVER['REQUEST_URI']
на переменную Yii2, которая показывает весь WEB-путь, а не директорию с сервера, я про код
<?=Yii::getAlias('@webroot', $model->id);?>
По крайней мере, если его применять на OpenServer, видно весь путь начиная с диска, на котором он установлен. Мне надо так: Если текущий адрес браузера совпадает, тогда класс "эктив", если не совпадает, тогда нет этого класса.

Второе. Безопасность. Я просто готов отбить себе пальцы за это, но пока не понял как вывести
<?php
$link = Menu::find()->orderBy(['sort' => SORT_ASC])->limit(10)->all();
?>

в контроллере так, чтобы это работало в "лэйауте" на всех страницах, чтобы каждый раз не писать эту строку в экшене (ну вы поняли про что я говорю).

Третье. Многоуровневое меню.
--
Скажем так, что в таблице БД, есть некий столбец, назовём его url, и он будет отвечать за уровни, грубо говоря, если ссылка имеет url=12, то на сайте будут все подменю размещены там, где указан этот уровень.
Для тех кому не понятно, вот пример работы, архитектура и DOM-дерево меню.
www.magisters.org/community/3/17

На bootstrap 4 - возможно всё иначе, ещё не смотрел. Но в примере по ссылке, видно, что там 3 уровня, думаю неплохо, и вполне годно для стандартных решений. Условия с подсветкой активной ссылки, думаю можно сделать аналогично.

--
Заранее благодарю за участие в этом вопросе. Юный подаван ждёт мудрого совета на путь истинный.
Да прибудет с нами сила)))
  • Вопрос задан
  • 897 просмотров
Пригласить эксперта
Ответы на вопрос 1
qonand
@qonand
Software Engineer
Мне надоhttps://toster.ru/# так: Если текущий адрес браузера совпадает, тогда класс "эктив", если не совпадает, тогда нет этого класса.

Почему тогда просто не использовать стандартное свойства класса Nav activateItems?
Второе. Безопасность. Я просто готов отбить себе пальцы за это, но пока не понял как вывести

При чем здесь безопасность? Да не стоит в слое обращаться к БД, но это не влияет на безопасность.
Что бы в слое не обращаться напрямую к базе данных реализуйте виджет который это будет делать.
Третье. Многоуровневое меню.

в чем собственно вопрос?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы