Шаблоны и виджеты ================= ## Виджеты Расширение позволяет использовать виджеты в удобной форме, конвертируя их синтаксис в вызовы функций: ```twig {{ use('yii/bootstrap') }} {{ nav_bar_begin({ 'brandLabel': 'My Company', }) }} {{ nav_widget({ 'options': { 'class': 'navbar-nav navbar-right', }, 'items': [{ 'label': 'Home', 'url': '/site/index', }] }) }} {{ nav_bar_end() }} ``` В шаблоне выше имена функций `nav_bar_begin`, `nav_bar_end` или `nav_widget` состоят из двух частей. Первая часть - это имя виджета, переведенное в нижний регистр и разделенное нижними подчеркиваниями: `NavBar` становится `nav_bar`, `Nav` становится `nav`. `_begin`, `_end` и `_widget` аналогичны вызовам виджета `::begin()`, `::end()` и `::widget()`. Можно также использовать более общий вызов функции `widget_end()`, который выполняет `Widget::end()`. Идеология Twig не позволяет применять php-код в шаблонах. Поэтому если есть необходимость использования анонимных функций при конфигурации виджетов, эта функция может быть передана в шаблон в качестве переменной. ```php /** * Site controller */ class SiteController extends Controller { public function actionIndex() { $dataProvider = new ArrayDataProvider(); $dataProvider->setModels([ [ 'id' => 1, 'name' => 'First', 'checked' => false, ], [ 'id' => 2, 'name' => 'Second', 'checked' => true, ], [ 'id' => 1, 'name' => 'third', 'checked' => false, ], ]); $someFunction = function ($model) { return $model['checked'] === true ? 'yes' : 'no'; }; return $this->render('index.twig', [ 'dataProvider' => $dataProvider, 'someFunction' => $someFunction ]); } } ``` ```twig {{ use('yii/grid/GridView') }} {{ grid_view_widget({ 'dataProvider': dataProvider, 'columns': [ {'class': '\\yii\\grid\\SerialColumn'}, 'id', 'name', { 'attribute': 'checked', 'value': someFunction } ] }) }} ``` ## Главный шаблон Рассмотрим пример, как заменить шаблон по умолчанию `views/layout/main.php` на файл `views/layout/main.twig`. Чтобы изменить шаблон по умолчанию, добавьте public свойство в контроллер `SiteController`: ```php /** * Site controller */ class SiteController extends Controller { // .. public $layout = 'main.twig'; // .. ``` Код в шаблоне `views/layout/main.twig`: ```twig {{ register_asset_bundle('frontend/assets/AppAsset') }} {# asset root for yii advanced template #} {{ void(this.beginPage()) }}