php yii2 搜索功能,yii2-搜索带分页,分页的两种方式

注:

本次事例会使用到关联表操作(文章类别表Cate.php、文章表Article.php)

文章表里有一个cid对应类别表里的id。

我的源文

一、模型配置

事例会用到三个models。文章类别表和文章表用gii生成下即可,最后一个是搜索验证模型。

其中,只讲下一个联表和搜索验证。其他不用操作。

1.文章表关联

//...other code

//关联

public function getCate(){

return $this->hasOne(ArticleCate::className(),['id' => 'cid']);

}

?>

2.搜索模型

common/models/search/创建ArticleSearch.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;

}

}

二、分页使用

方式一

首先在控制器的动作中,创建分页对象并且为其填充数据:

//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,

]);

}

?>

其次在视图中我们输出的模板为当前页并通过分页对象链接到该页:

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',

]);

?>

方式二

控制器:

$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

]);

?>

视图:

use yii\grid\GridView;

echo GridView::widget([

'dataProvider' => $dataProvider,

//每列都有搜索框 控制器传过来$searchModel = new ArticleSearch();

//'filterModel' => $searchModel,

'layout'=> '{items}

{pager}
',

'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(' 删除',

['artdel', 'id' => $key],

['class' => 'btn btn-default btn-xs',

'data' => ['confirm' => '你确定要删除文章吗?',]

]);

},

'update' => function($url, $model, $key){

return Html::a(' 更新',

['artedit', 'id' => $key],

['class' => 'btn btn-default btn-xs']);

},

],

],

],

]);

?>

三、搜索带分页功能

创建搜索模型(前面己做)

控制传入数据

视图显示

控制器代码:

public function actionIndex(){

$searchModel = new ArticleSearch();

$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

return $this->render('index', [

'searchModel' => $searchModel,

'dataProvider' => $dataProvider,

]);

}

?>

视图:

'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']) ?>

= GridView::widget([

'dataProvider' => $dataProvider,

'layout'=> '{items}

{pager}
',

'pager'=>[

//'options'=>['class'=>'hidden']//关闭自带分页

'firstPageLabel'=>"First",

'prevPageLabel'=>'Prev',

'nextPageLabel'=>'Next',

'lastPageLabel'=>'Last',

],

//这部分和上面的分页是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值