• 技术文章 >后端开发 >php教程

    yii2实现分页和带搜索的分页功能

    不言不言2018-06-15 16:30:17原创2435
    本篇文章主要介绍了yii2实现分页,带搜索的分页功能示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

    一、模型配置

    事例会用到三个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}<p class="text-right tooltip-demo">{pager}</p>',
       '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}<p class="text-right tooltip-demo">{pager}</p>',
              'pager'=>[
                //'options'=>['class'=>'hidden']//关闭自带分页
                'firstPageLabel'=>"First",
                'prevPageLabel'=>'Prev',
                'nextPageLabel'=>'Next',
                'lastPageLabel'=>'Last',
              ],
           //这部分和上面的分页是一样的

    以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

    相关推荐:

    关于YII框架中搜索分页jQuery写法

    Yii使用CLinkPager进行的分页

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

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    上一篇:关于YII框架中搜索分页jQuery写法 下一篇:Yii2中场景的简单使用
    大前端线上培训班

    相关文章推荐

    • PHP数据库学习之怎样使用PDO执行SQL语句?• PHP数据库学习之怎样使用PDO连接数据库?• PHP表单学习之表单的输入与验证• PHP数据库学习之怎样使用PDO获取查询结果?• PHP中怎样去连接MySQL数据库?

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网