Thinkphp模板没有解析直接原样输出的解决方法


Posted in Javascript onOctober 31, 2014

本文实例讲述了Thinkphp模板没有解析直接原样输出的解决方法。分享给大家供大家参考。具体如下:

一、问题:

最近在学习thinkphp模板了,但是发现模板页原样出来了,经过一番艰苦搜索终于找到解决方案。

二、解决方法:

很多人都碰到相同问题,在变量中赋值的字符串中包含的__ROOT__、__PUBLIC__、__APP__,这种字符的, 在模板中display出来的时候都被替换成了真实路径。话说是在写Timi文件管理系统的时候发现的这个问题。

从文件中把源码读出来输出到页面后发现,只要是TP的路径字符,都被替换成了真实路径。
比如:

$this->assign('fileContent',$fileContent);//$fileContent中包含__PUBLIC__“路径常量”字符。

 
页面输出后显示为真实路径/public/。
期间经过了多种尝试,比如assign的时候base64加密,模板输出的时候decode一下,发现没起作用。最后终于忍不住的看了下Tp这块的源码,发现在display方法的最后一步的时候通过调用tag方法把“Tp的路径常量”替换成真实路径的。在render方法之前都是正常的。

Thinkphp模板没有解析直接原样输出的解决方法

本来准备改下源码实现下面这位童鞋的需求方案的:
老大、这是临时解决方案还是最终方案?
不过我感觉在assign()方法里面加个判断还不错,
如果是$this->assign('','',false),则对内容不替换,原样输出。

结果,看完这块源码后才发现,不是那么容易,改动太大了。

最后另一位童鞋的回复,点出了最终解决方案:

“可以参考这里的内容:https://3water.com/article/54217.htm(模板替换)
 
有了模板替换规则后,页面上所有的__PUBLIC__ 字符串都会被替换,那如果确实需要输出__PUBLIC__ 字符串到模板呢,我们可以通过增加替换规则的方式,例如:

'TMPL_PARSE_STRING'  =>array(

         '--PUBLIC--' => '__PUBLIC__', // 采用新规则输出/Public字符串

)

这样增加替换规则后,如果我们要输出__PUBLIC__ 字符串,只需要在模板中添加--PUBLIC--,其他替换字符串的输出方式类似。

这样增加替换规则后,如果我们要输出__PUBLIC__ 字符串,只需要在模板中添加--PUBLIC--,其他替换字符串的输出方式类似。

于是乎,方案出炉:

在Tp的配置文件config.php中配置

'TMPL_PARSE_STRING' => array (//路径配置

       

        //Timi文件路径还原

        '--PUBLIC--' => '__PUBLIC__',

        '--APP--' => '__APP__',

        '--URL--' => '__URL__',

        '--ACTION--' => '__ACTION__',

        '--SELF--' => '__SELF__',

        '--INFO--' => '__INFO__',

        '--EXT--' => '__EXT__'

),

读出源码的时候正则替换一下“路径常量字符”__ROOT__为--ROOT--:
$fileContent=file_get_contents($filePath); 

$fileContent=htmlspecialchars(preg_replace('/__(.*?)__/is','--$1--',$fileContent));

然后TMPL_PARSE_STRING的配置在模板被解析的时候刚好替换回去,如下图所示:

Thinkphp模板没有解析直接原样输出的解决方法

于是乎,这个问题就“暂时”“完美”解决了。

希望本文所述对大家的ThinkPHP框架程序设计有所帮助。

Javascript 相关文章推荐
jquery 锁定弹出层实现代码
Feb 23 Javascript
javascript操作符"!~"详解
Feb 10 Javascript
jQuery中 prop() attr()使用详解
May 19 Javascript
JS简单编号生成器实现方法(附demo源码下载)
Apr 05 Javascript
JS读写CSS样式的方法汇总
Aug 16 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
Dec 08 Javascript
详解jQuery简单的表单应用
Dec 16 Javascript
JS基于面向对象实现的选项卡效果示例
Dec 20 Javascript
jQuery获取table表中的td标签(实例讲解)
Jul 28 jQuery
bootstrap treeview 扩展addNode方法动态添加子节点的方法
Nov 21 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
May 18 Javascript
vue 组件开发原理与实现方法详解
Nov 29 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
Oct 31 #Javascript
JsRender实用入门教程
Oct 31 #Javascript
JsRender for object语法简介
Oct 31 #Javascript
JsRender for index循环索引用法详解
Oct 31 #Javascript
javascript常用函数归纳整理
Oct 31 #Javascript
让html页面不缓存js的实现方法
Oct 31 #Javascript
js读取cookie方法总结
Oct 31 #Javascript
You might like
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
第四节--构造函数和析构函数
2006/11/16 PHP
你真的了解JavaScript吗?
2007/02/24 Javascript
htm调用JS代码
2007/03/15 Javascript
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
jquery自定义表格样式
2015/11/23 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
web打印小结
2017/01/11 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
tab栏切换原理
2017/03/22 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
2018/10/08 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
bootstrap-table+treegrid实现树形表格
2019/07/26 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
[02:10]DOTA2 TI10勇士令状玩法及不朽Ⅰ展示:焕新世界,如你所期
2020/05/29 DOTA
python实现哈希表
2014/02/07 Python
Python命令行解析模块详解
2018/02/01 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
解决pycharm安装后代码区不能编辑的问题
2018/10/28 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
python列表推导式入门学习解析
2019/12/02 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
python 5个实用的技巧
2020/09/27 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
省三好学生申请材料
2014/01/22 职场文书
初中中等生评语
2014/12/29 职场文书
全国助残日活动总结
2015/05/11 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书