php教程

超轻量级php框架startmvc

yii2实现分页,带搜索的分页功能示例

更新时间:2020-03-17 10:32:03 作者:startmvc
一、模型配置事例会用到三个models。文章类别表和文章表用gii生成下即可,最后一个是搜索

一、模型配置

事例会用到三个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) ?>
 <?= 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',
 ],
 //这部分和上面的分页是一样的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

yii2 搜索分页 yii 搜索分页 yii2 分页带搜索