maclechan 2015-09-26 23:57:59 22281次浏览 2条评论 22 10 0

注:
本次事例会使用到关联表操作(文章类别表Cate.php、文章表Article.php)
文章表里有一个cid对应类别表里的id。
我的源文

一、模型配置
事例会用到三个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) ?>
<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',
                    ],
              //这部分和上面的分页是一样的

觉得很赞
  • 评论于 2017-02-17 18:55 举报

    好文章。赞一个。

  • 评论于 2015-11-06 09:42 举报

    贴子很有用,感谢分享!想学习一下GridView,方法里面'delete' => function($url, $model, $key){}函数的三个参数,$url, $model, $key传入顺序和命名是固定的吗?如果想把后台model里定义好的数组传入GridView里的delete方法中使用,如何处理呢?

您需要登录后才可以评论。登录 | 立即注册