需求:因为要统计学校中每个学院每个年级的人数,且需要做备份处理。即会出现当前已经不在校的年级,根据哪一次备份进行查询,列为当次备份的各个年级。
举个例子,就比如说,今天我备份了一次学生数据记为“备份1”,一共有18级,19级,20级三个年级的学生人数,但是下一个星期,18级毕业了,21级新生暂时还没报到,这个星期又备份了一次记为“备份2”,此时我们在搜索备份数据的时候,假如搜索备份1,他的列有18,19,20级三个列,更换搜索条件为备份2,列就只剩下了19,20级。
效果图:
在这张图里就有三个年级的人数,更换搜索条件就会少一个。
由于网上资源稀缺,在社区里,负责人也只是提供过简单的思路,具体代码需要购买cms,我没有买,不知道cms里面是怎么写的,而且他只是讲了动态column,没有添加搜索条件。没办法,只能自己研究。
动态column
要做搜索条件的动态column,第一步也肯定是先做动态column,是说column会更具数据库中字段的增加而增加,不需要自己在后台配置。搜了很久,网上只有一段没有注释,没有文字的代码,研究了很久算是研究透了,接下来讲讲我的做法。
fastadmin的表格渲染着主要是通过bootstrap渲染的,在js文件里有对应表格的js代码,
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'weigh',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'category_id', title: __('Category_id')},
{field: 'title', title: __('Title')},
{field: 'image', title: __('Image'), events: Table.api.events.image, formatter: Table.api.formatter.image},
{field: 'images', title: __('Images'), events: Table.api.events.image, formatter: Table.api.formatter.images},
{field: 'refreshtime', title: __('Refreshtime'), operate:'RANGE', addclass:'datetimerange', formatter: Table.api.formatter.datetime},
{field: 'weigh', title: __('Weigh')},
{field: 'switch', title: __('Switch'), searchList: {"1":__('Yes'),"0":__('No')}, formatter: Table.api.formatter.toggle},
{field: 'status', title: __('Status'), searchList: {"normal":__('Normal'),"hidden":__('Hidden')}, formatter: Table.api.formatter.status},
{field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
]
]
});
这是官方文档中的一段代码,我用来做演示,这里是静态column,每一个字段都是自己配置的,如果要做到动态column,只要从后台的方法那里获取到column就可以了,我们可以把做出column的方法写在和url里的文件同一个目录下,在这里要用到fastadmin的一个对象fast,在js文件也可以看到fast.js文件,fastadmin的创作人也在社区里面写过相关的介绍文章
fast主要是和$this->success
或者$this->error
一起使用这样才能接收到数据,
而column的内容只要从数据库里面拉出来,然后自己再进行一些改造就可以了
这里主要讲js文件该怎么写
经过后台加工后的column仍然无法直接使用,后台接收后还是要做一些处理
sixth: function () {
var column = [];
var array = [];
let diff = [];
//学院动态年级分布
var table6 = $("#table6");
Fast.api.ajax({
url: 'general/backup/student/columntd'
}, function (data) {
$.each(data, function (i, item) {
var row;
row = {
"field": item.field,
"title": item.title,
operate: false
};
column.push(row);
})
}
用fast.api.ajax接收数据后,再用each循环,将只有数据 的数组,变成框架可以识别的column结构最后和平常一样直接渲染表格就可以了,
table.bootstrapTable({
url: 'general/backup/student/school' + location.search,
toolbar: '#toolbar6',
searchFormVisible: true,
searchFormTemplate: 'customformtpl',
columns: column
})
增加搜索条件
做好动态column以后就是加搜索条件了,在官方文档里有这样的一个事件
onLoadSuccess | load-success.bs.table |
---|---|
data | 远程数据加载成功时触发成功 |
onloadSuccess,参数是data,如果你也看了文档会发现有一个onSearch文档,我为什么没用?因为他的参数是text,我也想用,可我实在想不明白text是干嘛用的,偶一就放弃了,还好这个onLoadSuccess可以起到差不多的效果,把这个事件写到columns后面。
我原本的思路是套娃,就是触发这个事件的时候再一次获取列头,就是field,重新渲染一次表格,但是不行,第一次进入页面效果正常,会加载两次column方法,但是用搜索条件的时候就不会访问column,思考了很久放弃了,,后来突然想到了一个更方便的方法。
一开始将所有的列都查出来好了,根据搜索条件,显示想要显示的列,屏蔽不想要屏蔽列就可以了,然后去翻一翻文档,果然有我想要的参数
在表格参数中,有hideColumn和showColumn,两个参数,只要我们将所有需要显示的column_all都查出来,然后用搜索条件查出来的column_portion和column_all对比,有的showColumn,没有的hideColumn这样就可以了
columns: column,
onLoadSuccess: function () {
data = table.bootstrapTable('getData', true);//获取数据
if (data[0]) {
var key = Object.keys(data[0]);
}
if (diff) {
for (let i = 0; i < diff.length; i++) {
table.bootstrapTable("hideColumn", diff[i]);
}
}
if (key) {
for (let j = 0; j < key.length; j++) {
table.bootstrapTable("showColumn", key[j]);
}
}
}
})
阉割了点代码,只放出了重要的部分。
这个需求着实是卡了我很多天,想了很多办法,头都秃了,今天早上灵光一闪,想出了这个办法,终于可以实现了,还是很有成就感的,而且网上还都搜不到。