转载

yii2-分页,带搜索的分页功能

注:

本次事例会使用到关联表操作(文章类表ArticleCate.php、文章表Article.php)

yii2-分页,带搜索的分页功能

][1]

一、模型配置

事例会用到三个models。文章类别表和文章表用gii生成下即可,最后一个是搜索验证模型。其中,只讲下一个联表和搜索验证。其他不用操作。

1.文章表关联

<?php //...other code //关联 public function getCate(){         return $this->hasOne(ArticleCate::className(),['id' => 'cid']);     } ?>

2.搜索模型

common/models/search/创建 ArticleSearch.php

<?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;  } } 

二、分页使用

方式一

首先在控制器的动作中,创建分页对象并且为其填充数据:

<?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,   ]);  } ?> 

其次在视图中我们输出的模板为当前页并通过分页对象链接到该页:

<?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', ]); ?> 

方式二

控制器:

<?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   ]); ?> 

视图:

<?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']);     },    ],    ],  ], ]); ?> 

三、搜索带分页功能

  • 创建搜索模型(前面己做)

  • 控制传入数据

  • 视图显示控制器代码:

<?php public function actionIndex() {   $searchModel = new ArticleSearch();   $dataProvider = $searchModel->search(Yii::$app->request->queryParams);     return $this->render('index', [         'searchModel' => $searchModel,         'dataProvider' => $dataProvider,     ]);  } ?>

视图:

<?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) ?> <span class="input-group-btn">  <?= Html::submitButton('Go!', ['class' => 'btn btn-sm btn-primary']) ?> </span> <?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',      ],      //这部分和上面的分页是一样的 

正文到此结束
Loading...