> 在 GridView 小部件是從數據提供者獲取數據,并以一個表格的形式呈現數據。表中的每一行代表一個單獨的數據項,列表示該項目的屬性。
[TOC]
在 DataGrid 小部件中的列是在 yii\grid\Column 類中進行配置的。它代表一個模型屬性,并可以進行過濾和排序。
### GridView 列顯示常用操作
~~~
<?php
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
'published_at:datetime',
[
'label' => '排序值(越大越靠前)',
'value' => function ($model) {
return $model->order_num;
}
],
//[ 是否顯示某列 ],意思是如果參數type為1的情況,該列就顯示
[
'attribute' => 'buy_num',
'label' => '商品總價(元)',
'value' => function($model){
return $model->buy_num * $model->product_price_num;
}
'visible' => Yii::$app->request->get('type') == 1,
],
//[ 設定寬度 ],如title列太長了,可以限定一下
[
'attribute' => 'title',
'headerOptions'=> ['width'=> '100'],
],
'create_at:date', //短的時間顯示:Y-m-d
'create_at:datetime', //長的時間顯示:Y-m-d H:i:s
[
'label' => '子類鏈接', //為字段加超鏈接
'format' => 'raw',
'value' => function ($model){
return Html::a('屬性列表', ['test/index','id'=>$model->id]);
}
],
],
]);
?>
~~~
### 自定義按鈕
~~~
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'nickname',
'sex',
[
'class' => 'yii\grid\ActionColumn',
'template' => '{view} {update} {delete} {refresh}',
'buttons' => [
'refresh'=>function ($url, $model, $key) {
return Html::a('刷新', ['user/refresh', 'id' => $model->id, 'status'=>0], ['class' => "btn btn-xs btn-danger"]);
}
]
],
],
]); ?>
~~~
### 使用多選框
> 一般用于批量設置狀態或者批量刪除等。
~~~
<?php
echo GridView::widget([
// ......
"options" => ["class" => "grid-view","style"=>"overflow:auto", "id" => "grid"],
"columns" => [
[
"class" => "yii\grid\CheckboxColumn",
"name" => "id",
],
'id',
'name',
],
]);
echo Html::a("批量刪除", "javascript:void(0);", ["class" => "btn btn-success mybtn"]);
$this->registerJs('
$(document).on('click', '.mybtn', function () {
//可以把選中的id通過ajax提交到后端,然后借助yii的deleteAll()語句進行刪除或操作
var keys = $("#grid").yiiGridView("getSelectedRows");
console.log(keys);
});
');
?>
~~~
### GridView(搜索)數據篩選
> 要篩選數據,表格視圖需要一個模型從過濾的表單取得輸入數據,并調整 dataprovider 的查詢語句到期望的搜索條件。使用active records的慣例是建立一個搜索模型類繼承活動記錄類。然后用這個類定義搜索的驗證規則和提供 search() 方法來返回 data provider 。
要給 Article 模型添加搜索能力,可以創建 ArticleSearch ,如下所示:
#### 修改Article模型
~~~
//包含如下關聯表數據
public function getAuthor()
{
return $this->hasOne(Author::className(), ['id' => 'author_id']);
}
public function getArticleType()
{
return $this->hasOne(ArticleType::className(), ['id' => 'article_type_id']);
}
~~~
#### 創建ArticleSearch模型
~~~
<?php
namespace app\models;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
class ArticleSearch extends Article
{
public function rules()
{
public $author_name;
// 只有在 rules() 的字段才能被搜索
return [
[['status', 'article_type_id'], 'integer'],
[['title','author_name'], 'safe'],
];
}
public function scenarios()
{
return Model::scenarios();
}
public function search($params)
{
$query = Article::find();
//這里因為要調用author表進行作者名查詢,所以要用到joinWith
$query->joinWith('author');
//在視圖中,會調用級聯的article_type表,調用他的分類名,所以為了性能,在這里join一下
$query->join('articleType');
//如果增加的字段需要表頭排序,則可加入以下代碼
$dataProvider->setSort([
'attributes' => [
/* 其它字段不要動 */
/* 下面這段是加入的 */
/*=============*/
'customer_name' => [
'asc' => ['author.author_name' => SORT_ASC],
'desc' => ['author.author_name' => SORT_DESC],
'label' => '作者'
],
/*=============*/
]
]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
// 加載搜索表單數據并驗證
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
$query->andFilterWhere([
'status' => $this->status,
'article_type_id' => $this->article_type_id,
]);
//時間搜索,用戶在view上面輸入的是字符串的時間,而數據庫存放的是時間戳,需轉換匹配
if ($this->created_at) {
$createdAt = strtotime($this->created_at);
$createdAtEnd = $createdAt + 24*3600;
$query->andWhere("created_at >= {$createdAt} AND created_at <= {$createdAtEnd}");
}
// 通過添加過濾器來調整查詢語句
$query->andFilterWhere(['like', 'title', $this->title])
->andFilterWhere(['like', 'author.name', $this->author_name]);
return $dataProvider;
}
}
~~~
#### 控制器調用
~~~
$searchModel = new ArticleSearch();
$dataProvider = $searchModel->search($_GET);
return $this->render('view', [
'dataProvider' => $dataProvider,
'searchModel' => $searchModel,
]);
~~~
#### 視圖顯示
~~~
<?= GridView::widget([
'dataProvider' => $dataProvider,
//表格列值搜索功能,注意一定要配合attribute才會顯示
//$searchModel = new ArticleSearch();
'filterModel' => $searchModel,
'options' => [
'class' => 'grid-view table-responsive'
],
'columns' => [
'id',
//自定義搜索輸入框,比如增加“haha樣式”、和onclick事件
[
'attribute' => 'title',
'filter' => Html::activeTextInput($searchModel, 'title', ['class' => 'form-control haha','onclick'=>'haha()']),
],
//此處用到了$model的關聯數據,hasOne
[
'attribute'=>'author_id',
'value'=>function ($model) {
return $model->author->name;
}
],
//【下拉框搜索1111】在搜索條件(過濾條件)中使用下拉框來搜索
[
'attribute'=>'status',
'filter' => ['1'=>'可用','0'=>'不可用']
],
//or~~~~
[
'class'=>\common\grid\EnumColumn::className(),
'attribute'=>'status',
'enum'=>[
'1' => '可用狀態',
'0' => '禁用狀態',
]
],
//or~~~~~
[
'attribute'=>'status',
'filter' => Html::activeDropDownList($searchModel,'status',['1'=>'可用','0'=>'不可用'],['prompt'=>'全部','class'=>'form-control'])
],
//【下拉框搜索2222】文章分類作為下拉框選項進行索引
[
'attribute'=>'article_type',
'value'=>function ($model) {
return $model->articleType->title;
},
'filter'=>\yii\helpers\ArrayHelper::map(ArticleType::find()->all(), 'id', 'title')
],
'created_at:datetime'
['class' => 'yii\grid\ActionColumn']
]
]); ?>
~~~
- 基礎教程
- 入門安裝
- Yii2 composer 安裝慢解決
- Cookies
- 數據庫操作
- 數據提供者
- 助手類
- 驗證規則
- GridView
- DetailView
- YII2分頁
- JS、CSS的引用
- Excel導出
- 中文轉拼音
- 發送郵件
- 第三方插件
- Session跨域共享
- Url跨域訪問
- 場景應用
- 查詢條件鏈
- Session分布式共享
- Redis的使用
- mongodb
- 高級教程
- 自定義gii模板
- 角色權限管理(RBAC)
- user組件的配置
- 國際化(I18N)
- 小部件(Widget)
- 模塊(Module)
- 行為(Behavior)
- 緩存(Cache)
- migrate 數據庫遷移
- phpstorm
- 快捷鍵
- 自定義
- 其它插件