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 过滤页面中的BOM(实现代码)
Jun 29 PHP
关于php支持分块与断点续传文件下载功能代码
May 09 PHP
Laravel框架路由配置总结、设置技巧大全
Sep 03 PHP
PHP获取ip对应地区和使用网络类型的方法
Mar 11 PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
Jun 28 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
May 02 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
Mar 01 PHP
php apache开启跨域模式过程详解
Jul 08 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 PHP
PHP连接MySQL数据库三种实现方法
Dec 10 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修改上传图片尺寸的方法
2015/04/14 PHP
php经典算法集锦
2015/11/14 PHP
PHP实现查询两个数组中不同元素的方法
2016/02/23 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
php 中奖概率算法实现代码
2017/01/25 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
JsDom 编程小结
2011/08/09 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
js实现带三角符的手风琴效果
2017/03/01 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
20行python代码实现人脸识别
2019/05/05 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
python实现数字炸弹游戏
2020/07/17 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
德国著名廉价网上药店:Shop-Apotheke
2017/07/23 全球购物
马来西亚领先的在线礼品店:Giftr
2018/08/23 全球购物
单位在职证明范本
2014/01/09 职场文书
竞聘副主任科员演讲稿
2014/01/11 职场文书