一、模型配置
事例会用到三个models。文章类别表和文章表用gii生成下即可,最后一个是搜索验证模型。其中,只讲下一个联表和搜索验证。其他不用操作。
1.文章表关联
1
2
3
4
5
6
7
|
<?php
//...other code
//关联
public function getCate(){
return $this ->hasOne(ArticleCate::className(),[ 'id' => 'cid' ]);
}
?>
|
2.搜索模型
common/models/search/创建ArticleSearch.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
<?php
namespace common\models\search;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use common\models\Article;
class ArticleSearch extends Article
{
//public $cname;//文章类别名
/**
* @inheritdoc
*/
public function rules()
{
return [
[[ 'cid' , 'created_at' , 'updated_at' ], 'integer' ],
[[ 'id' , 'desc' , 'title' , 'cover' , 'content' ], 'safe' ],
];
}
/**
* @inheritdoc
*/
public function scenarios()
{
// bypass scenarios() implementation in the parent class
return Model::scenarios();
}
//搜索
public function search( $params )
{
$query = Article::find();
// $query->joinWith(['cate']);//关联文章类别表
// $query->joinWith(['author' => function($query) { $query->from(['author' => 'users']); }]);
$dataProvider = new ActiveDataProvider([
'query' => $query ,
'pagination' => [
'pageSize' => 2,
],
]);
// 从参数的数据中加载过滤条件,并验证
$this ->load( $params );
if (! $this ->validate()) {
// uncomment the following line if you do not want to any records when validation fails
// $query->where('0=1');
return $dataProvider ;
}
// 增加过滤条件来调整查询对象
$query ->andFilterWhere([
// 'cname' => $this->cate.cname,
'title' => $this ->title,
]);
$query ->andFilterWhere([ 'like' , 'title' , $this ->title]);
//$query->andFilterWhere(['like', 'cate.cname', $this->cname]) ;
return $dataProvider ;
}
}
|
二、分页使用
方式一
首先在控制器的动作中,创建分页对象并且为其填充数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?php
//other code
use yii\data\Pagination;
public function actionArticlelist()
{
//分页读取类别数据
$model = Article::find()->with( 'cate' );
$pagination = new Pagination([
'defaultPageSize' => 3,
'totalCount' => $model -> count (),
]);
$model = $model ->orderBy( 'id ASC' )
->offset( $pagination ->offset)
->limit( $pagination ->limit)
->all();
return $this ->render( 'index' , [
'model' => $model ,
'pagination' => $pagination ,
]);
}
?>
|
其次在视图中我们输出的模板为当前页并通过分页对象链接到该页:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php
use yii\widgets\LinkPager;
use yii\helpers\Html;
use yii\helpers\Url;
//other code
foreach ( $models as $model ) {
// 在这里显示 $model
}
// 显示分页
echo LinkPager::widget([
'pagination' => $pagination ,
'firstPageLabel' => "First" ,
'prevPageLabel' => 'Prev' ,
'nextPageLabel' => 'Next' ,
'lastPageLabel' => 'Last' ,
]);
?>
|
方式二
控制器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?php
$query = Article::find()->with( 'cate' );
$provider = new ActiveDataProvider([
'query' => $query ,
'pagination' => [
'pageSize' => 3,
],
'sort' => [
'defaultOrder' => [
//'created_at' => SORT_DESC,
//'title' => SORT_ASC,
]
],
]);
return $this ->render( 'index' , [
'model' => $query ,
'dataProvider' => $provider
]);
?>
|
视图:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
<?php
use yii\grid\GridView;
echo GridView::widget([
'dataProvider' => $dataProvider ,
//每列都有搜索框 控制器传过来$searchModel = new ArticleSearch();
//'filterModel' => $searchModel,
'layout' => '{items}<div class="text-right tooltip-demo">{pager}</div>' ,
'pager' =>[
//'options'=>['class'=>'hidden']//关闭自带分页
'firstPageLabel' => "First" ,
'prevPageLabel' => 'Prev' ,
'nextPageLabel' => 'Next' ,
'lastPageLabel' => 'Last' ,
],
'columns' => [
//['class' => 'yii\grid\SerialColumn'],//序列号从1开始
// 数据提供者中所含数据所定义的简单的列
// 使用的是模型的列的数据
'id' ,
'username' ,
[ 'label' => '文章类别' , /*'attribute' => 'cid',产生一个a标签,点击可排序*/ 'value' => 'cate.cname' ],
[ 'label' => '发布日期' , 'format' => [ 'date' , 'php:Y-m-d' ], 'value' => 'created_at' ],
// 更复杂的列数据
[ 'label' => '封面图' , 'format' => 'raw' , 'value' => function ( $m ){
return Html::img( $m ->cover,[ 'class' => 'img-circle' , 'width' => 30]);
}],
[
'class' => 'yii\grid\DataColumn' , //由于是默认类型,可以省略
'value' => function ( $data ) {
return $data ->name;
// 如果是数组数据则为 $data['name'] ,例如,使用
SqlDataProvider 的情形。
},
],
[
'class' => 'yii\grid\ActionColumn' ,
'header' => '操作' ,
'template' => '{delete} {update}' , //只需要展示删除和更新
/*'headerOptions' => ['width' => '80'],*/
'buttons' => [
'delete' => function ( $url , $model , $key ){
return Html::a( '<i class="glyphicon glyphicon-trash"></i> 删除' ,
[ 'artdel' , 'id' => $key ],
[ 'class' => 'btn btn-default btn-xs' ,
'data' => [ 'confirm' => '你确定要删除文章吗?' ,]
]);
},
'update' => function ( $url , $model , $key ){
return Html::a( '<i class="fa fa-file"></i> 更新' ,
[ 'artedit' , 'id' => $key ],
[ 'class' => 'btn btn-default btn-xs' ]);
},
],
],
],
]);
?>
|
三、搜索带分页功能
- 创建搜索模型(前面己做)
- 控制传入数据
- 视图显示控制器代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php
public function actionIndex()
{
$searchModel = new ArticleSearch();
$dataProvider = $searchModel ->search(Yii:: $app ->request->queryParams);
return $this ->render( 'index' , [
'searchModel' => $searchModel ,
'dataProvider' => $dataProvider ,
]);
}
?>
|
视图:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php $form = ActiveForm::begin([
'action' => [ 'index' ],
'method' => 'get' ,
'id' => 'cateadd-form' ,
'options' => [ 'class' => 'form-horizontal' ],
]); ?>
<?= $form ->field( $searchModel , 'title' ,[
'options' =>[ 'class' => '' ],
'inputOptions' => [ 'placeholder' => '文章搜索' , 'class' => 'input-sm form-control' ],
])->label(false) ?>
<?= Html::submitButton( 'Go!' , [ 'class' => 'btn btn-sm btn-primary' ]) ?>
<?php ActiveForm:: end (); ?>
<?= GridView::widget([
'dataProvider' => $dataProvider ,
'layout' => '{items}<div class="text-right tooltip-demo">{pager}</div>' ,
'pager' =>[
//'options'=>['class'=>'hidden']//关闭自带分页
'firstPageLabel' => "First" ,
'prevPageLabel' => 'Prev' ,
'nextPageLabel' => 'Next' ,
'lastPageLabel' => 'Last' ,
],
//这部分和上面的分页是一样的
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。