🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 【TP5·预览模型·思路分析】 [TOC] ## 知识点 > 1、制作静态模型预览模板(整合WebUploader、UEditor) 2、整合多图片上传插件WebUploader 3、整合编辑器(百度编辑器UEditor 1.4.3.3版本) 4、自动生成模型预览页面(根据模型字段自动生成) 5、定界符(<<<EOF ... EOF(必须顶格写);) 6、选项(box)字段预览思路理解 7、条件判断(两种方法)一是if....else...(条件三种以内);二是switch...case...(多条件) 8、回车键(\n)注意回车键必须在双引号之间才有用("\n") 9、循环中不显示某部分内容{volist name="forminfos" id="vo" key="k"}...{/volist}默认key为i ## 问题 > 1、异步删除不能正常使用(已解决:contentType:"application/x-www-form-urlencoded", ) 2、文本编辑器显示不出来(已解决:定义一个插件路径) ## 备注:$.ajax 中的contentType和dataType 参考网页:https://www.cnblogs.com/htoooth/p/7242217.html contentType 主要设置你发送给服务器的格式 dataType 设置你收到服务器数据的格式 在 jquery 的 ajax 中, contentType都是默认的值:application/x-www-form-urlencoded 这种格式的特点就是,name/value 成为一组,每组之间用 & 联接,而 name与value 则是使用 = 连接。 如: wwwh.baidu.com/q?key=fdsa&lang=zh 这是get 而 post 请求则是使用请求体,参数不在 url 中,在请求体中的参数表现形式也是: key=fdsa&lang=zh的形式。 ## 【循环中不显示某部分内容】 > 1、控制器获取记录总条数 $info为当前模型字段总条数 $this->assign('total_num',count($info)); > 2、模板中判断:当total_num不等于总条数,则输出虚线 ~~~ {volist name="forminfos" id="vo" key="k"} <div class="form-group" {eq name='vo.formtype' value='datetime'}id="data_1"{/eq}> <label class="col-sm-2 control-label">{$vo.name}</label> <div class="col-sm-10"> {$vo.form} </div> </div> {neq name="total_num" value="$k"}<div class="hr-line-dashed"></div>{/neq} {/volist} ~~~ ## 【自动生成模型预览页面】 ### 思路 > a、获取模型的字段 b、获取字段的类型 c、给类型写成函数(函数生成相应的模板) d、显示在模板中去 ### 1、控制器代码 ~~~ //获取当前模型字段$id为模型ID $modelsFieldArray = Db::name('models_field')->where('modelid',$id)->order('sort')->select(); //预览模型 foreach ($modelsFieldArray as $value) { //字段名 $field = $value['field']; //字段类型 $func = $value['formtype']; //判断函数是否存在$func为变量函数 //函数位置:当前模块下面的common.php文件 if(function_exists($func)){ //获取表单HTML代码 $form = $func($value); if($form != ''){ $info[$field] = array( 'name' => $value['name'], 'form' => $form, 'formtype' => $value['formtype'] ); } } } $this->assign('forminfos',$info); ~~~ ### 2、公共函数 ~~~ 函数文件位置:application/admin/common.php function text($fieldinfo){ //字段名 $field = $fieldinfo['field']; //反序列化设置项 $setting = unserialize($fieldinfo['setting']); //默认值 $value = $setting['defaultvalue']; //是否密码框 $type = "text"; if( $setting['ispassword'] ) { $type = "password"; } $form = <<<EOF <input id="info_$field" name="info[$field]" type="$type" class="form-control" value="$value"> EOF; return $form; } ~~~ 其它字段(变量函数,单独新建文件,见:TP模型管理之公共函数) ### 3、模板代码 ~~~ {volist name="forminfos" id="vo"} <div class="form-group"> <label class="col-sm-2 control-label">{$vo.name}</label> <div class="col-sm-10"> {$vo.form} </div> </div> <div class="hr-line-dashed"></div> {/volist} ~~~ ## 是否密码框 ~~~ $type = "text"; if( $setting['ispassword'] ) { $type = "password"; } <input type="$type" class="form-control" name="$field" value="$value"> ~~~ ## TP5整合相关插件 ### 整合多图片上传插件WebUploader #### 插件简介 WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。 在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+。 两套运行时,同样的调用方式,可供用户任意选用。 采用大文件分片并发上传,极大的提高了文件上传效率。 官网:http://fex.baidu.com/webuploader/ #### 快速入门 第一、插件位置:WWW\tp5\public\static\admin\plugins\webuploader-0.1.5 第二、引入资源:使用Web Uploader文件上传需要引入三种资源:JS, CSS, SWF。 ~~~ <!--引入CSS--> <link rel="stylesheet" type="text/css" href="webuploader文件夹/webuploader.css"> <!--引入JS--> <script type="text/javascript" src="webuploader文件夹/webuploader.js"></script> <!--SWF在初始化的时候指定,在后面将展示--> ~~~ 第三、图片上传 与普通文件上传相比,此demo演示了:文件过滤,图片预览,图片压缩上传等功能。 #### 代码介绍 > 1、Html 要实现如上demo,首先需要准备一个按钮,和一个用来存放添加的文件信息列表的容器。 ~~~ <!--dom结构部分--> <div id="uploader-demo"> <!--用来存放item--> <div id="fileList" class="uploader-list"></div> <div id="filePicker">选择图片</div> </div> ~~~ > 2、Javascript(创建Web Uploader实例) ~~~ // 初始化Web Uploader var uploader = WebUploader.create({ // 选完文件后,是否自动上传。 auto: true, // swf文件路径 swf: BASE_URL + '/js/Uploader.swf', // 文件接收服务端。 server: 'http://webuploader.duapp.com/server/fileupload.php', // 选择文件的按钮。可选。 // 内部根据当前运行是创建,可能是input元素,也可能是flash. pick: '#filePicker', // 只允许选择图片文件。 accept: { title: 'Images', extensions: 'gif,jpg,jpeg,bmp,png', mimeTypes: 'image/*' } }); ~~~ > 3、初始化代码修改 > 在BootStrap的tab组件中加入webuploader,如果不是默认页会出现点击无法弹出打开对话框, 解决方法即将初始化代码放在单独的函数中调用 ~~~ $('a[data-toggle="tab"]').on('shown.bs.tab',function(e){ var target = e.target.toString(); if(target.indexOf('tab-4')>0){ initWebUploader(); } }); ~~~ #### 知识点:Bootstrap 标签页(Tab)插件 参考网址:http://www.runoob.com/bootstrap/bootstrap-tab-plugin.html 标签页(Tab)在 Bootstrap 导航元素 一章中介绍过。通过结合一些 data 属性,您可以轻松地创建一个标签页界面。 通过这个插件您可以把内容放置在标签页或者是胶囊式标签页甚至是下拉菜单标签页中。 如果您想要单独引用该插件的功能,那么您需要引用 tab.js。 或者,正如 Bootstrap 插件概览 一章中所提到,您可以引用 bootstrap.js 或压缩版的 bootstrap.min.js。 > 用法 您可以通过以下两种方式启用标签页: 通过 data 属性:您需要添加 data-toggle="tab" 或 data-toggle="pill" 到锚文本链接中。 添加 nav 和 nav-tabs 类到 ul 中,将会应用 Bootstrap 标签样式,添加 nav 和 nav-pills 类到 ul 中,将会应用 Bootstrap 胶囊式样式。 > 事件 下表列出了标签页(Tab)插件中要用到的事件。这些事件可在函数中当钩子使用。 事件一:show.bs.tab 该事件在标签页显示时触发,但是必须在新标签页被显示之前。 分别使用 event.target 和 event.relatedTarget 来定位到激活的标签页和前一个激活的标签页。 ~~~ $('a[data-toggle="tab"]').on('show.bs.tab', function (e) { e.target // 激活的标签页 e.relatedTarget // 前一个激活的标签页 }) ~~~ #### webuploader 第二种样式 或将照片拖到这里,单次最多可选300张 参考网址:http://fex.baidu.com/webuploader/demo.html > 1、引入文件 ~~~ <link href="__ADMIN__/plugins/webuploader-0.1.5/xb-webuploader.css" rel="stylesheet"> <script type="text/javascript"> var BASE_URL = "__ADMIN__/plugins/webuploader-0.1.5"; </script> <script src="__ADMIN__/js/uploader.js"></script> <script src="__ADMIN__/plugins/webuploader-0.1.5/webuploader.js"></script> ~~~ > 2、html代码 ~~~ <div id="uploader" class="xb-uploader"> <div class="queueList"> <div class="placeholder"> <div class="filePicker"></div> <p>或将照片拖到这里,单次最多可选300张</p> </div> </div> <div class="statusBar" style="display:none;"> <div class="progress"> <span class="text">0%</span> <span class="percentage"></span> </div> <div class="info"></div> <div class="btns"> <div class="webuploader-container filePicker2"> <div class="webuploader-pick">继续添加</div> <div style="position: absolute; top: 0px; left: 0px; width: 1px; height: 1px; overflow: hidden;" id="rt_rt_1armv2159g1o1i9c2a313hadij6"> </div> </div> <div class="uploadBtn">开始上传</div> </div> </div> </div> ~~~ > 3、js代码 这里只张贴关键代码,JS初始化(实例化) ~~~ // 实例化 uploader = WebUploader.create({ pick: { id: "#uploader .filePicker", label: '点击选择文件', multiple : true }, dnd: "#uploader .queueList", paste: document.body, // accept: { // title: 'Images', // extensions: 'gif,jpg,jpeg,bmp,png', // mimeTypes: 'image/*' // }, // swf文件路径 swf: BASE_URL + '/Uploader.swf', disableGlobalDnd: true, chunked: true, server: "ajax_upload", fileNumLimit: 300, fileSizeLimit: 200 * 1024 * 1024, // 200 M fileSingleSizeLimit: 50 * 1024 * 1024 // 50 M }); ~~~ ### 整合编辑器(百度编辑器UEditor 1.4.3.3版本) #### 官方网站: http://fex.baidu.com/ueditor/ #### 思路分析 ~~~ <!-- 加载编辑器的容器 --> <script id="container" name="content" type="text/plain"> 这里写你的初始化内容 </script> <!-- 配置文件 --> <script type="text/javascript" src="ueditor.config.js"></script> <!-- 编辑器源码文件 --> <script type="text/javascript" src="ueditor.all.js"></script> <!-- 实例化编辑器 --> <script type="text/javascript"> var ue = UE.getEditor('container'); </script> ~~~ #### 代码实现 > 1、html代码 ~~~ <div class="form-group"> <label class="col-sm-2 control-label">编辑器</label> <div class="col-sm-10"> <script id="container" name="content" type="text/plain">雪狐网</script> <script src="__ADMIN__/plugins/ueditor1_4_3_3/ueditor.config.js"></script> <script src="__ADMIN__/plugins/ueditor1_4_3_3/ueditor.all.js"></script> <script> var um = UE.getEditor('container',{ initialFrameHeight:300, autoHeightEnabled:false, catchRemoteImageEnable:true }); </script> </div> </div> ~~~ 备注:编辑器插件很简单,就上面的代码即可