zoukankan      html  css  js  c++  java
  • YII2-搜索带分页,分页的两种方式

    1.文章表关联

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

    2.搜索模型
    common/models/search/创建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->cate.cname,
                'title' => $this->title,
            ]);
    
            $query->andFilterWhere(['like', 'title', $this->title]);
            //$query->andFilterWhere(['like', 'cate.cname', $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}<div class="text-right tooltip-demo">{pager}</div>',
         'pager'=>[
                   //'options'=>['class'=>'hidden']//关闭自带分页
                   'firstPageLabel'=>"First",
                    'prevPageLabel'=>'Prev',
                    'nextPageLabel'=>'Next',
                     'lastPageLabel'=>'Last',
          ],
        'columns' => [
            //['class' => 'yiigridSerialColumn'],//序列号从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' => '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) ?>
    <span class="input-group-btn">
        <?= Html::submitButton('Go!', ['class' => 'btn btn-sm btn-primary']) ?>
    </span>
    <?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',
                        ],
                  //这部分和上面的分页是一样的
  • 相关阅读:
    Top 10 Product Manager Skills To Boost Your Resume In 2021
    大数据知识梳理
    B端产品如何设计权限系统?
    华三盒式交换机MAC、ARP、Route性能表项参数查询
    中了传说中的挖矿病毒
    SqlServer 2019 事务日志传送
    docker中生成的pdf中文是方框的解决方案
    The Live Editor is unable to run in the current system configuration
    2021 面试题大纲
    五分钟搞定Docker安装ElasticSearch
  • 原文地址:https://www.cnblogs.com/wenxinphp/p/5800431.html
Copyright © 2011-2022 走看看