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 相关文章推荐
一页面多XMLHttpRequest对象
Jan 22 Javascript
js 操作select和option常用代码整理
Dec 13 Javascript
EditPlus注册码生成器(js代码实现)
Mar 25 Javascript
Jquery实现搜索框提示功能示例代码
Aug 13 Javascript
辨析JavaScript中的Undefined类型与null类型
May 26 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
Oct 09 Javascript
浅谈js数组和splice的用法
Dec 04 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
Mar 02 Javascript
Bootstrap警告框(Alert)插件使用方法
Mar 21 Javascript
JS仿Base.js实现的继承示例
Apr 07 Javascript
深入理解Vue2.x的虚拟DOM diff原理
Sep 27 Javascript
Three.js中矩阵和向量的使用教程
Mar 19 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
PHP扩展编写点滴 技巧收集
2010/03/09 PHP
php文件缓存类汇总
2014/11/21 PHP
php实现excel中rank函数功能的方法
2015/01/20 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
Bootstrap每天必学之下拉菜单
2015/11/25 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
完美解决IE不支持Data.parse()的问题
2016/11/24 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
security.js实现的RSA加密功能示例
2018/06/06 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
python算法学习之计数排序实例
2013/12/18 Python
Python实现多线程HTTP下载器示例
2017/02/11 Python
python中关于for循环的碎碎念
2017/06/30 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
python实现弹窗祝福效果
2019/04/07 Python
python自动发微信监控报警
2019/09/06 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
Python发送邮件实现基础解析
2020/08/14 Python
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
任课老师推荐信范文
2013/11/24 职场文书
安全事故检讨书
2014/01/18 职场文书
工作决心书
2014/03/11 职场文书
个人求职自荐信范文
2014/06/20 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
MySQL中in和exists区别详解
2021/06/03 MySQL