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

一、模型配置

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

1.文章表关联

hasOne(ArticleCate::className(),['id' => 'cid']); } ?>

2.搜索模型

common/models/search/创建ArticleSearch.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',$this->title]);
//$query->andFilterWhere(['like','cate.cname',$this->cname]) ;

return $dataProvider;

}
}

二、分页使用

方式一

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

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

}
?>

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

// 显示分页
echo LinkPager::widget([
'pagination' => $pagination,'firstPageLabel'=>"First",'prevPageLabel'=>'Prev','nextPageLabel'=>'Next','lastPageLabel'=>'Last',]);
?>

方式二

控制器:

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

?>

视图:

$dataProvider,//每列都有搜索框 控制器传过来$searchModel = new ArticleSearch(); //'filterModel' => $searchModel,'layout'=> '{items}
','pager'=>[ //'options'=>['class'=>'hidden']//关闭自带分页 'firstPageLabel'=>"First",'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"> 删除',['artdel','id' => $key],['class' => 'btn btn-default btn-xs','data' => ['confirm' => '你确定要删除文章吗?',]
]);
},'update' => function($url,$key){
return Html::a('<i class="fa fa-file"> 更新',['artedit',['class' => 'btn btn-default btn-xs']);
},]);
?>

三、搜索带分页功能

  • 创建搜索模型(前面己做)
  • 控制传入数据
  • 视图显示控制器代码:
search(Yii::$app->request->queryParams);

return $this->render('index',[
'searchModel' => $searchModel,'dataProvider' => $dataProvider,]);
}
?>

视图:

['index'],'method' => 'get','id' => 'cateadd-form','options' => ['class' => 'form-horizontal'],]); ?>

<?= $form->field($searchModel,[
'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,'pager'=>[
//'options'=>['class'=>'hidden']//关闭自带分页
'firstPageLabel'=>"First",//这部分和上面的分页是一样的

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


如何选择合适的 C++ Web 开发框架?
利用 C++ 框架构建高并发 Web 应用的策略
用 C++ 框架开发跨平台图形应用程序
golang框架中安全编码实践的最佳指南是什么?
golang框架与其他语言框架在设计理念上的区别有哪些?
C++ 图形框架与其他语言框架的比较
C++ 框架与其他 Web 开发框架的对比分析
使用 C++ 框架构建大型项目最佳实践
C++ 框架如何提高大型项目开发效率
C++ 框架中依赖注入的持续集成与部署工具
如何与社区协作和贡献到自定义 Golang 框架?
C++ 框架在大型项目中如何实现模块化开发
使用 C++ 框架开发跨平台 Web 应用
C++ 框架在大型项目中的优缺点
golang框架在性能上的优势体现在哪些方面?
C++ 框架在嵌入式系统内存优化中的优势
golang框架在人工智能与机器学习中的作用
如何扩展 Golang 框架以支持特定功能?
如何利用 Go Modules 和依赖项管理来自定义 Golang 框架?
Golang 框架中的性能优化技巧