这里有新鲜出炉的精品教程,程序狗速度看过来!
Yii 2 完全根据 Yii 1.1 版本重写,后者是最流行的 PHP 框架之一。Yii 2 继承了 Yii 的简洁、快速、和高扩展性。Yii 2 需要 PHP 5.4,并且拥有现代 web 应用开发中最好的实例和协议。
本篇文章主要介绍了 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}<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) ?>
- <?= Html::submitButton('Go!', ['class' => 'btn btn-sm btn-primary']) ?>
- <?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',
- ],
- //这部分和上面的分页是一样的
来源: http://www.phperz.com/article/17/0730/340727.html