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',
                        ],
                  //这部分和上面的分页是一样的
    
  • 相关阅读:
    Ecshop去掉模版中随机出现Ecshop版权的方法
    ecshop邮件订阅按“订阅”没反应
    ecshop开发帮助
    ecshop循环计数
    ECSHOP购物车页面显示商品简单描述
    ecshop 函数列表大全
    ecshop 商品分类页 取得当前分类下的子分类方法
    ecshop调用指定分类和个数的文章列表
    thymeleaf中的th:assert用法
    thymeleaf中的模板布局
  • 原文地址:https://www.cnblogs.com/xiexiang168/p/5317148.html
Copyright © 2011-2022 走看看