Nav::widget() способен на такое или нет? (Yii2, basic)

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение girmate »

Подскажите, встроенный в фреймворк Nav::widget() может именно такое сделать (html код, который хочу получить привожу ниже), или нужно писать собственный виджет? Это всего лишь горизонтальное меню с одним уровнем вложенности (подменю).

Код: Выделить всё

<ul class="nav navbar-nav collapse navbar-collapse">
        <li><a href="index.html" class="active">Home</a></li>
        <li class="dropdown"><a href="#">Shop<i class="fa fa-angle-down"></i></a>
               <ul role="menu" class="sub-menu">
                        <li><a href="shop.html">Products</a></li>
                        <li><a href="product-details.html">Product Details</a></li> 
                        <li><a href="checkout.html">Checkout</a></li> 
                        <li><a href="cart.html">Cart</a></li> 
                        <li><a href="login.html">Login</a></li> 
                </ul>
           </li> 
           <li class="dropdown"><a href="#">Blog<i class="fa fa-angle-down"></i></a>
                <ul role="menu" class="sub-menu">
                        <li><a href="blog.html">Blog List</a></li>
                        <li><a href="blog-single.html">Blog Single</a></li>
                 </ul>
            </li> 
            <li><a href="404.html">404</a></li>
            <li><a href="contact-us.html">Contact</a></li>
</ul>
 
Осторожно! Вы общаетесь с новичком ;)
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение Евгений Емельянов »

А в чем, собственно, трудность узнать это практически?
Делается элементарно.

Код: Выделить всё

$menuItems = [
                ['label' => 'Главная', 'url' => ['/']],
            ];
            if (!Yii::$app->user->isGuest) {
                $menuItems[] = [// первый уровень
                    'label' => 'Выйти (' . Yii::$app->user->identity->username . ')',
                    'url' => Url::to(['/user/default/logout']),
                    'linkOptions' => ['data-method' => 'post']
                ];
            }
            $menuItems[] = ['label' => 'Страницы', 'items' => [ // первый уровень
                ['label' => 'Страницы', 'url' => Url::to(['/pages/pages'])], // второй уровень
                ['label' => 'Комментарии', 'url' => Url::to(['/pages/comments'])],
                ['label' => 'Теги', 'url' => Url::to(['/pages/tags'])],
                ['label' => 'Меню', 'url' => Url::to(['/menus'])],
            ]];
            echo Nav::widget([
                'options' => ['class' => 'navbar-nav navbar-right'],
                'items' => $menuItems,
            ]); 
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение girmate »

Конечно же пробовал сам, прежде, чем задать вопрос.

Вот мой кусок PHP:

Код: Выделить всё

<?php
                echo Nav::widget([
                    'options' => [
                    'class' => 'nav navbar-nav collapse navbar-collapse'
                    ],
                    'items' => [
                    [
                        'label' => 'Межкомнатные двери',
                        'url' => '#'
                    ],
                    [
                        'label' => 'Металлические двери',
                        'url' => '#',
                        'options'=> [
                        'class'=> 'myclass'
                        ],
                        'items' => [
                        [
                            'label' => 'Inside1',
                            'url' => '#'
                        ],
                        [
                            'label' => 'Inside2',
                            'url' => '#'
                        ],
                        ]
                    ],
                    [
                        'label' => 'Фурнитура',
                        'url' => '#'
                    ],
                    [
                        'label' => 'Апельсины',
                        'url' => '#'
                    ],
                    ]
                ])
                ?>
А вот что получается при этом (обратите внимание, что виджет сам добавляет класс dropdown к полю списка, который мне совсем не нужен, а также некоторые другие элементы "caret", например):

Код: Выделить всё

<ul id="w0" class="nav navbar-nav collapse navbar-collapse">
    <li><a href="#">Межкомнатные двери</a></li>
    <li class="myclass dropdown"><a class="dropdown-toggle" href="#" data-toggle="dropdown">Металлические двери <b class="caret"></b></a>
        <ul id="w1" class="dropdown-menu">
            <li><a href="#" tabindex="-1">Inside1</a></li>
            <li><a href="#" tabindex="-1">Inside2</a></li>
        </ul>
    </li>
    <li><a href="#">Фурнитура</a></li>
    <li><a href="#">Апельсины</a></li>
</ul>                
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение girmate »

Поэтому я и обратился на форум, может кто-то разобрался в тонкостях настройки этого виджета, чтобы я смог получить желаемый результат. Моя мечта перевод всей документации API 2.0 на русский язык. С английским проблемы, а фреймворк очень понравился (хоть и сравнить не с чем - мой первый фреймворк).
Последний раз редактировалось girmate 2015.12.27, 02:21, всего редактировалось 1 раз.
Осторожно! Вы общаетесь с новичком ;)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение zelenin »

собственно гляньте код виджета - https://github.com/yiisoft/yii2-bootstr ... v.php#L184
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение girmate »

Спасибо, я глянул и понял что он сам добавляет свои классы, но как это отключить?
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение girmate »

Есть очень неплохой материал по этому виджету, но я не нашел там то, что хотел.

http://www.webapplex.ru/vidzhet-menu-v- ... mvorke-2.x
Осторожно! Вы общаетесь с новичком ;)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение zelenin »

girmate писал(а):Спасибо, я глянул и понял что он сам добавляет свои классы, но как это отключить?
так глянуть надо не для того, чтобы определить, что виджет сам добавляет классы - это очевидно.
Я вам кинул ссылку именно на тот кусок кода, который отвечает за появление этого класса. Неужели в трех строчках не разберетесь?
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение girmate »

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

Нет, конечно же понятно, что идет проверка если dropDownCaret нее пустой, то добавляется метка dropDownCaret, значит где-то можно повлиять на это

Код: Выделить всё

if ($this->dropDownCaret !== '') {
    $label .= ' ' . $this->dropDownCaret;
}
Осторожно! Вы общаетесь с новичком ;)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение zelenin »

girmate писал(а):стыдно, но не пойму как это исправить так, чтобы получилось именно то, что хочу я ((
(уровень знания ООП далек от идеала, поскольку свое обучение строится исключительно на самообразовании, так как моя работа в жизни совершенно не связана с программированием)

Код: Выделить всё

            if ($this->dropDownCaret !== '') {
                $label .= ' ' . $this->dropDownCaret;
            } 
перевожу с php на русский: если dropDownCaret не равен пустоте (''), то добавить dropDownCaret к лейблу пункта меню.
Немного логики от себя: соответственно не добавляется тогда, когда dropDownCaret равен ''.
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение girmate »

Конечно же, я смогу сам написать тот виджет, который меня устроит, но я хочу задействовать уже имеющиеся "велосипеды", ведь на то он и фреймворк)
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение girmate »

то есть надо дописать свойство в виджет с "пустотой". Но как быть с остальными классами? (хотя наверное также)

Код: Выделить всё

<a class="dropdown-toggle" href="#" data-toggle="dropdown">Металлические двери <b class="caret"></b></a> 
Здесть много лишнего, предполагаю что надо задействовать свойство 'linkTemplate', скорее всего.
Осторожно! Вы общаетесь с новичком ;)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение zelenin »

girmate писал(а):то есть надо дописать свойство в виджет с "пустотой". Но как быть с остальными классами? (хотя наверное также)

Код: Выделить всё

<a class="dropdown-toggle" href="#" data-toggle="dropdown">Металлические двери <b class="caret"></b></a>
Здесть много лишнего, предполагаю что надо задействовать свойство 'linkTemplate', скорее всего.
все верно
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение girmate »

Спасибо, что направили меня в нужное русло в столь поздний час). Буду дальше продвигаться.
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение girmate »

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

В коде я использовал виджет Nav, и ссылку на доки Вы мне нашли верно. Но разбирался я по документации на виджет Menu, а там есть отличия.

В итоге разобрался. все работает как я хочу со всеми классами и прибамбасами).

Вот код, который заработал (оставлю здесь на память, чтобы потом сюда подсматривать. Здесь одно вложенное подменю со своими классами:

Код: Выделить всё

<?php
                echo Menu::widget([
                    'options' => ['class' => 'nav navbar-nav collapse navbar-collapse'],
                    'submenuTemplate' => '<ul role="menu" class="sub-menu">{items}</ul>'."\n",
                    'items' => [
                    ['label' => 'Межкомнатные двери', 'url' => 'category/2'],
                    [
                        'label' => 'Металлические двери',
                        'url' => ['category/4'],
                        'template' => '<a href="{url}">{label}<i class="fa fa-angle-down"></i></a>'."\n",
                        'options' => [
                        'class' => 'dropdown',
                        ],
                        'items' => [
                        ['label' => 'Inside1', 'url' => 'category/17'],
                        ['label' => 'Inside2', 'url' => 'category/24'],
                        ]
                    ],
                    ['label' => 'Фурнитура', 'url' => 'category/10'],
                    ['label' => 'Апельсины', 'url' => 'category/12'],
                    ],
                ])
?>
И этот код выводит нам

Код: Выделить всё

<ul class="nav navbar-nav collapse navbar-collapse">
    <li><a href="category/2">Межкомнатные двери</a></li>
    <li class="dropdown"><a href="/category/4">Металлические двери<i class="fa fa-angle-down"></i></a>
        <ul role='menu' class='sub-menu'>
            <li><a href="category/17">Inside1</a></li>
            <li><a href="category/24">Inside2</a></li>
        </ul>
    </li>
    <li><a href="category/10">Фурнитура</a></li>
    <li><a href="category/12">Апельсины</a></li>
</ul>
 
Что я и хотел.
Последний раз редактировалось girmate 2015.12.27, 04:19, всего редактировалось 2 раза.
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение girmate »

Насколько я понимаю - виджет yii\widgets\Menu более универсальный, а виджет yii\bootstrap\Nav больше заточен под Bootsrtap шаблон.
Осторожно! Вы общаетесь с новичком ;)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение zelenin »

girmate писал(а):Насколько я понимаю - виджет yii\widgets\Menu более универсальный, а виджет yii\bootstrap\Nav больше заточен под Bootsrtap шаблон.
заточен только под бустрап, т.к. является реализацией виджета, генерящего бутстрап-модуль.
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Nav::widget() способен на такое или нет? (Yii2, basic)

Сообщение Onotole »

girmate писал(а):Есть очень неплохой материал по этому виджету, но я не нашел там то, что хотел.

http://www.webapplex.ru/vidzhet-menu-v- ... mvorke-2.x

Код: Выделить всё

'encodeLabels' =>'false', 
Хороший мануал
Закрыто