一、模型配置
事例会用到三个models。文章类别表和文章表用gii生成下即可,最后一个是搜索验证模型。其中,只讲下一个联表和搜索验证。其他不用操作。
1.文章表关联
<?php//...other code//关联public function getCate(){ return $this->hasOne(ArticleCate::className(),["id" => "cid"]); }?>
2.搜索模型
common/models/search/创建ArticleSearch.php
<?phpnamespace commonmodelssearch;use Yii;use yiiaseModel;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 codeuse 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, ]); }?>
其次在视图中我们输出的模板为当前页并通过分页对象链接到该页:
<?phpuse yiiwidgetsLinkPager;use yiihelpersHtml;use yiihelpersUrl;//other codeforeach ($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 ]);?>
视图:
<?phpuse 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"]); }, ], ], ],]);?>
三、搜索带分页功能
- 创建搜索模型(前面己做)
- 控制传入数据
- 视图显示控制器代码:
<?phppublic 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", ], //这部分和上面的分页是一样的
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持网页设计。