レイアウトとウィジェット ======================== ## ウィジェット このエクステンションは、ウィジェットを使うのに便利なように、ウィジェットの構文を関数呼び出しに変換します。 ``` {{ 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/layoust/main.php` を置き換える `views/layouts/main.twig` ファイルの例を示します。 デフォルトのレイアウトを変更するために、`SiteController` の中でパブリックな変数を追加します。 ```php /** * Site controller */ class SiteController extends Controller { // .. public $layout = 'main.twig'; // .. ``` `views/layouts/main.twig` の中身は次のようになります。 ```twig {{ register_asset_bundle('frontend/assets/AppAsset') }} {# アドバンスト・テンプレートのアセットのルート #} {{ void(this.beginPage()) }} {{ html.encode(this.title) }} {{ html.csrfMetaTags | raw }} {{ void(this.head) }} {{ void(this.beginBody()) }} {{ content | raw}} {{ void(this.endBody()) }} {{ void(this.endPage()) }} ``` コントローラのレイアウトを使いたくない場合は `$layout` プロパティを `false` に設定しなければなりません。 また、アプリケーション設定でレイアウトをグローバルに変更することもできます。 ```php [ 'layout' => 'main.twig', // または無効にする 'layout' => false ] ``` ## ナビゲーション・バー 前もって `global` を構成情報ファイルの中に追加しましょう。 ```php 'renderers' => [ 'twig' => [ 'class' => 'yii\twig\ViewRenderer', 'cachePath' => '@runtime/Twig/cache', // twig のオプションの配列 'options' => [ 'auto_reload' => true, ], 'globals' => [ //.. 'url' => ['class' => '\yii\helpers\Url'], // 新しい global //.. ], 'uses' => ['yii\bootstrap'], ], ], ``` 以下が login/logout の動的なバリエーションを持つ `navigation` バーのコードです。 ```twig {{ nav_bar_begin({ 'brandLabel': '', 'brandUrl' : app.homeUrl, 'options' : { 'class' : 'header navbar navbar-fixed-top', } }) }} {% set menuItems = [] %} {% if app.user.isGuest == false %} {% set menuItems = menuItems|merge([ {'label' : 'Main', 'url' : ['/site/index']}, {'label' : 'About', 'url' : ['/site/about']}, {# その他 #} { 'label' : 'ログアウト (' ~ app.user.identity.username ~ ')', 'url' : ['/site/logout'], 'linkOptions' : {'data-method' : 'post'} } ]) %} {% else %} {% set menuItems = menuItems|merge([ {'label' : 'ログイン', 'url' : ['/site/login']}, {# その他 #} ]) %} {% endif %} {{ nav_widget({ 'options': { 'class': 'navbar-nav navbar-right', }, 'items': menuItems }) }} {{ nav_bar_end() }} ``` ## フッタ 基本的な Yii のフッタのコードを PHP から twig に変換する方法を例示しましょう。 `Powered by Yii framework` を表示するために、構成ファイルの中に `global` を追加します。 ```php 'renderers' => [ 'twig' => [ //.. 'globals' => [ //.. 'Yii' => ['class' => '\Yii'], //.. ], 'uses' => ['yii\bootstrap'], //.. ], ], ``` これがフッタのコードです。 ``` ``` ## フォーム 次のようにして、フォームを構築することが出来ます。 ``` {{ use('yii/widgets/ActiveForm') }} {% set form = active_form_begin({ 'id' : 'login-form', 'options' : {'class' : 'form-horizontal'}, }) %} {{ form.field(model, 'username') | raw }} {{ form.field(model, 'password').passwordInput() | raw }}
{{ active_form_end() }} ```