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 相关文章推荐
js post方式传递提交的实现代码
May 31 Javascript
jquery 缓存问题的几个解决方法
Nov 11 Javascript
javascript的函数作用域
Nov 12 Javascript
javascript实现实时输出当前的时间
Apr 27 Javascript
jQuery简单实现上下,左右滑动的方法
Jun 01 Javascript
教你快速搭建Node.Js服务器的方法教程
Mar 30 Javascript
微信小程序获取手机号授权用户登录功能
Nov 09 Javascript
Vue.js devtool插件安装后无法使用的解决办法
Nov 27 Javascript
基于vue.js中事件修饰符.self的用法(详解)
Feb 23 Javascript
详细分析Node.js 模块系统
Jun 28 Javascript
探索浏览器页面关闭window.close()的使用详解
Aug 21 Javascript
vue2和vue3的v-if与v-for优先级对比学习
Oct 10 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
PHP5 面向对象程序设计
2008/02/13 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
PHP反射实际应用示例
2019/04/03 PHP
PHP创建对象的六种方式实例总结
2019/06/27 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
一些mootools的学习资源
2010/02/07 Javascript
javascript实现yield的方法
2013/11/06 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
微信小程序页面调用自定义组件内的事件详解
2019/09/12 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
vue实现购物车的监听
2020/04/20 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
flask 实现token机制的示例代码
2019/11/07 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
python 操作excel表格的方法
2020/12/05 Python
css3进阶之less实现星空动画的示例代码
2019/09/10 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
图书室管理制度
2014/01/19 职场文书
学期自我评价
2014/01/27 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
公司开业主持词
2015/07/02 职场文书
Python数据类型最全知识总结
2021/05/31 Python
react中的DOM操作实现
2021/06/30 Javascript
golang连接MySQl使用sqlx库
2022/04/14 Golang
MySQL数据库简介与基本操作
2022/05/30 MySQL