gridview中完美的嵌入了列表式id查询,可以对每个列表中的字段进行筛选查询,很是方便,效果如下:
下面就说一下如何实现:
一、yii2在用gii生成curd的时候,会默认的生成列表式查询,其实就是多了一个searchModel的模型,里面有关于查询的代码,不过在自己写的时候,还是要理解里面的内容,还有一些重点内容,下面我把我自己的一个orderSearch的模型拿出来说一下
<?php namespace common\models; use api\modules\RestApi\models\Order; use Yii; use yii\base\Model; use yii\data\ActiveDataProvider; /** * OrderSearch represents the model behind the search form about `frontend\models\Order`. */ class OrderSearch extends Order { /** * @inheritdoc */ public $date; public $time; public function rules() { return [ [['id', 'parent_orderid', 'type', 'new','ispay', 'paytype', 'storeid', 'tableid', 'eatnumber', 'userid', 'appointmenttime', 'finishedtime', 'fapiao', 'jiezhang', 'shippingfee', 'sellout', 'addressid', 'workerid', 'status', 'ordertime', 'regionid', 'goodscount'], 'integer'], [['ordersn', 'tablename', 'buyername', 'buyertel', 'note', 'address', 'swiftnumber', 'tablenote'], 'safe'], [['total', 'discountprice', 'youhui', 'yingshou', 'favorablemoney'], 'number'], [['date','time'], 'trim'] ]; } /** * @inheritdoc */ public function scenarios() { // bypass scenarios() implementation in the parent class return Model::scenarios(); } /** * Creates data provider instance with search query applied * * @param array $params * * @return ActiveDataProvider */ public function search($params,$where=[]) { $query = Order::find()->where($where)->with('addressInfo')->with('username')->orderBy('id desc'); $dataProvider = new ActiveDataProvider([ 'query' => $query, 'sort' => ['defaultOrder' => ['id' => SORT_DESC]], 'pagination' => [ 'pageSize' => 10, ], ]); $this->load($params); if (!$this->validate()) { // uncomment the following line if you do not want to return any records when validation fails // $query->where('0=1'); return $dataProvider; } $dateBegin = strtotime($this->date); $dateEnd = $dateBegin + 86400; $timeBegin = strtotime($this->time); $timeEnd = $timeBegin + 86400; $query->andFilterWhere([ 'id' => $this->id, 'parent_orderid' => $this->parent_orderid, // 'ordersn' => $this->ordersn, 'type' => $this->type, 'new' => $this->new, 'paytype' => $this->paytype, 'status' => $this->status, 'ordertime' => $this->ordertime, 'regionid' => $this->regionid, 'goodscount' => $this->goodscount, ]); $query->andFilterWhere(['like', 'ordersn', $this->ordersn]) ->andFilterWhere(['like', 'tablename', $this->tablename]) ->andFilterWhere(['like', 'buyername', $this->buyername]) ->andFilterWhere(['like', 'buyertel', $this->buyertel]) ->andFilterWhere(['like', 'note', $this->note]) ->andFilterWhere(['like', 'address', $this->address]) ->andFilterWhere(['like', 'swiftnumber', $this->swiftnumber]) ->andFilterWhere(['like', 'tablenote', $this->tablenote]) ->andFilterWhere(['like','status',$this->status]) ->andFilterWhere(['like','ispay',$this->ispay]) ->andFilterWhere(['>=', 'ordertime', $this->date ? $dateBegin : null]) ->andFilterWhere(['<', 'ordertime', $this->date ? $dateEnd : null]) ->andFilterWhere(['>=', 'appointmenttime', $this->time ? $timeBegin : null]) ->andFilterWhere(['<', 'appointmenttime', $this->time ? $timeEnd : null]); return $dataProvider; } }
上面的这些代码基本上是gii自动生成的,也有一些自己添加的查询,注意:
rules里面的规则,基本上就这三种类型:interge、safe、number、trim,要筛选查询的字段必须在这几种类型其中一个里,否则,列表中就不会出现查询的input框。
$query->andFilterWhere
这里出现了2遍,第一次出现的都是以数字‘id'=>$this->id;等的形式,而下面的是以like的方式出现的,细心的你一定会发现,这是怎么回事吧,第一种是精确查找,第二种是模糊查询,如果一个字段,例如ordersn,两种方式中都有,就会按精确查找来查询,所以,一般我们根据实际情况来区分,到底用哪种查询!
3. 这里我还用到了一个时间查询插件,就是效果图中的那样,根据日期来查询,在model中是如下代码在起作用:
public $date;
public $time;
[['date','time'], 'trim']
$dateBegin = strtotime($this->date);
$dateEnd = $dateBegin + 86400;
->andFilterWhere(['>=', 'ordertime', $this->date ? $dateBegin : null])
->andFilterWhere(['<', 'ordertime', $this->date ? $dateEnd : null])
二、是不是很简单,下面在来看一下视图中是怎样的,注意下面的注释部分
<?php echo GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, //这是筛选查询中必须加的 'layout' => "{items}\n{pager}", 'filterSelector' => "input[name='".$dataProvider->getPagination()->pageParam."']", 'pager' => [ 'class' => LinkPager::className(), 'firstPageLabel' => '第一页', 'lastPageLabel' => '最后一页', 'prevPageLabel' => '上一页', 'nextPageLabel' => '下一页', ], 'columns' => [ ['class' => 'yii\grid\CheckboxColumn'],//复选框列 [ 'attribute' => 'ordertime', 'format' => ['date', 'php:Y-m-d H:i'], 'filter' => DatePicker::widget([ //filter这一部分都是要加的 'model' => $searchModel, 'type' => DatePicker::TYPE_COMPONENT_APPEND, 'attribute' => 'date', 'options' => ['class' => 'input-sm'], 'pluginOptions' => [ 'autoclose' => true, 'format' => 'yyyy-mm-dd' ] ]), 'headerOptions' => ['class' => 'col-md-2'] ], 'ordersn', [ 'attribute' => 'yingshou', 'headerOptions' => ['class' => 'col-md-1'] ], [ 'attribute' => 'appointmenttime', 'format' => ['date', 'php:Y-m-d H:i'], 'filter' => DatePicker::widget([ 'model' => $searchModel, 'type' => DatePicker::TYPE_COMPONENT_APPEND, 'attribute' => 'time', 'options' => ['class' => 'input-sm'], 'pluginOptions' => [ 'autoclose' => true, 'format' => 'yyyy-mm-dd' ] ]), 'headerOptions' => ['class' => 'col-md-2'] ], [ 'attribute' => 'paytype', 'filter' =>Order::getPayTypeList(), 'filterInputOptions' => ['class' => 'form-control input-sm'], 'headerOptions' => ['class' => 'col-md-1'], 'value' => function ($model) { return $model->payTypeMsg; } ], [ 'attribute' => 'ispay', 'filter' =>Order::getPayStatusList(), 'filterInputOptions' => ['class' => 'form-control input-sm'], 'headerOptions' => ['class' => 'col-md-1'], 'value' => function ($model) { return $model->payStatusMsg; } ], [ 'attribute' => 'status', 'filter' => Order::getStatusList(), 'filterInputOptions' => ['class' => 'form-control input-sm'], 'headerOptions' => ['class' => 'col-md-1'], 'value' => function ($model, $key, $index, $column) { return $model->statusMsg; } ], [ 'class' => 'yii\grid\ActionColumn', 'header' => '操作', 'template' => '{view}', 'buttons' => [ 'view' => function($url, $dataProvider) { return Html::a('订单详情',"javascript:void(0)",['class' => 'view','data-tableid'=>$dataProvider->id ]); }, 'delete' => function($url, $dataProvider){ return Html::a('删除','javascript:void(0)',['class' => 'del','data-tableid'=>$dataProvider->id ]); }, ], ], ], ]); ?>
从上面的代码中可以看出来,
'filterModel' => $searchModel,
是必须要加的,如果查询的时候需要下拉筛选功能,就要添加
'filter' =>Order::getPayTypeList(),//键值为数组
就是这样的效果
筛选时间的部分需要用到插件,
use kartik\date\DatePicker;
你可以到packagist.org中去下载,用composer很简单的!
下一篇继续讲在girdview中直接修改列表中的内容的知识,