TPL + Json + PHP = ?

本文介绍了一种文本处理方案TPL+JSPT,利用TPL进行文本解析与格式化,并结合JSON与PHP实现数据转换。具体流程包括使用TPL将文本转换为DOM结构,再用JSON格式化,最后通过PHP的强大功能将DOM转换为目标文本格式。

TPL + Json + PHP = TPL + JSPT

这里,JSPT 是我发明的名词。它代表了 Json PHP Transformations = Json (Data) + PHP (Transformation Template)。为什么有这个词,是因为这个世界上还有一个著名的词:XSLT = XSL Transformations = XML (Data) + XSL (Transformation Template)。

我介绍 TPL 时,曾经把文本处理分为I和O。其中I是Parser,即将文本Parse为内存DOM结构,其中O是Formmatter,即将内存DOM结构转换为文本。其实还有第三个角色,就是Data。这里补充说明下:

TPL: 是I(Parser)模块。它将文本转为DOM。

Json/XML/etc: 它们的定位是,作为DOM的文本规范。我称之为Data。其实它们仍然是文本,需要Parser和Formmatter来处理它。但是它们的特殊之处在于 通常它们被看作为程序之间的交互规范,是DOM的Presentation(或者Persistence)。

PHP/XSL/etc: 是O(Formatter)模块。它们将DOM转为文本。通常O模块还有另一个名字,叫模板引擎(Template Engine)。这个世界上有太多的模板引擎。如:

但我个人更倾向于认为,PHP才是世上最棒的模板引擎 ── 这根本就是这个语言的定位。任何额外的封装其实是画蛇添足。

当然,对TPL而言,它并不排斥任何组合。TPL + XSLT,还是 TPL + JSPT (Json + PHP),还是其他,你来决定。

TPL + JSPT (Json + PHP)如何工作?

TPL + JSPT可将任意两种文本格式进行相互转换。假设我们要将 TextA 转为 TextB。那么实际转换的流程是:

  • TextA 由 TPL 分析,Parse为内存中的DOM。
  • 内存中的DOM,由一个JsonFormmatter转为Json文本。
  • Json文本由PHP的JsonParser模块转为内存中的DOM。
  • 最后,使用PHP强悍的Formmatter能力,转换为TextB格式。

前两步由TPL库提供。后两步由PHP完成。TPL与PHP的交互通过Json文本。

一个TPL + JSPT的样例:prjconv

prjconv是一个工程转换器。它可以将各种源代码的工程格式彼此进行转换。

代码参见:http://winx.googlecode.com/svn/trunk/tpl/JSPT/

<!-- google_ad_section_end --> <!-- google_ad_section_start(weight=ignore) -->
<script type="text/html" id="ID-table-remove-status"> {{# if(d.state==2){ }} <label> <input type="radio" name="remove" value="1" title="是" lay-filter="TPL-remove"> <!-- <span>是</span> --> </label> <label> <input type="radio" name="remove" value="0" title="否" lay-filter="TPL-remove"> <!-- <span>否</span> --> </label> <a class="layui-btn layui-btn-xs layui-bg-orange" id="outupFile-accept" lay-event="upFile">上传</a> {{# } else if(d.state>1 && d.state<7) { }} <input type="checkbox" name="remove" title="是|否" lay-skin="switch" {{ d.remove == '0' ? '' : 'checked' }} disabled> {{# console.log(d.state); }} {{# if(d.state==3){ }} <input type="checkbox" name="filestate" value="{{= d.id }}" title="OK|审核" lay-skin="switch" lay-filter="TPL-filestate" data="{{ d.state }}" {{ d.file1_state == '0' ? '' : 'checked' }} > {{# }else if(d.state==4){ }} <input type="checkbox" name="filestate" value="{{= d.id }}" title="OK|审核" lay-skin="switch" lay-filter="TPL-filestate" data="{{ d.state }}" {{ d.file2_state == '0' ? '' : 'checked' }} > {{# }else if(d.state==5){ }} <input type="checkbox" name="filestate" value="{{= d.id }}" title="OK|审核" lay-skin="switch" lay-filter="TPL-filestate" data="{{ d.state }}" {{ d.file3_state == '0' ? '' : 'checked' }} > {{# } }} {{# } else if(d.state==7) { }} {{# if(d.remove==1){ }} <input type="checkbox" name="remove" value="{{= d.id }}" title="是|否" lay-skin="switch" {{ d.remove == '0' ? '' : 'checked' }} disabled> <a class="layui-btn layui-btn-xs layui-bg-orange" id="removeFile-accept" lay-event="upremoveFile">上传</a> {{# } else { }} <input type="checkbox" name="remove" value="{{= d.id }}" title="是|否" lay-skin="switch" lay-filter="TPL-remove"> {{# } }} {{# } else if(d.state==8) { }} {{# if(d.remove==1){ }} <input type="checkbox" name="remove" value="{{= d.id }}" title="是|否" lay-skin="switch" {{ d.remove == '0' ? '' : 'checked' }} disabled> <input type="checkbox" name="remove_file_state" value="{{= d.id }}" title="OK|审核" lay-skin="switch" lay-filter="TPL-remove_file_state" data="{{ d.remove_file_state }}" {{ d.remove_file_state == '1' ? 'checked' : '' }} > <!-- <a class="layui-btn layui-btn-xs layui-bg-orange" id="removeid" lay-event="removeid">上传</a> --> {{# } else { }} <input type="checkbox" name="remove" value="{{= d.id }}" title="是|否" lay-skin="switch" lay-filter="TPL-remove"> <input type="checkbox" name="remove_file_state" value="{{= d.id }}" title="OK|审核" lay-skin="switch" lay-filter="TPL-remove_file_state" data="{{ d.remove_file_state }}" {{ d.remove_file_state == '1' ? 'checked' : '' }} > {{# } }} {{# } else if(d.state==9) { }} <input type="checkbox" name="closed_state" value="{{= d.id }}" title="OK|审核" lay-skin="switch" lay-filter="TPL-closed_state" data="{{ d.state }}" {{ d.closed_state == '1' ? 'checked' : '' }} > {{# } }} </script> { field: 'operate', width: 150,fixed: 'right', title: '😊除账 |资料', templet: '#ID-table-remove-status' } // 工具栏事件 table.on('toolbar(test)', function (obj) { var id = obj.config.id; var checkStatus = table.checkStatus(id); var othis = lay(this); switch (obj.event) { case 'Audit': var checkStatus = table.checkStatus('test'); //test-table-index 即为基础参数 id 对应的值 --> checkData = checkStatus.data; //得到选中的数据 if (checkData.length === 0) { return layer.msg('请选择数据'); } var idsArray = []; for (var i = 0; i < checkStatus.data.length; i++) { idsArray.push(checkStatus.data[i].id); } var ids = idsArray.toString(); layui.layer.alert(ids); layer.confirm('确认提交吗', { icon: 3, title: '温馨提示' }, function () { var url = layui.setter.paths.base + 'api/APP/daiban/audit.php'; admin.req({ url: url, type: 'GET', data: { ids: ids}, dataType: "json", success: function (obj) { if (obj) { if (obj.code == 0) { layer.msg(obj.message, { icon: 1, time: 1500 }, function () { for (var i = 0; i < checkData.length; i++) { checkData[i].layuiTableChecked = false; // 移除选中状态属性 } table.reload('test', {}); }); } else if (obj.code == -1) { layer.msg(obj.message, { icon: 3, time: 3000 }); } } else { layer.msg('提交失败', { icon: 5, time: 3000 }); } }, error: function (e) { layer.msg('提交失败!', { icon: 5, time: 3000 }); }, }); }); break; 在提交审核时先判断两个单选按钮是否有选择,没有选择,不可提交
09-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值