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

阅读量:29
2021-04-17

这篇文章介绍的内容是关于yii2实现分页,带搜索的分页功能示例,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

事例会用到三个models。文章类别表和文章表用gii生成下即可,最后一个是搜索验证模型。其中,只讲下一个联表和搜索验证。其他不用操作。

1.文章表关联

<?php
//...other code
//关联
public function getCate(){
    return $this->hasOne(ArticleCate::className(),['id' => 'cid']);
  }
?>

2.搜索模型

/创建ArticleSearch.php

<?php
 
namespace commonmodelssearch;
 
use Yii;
use yiibaseModel;
use yiidataActiveDataProvider;
use commonmodelsArticle;
 
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->ame,
      'title' => $this->title,
    ]);
 
    $query->andFilterWhere(['like', 'title', $this->title]);
    //$query->andFilterWhere(['like', 'ame', $this->cname]) ;
 
    return $dataProvider;
  }
}

二、分页使用

方式一

首先在控制器的动作中,创建分页对象并且为其填充数据:

<?php
//other code
use yiidataPagination;
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 yiiwidgetsLinkPager;
use yiihelpersHtml;
use yiihelpersUrl;
//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 yiigridGridView;
echo GridView::widget([
  'dataProvider' => $dataProvider,
  //每列都有搜索框 控制器传过来$searchModel = new ArticleSearch(); 
  //'filterModel' => $searchModel,
  'layout'=> '{items}<p class="text-right tooltip-demo">{pager}</p>',
   'pager'=>[
        //'options'=>['class'=>'hidden']//关闭自带分页
        'firstPageLabel'=>"First",
        'prevPageLabel'=>'Prev',
        'nextPageLabel'=>'Next',
         'lastPageLabel'=>'Last',
   ],
  'columns' => [
    //['class' => 'yiigridSerialColumn'],//序列号从1开始
    // 数据提供者中所含数据所定义的简单的列
    // 使用的是模型的列的数据
    'id',
    'username',
    ['label'=>'文章类别', /*'attribute' => 'cid',产生一个a标签,点击可排序*/ 'value' => 'ame' ],
    ['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' => 'yiigridDataColumn', //由于是默认类型,可以省略 
      'value' => function ($data) {
        return $data->name; 
        // 如果是数组数据则为 $data['name'] ,例如,使用 
 
SqlDataProvider 的情形。
      },
    ],
    [
     'class' => 'yiigridActionColumn',
     '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}<p class="text-right tooltip-demo">{pager}</p>',
          'pager'=>[
            //'options'=>['class'=>'hidden']//关闭自带分页
            'firstPageLabel'=>"First",
            'prevPageLabel'=>'Prev',
            'nextPageLabel'=>'Next',
            'lastPageLabel'=>'Last',
          ],
       //这部分和上面的分页是一样的

相关推荐:

yii实现model添加默认值的方法

Yii实现的多级联动下拉菜单

Yii2实现表单上传文件功能

以上就是yii2实现分页,带搜索的分页功能示例的详细内容,更多请关注星网无限其它相关文章!

声明:本文原创发布星网无限,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@处理

THE END

发表评论

相关推荐

  • php getdate函数怎么用

    php getdate函数用于返回当前本地的“日期/时间”的“日期/时间”信息,其语法为“getdate(timestamp)”,该函数会返回带有与时间 ...

    阅读量:101
    2021-04-19
  • column的10篇内容推荐

    column-fill属性会将不同高度的指定列以高度差最小化的方式进行对齐,这里我们就来看一下CSS3的column-fill属性对齐列内容高 ...

    阅读量:102
    2021-04-19
  • PHPMailer 中文使用说明小结_PHP教程

    A开头: $AltBody --属性 出自:PHPMailer : $AltBody 文件:class.phpmailer .php 说明:该属性的设置是在邮件正文不支持HT ...

    阅读量:136
    2021-04-19
  • php date与gmdate的获取日期的区别_PHP教程

    date -- 格式化一个本地时间/日期   gmdate -- 格式化一个 /UTC 日期/时间,返回的是格林威治标准时(GMT)。   举个 ...

    阅读量:117
    2021-04-19
  • php 正确解码javascript中通过escape编码后的字符_PHP教程

    这是很久以前收集的一个,不知道谁写的了,但经过测试没有问题~ JavaScript代码

    阅读量:116
    2021-04-19