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

发布时间 - 2026-01-10 22:22:12    点击率:

一、模型配置

事例会用到三个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  # 分页带搜索  # yii分页组件用法实例分析  # Yii2.0框架实现带分页的多条件搜索功能示例  # Yii2.0小部件GridView(两表联查/搜索/分页)功能的实现代码  # yii2分页之实现跳转到具体某页的实例代码  # Yii2分页的使用及其扩展方法详解  # Yii分页用法实例详解  # Yii使用CLinkPager分页实例详解  # Yii列表定义与使用分页方法小结(3种方法)  # 详解Yii实现分页的两种方法  # Yii1.1中通过Sql查询进行的分页操作方法  # yii使用bootstrap分页样式的实例  # YII2框架中分页组件的使用方法示例  # 分页  # 自带  # 的是  # 都有  # 在这里  # 发布日期  # 这部  # 为其  # 只需要  # 该页  # 则为  # 大家多多  # 所含  # 分和  # 只讲  # 加载  # 是一样的  # 当前页  # dataProvider  # pagination 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 清除minerd进程的简单方法  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  nodejs redis 发布订阅机制封装实现方法及实例代码  手机软键盘弹出时影响布局的解决方法  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  如何快速重置建站主机并恢复默认配置?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何在腾讯云免费申请建站?  如何用PHP快速搭建CMS系统?  详解Android中Activity的四大启动模式实验简述  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  linux写shell需要注意的问题(必看)  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  java中使用zxing批量生成二维码立牌  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  七夕网站制作视频,七夕大促活动怎么报名?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  JavaScript实现Fly Bird小游戏  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  如何在IIS中配置站点IP、端口及主机头?  如何快速搭建FTP站点实现文件共享?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  大连 网站制作,大连天途有线官网?  怎么用AI帮你设计一套个性化的手机App图标?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Laravel如何与Inertia.js和Vue/React构建现代单页应用  音乐网站服务器如何优化API响应速度?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  php结合redis实现高并发下的抢购、秒杀功能的实例  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  ,在苏州找工作,上哪个网站比较好?  如何用AI帮你把自己的生活经历写成一个有趣的故事?  移动端脚本框架Hammer.js  太平洋网站制作公司,网络用语太平洋是什么意思?  深入理解Android中的xmlns:tools属性  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  利用vue写todolist单页应用