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


Posted in PHP onJanuary 07, 2017

一、模型配置

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

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

PHP 相关文章推荐
不用iconv库的gb2312与utf-8的互换函数
Oct 09 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
Apr 12 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
May 18 PHP
PHP高级对象构建 工厂模式的使用
Feb 05 PHP
php获取文件夹路径内的图片以及分页显示示例
Mar 11 PHP
php实现httpclient类示例
Apr 08 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
Dec 18 PHP
利用php做服务器和web前端的界面进行交互
Oct 31 PHP
静态html文件执行php语句的方法(推荐)
Nov 21 PHP
PHP实现多图上传(结合uploadify插件)思路分析
Nov 30 PHP
PHP实现分布式memcache设置web集群session同步的方法
Apr 10 PHP
Laravel框架实现定时发布任务的方法
Aug 16 PHP
Yii框架用户登录session丢失问题解决方法
Jan 07 #PHP
Yii框架表单提交验证功能分析
Jan 07 #PHP
Yii框架弹出框功能示例
Jan 07 #PHP
Yii框架弹出窗口组件CJuiDialog用法分析
Jan 07 #PHP
PHP验证码类ValidateCode解析
Jan 07 #PHP
PHP缩略图生成和图片水印制作
Jan 07 #PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 #PHP
You might like
小偷PHP+Html+缓存
2006/12/20 PHP
ZF等常用php框架中存在的问题
2008/01/10 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
php文件夹的创建与删除方法
2015/01/24 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
点击进行复制的JS代码实例
2013/08/23 Javascript
Javascript基础教程之函数对象和属性
2015/01/18 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
触摸春天教学反思
2014/02/03 职场文书
座谈会主持词
2014/03/20 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
优秀教师单行材料
2014/12/16 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
写给同事的离职感言
2015/08/04 职场文书
反邪教教育心得体会
2016/01/15 职场文书
七年级生物教学反思
2016/02/20 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
react国际化react-intl的使用
2021/05/06 Javascript