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 相关文章推荐
PHP 防注入函数(格式化数据)
Aug 08 PHP
PHP文章采集URL补全函数(FormatUrl)
Aug 02 PHP
php将gd生成的图片缓存到memcache的小例子
Jun 05 PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 PHP
php提取字符串中网站url地址的方法
Dec 03 PHP
php实现监控varnish缓存服务器的状态
Dec 30 PHP
文件上传之SWFUpload插件(代码)
Jul 30 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
May 24 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 PHP
PHP7修改的函数
Mar 09 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 header功能的使用
2013/10/28 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
购物车实现的几种方式优缺点对比
2018/05/02 PHP
js 窗口抖动示例
2013/09/04 Javascript
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
jQuery表单设置值的方法
2017/06/30 jQuery
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
使用axios请求时,发送formData请求的示例
2019/10/29 Javascript
JS实现拼图游戏
2021/01/29 Javascript
Python日志模块logging简介
2015/04/13 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
Python3生成手写体数字方法
2018/01/30 Python
Python wxPython库消息对话框MessageDialog用法示例
2018/09/03 Python
python os.path模块常用方法实例详解
2018/09/16 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
2020/03/28 Python
pytorch随机采样操作SubsetRandomSampler()
2020/07/07 Python
Python实现弹球小游戏
2020/08/01 Python
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
会计专业应届生求职信
2013/11/24 职场文书
中专生自我鉴定书范文
2013/12/28 职场文书
天网工程实施方案
2014/03/26 职场文书
讲座通知范文
2015/04/23 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
Python实现照片卡通化
2021/12/06 Python
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android