多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## 知识点 > * 1、函数:自动设置框架高度changeFrameHeight() 2、模型修正(副表中新增catid) 3、内容删除 4、公共函数 a、根据分类ID获取相应分类信息getCatInfoById() b、根据分类ID获取相应模型信息getModInfoById() 5、CheckBox全选与反选(iCheck插件) 6、批量删除 7、数据分页(Datatables插件) 8、插件DataTables表格插件使用 ## 一、常用函数:自动设置框架高度 ### 1、自动设置changeFrameHeight() #### html ~~~ <div class="col-sm-9"> <iframe id="iframe_content" src="{:url('content')}" style="width:100%;" frameborder="0" scrolling="atuo" onload="changeFrameHeight()"></iframe> </div> ~~~ #### JavaScript ~~~ <script> function changeFrameHeight() { document.getElementById("iframe_content").height = document.documentElement.clientHeight - 44; }; </script> ~~~ ### 2、窗体大小改变重新设置高度 ~~~ <script> window.onresize = function() { changeFrameHeight(); } </script> ~~~ ## 二、模型修正 > 一个模型对应一张表 一个模型有多个分类 模型表中必须有分类ID model_field 模型字段(主表) artic 模型表(副表) >新增:`catid` int(11) NOT NULL DEFAULT '0' COMMENT '分类ID', >位置:StudyFoxCMS.rar\public\data\sfox_newmodel.sql ~~~ -- DROP TABLE IF EXISTS `@cmsprefix@@cmstablename@`; -- CREATE TABLE `@cmsprefix@@cmstablename@` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `catid` int(11) NOT NULL DEFAULT '0' COMMENT '分类ID', `title` varchar(100) NOT NULL DEFAULT '' COMMENT '标题', `keywords` varchar(100) NOT NULL DEFAULT '' COMMENT '关键词', `tags` varchar(255) NOT NULL DEFAULT '' COMMENT 'TAGS', `description` varchar(255) NOT NULL DEFAULT '' COMMENT '摘要', `thumb` varchar(100) NOT NULL DEFAULT '' COMMENT '缩略图', `username` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名', `inputtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '发布时间', `url` varchar(100) NOT NULL DEFAULT '' COMMENT 'URL', `status` tinyint(2) NOT NULL DEFAULT '0' COMMENT '状态', `views` int(11) NOT NULL DEFAULT '0' COMMENT '浏览量', `order` int(11) NOT NULL DEFAULT '0' COMMENT '排序', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; ~~~ > content.php ~~~ public function content($id = 0){ if ($id) { // 获取相关分类信息 $catInfo = Db::name('category')->where('id',$id)->find(); //根据当前分类所属模型获取相应数据表 $modeldInfo = Db::name('models')->where('id',$catInfo['modelid'])->find(); $infoList = Db::name($modeldInfo['tablename'])->where('catid',$id)->select(); $this->assign('catname',$catInfo['catname']); $this->assign('infoList',$infoList); } return view(); } ~~~ ## 三、内容删除 ### 1、html ~~~ <a name="delete" href="{:url('delete',['catid'=>$vo.catid, 'id'=>$vo.id])}" title="删除"><i class="fa fa-trash-o text-navy"></i></a> ~~~ ### 2、php ~~~ // 单条删除 public function delete($catid = 0, $id = 0){ // 获取表名 $tablename = getModInfoById($catid, 'tablename'); if(Db::name($tablename)->where('id',$id)->delete()){ return success('删除成功!',url('content',['id'=>$catid])); }else{ return error('删除失败!'); } } ~~~ ~~~ // 批量删除 public function deleteAll(){ $catid = input('post.catid'); // 获取表名 $tablename = getModInfoById($catid, 'tablename'); if (empty(input('post.ids/a'))) { return error('请选中需要删除的数据!'); } foreach (input('post.ids/a') as $id => $value) { Db::name($tablename)->where('id',$id)->delete(); } return success('删除成功!',url('content',['id'=>$catid])); } ~~~ ## 四、公共函数 > 函数位置:D:\phpStudy\WWW\tp5\application\common.php ~~~ // 根据分类ID获取相应分类信息 function getCatInfoById($id=0, $field=''){ if($field == ''){ //获取单条数据 return Db::name('category')->where('id',$id)->find(); }else{ //获取某个字段 return Db::name('category')->where('id',$id)->value($field); } } // 根据分类ID获取相应模型信息 function getModInfoById($id=0, $field=''){ //模型ID、 $modelId = getCatInfoById($id, 'modelid'); if($field == ''){ //获取单条数据 return Db::name('models')->where('id',$modelId)->find(); }else{ //获取某个字段 return Db::name('models')->where('id',$modelId)->value($field); } } ~~~ ## 五、CheckBox全选与反选 >参考网址: iCheck插件的全选、反选、获取值操作 https://blog.csdn.net/ya_1249463314/article/details/78120939 ### 1.js包下载 http://www.jq22.com/jquery-info784 ### 2.插件文档 http://www.jq22.com/yanshi784 http://www.bootcss.com/p/icheck/ ### 3.引入js文件 ~~~ <link href="__ADMIN__/css/bootstrap.min14ed.css?v=3.3.6" rel="stylesheet"> <link href="__ADMIN__/css/plugins/iCheck/custom.css" rel="stylesheet"> <script src="__ADMIN__/js/jquery.min.js?v=2.1.4"></script> <script src="__ADMIN__/js/bootstrap.min.js?v=3.3.6"></script> <script src="__ADMIN__/js/plugins/iCheck/icheck.min.js"></script> ~~~ ### 4.html文件 ~~~ <input id="isCheckAll" type="checkbox" class="i-checks"> ~~~ ### 5.js实现 ~~~ <script> $(document).ready(function() { $(".i-checks").iCheck({ checkboxClass: "icheckbox_square-green", radioClass: "iradio_square-green", }); // 全选 $("#isCheckAll").on('ifChecked', function(event) { $('input').iCheck('check'); }); // 全不选 $("#isCheckAll").on('ifUnchecked', function(event) { $('input').iCheck('uncheck'); }) }); </script> ~~~ ## 六、批量删除 > 思路:内容ID要批量传递到控制器中去,控制器再循环删除对应的ID即可 ### 1、html部分 ~~~ <div class="ibox-content"> <form method="post" class="form-horizontal" action="{:url('deleteAll')}" data-type="ajax"> <input type="hidden" name="catid" value="{$infoList[0]['catid']}" /> <div class="row"> <div class="col-sm-8 m-b-xs"> <div class="btn-group hidden-xs" id="exampleTableEventsToolbar" role="group"> <button type="submit" class="btn btn-sm btn-outline btn-default" title="添加"> <i class="glyphicon glyphicon-plus" aria-hidden="true"></i> </button> <button type="submit" class="btn btn-sm btn-outline btn-default" title="删除"> <i class="glyphicon glyphicon-trash" aria-hidden="true"></i> </button> </div> </div> </div> <div class="table-responsive"> <table class="table table-striped"> <tbody> {volist name="infoList" id="vo"} <tr> <td> <input type="checkbox" class="i-checks" name="ids[{$vo.id}]"> </td> <td>{$vo.id}</td> <td>{$vo.title}</td> <td>{$vo.username}</td> <td>{$vo.inputtime}</td> <td>{$vo.views}</td> <td> <a href="{:url('index',['tab'=>3,'id'=>$vo.id])}" title="编辑"><i class="fa fa-edit text-navy"></i></a>&nbsp;&nbsp; <a name="delete" href="{:url('delete',['catid'=>$vo.catid, 'id'=>$vo.id])}" title="删除"><i class="fa fa-trash-o text-navy"></i></a> </td> </tr> {/volist} </tbody> </table> </div> </form> </div> ~~~ ### 2、php处理 ~~~ // 批量删除 public function deleteAll(){ $catid = input('post.catid'); // 获取表名 $tablename = getModInfoById($catid, 'tablename'); if (empty(input('post.ids/a'))) { return error('请选中需要删除的数据!'); } foreach (input('post.ids/a') as $id => $value) { Db::name($tablename)->where('id',$id)->delete(); } return success('删除成功!',url('content',['id'=>$catid])); } ~~~ ### 3、js实现 ~~~ $(document).on('submit','form[data-type=ajax]',function(){ //获取数据 var url = $(this).attr('action'); var data = $(this).serializeArray();//序列化表单元素 //弹出询问框 layer.confirm('您确定提交处理吗?',{icon:3, title:'提示'},function(index){ //异步提交 $.ajax({ type: "POST", dataType:"json", url:url, data:data, success:function(obj){ var icon_num = (obj.status==200) ? 1 : 2; if(obj.status==200 || obj.status==202){ layer.open({ content: obj.msg, btn: ['确定'], shade: 0.1, icon: icon_num, yes: function(index, layero){ if(obj.url){ location.href = obj.url; //跳转指定地址 }else{ layer.close(index); } }, cancel: function(){ if(obj.url){ location.href = obj.url; //跳转指定地址 }else{ layer.close(); } }, }); } }, error:function(data){ layer.alert('网络故障!'); } }); }); return false; }); ~~~ ## 七、数据分页 ### (一)tp5官网分页(简单) #### 1、php ~~~ public function content($id = 0) { if($id){ // 获取表名 $tablename = getModInfoById($id, 'tablename'); $infoList = Db::name($tablename)->where('catid',$id)->paginate(10); $catname = getCatInfoById($id, 'catname'); $this->assign('catname',$catname); $this->assign('infoList',$infoList); } return view(); } ~~~ #### 2、html ~~~ <tr><td> {$infoList->render()} </td></tr> ~~~ #### 3、缺点 每点击分页,都要刷新一次页面;而我们不想刷新页面,就要用ajax,也就是用下面这种方法。 ### (二)异步无刷新分页(Datatables) Datatables是一款jquery表格插件。它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能。 #### 1、官网中文 http://www.datatables.club/ #### 2、引入文件 ~~~ <link href="__ADMIN__/css/plugins/dataTables/dataTables.bootstrap.css" rel="stylesheet"> <link href="__ADMIN__/css/admin.css" rel="stylesheet"> <script src="__ADMIN__/js/plugins/dataTables/jquery.dataTables.js"></script> <script src="__ADMIN__/js/plugins/dataTables/dataTables.bootstrap.js"></script> ~~~ #### 3、html ~~~ <div class="table-responsive"> <table id="dataTables-example" class="table table-striped">……</table> </div> ~~~ #### 4、初始化 ~~~ <script> $(document).ready(function() { $("#dataTables-example").dataTable(); }); </script> ~~~ ## 八、插件DataTables表格插件使用 ### (一)插件介绍 Datatables是一款jquery表格插件。它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能。 参考手册:http://www.datatables.club/reference/#options > 分页,即时搜索和排序 几乎支持任何数据源:DOM, javascript, Ajax 和 服务器处理 支持不同主题 DataTables, jQuery UI, Bootstrap, Foundation 各式各样的扩展: Editor, TableTools, FixedColumns …… 丰富多样的option和强大的API 支持国际化 超过2900+个单元测试 免费开源 开始使用DataTables很简单,只需要引入两个文件, 一个css样式文件和DataTables本身的脚本文件。在DataTables CDN上,可以使用下面这两个文件: CSS:http://cdn.datatables.net/1.10.15/css/jquery.dataTables.min.css JS:http://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js 怎样简单地使用DataTables?使用下方简单的几行代码,一个方法初始化table ~~~ $(document).ready(function(){ $('#myTable').DataTable(); }); ~~~ ### (二)整合TP5使用 #### 1、html结构 ~~~ <div class="ibox-content"> <form method="post" class="form-horizontal" action="{:url('deleteAll')}" data-type="ajax"> <input type="hidden" name="catid" value="{$infoList[0]['catid']}" /> <div class="row"> <div class="col-sm-8 m-b-xs"> <!-- 添加和删除按钮 --> </div> </div> <div class="table-responsive"> <table id="dataTables-example" class="table table-striped"> <thead> <tr> <th>ID</th> <th>标题</th> </tr> </thead> </table> </div> </form> </div> ~~~ > 完整content.html ~~~ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>H+ 后台主题UI框架 - 树形视图</title> <meta name="keywords" content="H+后台主题,后台bootstrap框架,会员中心主题,后台HTML,响应式后台"> <meta name="description" content="H+是一个完全响应式,基于Bootstrap3最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术"> <link rel="shortcut icon" href="favicon.ico"> <link href="__ADMIN__/css/bootstrap.min14ed.css?v=3.3.6" rel="stylesheet"> <link href="__ADMIN__/css/font-awesome.min93e3.css?v=4.4.0" rel="stylesheet"> <link href="__ADMIN__/css/plugins/iCheck/custom.css" rel="stylesheet"> <link href="__ADMIN__/css/plugins/dataTables/dataTables.bootstrap.css" rel="stylesheet"> <link href="__ADMIN__/css/animate.min.css" rel="stylesheet"> <link href="__ADMIN__/css/style.min862f.css?v=4.1.0" rel="stylesheet"> <link href="__ADMIN__/css/admin.css" rel="stylesheet"> </head> <body class="gray-bg"> <div class="ibox float-e-margins"> <div class="ibox-title"> <h5>{$catname ? $catname : '暂无'}列表</h5> </div> <div class="ibox-content"> <form method="post" class="form-horizontal" action="{:url('deleteAll')}" data-type="ajax"> <input type="hidden" name="catid" value="{$infoList[0]['catid']}" /> <div class="table-responsive"> <table id="dataTables-example" class="table table-striped"> <thead> <tr> <th><input id="isCheckAll" type="checkbox" class="i-checks"></th> <th>ID</th> <th>标题</th> <th>发布人</th> <th>发布时间</th> <th>浏览量</th> <th>操作</th> </tr> </thead> </table> </div> </form> </div> </div> <script src="__ADMIN__/js/jquery.min.js?v=2.1.4"></script> <script src="__ADMIN__/js/bootstrap.min.js?v=3.3.6"></script> <script src="__ADMIN__/js/plugins/dataTables/jquery.dataTables.js"></script> <script src="__ADMIN__/js/plugins/dataTables/dataTables.bootstrap.js"></script> <script src="__ADMIN__/js/content.min.js?v=1.0.0"></script> <script src="__ADMIN__/js/plugins/iCheck/icheck.min.js"></script> <script> $(document).ready(function() { $("#dataTables-example").dataTable({ "serverSide": true, "ajax": { "url": "{:url('getDataTables',['id'=>input('id')])}", "data": function(d) { d.extra_search = "title|username"; } }, "ordering": false, //禁用全局排序 "order": [0, '`order` desc'], "lengthMenu": [5, 10, 20, 50, 100], // "dom": '<l <"#normalToos">f>t<ip>', "dom": "<'row'<'#normalToos.col-xs-4'><'col-xs-8'f>>" + "<'row'<'col-xs-12't>>" + "<'row'<'col-xs-6'li><'col-xs-6'p>>", "language": { "zeroRecords": "没有检索到数据", "lengthMenu": "每页 _MENU_ 条记录&nbsp;&nbsp;", "search": "搜索 ", "info": "共 _PAGES_ 页,_TOTAL_ 条记录,当前显示 _START_ 到 _END_ 条", "paginate": { "previous": "上一页", "next": "下一页", } }, "columns": [{ render: function(data, type, row, meta) { return '<input type="checkbox" class="i-checks" name="ids[' + row.id + ']">'; } }, { data: "id" }, { data: "title" }, { data: "username" }, { data: "inputtime" }, { data: "views" }, { data: "operate" }, ], "drawCallback": function() { normal_init(); }, "initComplete": function() { $("#normalToos").append("<div class='m-b-xs'>" + "<div class='btn-group hidden-xs' id='exampleTableEventsToolbar' role='group'>" + "<button type='submit' class='btn btn-sm btn-outline btn-default' title='添加'>" + "<i class='glyphicon glyphicon-plus' aria-hidden='true'></i></button>" + "<button type='submit' class='btn btn-sm btn-outline btn-default' title='删除'>" + "<i class='glyphicon glyphicon-trash' aria-hidden='true'></i></button></div></div>"); } }); }); </script> <script src="__ADMIN__/js/plugins/layer/layer.min.js"></script> <script src="__ADMIN__/js/layer_hplus.js"></script> </body> </html> ~~~ #### 2、js实现 ~~~ <script> $(document).ready(function() { $("#dataTables-example").dataTable({ "serverSide": true, "ajax": { "url": "{:url('getDataTables',['id'=>input('id')])}", "data": function(d) { d.extra_search = "title|username"; } }, "ordering": false, //禁用全局排序 "order": [0, '`order` desc'], "lengthMenu": [5, 10, 20, 50, 100], // "dom": '<l <"#normalToos">f>t<ip>', "dom": "<'row'<'#normalToos.col-xs-4'><'col-xs-8'f>>" + "<'row'<'col-xs-12't>>" + "<'row'<'col-xs-6'li><'col-xs-6'p>>", "language": { "zeroRecords": "没有检索到数据", "lengthMenu": "每页 _MENU_ 条记录&nbsp;&nbsp;", "search": "搜索 ", "info": "共 _PAGES_ 页,_TOTAL_ 条记录,当前显示 _START_ 到 _END_ 条", "paginate": { "previous": "上一页", "next": "下一页", } }, "columns": [{ render: function(data, type, row, meta) { return '<input type="checkbox" class="i-checks" name="ids[' + row.id + ']">'; } }, { data: "id" }, { data: "title" }, { data: "username" }, { data: "inputtime" }, { data: "views" }, { data: "operate" }, ], "drawCallback": function() { normal_init(); }, "initComplete": function() { $("#normalToos").append("<div class='m-b-xs'>" + "<div class='btn-group hidden-xs' id='exampleTableEventsToolbar' role='group'>" + "<button type='submit' class='btn btn-sm btn-outline btn-default' title='添加'>" + "<i class='glyphicon glyphicon-plus' aria-hidden='true'></i></button>" + "<button type='submit' class='btn btn-sm btn-outline btn-default' title='删除'>" + "<i class='glyphicon glyphicon-trash' aria-hidden='true'></i></button></div></div>"); } }); }); </script> ~~~ #### 3、php处理 ~~~ // datatables插件请求地址 public function getDataTables($id = 0) { // 请求数据 // draw:1 请求次数 // columns[0][data]:0 设置列的数据源,即如何从整个Table的数据源(object / array)中获得 // columns[0][name]: 为列设定一个别名 // columns[0][searchable]:true 在该列上允许或者禁止过滤搜索记录 // columns[0][orderable]:true 在该列上允许或者禁止排序功能 // columns[0][search][value]: 该列的搜索条件 // columns[0][search][regex]:false 允许或者禁止对在搜索字符串中出现的正则表达式字符强制编码 // order[0][column]:0 指定排序的列 // order[0][dir]:asc 指定排序列的方式:升序或降序 // start:0 起始下标 // length:10 每页记录数 // search[value]: 全局搜索条件 // search[regex]:false 允许或者禁止对在搜索字符串中出现的正则表达式字符强制编码 // 返回数据 // "draw": 请求次数 // "recordsTotal": 数据总数 // "recordsFiltered": 过滤之后的记录总数 // "data": 返回数据 if($id){ //获取请求过来的数据 $getParam = request()->param(); $draw = $getParam['draw']; //排序 $orderSql = $getParam['order'][0]['dir']; //自定义查询参数 $extra_search = $getParam['extra_search']; // 获取表名 $tablename = getModInfoById($id, 'tablename'); // 总记录数 $recordsTotal = Db::name($tablename)->where('catid',$id)->count(); //过滤条件后的总记录数 $search = $getParam['search']['value']; $recordsFiltered = strlen($search) ? Db::name($tablename)->where('catid',$id)->where($extra_search,'like','%'.$search.'%')->count() : $recordsTotal; //分页 $start = $getParam['start']; //起始下标 $length = $getParam['length']; //每页显示记录数 //根据开始下标计算出当前页 $page = intval($start/$length) + 1; $config = ['page'=>$page, 'list_rows'=>$length]; $list = Db::name($tablename)->where('catid',$id)->where($extra_search,'like','%'.$search.'%')->order($orderSql)->paginate(null,false,$config); $lists = []; if(!empty($list)){ foreach ($list as $key => $value) { $lists[$key] = $value; $lists[$key]['operate'] = "<a href='". url('index',['id'=>$value['id']]) ."' title='编辑'><i class='fa fa-edit text-navy'></i></a>&nbsp;&nbsp; <a name='delete' href='". url('delete',['id'=>$value['id'], 'catid'=>$value['catid']]) ."' title='删除'><i class='fa fa-trash-o text-navy'></i></a>"; } } } else{ $draw = 1; $recordsTotal = 0; $recordsFiltered = 0; $lists = []; } $data = array( "draw"=>$draw, "recordsTotal"=>$recordsTotal, //数据总数 "recordsFiltered"=>$recordsFiltered, //过滤之后的记录总数 "data"=>$lists ); echo json_encode($data); ~~~ #### 4、layer_hplus.js(第二版) ~~~ $(document).on('submit','form[data-type=ajax]',function(){ //获取数据 var url = $(this).attr('action'); var data = $(this).serializeArray();//序列化表单元素 //弹出询问框 layer.confirm('您确定提交处理吗?',{icon:3, title:'提示'},function(index){ //异步提交 $.ajax({ type: "POST", dataType:"json", url:url, data:data, success:function(obj){ var icon_num = (obj.status==200) ? 1 : 2; if(obj.status==200 || obj.status==202){ layer.open({ content: obj.msg, btn: ['确定'], shade: 0.1, icon: icon_num, yes: function(index, layero){ if(obj.url){ location.href = obj.url; //跳转指定地址 }else{ layer.close(index); } }, cancel: function(){ if(obj.url){ location.href = obj.url; //跳转指定地址 }else{ layer.close(); } }, }); } }, error:function(data){ layer.alert('网络故障!'); } }); }); return false; }); function normal_init() { $(".i-checks").iCheck({ checkboxClass: "icheckbox_square-green", radioClass: "iradio_square-green", }); $("#isCheckAll").on('ifChecked', function(event) { $('input').iCheck('check'); }); $("#isCheckAll").on('ifUnchecked', function(event) { $('input').iCheck('uncheck'); }); $('input[type="checkbox"]').on('ifChecked', function() { $(this).val('1'); }); $('input[type="checkbox"]').on('ifUnchecked', function() { $(this).val('0'); }); $("a[name='delete']").click(function(){ //获取数据 var url = $(this).attr('href'); //弹出询问框 layer.confirm('您确定要删除数据吗?',{icon:3, title:'提示'},function(index){ //异步提交 $.ajax({ type: "POST", dataType:"json", url:url, data:null, success:function(obj){ var icon_num = (obj.status==200) ? 1 : 2; if(obj.status==200 || obj.status==202){ layer.open({ content: obj.msg, btn: ['确定'], shade: 0.1, icon: icon_num, yes: function(index, layero){ if(obj.url){ location.href = obj.url; //跳转指定地址 }else{ layer.close(index); } }, cancel: function(){ location.href = obj.url; //跳转指定地址 }, }); } }, error:function(data){ layer.alert('网络故障!'); } }); }); return false; }); } $(document).ready(function(){ normal_init(); //隐藏特殊标签页 $(".nav-tabs li").click(function(){ if($(this).attr('id')!='showtab'){ $('#showtab').attr('style','display:none'); } }); }); ~~~