数据小部件
============
Yii提供了一套数据小部件 [widgets](structure-widgets.md) ,这些小部件可以用于显示数据。
[DetailView](#detail-view) 小部件能够用于显示一条记录数据,
[ListView](#list-view) 和 [GridView](#grid-view) 小部件能够用于显示一个拥有分页、
排序和过滤功能的一个列表或者表格。
DetailView 
----------
[[yii\widgets\DetailView|DetailView]] 小部件显示的是单一 [[yii\widgets\DetailView::$model|model]] 数据的详情。
它非常适合用常规格式显示一个模型(例如在一个表格的一行中显示模型的每个属性)。
这里说的模型可以是 [[\yii\base\Model]] 或者其子类的一个实例,例如子类 [active record](db-active-record.md),也可以是一个关联数组。
DetailView使用 [[yii\widgets\DetailView::$attributes|$attributes]] 属性来决定显示模型哪些属性以及如何格式化。
可用的格式化选项,见 [formatter section](output-formatting.md) 章节。
一个典型的DetailView的使用方法如下:
 
```php
echo DetailView::widget([
    'model' => $model,
    'attributes' => [
        'title',                                           // title attribute (in plain text)
        'description:html',                                // description attribute formatted as HTML
        [                                                  // the owner name of the model
            'label' => 'Owner',
            'value' => $model->owner->name,            
            'contentOptions' => ['class' => 'bg-red'],     // HTML attributes to customize value tag
            'captionOptions' => ['tooltip' => 'Tooltip'],  // HTML attributes to customize label tag
        ],
        'created_at:datetime',                             // creation date formatted as datetime
    ],
]);
```
请记住,与处理一组模型的 [[yii\widgets\GridView|GridView]] 不同,
[[yii\widgets\DetailView|DetailView]] 只处理一个。
因为 `$model` 是唯一一个用于显示的模型,并且可以作为变量在视图中使用。
但是有些情况下可以使闭包有用。
例如指定了 `visible`,并且你不想让`value` 的结果为 `false`:
```php
echo DetailView::widget([
    'model' => $model,
    'attributes' => [
        [
            'attribute' => 'owner',
            'value' => function ($model) {
                return $model->owner->name;
            },
            'visible' => \Yii::$app->user->can('posts.owner.view'),
        ],
    ],
]);
```
ListView 
--------
[[yii\widgets\ListView|ListView]] 小部件用于显示数据提供者 [data provider](output-data-providers.md) 提供的数据。
每个数据模型用指定的视图文件 [[yii\widgets\ListView::$itemView|view file]] 来渲染。
因为它提供开箱即用式的(译者注:封装好的)分页、排序以及过滤这样一些特性,
所以它可以很方便地为最终用户显示信息并同时创建数据管理界面。
一个典型的用法如下例所示:
```php
use yii\widgets\ListView;
use yii\data\ActiveDataProvider;
$dataProvider = new ActiveDataProvider([
    'query' => Post::find(),
    'pagination' => [
        'pageSize' => 20,
    ],
]);
echo ListView::widget([
    'dataProvider' => $dataProvider,
    'itemView' => '_post',
]);
```
`_post` 视图文件可包含如下代码:
```php
     ['index'],
        'method' => 'get',
    ]); ?>
    = $form->field($model, 'title') ?>
    = $form->field($model, 'creation_date') ?>
    
        = Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
        = Html::submitButton('Reset', ['class' => 'btn btn-default']) ?>