记录我工作学习生活中的点点滴滴......

ThinkPHP的模版替换引发的一处bug
发布于 开发框架
2013-04-01 10:19:13
4496
2

Thinkphp解析模版时加载一了一个Behavior->模板内容输出替换(相关文件ContentReplaceBehavior.class.php),在这里,将模版中__TMPL__,__ROOT__,之类的特殊字符全部替换成定义好的,方便进行前端制作。但是TP这里的顺序没有处理好,会产生一个很无奈的bug。

比如我在TP反馈的bug的帖子http://www.thinkphp.cn/bug/2143.html,标题我本意是“ThinkPHP的__TMPL__无法得到正确模版路径的bug“但是这里的__TMPL__却被解析了,成了“ThinkPHP的/Apps/home/Tpl/simple/无法得到正确模版路径的bug”,极其恼人。更甚至在官方的帮助文档中使用了!_ROOT_!来进行代替
1efad9ea7234898985324da2c1cc90cb.png

那么如何解决呢?既要保留这个功能,又不至于影响到正常内容输出。

首先找到这个Behavior是在那里调用的,我们查配置文件的tags.php可以看到

'view_filter'   =>  array(
    'ContentReplace', // 模板输出替换
    'TokenBuild',   // 表单令牌
    'WriteHtmlCache', // 写入静态缓存
    'ShowRuntime', // 运行时间显示
),

我们来看View.class.php的fetch方法

// 获取并清空缓存
$content = ob_get_clean();
// 内容过滤标签
tag('view_filter',$content);

这样就找到了,到这里我们也发现了问题所在,TP是先解析模版引擎,然后把所有内容在缓存区都解析完,在进行替换,这样就肯定会造成了我们上面的问题,而解决办法就是把这个替换移到前面,在解析模版引擎之后存入模版缓存之前进行。

问题已经找到了,在这里解决代码就不提供了,遇到同样问题的可以自己动手试一下!



分享本文到:
除非特殊注明,本文版权归原作者所有,欢迎转载!转载请注明版权以及本文地址,谢谢。
转载保留版权:Pakey's BLog >>开发框架 >>ThinkPHP的模版替换引发的一处bug
本文地址:http://www.pakey.net/blog/thinkphp-contentreplace-bug.html