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自动生成的,也有一些自己添加的查询,注意:

  1. rules里面的规则,基本上就这三种类型:interge、safe、number、trim,要筛选查询的字段必须在这几种类型其中一个里,否则,列表中就不会出现查询的input框。

  2. $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中直接修改列表中的内容的知识,