一、模型配置

事例会用到三个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",          ],       //这部分和上面的分页是一样的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持网页设计。