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 相关文章推荐
基于文本的搜索
Oct 09 PHP
PHP+DBM的同学录程序(2)
Oct 09 PHP
IIS下PHP连接数据库提示mysql undefined function mysql_connect()
Jun 04 PHP
PHP 第二节 数据类型之数组
Apr 28 PHP
PHP根据IP判断地区名信息的示例代码
Mar 03 PHP
php将csv文件导入到mysql数据库的方法
Dec 24 PHP
php删除文本文件中重复行的方法
Apr 28 PHP
Cygwin中安装PHP方法步骤
Jul 04 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
PHP校验15位和18位身份证号的类封装
Nov 07 PHP
PHP利用DWZ.CN服务生成短网址
Aug 11 PHP
php校验公钥是否可用的实例方法
Sep 17 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
农民和部队如何穿矿
2020/03/04 星际争霸
一个改进的UBB类
2006/10/09 PHP
php利用cookie实现访问次数统计代码
2011/05/19 PHP
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
google 搜索框添加关键字实现代码
2010/04/24 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
js对象基础实例分析
2015/01/13 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
JavaScript动态数量的文件上传控件
2016/11/18 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
AngularJS 仿微信图片手势缩放的实例
2017/09/28 Javascript
详解VueJS应用中管理用户权限
2018/02/02 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
Python学习资料
2007/02/08 Python
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
Python新手实现2048小游戏
2015/03/31 Python
python内置数据类型之列表操作
2018/11/12 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
英国日常交易网站:Wowcher
2018/09/04 全球购物
竞聘演讲稿范文
2014/01/12 职场文书
2015年元旦标语大全
2014/12/09 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
mysql如何能有效防止删库跑路
2021/10/05 MySQL
React更新渲染原理深入分析
2022/12/24 Javascript