fastadmin 可根据搜索条件改变的动态column表格

需求:因为要统计学校中每个学院每个年级的人数,且需要做备份处理。即会出现当前已经不在校的年级,根据哪一次备份进行查询,列为当次备份的各个年级。
举个例子,就比如说,今天我备份了一次学生数据记为“备份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以后就是加搜索条件了,在官方文档里有这样的一个事件

onLoadSuccessload-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]);
                                }
                            }
                        }
                    })

阉割了点代码,只放出了重要的部分。
这个需求着实是卡了我很多天,想了很多办法,头都秃了,今天早上灵光一闪,想出了这个办法,终于可以实现了,还是很有成就感的,而且网上还都搜不到。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值