前段时间修改了一个老项目。客户让我把表格重新排序,按照医生的职称排序。因为客户的项目是医院的人事系统,考虑到整个医院有几千人,如果按照客户的要求一个一个的安排,我的腰都累死了……还好,这个时候,我想起来了我可以使用jqueryUi插件来实现这个功能。但是jqueryUi插件只能在当前页面排序,页面刷新恢复。于是研究了如何拖拽排序,并将排序永久保存到数据库中。我做了1小时并成功了。记录在这里,如果大家有更好的想法,欢迎不吝赐教。先下载jqueryUi插件,网上随便搜一下,这里略过。下载完成后,导入页面。只需添加一行代码:需要注意的是选择器要选择表格的tbody。许多配置参数可以添加到排序方法。有关详细信息,请参阅此插件文档。网上搜的也很多,比如菜鸟教程。现在只是在当前页面排序,但是数据库还是一样。下面是我将排序保存到数据库的方法。之前我的排序是根据数据表的ID值排序的,默认是倒序的。现在我可以在数据表中添加一个排序字段,也就是XX字段,来表示排序后的数字。每次拖拽完成后,利用本插件内置的update功能,通过ajax将每行排序后的id传给后台。在后台controller中接收后,遍历,将第一行数据的sort值改为key值+1。比如排序完成后,第一行数据ID值为8,则第二行数据ID为6,第三行为2,后台接收遍历时,必须先遍历ID为8的数据,则foreach中数据的key值必须为0,即即,$k为0,则将其排序改为$k+1为0+1等于1。同理,第二个数据的排序为$k+1为2,以此类推。那么就可以根据sort值正序排列了。下面是前端代码:$("#sorttbody").sortable({update:function(){varidArr=[];$("input[name='id']").each(function(){//遍历每一行ID值idArr.push($(this).val());//将排序后的数据ID一一压入数组})$.ajax({type:"POST",dataType:"json",url:"__URL__/staff/pinyong",数据:{idArr:idArr},success:function(data){layer.msg(data['msg'],{icon:1,time:2000});},error:function(request){console.log(request);}});}});这是个老项目,TP3写的,所以没有用TP5的写法,TP5只需要把url地址改成{:url(...)}的写法就可以了。后台代码:(也是TP3的写法,TP5只需要用model方法获取表模型,然后改save方法即可)publicfunctionpinyong(){if(IS_POST){//如果前端通过post发送数组,后台必须指定接收格式才能接收,否则会报错$arr=I('idArr/a');foreach($arras$k=>$v){M('pinyong')->where('id','eq',$v)->保存(['sort'=>$k+1]);}$this->success('排序成功');}else{$this->display();这样,前台每次拖拽排序都会触发update函数,然后将新排序的ID值用ajax发送给后台。后台收到后,按顺序重新修改排序值即可。这样就实现了一个简单的功能。欢迎拍砖。
