Одной из замечательных особенностей Yii 2.0 является встроенная поддержка Bootstrap 3.0 от Twitter.
Для вывода компонентов бутстрапа в шаблонах приложения можно использовать виджеты. Виджеты в Yii2 — небольшие блоки кода, которые можно легко многократно использовать для форматированного вывода данных. Как и большинство объектов в Yii 2.0, настройки виджету можно передать в виде массива параметров. Вместо немного монструозного
$param = array('key1' =>'value1', 'key2'=>'value2');
лучше использовать
$param = ['key1' =>'value1', 'key2'=>'value2'];
Это значительно улучшает читаемость кода.
Далее рассмотрим некоторые варианты использования Twitter Bootstrap в Yii2.
Carousel (yii\bootstrap\Carousel)
echo Carousel::widget ( [ 'items' => [ [ 'content' => '<img style="width:474px;height:296px" src="//p0vidl0.info/wp-content/uploads/2014/11/carousel003.jpg"/>', 'caption' => '<h2>Yii Gii</h2><p>Удобный встроенный генератор кода. Модули, модели на основе таблиц в БД и, конечно же, CRUD</p>', 'options' => [] ], [ 'content' => '<img style="width:474px" src="//p0vidl0.info/wp-content/uploads/2014/11/carousel002.jpg"/>', 'caption' => '<h2>Отличный отладчик</h2><p>Легко подключается, помнит все запросы http, БД и логи</p>', 'options' => [] ], [ 'content' => '<img style="width:474px" src="//p0vidl0.info/wp-content/uploads/2014/11/carousel001.jpg"/>', 'caption' => '<h2>Быстрый старт</h2><p>Установка и обновление через composer</p>', 'options' => [] ] ], 'options' => [ 'style' => 'width:474px;' // Задаем ширину контейнера ] ]);
Tabs (yii\bootstrap\Tabs)
echo Tabs::widget([ 'items' => [ [ 'label' => 'Yii2', 'content' => '<h2>Фреймворк Yii 2 - один из самых быстрых, безопасных и "крутых" php-фреймворков.</h2>', 'active' => true ], [ 'label' => 'jQuery', 'content' => '<h2>jQuery - один из самых популярных JavaScript фреймворков, который работает с объектами DOM.</h2>' ], [ 'label' => 'Bootstrap', 'content' => '<h2>Twitter Bootstrap - супер фреймворк, объединяющий в себе html, css, и JavaScript для для верстки веб-интерфейсов и страниц.</h2>', 'headerOptions' => [ 'id' => 'headerOptions' ], 'options' => [ 'id' => 'options' ] ], [ 'label' => 'Еще табы', 'content' => '<h2>Вы можете добавить любое количество табов. Просто опишите их структуру в массиве.</h2>' ], [ 'label' => 'Выпадающий список табов', 'items' => [ [ 'label' => 'Первый таб из выпадающего списка', 'content' => '<h2>Обновите свои познания в Yii 2 and Twitter Bootstrap. Все возможнсти уже обернуты в удобные интерфейсы.</h2>' ], [ 'label' => 'Второй таб из выпадающего списка', 'content' => '<h2>Один в поле не воин, а двое - уже компания.</h2>' ], [ 'label' => 'Это третий таб из выпадающего списка', 'content' => '<h2>Третий не лишний!</h2>' ] ] ] ] ]);
Alert (yii\bootstrap\Alert)
echo Alert::widget([ 'options' => [ 'class' => 'alert-info' ], 'body' => '<b>Привет</b>, Обратите внимание на эту полезную информацию.' ]); echo Alert::widget([ 'options' => [ 'class' => 'alert-success' ], 'body' => '<b>Вы победили!</b> Поздравляем с вашим новым достижением.' ]); echo Alert::widget([ 'options' => [ 'class' => 'alert-warning' ], 'body' => '<b>Обратите внимание</b> на эту важную информацию.' ]); echo Alert::widget([ 'options' => [ 'class' => 'alert-danger' ], 'body' => '<b>Ошибка!</b> Похоже, что-то сломалось.' ]);
Buttons yii\bootstrap\Button
echo Button::widget([ 'label' => 'Default', 'options' => [ 'class' => 'btn-lg btn-default', 'style' => 'margin:5px' ], // переопределяем стили bootstrap css своими 'tagName' => 'div' ]); // по желанию, возможно изменить тег элемента echo Button::widget([ 'label' => 'Primary', 'options' => [ 'class' => 'btn-lg btn-primary', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Ура!', 'options' => [ 'class' => 'btn-lg btn-success', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Info', 'options' => [ 'class' => 'btn-lg btn-info', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Warning', 'options' => [ 'class' => 'btn-lg btn-warning', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Danger', 'options' => [ 'class' => 'btn-lg btn-danger', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Link', 'options' => [ 'class' => 'btn-lg btn-link', 'style' => 'margin:5px' ] ]); // disabled echo Button::widget([ 'label' => 'Default', 'options' => [ 'class' => 'disabled btn-default', 'style' => 'margin:5px' ], // add a style to overide some default bootstrap css 'tagName' => 'div' ]); // change the tag used to generate the button if you like echo Button::widget([ 'label' => 'Primary', 'options' => [ 'class' => 'disabled btn-primary', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Success', 'options' => [ 'class' => 'disabled btn-success', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Info', 'options' => [ 'class' => 'disabled btn-info', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Warning', 'options' => [ 'class' => 'disabled btn-warning', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Danger', 'options' => [ 'class' => 'disabled btn-danger', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Link', 'options' => [ 'class' => 'disabled btn-link', 'style' => 'margin:5px' ] ]); // mixed size echo Button::widget([ 'label' => 'Large', 'options' => [ 'class' => 'btn-lg btn-default', 'style' => 'margin:5px' ], // add a style to overide some default bootstrap css 'tagName' => 'div' ]); // change the tag used to generate the button if you like echo Button::widget([ 'label' => 'Default', 'options' => [ 'class' => 'btn-primary', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Small', 'options' => [ 'class' => 'btn-sm btn-success', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Extra Small', 'options' => [ 'class' => 'btn-xs btn-info', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Large', 'options' => [ 'class' => 'btn-lg btn-warning', 'style' => 'margin:5px' ] ]); echo Button::widget([ 'label' => 'Default', 'options' => [ 'class' => 'btn-danger', 'style' => 'margin:5px' ] ]);
ButtonDropdown yii\bootstrap\ButtonDropdown
echo ButtonDropdown::widget([ 'label' => 'Default', 'options' => [ 'class' => 'btn-lg btn-default', 'style' => 'margin:5px' ], 'dropdown' => [ 'items' => [ [ 'label' => 'Второе действие', 'url' => '#' ], [ 'label' => 'Третье действие', 'url' => '#' ], [ 'label' => '', 'options' => [ 'role' => 'presentation', 'class' => 'divider' ] ], [ 'label' => 'Четвертое действие', 'url' => '#' ] ] ] ]); echo ButtonDropdown::widget([ 'label' => 'Primary', 'options' => [ 'class' => 'btn-lg btn-primary', 'style' => 'margin:5px' ], 'dropdown' => [ 'items' => [ [ 'label' => 'Второе действие', 'url' => '#' ], [ 'label' => 'Третье действие', 'url' => '#' ], [ 'label' => '', 'options' => [ 'role' => 'presentation', 'class' => 'divider' ] ], [ 'label' => 'Четвертое действие', 'url' => '#' ] ] ] ]); echo ButtonDropdown::widget([ 'label' => 'Success', 'options' => [ 'class' => 'btn-lg btn-success', 'style' => 'margin:5px' ], 'dropdown' => [ 'items' => [ [ 'label' => 'Второе действие', 'url' => '#' ], [ 'label' => 'Третье действие', 'url' => '#' ], [ 'label' => '', 'options' => [ 'role' => 'presentation', 'class' => 'divider' ] ], [ 'label' => 'Четвертое действие', 'url' => '#' ] ] ] ]); echo ButtonDropdown::widget([ 'label' => 'Info', 'options' => [ 'class' => 'btn-lg btn-info', 'style' => 'margin:5px' ], 'dropdown' => [ 'items' => [ [ 'label' => 'Второе действие', 'url' => '#' ], [ 'label' => 'Третье действие', 'url' => '#' ], [ 'label' => '', 'options' => [ 'role' => 'presentation', 'class' => 'divider' ] ], [ 'label' => 'Четвертое действие', 'url' => '#' ] ] ] ]); echo ButtonDropdown::widget([ 'label' => 'Warning', 'options' => [ 'class' => 'btn-lg btn-warning', 'style' => 'margin:5px' ], 'dropdown' => [ 'items' => [ [ 'label' => 'Второе действие', 'url' => '#' ], [ 'label' => 'Третье действие', 'url' => '#' ], [ 'label' => '', 'options' => [ 'role' => 'presentation', 'class' => 'divider' ] ], [ 'label' => 'Четвертое действие', 'url' => '#' ] ] ] ]); echo ButtonDropdown::widget([ 'label' => 'Danger', 'options' => [ 'class' => 'btn-lg btn-danger', 'style' => 'margin:5px' ], 'dropdown' => [ 'items' => [ [ 'label' => 'Второе действие', 'url' => '#' ], [ 'label' => 'Третье действие', 'url' => '#' ], [ 'label' => '', 'options' => [ 'role' => 'presentation', 'class' => 'divider' ] ], [ 'label' => 'Четвертое действие', 'url' => '#' ] ] ] ]); echo ButtonDropdown::widget([ 'label' => 'Link', 'options' => [ 'class' => 'btn-lg btn-link', 'style' => 'margin:5px' ], 'dropdown' => [ 'items' => [ [ 'label' => 'Второе действие', 'url' => '#' ], [ 'label' => 'Третье действие', 'url' => '#' ], [ 'label' => '', 'options' => [ 'role' => 'presentation', 'class' => 'divider' ] ], [ 'label' => 'Четвертое действие', 'url' => '#' ] ] ] ]);
Collapse yii\bootstrap\Collapse
echo Collapse::widget([ 'items' => [ [ 'label' => 'Этот блок открыт, но Вы можете его свернуть.', 'content' => 'Содержимое блока, открытого по-умолчанию', // Открыто по-умолчанию 'contentOptions' => [ 'class' => 'in' ] ], [ 'label' => 'Этот блок свернут, но Вы можете легко открыть его.', 'content' => 'Содержимое свернутого блока.', 'contentOptions' => [], 'options' => [] ], [ 'label' => 'Нажмите здесь', 'content' => 'А чего еще Вы ожидали?', 'contentOptions' => [], 'options' => [] ] ] ]);
Modal yii\bootstrap\Modal
Modal::begin([ 'header' => '<h2>Вот это модальное окно!</h2>', 'toggleButton' => [ 'tag' => 'button', 'class' => 'btn btn-lg btn-block btn-info', 'label' => 'Нажмите здесь, забавная штука!', ] ]); echo 'Надо взять на вооружение.'; Modal::end();
Nav yii\bootstrap\Nav
Navbar yii\bootstrap\Navbar
NavBar::begin([ 'brandLabel' => 'Yii Navbar', 'brandUrl' => Yii::$app->homeUrl, 'options' => [ 'class' => 'navbar-default' ] ]); echo Nav::widget([ 'options' => [ 'class' => 'navbar-nav navbar-right' ], 'items' => [ [ 'label' => 'Главная', 'url' => [ '#' ] ], [ 'label' => 'About', 'url' => [ '#' ] ], [ 'label' => 'Обратная связь', 'url' => [ '#' ] ], Yii::$app->user->isGuest ? [ 'label' => 'Войти', 'url' => [ '#' ] ] : [ 'label' => 'Выйти ('.Yii::$app->user->identity->username.')', 'url' => [ '#' ], 'linkOptions' => [ 'data-method' => 'post' ] ] ] ]); NavBar::end();
Progress yii\bootstrap\Progress
echo Progress::widget([ 'percent' => 60, 'label' => 'Ход выполнения' ]); echo Progress::widget([ 'percent' => 65, 'barOptions' => [ 'class' => 'progress-bar-danger' ] ]); echo Progress::widget([ 'percent' => 70, 'barOptions' => [ 'class' => 'progress-bar-warning' ], 'options' => [ 'class' => 'progress-striped' ] ]); echo Progress::widget([ 'percent' => 70, 'barOptions' => [ 'class' => 'progress-bar-success' ], 'options' => [ 'class' => 'active progress-striped' ] ]); echo Progress::widget([ 'bars' => [ [ 'percent' => 30, 'options' => [ 'class' => 'progress-bar-danger' ] ], [ 'percent' => 30, 'label' => 'Составная задача', 'options' => [ 'class' => 'progress-bar-success' ] ], [ 'percent' => 35, 'options' => [ 'class' => 'progress-bar-warning' ] ] ] ]);
ActiveForm yii\bootstrap\ActiveForm
<? = $form = ActiveForm::begin(); ?> <?= $form->field($model, 'imya')->textInput(['maxlength' => 64]) ?> <?= $form->field($model, 'familiya')->textInput(['maxlength' => 64]) ?> <div class="form-group"> <?= Html::submitButton($model->isNewRecord ? 'Создать' : 'Удалить', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> </div> <?php ActiveForm::end(); ?>
Советы по использованию Bootstrap в Yii2
Мы рассмотрели много примеров использования Twitter Bootstrap в приложении Yii 2.0. Теперь давайте уясним несколько простых правил, которые помогут избежать граблей.
1. Не забывайте использовать конструкцию use
Если вы решили использовать виджеты Bootstrap, объявите об этом в начале файла, используя use. Или просто добавьте следующий код в нужный view-файл и используйте любой из описанных виджетов:
<?php use yii\bootstrap\NavBar; use yii\bootstrap\Nav; use yii\bootstrap\Tabs; use yii\bootstrap\Alert; use yii\bootstrap\Button; use yii\bootstrap\ButtonDropdown; use yii\bootstrap\ButtonGroup; use yii\bootstrap\Carousel; use yii\bootstrap\Collapse; use yii\bootstrap\Modal; use yii\bootstrap\Progress; use yii\bootstrap\ActiveForm;
2. Используйте редактор или среду разработки, которые поддерживают автоматическое форматирование текста
Существует большое количество подходящих редакторов, автоматически форматирующих код в ходе его написания. Их использование позволяет меньше отвлекаться на второстепенные детали, и уделять больше внимая своему творению. Если Вы еще этого не сделали, испробуйте несколько разных IDE/редакторов из множества подходящих для вашей деятельности, выберите один и уделите ему время. Изучите его возможности. Настройка подсветки синтаксиса, автоматического дополнения кода, его форматирования и рефакторинга. И это время съэкономит вам в разы больше в процессе разработки.
3. Как подключить свою тему Bootstrap
Тема по-умолчанию в Bootstrap 3 имеет плоское оформление. Это выглядит лаконично и просто. Но что, если вы хотите изменить его под требования дизайнера или по личным соображениям? Просто настройте его под себя. Измените файл assests/AppSet.php:
class AppAsset extends AssetBundle { public $basePath = '@webroot'; public $baseUrl = '@web'; public $css = [ 'css/site.css', ]; public $js = [ ]; public $depends = [ 'yii\web\YiiAsset', 'yii\bootstrap\BootstrapAsset', 'yii\bootstrap\BootstrapThemeAsset', ]; }
Заключение
В этой статье мы узнали, как легко и просто использовать элементы пользовательского интерфейса Twitter Bootstrap в нашем любимом Yii2.
Спасибо! Все очень доступно и примеры замечательные. Ваш материал оказался весьма полезным для меня =)
«Это значительно улучшает читаемость кода.» А то, что это требует PHP 5.4 версии и выше сообщать не нужно? Многие хостинги до сих пор сидят на 5.3.
Yii2 требует для работы PHP >= 5.4.0, к тому же, PHP 5.3 перестал поддерживаться 8 месяцев назад, тот же 5.4 потеряет поддержку в сентябре 2015 года.
Большинство хостингов сейчас предлагают php 5.4, а многие и 5.5/5.6.
Зачем размещать новые проекты у тех, кто не стремится развиваться?
Здравствуйте! Поправьте, пожалуйста, код. У Вас на странице тег [php][/php] не обрабатывается.
Поправил, спасибо!
Здравствуйте! Спасибо за материал! У меня вопрос.
Как в навигационном меню пункты оформлять с помощью тегов?
На пример, в этом материале меню состоит из
Главная,
О нас,
Обратная связь,
Войти
я хочу что бы пункт «Обратная связь» выглядела «Обратная связь»?
Спасибо
Статья отличная!
Можете подсказать: как можно сделать в компоненте collapse, что бы блоки открывались/закрывались по клику на блок лэйбла а не только по тексту этого самого лэйбла.
Супер, дякую, буду юзати
Всем привет.
хорошая статья. спасибо автору и фрейворка и данного блока :)
Вопрос возник у меня такой: никто разве не заметил что карусель работает неверно? в ней не хватает класса «‘slide» (в HTML) без него слайды не ездят… это в опциях или где-то тру выставить просто? или на jq дописать? кто-то имеет правильное решение?
мда… а ларчик просто открывался :)
отвечу сам:
дописать — ‘options’ => [‘class’ =>’slide’]
для тех кто в танке ,а где их вызывать,в каком файле?
Что за хрень выплывает в блоках с кодом, пусть наверх всплывает а не вниз… а то мешает.
Подскажите новичку, что делать если в первом пункте меню выводится не иконка, а теги
echo ButtonDropdown::widget([
‘encodeLabel’ => false,
‘label’ => ‘Action’,
‘dropdown’ => [
‘items’ => [
[‘label’ => FA::icon(‘times’, [‘class’ => ‘close’]), ‘url’ => ‘/’],
[‘label’ => ‘DropdownB’, ‘url’ => ‘#’],
],
],
]);
Тут все просто. Класс yii\bootstrap\ButtonDropdown имеет свойство ‘encodeLabel’, оно влияет только на саму кнопку, массив ‘dropdown’ передается в класс \yii\bootstrap\Dropdown, который имеет свойство ‘encodeLabels’:
echo ButtonDropdown::widget([
‘encodeLabel’ => false,
‘label’ => ‘Action’,
‘dropdown’ => [
‘items’ => [
[‘label’ => FA::icon(‘times’, [‘class’ => ‘close’]), ‘url’ => ‘/’,],
[‘label’ => ‘DropdownB’, ‘url’ => ‘#’],
],
‘encodeLabels’ => false,
],
]);
В любой непонятной ситуации смотри исходники;)
Большое спасибо!)
Подскажите пожалуйста, как сделать в ActiveForm поля input-sm?
field($model, ‘url’)->textInput([‘maxlength’ => 255, ‘class’ => ‘input-sm’])->label(false); ?>
спасибо огромное
Добрый день. Хорошая и наглядная статья. Только почему в ActiveForm так коротко. Я конечно не уверен, но наверняка там есть что показать. Например, fileinput(). Как то не верится, что он остался таким же простым, как в стандартной ActiveForm.
Спасибо за статью.
Возник вопрос и сразу вышел на хороший ответ.