|
|
@ -3,7 +3,8 @@ |
|
|
|
|
|
|
|
|
|
|
|
Yii はデータを表示するために使うことが出来る一連の [ウィジェット](structure-widgets.md) を提供しています。 |
|
|
|
Yii はデータを表示するために使うことが出来る一連の [ウィジェット](structure-widgets.md) を提供しています。 |
|
|
|
[DetailView](#detail-view) は、単一のレコードのデータを表示するのに使うことが出来ます。 |
|
|
|
[DetailView](#detail-view) は、単一のレコードのデータを表示するのに使うことが出来ます。 |
|
|
|
それに対して、[ListView](#list-view) と [GridView](#grid-view) は、複数のデータ・レコードをリストまたはテーブルで表示することが出来るもので、ページネーション、並べ替え、フィルタリングなどの機能を提供するものです。 |
|
|
|
それに対して、[ListView](#list-view) と [GridView](#grid-view) は、複数のデータ・レコードをリストまたはテーブルで表示することが出来るもので、 |
|
|
|
|
|
|
|
ページネーション、並べ替え、フィルタリングなどの機能を提供するものです。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DetailView <span id="detail-view"></span> |
|
|
|
DetailView <span id="detail-view"></span> |
|
|
@ -63,7 +64,8 @@ ListView <span id="list-view"></span> |
|
|
|
|
|
|
|
|
|
|
|
[[yii\widgets\ListView|ListView]] ウィジェットは、[データ・プロバイダ](output-data-providers.md) からのデータを表示するのに使用されます。 |
|
|
|
[[yii\widgets\ListView|ListView]] ウィジェットは、[データ・プロバイダ](output-data-providers.md) からのデータを表示するのに使用されます。 |
|
|
|
各データ・モデルは指定された [[yii\widgets\ListView::$itemView|ビュー・ファイル]] を使って表示されます。 |
|
|
|
各データ・モデルは指定された [[yii\widgets\ListView::$itemView|ビュー・ファイル]] を使って表示されます。 |
|
|
|
ListView は、特に何もしなくても、ページネーション、並べ替え、フィルタリングなどの機能を提供してくれますので、エンド・ユーザに情報を表示するためにも、データ管理 UI を作成するためにも、非常に便利なウィジェットです。 |
|
|
|
ListView は、特に何もしなくても、ページネーション、並べ替え、フィルタリングなどの機能を提供してくれますので、 |
|
|
|
|
|
|
|
エンド・ユーザに情報を表示するためにも、データ管理 UI を作成するためにも、非常に便利なウィジェットです。 |
|
|
|
|
|
|
|
|
|
|
|
典型的な使用方法は以下の通りです。 |
|
|
|
典型的な使用方法は以下の通りです。 |
|
|
|
|
|
|
|
|
|
|
@ -98,14 +100,14 @@ use yii\helpers\HtmlPurifier; |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
上記のビュー・ファイルでは、現在のデータ・モデルを `$model` としてアクセスすることが出来ます。 |
|
|
|
上記のビュー・ファイルでは、現在のデータ・モデルを `$model` としてアクセスすることが出来ます。追加で次のものを利用することも出来ます。 |
|
|
|
追加で次のものを利用することも出来ます。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `$key`: mixed - データ・アイテムと関連付けられたキーの値。 |
|
|
|
- `$key`: mixed - データ・アイテムと関連付けられたキーの値。 |
|
|
|
- `$index`: integer - データ・プロバイダによって返されるアイテムの配列の 0 から始まるインデックス。 |
|
|
|
- `$index`: integer - データ・プロバイダによって返されるアイテムの配列の 0 から始まるインデックス。 |
|
|
|
- `$widget`: ListView - ウィジェットのインスタンス。 |
|
|
|
- `$widget`: ListView - ウィジェットのインスタンス。 |
|
|
|
|
|
|
|
|
|
|
|
追加のデータを各ビューに渡す必要がある場合は、次のように、[[yii\widgets\ListView::$viewParams|$viewParams]] を使って「キー・値」のペアを渡すことが出来ます。 |
|
|
|
追加のデータを各ビューに渡す必要がある場合は、次のように、[[yii\widgets\ListView::$viewParams|$viewParams]] |
|
|
|
|
|
|
|
を使って「キー・値」のペアを渡すことが出来ます。 |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
echo ListView::widget([ |
|
|
|
echo ListView::widget([ |
|
|
@ -125,9 +127,9 @@ echo ListView::widget([ |
|
|
|
GridView <span id="grid-view"></span> |
|
|
|
GridView <span id="grid-view"></span> |
|
|
|
-------- |
|
|
|
-------- |
|
|
|
|
|
|
|
|
|
|
|
データ・グリッドすなわち [[yii\grid\GridView|GridView]] は Yii の最も強力なウィジェットの一つです。 |
|
|
|
データ・グリッドすなわち [[yii\grid\GridView|GridView]] は Yii の最も強力なウィジェットの一つです。これは、システムの管理セクションを素速く作らねばならない時に、 |
|
|
|
これは、システムの管理セクションを素速く作らねばならない時に、この上なく便利なものです。 |
|
|
|
この上なく便利なものです。このウィジェットは [データ・プロバイダ](output-data-providers.md) からデータを受けて、 |
|
|
|
このウィジェットは [データ・プロバイダ](output-data-providers.md) からデータを受けて、テーブルの形式で、行ごとに一組の [[yii\grid\GridView::columns|カラム]] を使ってデータを表示します。 |
|
|
|
テーブルの形式で、行ごとに一組の [[yii\grid\GridView::columns|カラム]] を使ってデータを表示します。 |
|
|
|
|
|
|
|
|
|
|
|
テーブルの各行が一つのデータ・アイテムを表します。そして、一つのカラムは通常はアイテムの一属性を表します |
|
|
|
テーブルの各行が一つのデータ・アイテムを表します。そして、一つのカラムは通常はアイテムの一属性を表します |
|
|
|
(カラムの中に、複数の属性を組み合わせた複雑な式に対応するものや、静的なテキストを表すものを含めることも出来ます)。 |
|
|
|
(カラムの中に、複数の属性を組み合わせた複雑な式に対応するものや、静的なテキストを表すものを含めることも出来ます)。 |
|
|
@ -152,11 +154,13 @@ echo GridView::widget([ |
|
|
|
上記のコードは、最初にデータ・プロバイダを作成し、次に GridView を使って、データ・プロバイダから受け取る全ての行の全ての属性を表示するものです。 |
|
|
|
上記のコードは、最初にデータ・プロバイダを作成し、次に GridView を使って、データ・プロバイダから受け取る全ての行の全ての属性を表示するものです。 |
|
|
|
表示されるテーブルには、特に何も設定しなくても、並べ替えとページネーションの機能が装備されます。 |
|
|
|
表示されるテーブルには、特に何も設定しなくても、並べ替えとページネーションの機能が装備されます。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### グリッドのカラム <span id="grid-columns"></span> |
|
|
|
### グリッドのカラム <span id="grid-columns"></span> |
|
|
|
|
|
|
|
|
|
|
|
グリッドのテーブルのカラムは [[yii\grid\Column]] クラスとして表現され、GridView の構成情報の [[yii\grid\GridView::columns|columns]] プロパティで構成されます。 |
|
|
|
グリッドのテーブルのカラムは [[yii\grid\Column]] クラスとして表現され、GridView の構成情報の |
|
|
|
カラムは、タイプや設定の違いに応じて、データをさまざまな形で表現することが出来ます。 |
|
|
|
[[yii\grid\GridView::columns|columns]] プロパティで構成されます。カラムは、タイプや設定の違いに応じて、 |
|
|
|
デフォルトのクラスは [[yii\grid\DataColumn]] です。これは、モデルの一つの属性を表現し、その属性による並べ替えとフィルタリングを可能にするものです。 |
|
|
|
データをさまざまな形で表現することが出来ます。デフォルトのクラスは [[yii\grid\DataColumn]] です。 |
|
|
|
|
|
|
|
これは、モデルの一つの属性を表現し、その属性による並べ替えとフィルタリングを可能にするものです。 |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
echo GridView::widget([ |
|
|
|
echo GridView::widget([ |
|
|
@ -178,11 +182,13 @@ echo GridView::widget([ |
|
|
|
]); |
|
|
|
]); |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
構成情報の [[yii\grid\GridView::columns|columns]] の部分が指定されない場合は、Yii は、データ・プロバイダのモデルの表示可能な全てのカラムを表示しようとすることに注意してください。 |
|
|
|
構成情報の [[yii\grid\GridView::columns|columns]] の部分が指定されない場合は、Yii は、 |
|
|
|
|
|
|
|
データ・プロバイダのモデルの表示可能な全てのカラムを表示しようとすることに注意してください。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### カラム・クラス <span id="column-classes"></span> |
|
|
|
### カラム・クラス <span id="column-classes"></span> |
|
|
|
|
|
|
|
|
|
|
|
グリッドのカラムは、いろいろなカラムクラスを使うことでカスタマイズすることが出来ます。 |
|
|
|
グリッドのカラムは、いろいろなカラム・クラスを使うことでカスタマイズすることが出来ます。 |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
echo GridView::widget([ |
|
|
|
echo GridView::widget([ |
|
|
@ -194,10 +200,10 @@ echo GridView::widget([ |
|
|
|
], |
|
|
|
], |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
Yii によって提供されるカラムクラスを以下で見ていきますが、それらに加えて、あなた自身のカラム・クラスを作成することも出来ます。 |
|
|
|
Yii によって提供されるカラム・クラスを以下で見ていきますが、それらに加えて、あなた自身のカラム・クラスを作成することも出来ます。 |
|
|
|
|
|
|
|
|
|
|
|
全てのカラム・クラスは [[yii\grid\Column]] を拡張するものですので、グリッドのカラムを構成するときに設定できる共通のオプションがいくつかあります。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
全てのカラム・クラスは [[yii\grid\Column]] を拡張するものですので、グリッドのカラムを構成するときに設定できる |
|
|
|
|
|
|
|
共通のオプションがいくつかあります。 |
|
|
|
|
|
|
|
|
|
|
|
- [[yii\grid\Column::header|header]] によって、ヘッダ行のコンテントを設定することが出来ます。 |
|
|
|
- [[yii\grid\Column::header|header]] によって、ヘッダ行のコンテントを設定することが出来ます。 |
|
|
|
- [[yii\grid\Column::footer|footer]] によって、フッタ行のコンテントを設定することが出来ます。 |
|
|
|
- [[yii\grid\Column::footer|footer]] によって、フッタ行のコンテントを設定することが出来ます。 |
|
|
@ -237,6 +243,13 @@ echo GridView::widget([ |
|
|
|
'attribute' => 'birthday', |
|
|
|
'attribute' => 'birthday', |
|
|
|
'format' => ['date', 'php:Y-m-d'] |
|
|
|
'format' => ['date', 'php:Y-m-d'] |
|
|
|
], |
|
|
|
], |
|
|
|
|
|
|
|
'created_at:datetime', // shortcut format |
|
|
|
|
|
|
|
[ |
|
|
|
|
|
|
|
'label' => '教育', |
|
|
|
|
|
|
|
'attribute' => 'education', |
|
|
|
|
|
|
|
'filter' => ['0' => '初等教育', '1' => '中等教育', '2' => '高等教育'], |
|
|
|
|
|
|
|
'filterInputOptions' => ['prompt' => '全ての教育', 'class' => 'form-control', 'id' => null] |
|
|
|
|
|
|
|
], |
|
|
|
], |
|
|
|
], |
|
|
|
]); |
|
|
|
]); |
|
|
|
``` |
|
|
|
``` |
|
|
@ -250,9 +263,16 @@ echo GridView::widget([ |
|
|
|
データカラムを構成するためには、ショートカット形式を使うことも出来ます。 |
|
|
|
データカラムを構成するためには、ショートカット形式を使うことも出来ます。 |
|
|
|
それについては、[[yii\grid\GridView::columns|columns]] の API ドキュメントで説明されています。 |
|
|
|
それについては、[[yii\grid\GridView::columns|columns]] の API ドキュメントで説明されています。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
フィルタ・インプットの HTML を制御するためには、[[yii\grid\DataColumn::filter|filter]] と |
|
|
|
|
|
|
|
[[yii\grid\DataColumn::filterInputOptions|filterInputOptions]] を使用して下さい。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
デフォルトでは、カラム・ヘッダは [[yii\data\Sort::link]] によってレンダリングされますが、[[yii\grid\Column::header]] を使って調整することが出来ます。 |
|
|
|
|
|
|
|
ヘッダのテキストを変更するには、上の例のように、[[yii\grid\DataColumn::$label]] を設定しなければなりません。 |
|
|
|
|
|
|
|
デフォルトでは、ラベルはデータ・モデルによって設定されます。詳細は [[yii\grid\DataColumn::getHeaderCellLabel]] を参照して下さい。 |
|
|
|
|
|
|
|
|
|
|
|
#### アクション・カラム <span id="action-column"></span> |
|
|
|
#### アクション・カラム <span id="action-column"></span> |
|
|
|
|
|
|
|
|
|
|
|
[[yii\grid\ActionColumn|アクション・カラム]] は、各行について、更新や削除などのアクションボタンを表示します。 |
|
|
|
[[yii\grid\ActionColumn|アクション・カラム]] は、各行について、更新や削除などのアクション・ボタンを表示します。 |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
echo GridView::widget([ |
|
|
|
echo GridView::widget([ |
|
|
@ -272,11 +292,9 @@ echo GridView::widget([ |
|
|
|
波括弧に囲まれたトークンは、コントローラのアクション ID として扱われます (アクション・カラムのコンテキストでは *ボタンの名前* とも呼ばれます)。 |
|
|
|
波括弧に囲まれたトークンは、コントローラのアクション ID として扱われます (アクション・カラムのコンテキストでは *ボタンの名前* とも呼ばれます)。 |
|
|
|
これらは、[[yii\grid\ActionColumn::$buttons|buttons]] によって定義される、対応するボタン表示コールバックによって置き換えられます。 |
|
|
|
これらは、[[yii\grid\ActionColumn::$buttons|buttons]] によって定義される、対応するボタン表示コールバックによって置き換えられます。 |
|
|
|
例えば、`{view}` というトークンは、`buttons['view']` のコールバックの結果によって置き換えられます。 |
|
|
|
例えば、`{view}` というトークンは、`buttons['view']` のコールバックの結果によって置き換えられます。 |
|
|
|
コールバックが見つからない場合は、トークンは空文字列によって置き換えられます。 |
|
|
|
コールバックが見つからない場合は、トークンは空文字列によって置き換えられます。デフォルトのテンプレートは `{view} {update} {delete}` です。 |
|
|
|
デフォルトのテンプレートは `{view} {update} {delete}` です。 |
|
|
|
|
|
|
|
- [[yii\grid\ActionColumn::buttons|buttons]] はボタン表示コールバックの配列です。 |
|
|
|
- [[yii\grid\ActionColumn::buttons|buttons]] はボタン表示コールバックの配列です。 |
|
|
|
配列のキーはボタンの名前 (波括弧を除く) であり、値は対応するボタン表示コールバックです。 |
|
|
|
配列のキーはボタンの名前 (波括弧を除く) であり、値は対応するボタン表示コールバックです。コールバックは下記のシグニチャを使わなければなりません。 |
|
|
|
コールバックは下記のシグニチャを使わなければなりません。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
function ($url, $model, $key) { |
|
|
|
function ($url, $model, $key) { |
|
|
@ -284,7 +302,8 @@ echo GridView::widget([ |
|
|
|
} |
|
|
|
} |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
上記のコードで、`$url` はカラムがボタンのために生成する URL、`$model` は現在の行に表示されるモデル・オブジェクト、そして `$key` はデータ・プロバイダの配列の中にあるモデルのキーです。 |
|
|
|
上記のコードで、`$url` はカラムがボタンのために生成する URL、`$model` は現在の行に表示されるモデル・オブジェクト、 |
|
|
|
|
|
|
|
そして `$key` はデータ・プロバイダの配列の中にあるモデルのキーです。 |
|
|
|
|
|
|
|
|
|
|
|
- [[yii\grid\ActionColumn::urlCreator|urlCreator]] は、指定されたモデルの情報を使って、ボタンの URL を生成するコールバックです。 |
|
|
|
- [[yii\grid\ActionColumn::urlCreator|urlCreator]] は、指定されたモデルの情報を使って、ボタンの URL を生成するコールバックです。 |
|
|
|
コールバックのシグニチャは [[yii\grid\ActionColumn::createUrl()]] のそれと同じでなければなりません。 |
|
|
|
コールバックのシグニチャは [[yii\grid\ActionColumn::createUrl()]] のそれと同じでなければなりません。 |
|
|
@ -308,7 +327,6 @@ echo GridView::widget([ |
|
|
|
] |
|
|
|
] |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### チェックボックス・カラム <span id="checkbox-column"></span> |
|
|
|
#### チェックボックス・カラム <span id="checkbox-column"></span> |
|
|
|
|
|
|
|
|
|
|
|
[[yii\grid\CheckboxColumn|チェックボックス・カラム]] はチェックボックスのカラムを表示します。 |
|
|
|
[[yii\grid\CheckboxColumn|チェックボックス・カラム]] はチェックボックスのカラムを表示します。 |
|
|
@ -359,9 +377,10 @@ echo GridView::widget([ |
|
|
|
### データをフィルタリングする <span id="filtering-data"></span> |
|
|
|
### データをフィルタリングする <span id="filtering-data"></span> |
|
|
|
|
|
|
|
|
|
|
|
データをフィルタリングするためには、GridView は検索基準を表す [モデル](structure-models.md) を必要とします。 |
|
|
|
データをフィルタリングするためには、GridView は検索基準を表す [モデル](structure-models.md) を必要とします。 |
|
|
|
検索基準は、通常は、グリッドビューのテーブルのフィルタのフィールドから取得されます。 |
|
|
|
検索基準は、通常は、グリッド・ビューのテーブルのフィルタのフィールドから取得されます。 |
|
|
|
[アクティブ・レコード](db-active-record.md) を使用している場合は、必要な機能を提供する検索用のモデル・クラスを作成するのが一般的なプラクティスです (あなたに代って [Gii](start-gii.md) が生成してくれます)。 |
|
|
|
[アクティブ・レコード](db-active-record.md) を使用している場合は、必要な機能を提供する検索用のモデル・クラスを |
|
|
|
このクラスが、グリッドビューのテーブルに表示されるフィルタ・コントロールのための検証規則を定義し、 |
|
|
|
作成するのが一般的なプラクティスです (あなたに代って [Gii](start-gii.md) が生成してくれます)。 |
|
|
|
|
|
|
|
このクラスが、グリッド・ビューのテーブルに表示されるフィルタ・コントロールのための検証規則を定義し、 |
|
|
|
検索基準に従って修正されたクエリを持つデータ・プロバイダを返す `search()` メソッドを提供します。 |
|
|
|
検索基準に従って修正されたクエリを持つデータ・プロバイダを返す `search()` メソッドを提供します。 |
|
|
|
|
|
|
|
|
|
|
|
`Post` モデルに対して検索機能を追加するために、次の例のようにして、`PostSearch` モデルを作成することが出来ます。 |
|
|
|
`Post` モデルに対して検索機能を追加するために、次の例のようにして、`PostSearch` モデルを作成することが出来ます。 |
|
|
@ -413,7 +432,6 @@ class PostSearch extends Post |
|
|
|
return $dataProvider; |
|
|
|
return $dataProvider; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
> Tip: フィルタのクエリを構築する方法を学ぶためには、[クエリ・ビルダ](db-query-builder.md)、 |
|
|
|
> Tip: フィルタのクエリを構築する方法を学ぶためには、[クエリ・ビルダ](db-query-builder.md)、 |
|
|
@ -443,12 +461,10 @@ echo GridView::widget([ |
|
|
|
]); |
|
|
|
]); |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 独立したフィルタ・フォーム <span id="separate-filter-form"></span> |
|
|
|
### 独立したフィルタ・フォーム <span id="separate-filter-form"></span> |
|
|
|
|
|
|
|
|
|
|
|
たいていの場合はグリッドビューのヘッダのフィルタで十分でしょう。 |
|
|
|
たいていの場合はグリッド・ビューのヘッダのフィルタで十分でしょう。しかし、独立したフィルタのフォームが必要な場合でも、 |
|
|
|
しかし、独立したフィルタのフォームが必要な場合でも、簡単に追加することができます。 |
|
|
|
簡単に追加することができます。まず、以下の内容を持つパーシャル・ビュー `_search.php` を作成します。 |
|
|
|
まず、以下の内容を持つパーシャル・ビュー `_search.php` を作成します。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
<?php |
|
|
|
<?php |
|
|
@ -487,12 +503,11 @@ use yii\widgets\ActiveForm; |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
> Note: Gii を使って CRUD コードを生成する場合、デフォルトで、独立したフィルタ・フォーム (`_search.php`) が生成されます。 |
|
|
|
> Note: Gii を使って CRUD コードを生成する場合、デフォルトで、独立したフィルタ・フォーム (`_search.php`) が生成されます。 |
|
|
|
ただし、`index.php` ビューの中ではコメント・アウトされています。 |
|
|
|
ただし、`index.php` ビューの中ではコメント・アウトされています。コメントを外せば、すぐに使うことが出来ます。 |
|
|
|
コメントを外せば、すぐに使うことが出来ます。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
独立したフィルタ・フォームは、グリッドビューに表示されないフィールドによってフィルタをかけたり、 |
|
|
|
独立したフィルタ・フォームは、グリッド・ビューに表示されないフィールドによってフィルタをかけたり、 |
|
|
|
または日付の範囲のような特殊なフィルタ条件を使う必要があったりする場合に便利です。 |
|
|
|
または日付の範囲のような特殊なフィルタ条件を使う必要があったりする場合に便利です。 |
|
|
|
日付の範囲によってフィルタする場合は、DB には存在しない `createdFrom` と `createdTo` という属性を検索用のモデルに追加すること良いでしょう。 |
|
|
|
日付の範囲によってフィルタする場合は、DB には存在しない `createdFrom` と `createdTo` という属性を検索用のモデルに追加すると良いでしょう。 |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
class PostSearch extends Post |
|
|
|
class PostSearch extends Post |
|
|
@ -524,16 +539,17 @@ $query->andFilterWhere(['>=', 'creation_date', $this->createdFrom]) |
|
|
|
<?= $form->field($model, 'creationTo') ?> |
|
|
|
<?= $form->field($model, 'creationTo') ?> |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### モデルのリレーションを扱う <span id="working-with-model-relations"></span> |
|
|
|
### モデルのリレーションを扱う <span id="working-with-model-relations"></span> |
|
|
|
|
|
|
|
|
|
|
|
GridView でアクティブ・レコードを表示するときに、リレーションのカラムの値、例えば、単に投稿者の `id` というのではなく、投稿者の名前を表示するという場合に遭遇するかも知れません。 |
|
|
|
GridView でアクティブ・レコードを表示するときに、例えば、単に投稿者の `id` ではなく、 |
|
|
|
`Post` モデルが `author` という名前のリレーションを持っていて、その投稿者のモデルが `name` という属性を持っているなら、[[yii\grid\GridView::$columns]] の属性名を `author.name` と定義します。 |
|
|
|
投稿者の名前のような関連するカラムの値を表示するという場合に遭遇するかも知れません。 |
|
|
|
そうすれば、GridView が投稿者の名前を表示するようになります。 |
|
|
|
`Post` モデルが `author` という名前のリレーションを持っていて、その投稿者のモデルが `name` という属性を持っているなら、 |
|
|
|
ただし、並べ替えとフィルタリングは、デフォルトでは有効になりません。 |
|
|
|
[[yii\grid\GridView::$columns]] の属性名を `author.name` と定義します。 |
|
|
|
|
|
|
|
そうすれば、GridView が投稿者の名前を表示するようになります。ただし、並べ替えとフィルタリングは、デフォルトでは有効になりません。 |
|
|
|
これらの機能を追加するためには、前の項で導入した `PostSearch` モデルを修正しなければなりません。 |
|
|
|
これらの機能を追加するためには、前の項で導入した `PostSearch` モデルを修正しなければなりません。 |
|
|
|
|
|
|
|
|
|
|
|
リレーションのカラムによる並べ替えを有効にするためには、リレーションのテーブルを結合し、データ・プロバイダの Sort コンポーネントに並べ替えの規則を追加します。 |
|
|
|
リレーションのカラムによる並べ替えを有効にするためには、リレーションのテーブルを結合し、 |
|
|
|
|
|
|
|
データ・プロバイダの Sort コンポーネントに並べ替えの規則を追加します。 |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
$query = Post::find(); |
|
|
|
$query = Post::find(); |
|
|
@ -580,7 +596,8 @@ $query->andFilterWhere(['LIKE', 'author.name', $this->getAttribute('author.name' |
|
|
|
|
|
|
|
|
|
|
|
> Info: 上の例では、リレーション名とテーブル・エイリアスに同じ文字列を使用しています。 |
|
|
|
> Info: 上の例では、リレーション名とテーブル・エイリアスに同じ文字列を使用しています。 |
|
|
|
> しかし、エイリアスとリレーション名が異なる場合は、どこでエイリアスを使い、どこでリレーション名を使うかに注意を払わなければなりません。 |
|
|
|
> しかし、エイリアスとリレーション名が異なる場合は、どこでエイリアスを使い、どこでリレーション名を使うかに注意を払わなければなりません。 |
|
|
|
> これに関する簡単な規則は、データベースクエリを構築するために使われる全ての場所でエイリアスを使い、`attributes()` や `rules()` など、その他の全ての定義においてリレーション名を使う、というものです。 |
|
|
|
> これに関する簡単な規則は、データベース・クエリを構築するために使われる全ての場所でエイリアスを使い、 |
|
|
|
|
|
|
|
> `attributes()` や `rules()` など、その他の全ての定義においてリレーション名を使う、というものです。 |
|
|
|
> |
|
|
|
> |
|
|
|
> 例えば、投稿者のリレーションテーブルに `au` というエイリアスを使う場合は、joinWith の文は以下のようになります。 |
|
|
|
> 例えば、投稿者のリレーションテーブルに `au` というエイリアスを使う場合は、joinWith の文は以下のようになります。 |
|
|
|
> |
|
|
|
> |
|
|
@ -605,18 +622,20 @@ $query->andFilterWhere(['LIKE', 'author.name', $this->getAttribute('author.name' |
|
|
|
> ]; |
|
|
|
> ]; |
|
|
|
> ``` |
|
|
|
> ``` |
|
|
|
> |
|
|
|
> |
|
|
|
> さらに、並べ替えの [[yii\data\Sort::defaultOrder|defaultOrder]] を指定するときも、エイリアスではなくリレーション名を使う必要があります。 |
|
|
|
> さらに、並べ替えの [[yii\data\Sort::defaultOrder|defaultOrder]] を指定するときも、 |
|
|
|
|
|
|
|
> エイリアスではなくリレーション名を使う必要があります。 |
|
|
|
> |
|
|
|
> |
|
|
|
> ```php |
|
|
|
> ```php |
|
|
|
> $dataProvider->sort->defaultOrder = ['author.name' => SORT_ASC]; |
|
|
|
> $dataProvider->sort->defaultOrder = ['author.name' => SORT_ASC]; |
|
|
|
> ``` |
|
|
|
> ``` |
|
|
|
|
|
|
|
|
|
|
|
> Info: `joinWith` およびバックグラウンドで実行されるクエリの詳細については、[アクティブ・レコード - リレーションを使ってテーブルを結合する](db-active-record.md#joining-with-relations) を参照してください。 |
|
|
|
> Info: `joinWith` およびバックグラウンドで実行されるクエリの詳細については、 |
|
|
|
|
|
|
|
> [アクティブ・レコード - リレーションを使ってテーブルを結合する](db-active-record.md#joining-with-relations) を参照してください。 |
|
|
|
|
|
|
|
|
|
|
|
#### SQL ビューを使って、データのフィルタリング・並べ替え・表示をする <span id="using-sql-views"></span> |
|
|
|
#### SQL ビューを使って、データのフィルタリング・並べ替え・表示をする <span id="using-sql-views"></span> |
|
|
|
|
|
|
|
|
|
|
|
もう一つ別に、もっと高速で便利な手法があります。SQL ビューです。 |
|
|
|
もう一つ別に、もっと高速で便利な手法があります。SQL ビューです。 |
|
|
|
例えば、ユーザとユーザのプロファイルを一緒にグリッドビューに表示する必要がある場合、次のような SQL ビューを作成することが出来ます。 |
|
|
|
例えば、ユーザとユーザのプロファイルを一緒にグリッド・ビューに表示する必要がある場合、次のような SQL ビューを作成することが出来ます。 |
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
```sql |
|
|
|
CREATE OR REPLACE VIEW vw_user_info AS |
|
|
|
CREATE OR REPLACE VIEW vw_user_info AS |
|
|
@ -673,10 +692,8 @@ class UserView extends ActiveRecord |
|
|
|
} |
|
|
|
} |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
このようにした後は、この UserView アクティブ・レコードを検索用のモデルとともに使うことが出来ます。 |
|
|
|
このようにした後は、この UserView アクティブ・レコードを検索用のモデルとともに使うことが出来ます。並べ替えやフィルタリングの属性を追加で定義する必要はありません。 |
|
|
|
並べ替えやフィルタリングの属性を追加で定義する必要はありません。 |
|
|
|
全ての属性がそのままで動作します。この手法にはいくつかの長所と短所があることに注意してください。 |
|
|
|
全ての属性がそのままで動作します。 |
|
|
|
|
|
|
|
この手法にはいくつかの長所と短所があることに注意してください。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 並べ替えとフィルタリングの条件をいろいろと定義する必要はありません。全てそのままで動きます。 |
|
|
|
- 並べ替えとフィルタリングの条件をいろいろと定義する必要はありません。全てそのままで動きます。 |
|
|
|
- データサイズが小さく、実行される SQL クエリの数が少ない (通常なら全てのリレーションについて一つずつ必要になる追加のクエリが要らない) ため、非常に高速になり得ます。 |
|
|
|
- データサイズが小さく、実行される SQL クエリの数が少ない (通常なら全てのリレーションについて一つずつ必要になる追加のクエリが要らない) ため、非常に高速になり得ます。 |
|
|
@ -684,13 +701,18 @@ class UserView extends ActiveRecord |
|
|
|
従って、`isActive` や `isDeleted` などのような UI に影響するメソッドがある場合は、それらをこのクラスの中に複製する必要があります。 |
|
|
|
従って、`isActive` や `isDeleted` などのような UI に影響するメソッドがある場合は、それらをこのクラスの中に複製する必要があります。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 一つのページに複数のグリッドビュー <span id="multiple-gridviews"></span> |
|
|
|
### 一つのページに複数のグリッド・ビュー <span id="multiple-gridviews"></span> |
|
|
|
|
|
|
|
|
|
|
|
一つのページで二つ以上のグリッドビューを使うことが出来ますが、お互いが干渉しないように、追加の構成がいくつか必要になります。 |
|
|
|
一つのページで二つ以上のグリッド・ビューを使うことが出来ますが、 |
|
|
|
グリッドビューの複数のインスタンスを使う場合は、並べ替えとページネーションのリンクが違うパラメータ名を持って生成されるように構成して、それぞれのグリッドビューが独立した並べ替えとページネーションを持つことが出来るようにしなければなりません。 |
|
|
|
お互いが干渉しないように、追加の構成がいくつか必要になります。 |
|
|
|
そのためには、データ・プロバイダの [[yii\data\BaseDataProvider::$sort|sort]] と [[yii\data\BaseDataProvider::$pagination|pagination]] インスタンスの [[yii\data\Sort::sortParam|sortParam]] と [[yii\data\Pagination::pageParam|pageParam]] を設定します。 |
|
|
|
グリッド・ビューの複数のインスタンスを使う場合は、並べ替えとページネーションのリンクが違うパラメータ名を持って生成されるように構成して、 |
|
|
|
|
|
|
|
それぞれのグリッド・ビューが独立した並べ替えとページネーションを持つことが出来るようにしなければなりません。 |
|
|
|
|
|
|
|
そのためには、データ・プロバイダの [[yii\data\BaseDataProvider::$sort|sort]] と [[yii\data\BaseDataProvider::$pagination|pagination]] |
|
|
|
|
|
|
|
インスタンスの [[yii\data\Sort::sortParam|sortParam]] と [[yii\data\Pagination::pageParam|pageParam]] |
|
|
|
|
|
|
|
を設定します。 |
|
|
|
|
|
|
|
|
|
|
|
`Post` と `User` のリストを表示するために、二つのプロバイダ、`$userProvider` と `$postProvider` を準備済みであると仮定します。 |
|
|
|
`Post` と `User` のリストを表示するために、二つのプロバイダ、`$userProvider` と `$postProvider` |
|
|
|
|
|
|
|
を準備済みであると仮定します。 |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
use yii\grid\GridView; |
|
|
|
use yii\grid\GridView; |
|
|
@ -714,7 +736,8 @@ echo GridView::widget([ |
|
|
|
|
|
|
|
|
|
|
|
### GridView を Pjax とともに使う <span id="using-gridview-with-pjax"></span> |
|
|
|
### GridView を Pjax とともに使う <span id="using-gridview-with-pjax"></span> |
|
|
|
|
|
|
|
|
|
|
|
[[yii\widgets\Pjax|Pjax]] ウィジェットを使うと、ページ全体をリロードせずに、ページの一部分だけを更新することが出来ます。 |
|
|
|
[[yii\widgets\Pjax|Pjax]] ウィジェットを使うと、ページ全体をリロードせずに、 |
|
|
|
|
|
|
|
ページの一部分だけを更新することが出来ます。 |
|
|
|
これを使うと、フィルタを使うときに、[[yii\grid\GridView|GridView]] の中身だけを更新することが出来ます。 |
|
|
|
これを使うと、フィルタを使うときに、[[yii\grid\GridView|GridView]] の中身だけを更新することが出来ます。 |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
@ -730,14 +753,16 @@ Pjax::begin([ |
|
|
|
Pjax::end(); |
|
|
|
Pjax::end(); |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
[[yii\widgets\Pjax|Pjax]] は、[[yii\widgets\Pjax::$linkSelector|Pjax::$linkSelector]] の指定に従って、リンクに対しても動作します。 |
|
|
|
Pjax は、[[yii\widgets\Pjax|Pjax]] ウィジェットの内側にあるリンク、および、[[yii\widgets\Pjax::$linkSelector|Pjax::$linkSelector]] |
|
|
|
これは [[yii\grid\ActionColumn|ActionColumn]] を使う場合には問題となり得ます。 |
|
|
|
で指定されているリンクに対しても動作します。 |
|
|
|
|
|
|
|
しかし、これは [[yii\grid\ActionColumn|ActionColumn]] のリンクに対しては問題となり得ます。 |
|
|
|
この問題を防止するためには、[[yii\grid\ActionColumn::$buttons|ActionColumn::$buttons]] |
|
|
|
この問題を防止するためには、[[yii\grid\ActionColumn::$buttons|ActionColumn::$buttons]] |
|
|
|
プロパティを編集して `data-pjax="0"` という HTML 属性を追加します。 |
|
|
|
プロパティを編集して `data-pjax="0"` という HTML 属性を追加します。 |
|
|
|
|
|
|
|
|
|
|
|
#### Gii における Pjax を伴う GridView/ListView |
|
|
|
#### Gii における Pjax を伴う GridView/ListView |
|
|
|
|
|
|
|
|
|
|
|
バージョン 2.0.5 以降、[Gii](start-gii.md) の CRUD ジェネレータでは `$enablePjax` というオプションがウェブ・インタフェイスまたはコマンドラインで使用可能になっています。 |
|
|
|
バージョン 2.0.5 以降、[Gii](start-gii.md) の CRUD ジェネレータでは `$enablePjax` |
|
|
|
|
|
|
|
というオプションがウェブ・インタフェイスまたはコマンドラインで使用可能になっています。 |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
yii gii/crud --controllerClass="backend\\controllers\PostController" \ |
|
|
|
yii gii/crud --controllerClass="backend\\controllers\PostController" \ |
|
|
@ -748,7 +773,6 @@ yii gii/crud --controllerClass="backend\\controllers\PostController" \ |
|
|
|
これによって、[[yii\grid\GridView|GridView]] または [[yii\widgets\ListView|ListView]] |
|
|
|
これによって、[[yii\grid\GridView|GridView]] または [[yii\widgets\ListView|ListView]] |
|
|
|
を囲む [[yii\widgets\Pjax|Pjax]] ウィジェットが生成されます。 |
|
|
|
を囲む [[yii\widgets\Pjax|Pjax]] ウィジェットが生成されます。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
さらに読むべき文書 |
|
|
|
さらに読むべき文書 |
|
|
|
------------------ |
|
|
|
------------------ |
|
|
|
|
|
|
|
|
|
|
|