FastAdmin后台表格的高级搜索中,默认只包含了数据库中有的字段,且在表格的定义中声明了operate
的。
但是会碰上这样的需求,比如数据表中存储了地区信息,字段为area_id,保存的是省市二级联动后的市的ID,搜索时需要先选择省、再选择市,再提交搜索。这个时候就需要对控制器、页面模板、JS文件里表格的列做一些比较大的改动,我称之后自定义搜索。
先说页面,编写index.html
,在底部添加
<script id="areahtml" type="text/html">
<div class="row">
<div class="col-xs-12">
<div class="form-inline" data-toggle="cxselect" data-selects="province_id,city_id">
<select style="width: 50%" id="province_id" class="province_id form-control" name="province_id" data-url="area/province_list" ></select>
<input type="hidden" class="operate" data-name="province_id" value="=" />
<select style="width: 50%" id="city_id" class="city_id form-control" name="city_id" data-url="area/city_list" ></select>
<input type="hidden" class="operate" data-name="city_id" value="=" />
</div>
</div>
</div>
</script>
再编辑对应的后端js文件,在columns
加上一个字段
{
field: "area_id",
title: "地区",
operate: "=",
formatter: function (value, row, index) {
return "";
},
visible: true,
searchList: function (column) {
//重点
return Template("areahtml", {});
},
},
再在下面的事件中添加相应的处理逻辑
$('#province_id').change(function () {
$('#city_id').data("params", function (obj) {
return { custom: { "pid": $('#province_id').val() } };
});
});
$('#city_id').data("params", function (obj) {
return { custom: { "pid": $('#province_id').val() } };
});
最后是在控制器中接收参数返回数据,涉及两个控制器,一是Area.php
,用于返回省市县列表
/**
* 省份列表
*/
public function province_list(){
$list = $this->model->where(['pid' => 0])->order("id asc")->field("id as value,name")->select();
$this->success("", null, $list);
}
/**
* 市县列表
*/
public function city_list(){
$pid = $this->request->param("province_id");
$list = $this->model->where(['pid' => $pid])->order("id asc")->field("id as value,name")->select();
$this->success("", null, $list);
}
二是主控制器,也就是用于返回表格所展示数据的控制器,在行list($where, $sort, $order, $offset, $limit) = $this->buildparams();
前面加入如下代码
$filter = json_decode($this->request->get("filter"),true);
$op = json_decode($this->request->get("op"),true);
if(isset($filter['province_id'])){
unset($filter['province_id']);
unset($op['province_id']);
}
if(isset($filter['city_id'])){
if($filter['city_id'] != 0){
$filter['area_id'] = $filter['city_id'];
}
unset($filter['city_id']);
unset($op['city_id']);
}
$this->request->get(["filter"=>json_encode($filter),'op'=>json_encode($op)]);
好了,刷新页面就可以在高级搜索中按省市来筛选了。