🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 【字段添加·思路分析】 > 涉及两个数据表(models_field和test) 模板中获取模型ID的方法:控制器中有id(为modelid)形参,所以{:input('id',0)}直接获取即可 Db类更新用update方法 模型model类更新用save方法,但必须调研isUpdate方法 模型model类添加也是用save方法 ## 【打开缓冲区·读取内容】 ~~~ // 参数设置,返回json格式,需调取不同字段模板文件 public function field_setting($fieldtype=''){ //打开缓冲区 ob_start(); //引入字段模板文件 include APP_PATH . 'admin/view/models_field/setting/' . $fieldtype . '/field_add.html'; $data_setting = ob_get_contents(); //清空缓冲区并关闭输出缓冲 ob_end_clean(); //转数组格式 $settings = array('setting'=>$data_setting); echo json_encode($settings); } ~~~ ## 【input接收数组,变量修饰符/a】 > input('post.sort/a') ~~~ if(request()->isPost()){ foreach (input('post.sort/a') as $key => $value) { Db::name('models_field')->where('id',$key)->update(['sort'=>$value]); } return success('排序更新成功!',url('index',array('tab'=>$tab,'id'=>$id))); } ~~~ ## 【返回模型管理·选项卡】 ~~~ <li><a href="{:url('models/index')}"> <i class="fa fa-mail-reply text-navy"></i>返回模型管理 </a></li> ~~~ # 【二级联动·参数设置·点击事件】 > 模板代码: ~~~ <div class="form-group"> <label class="col-sm-2 control-label">字段类型</label> <div class="col-sm-10"> <select class="form-control m-b" name="formtype" onchange="field_setting(this.value)"> <option value="" selected>≡ 请选择字段类型 ≡</option> <option value="text">单行文本</option> <option value="textarea">多行文本</option> <option value="editor">编辑器</option> <option value="box">选项</option> <option value="image">图片</option> <option value="images">多图片</option> <option value="number">数字</option> <option value="datetime">日期和时间</option> <option value="downfile">单文件上传</option> <option value="downfiles">多文件上传</option> </select> </div> </div> ~~~ > 二级联动显示位置: ~~~ <div class="form-group"> <label class="col-sm-2 control-label">参数设置</label> <div class="col-sm-10"> <div id="setting"> </div> </div> </div> ~~~ > 底部加载: ~~~ <script> function field_setting(formtype){ $.getJSON("{:url('field_setting')}",{fieldtype:formtype},function(data){ $('#setting').html(data.setting); }); } </script> ~~~ > 语法: jQuery.getJSON(url,data,success(data,status,xhr))该函数是简写的 Ajax 函数 getJSON() 方法使用 AJAX 的 HTTP GET 请求获取 JSON 数据。 > 控制器代码: ~~~ public function field_setting($fieldtype=''){ echo json_encode($fieldtype);//模板中显示字符串信息 } ~~~ 下面,进一步完善二级联动内容: 首先,在models_field模板文件夹下新建setting文件夹 其次,在setting文件夹下面,新建text、textarea、editor、box、image、number、datetime、downfile等字段类型的文件夹 第三,在这些文件夹下新建文件field_add.html 第四,field_add.html文件中添加相应的代码内容(不同的字段有不同的属性) 以text字段类型为例,文件中属性: ~~~ <div class="col-md-12"> <div class="form-group"> <label class="col-sm-1 control-label">默认值</label> <div class="col-sm-11"> <input type="text" name="setting[defaultvalue]" class="form-control" value=""> </div> </div> <div class="form-group"> <label class="col-sm-1 control-label">密码框</label> <div class="col-sm-11"> <input type="radio" name="setting[ispassword]" value="1"> 是 <input type="radio" name="setting[ispassword]" value="0" checked> 否 </div> </div> </div> ~~~ > 控制器代码: ~~~ // 参数设置,返回json格式,需调取不同字段模板文件 public function field_setting($fieldtype=''){ //打开缓冲区 ob_start(); //引入字段模板文件 include APP_PATH . 'admin/view/models_field/setting/' . $fieldtype . '/field_add.html'; $data_setting = ob_get_contents(); //清空缓冲区并关闭输出缓冲 ob_end_clean(); //转数组格式 $settings = array('setting'=>$data_setting); echo json_encode($settings); } ~~~ > 添加新字段(控制器逻辑添加) ~~~ public function add(){ $data = input('post.'); //模型ID $modelid = $data['modelid']; //实例化字段模型 $modelsfieldModel = new ModelsFieldModel; if(request()->isPost()){ $resultId = $modelsfieldModel->addField($data); switch ($resultId) { case -1: return error('字段名已存在!'); break; case -2: return error('新字段添加失败!'); break; default: return success('新字段添加成功!',url('index',array('id'=>$modelid,'tab'=>1))); break; } } } ~~~ > 模型中添加字段方法(模型中业务添加) ~~~ //添加字段 public function addField($data){ //对字段参数进行序列化 $setting = $data['setting']; $data['setting'] = serialize($setting); if(isset($setting[defaultvalue])){ $defaultvalue = $setting[defaultvalue]; } //模型ID $modelid = $data['modelid']; //根据模型ID获取模型名 $modelname = Db::name('models')->where('id',$modelid)->value('tablename'); //获取数据表前缀 $dbPrefix = confix('database.prefix'); //获取副表名 $tablename = $dbPrefix.$modelname; //字段名 $fieldname = $data['field']; //检测当前模型下字段名是否重复 $count = Db::name('models_field')->where('field',$fieldname)->where('modelid',$modelid)->count(); if($count){ return -1; }else{ //添加新字段 $modelsfield = new ModelsField; if($modelsfield->allowField(true)->save($data)){ //添加副表字段 }else{ return -2; } } } ~~~ ## 【删除信息前弹出提示框·改写JS代码】 > layer.confirm有三个参数 layer.confirm('提示信息','图标',function(index){……点确定,则执行相应代码}); 完整代码: ~~~ $(document).ready(function(){ $('input[type="checkbox"]').on('ifChecked',function(){ $(this).val('1'); }); $('input[type="checkbox"]').on('ifUnchecked',function(){ $(this).val('0'); }); //隐藏特殊标签页 $(".nav-tabs li").click(function(){ if($(this).attr('id')!='showtab'){ $('#showtab').attr('style','display:none'); } }); $("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; }); }); ~~~