搜索
系统检测到您的用户名不符合规范:

thinkphp3.2.3 使用smarty3.1.29以后,需要加上一句行为操作

浏览:653 发布日期:2016年06月09日 分类:技术分享
Tp3.2.3 使用了模板引擎smarty3.1.29 以后,一些内置变量失效啦,

对比了内置的模板引擎和tp 编写的smarty驱动,

发现差别在于,tp内置的模板引擎编译模板文件前,会监听字符替换行为,即tp内置的模板默认会加载 ContentReplaceBehavior.class.php,

而tp的smarty驱动中,并没有关于相关的行为加载,

所以,只好在ThinkPHP/Library/Think/View.class.php 输出模板内容之前,加上字符替换行为,即在:第130附近的fetch() 方法中修改:


修改前:

// 获取并清空缓存
$content = ob_get_clean();
// 内容过滤标签
Hook::listen('view_filter',$content);
// 输出模板文件
return $content;


修改后:

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

//原来的tp3.2.3使用smarty3.1.29后,不替换模板变量,加上一句,行为操作,就可以了。我的修改,2016年06月09日
Hook::listen('template_filter',$content);

// 输出模板文件
return $content;


这样就可以让smarty输出 __ROOT__ 、 __URL__ 等常量了。



原理:
tp默认的模板引擎,会使用到ThinkPHP/mode/common.php中的配置项,

并且在tp默认的模板引擎ThinkPHP/Library/Think/Template.class.php

中的compliter()方法中的第130行:Hook::listen('template_filter', $tmplcontent);

调取ThinkPHP/mode/common.php中的template_filter行为,即:执行Behavior\ContentReplaceBehavior,而Behavior\ContentReplaceBehavior就是
ThinkPHP/Library/Behavior/ContentReplaceBehavior.class.php文件,在这个文件中有相关的字符替换。


但tp给的smarty模板驱动是ThinkPHP/Library/Think/Template/Drive/Smarty.class.php文件,而在这个文件中,只是简单的提供了将要输出的变量smarty模板引擎,并没有其他的操作。但最后输出和提交给smarty处理的程序是是 ThinkPHP/Library/Think/View.class.php。 所以,就在smarty编译数据之前,在view中先替换字符变量。

这样一来,就可以让smarty使用tp的部分内置变量了。


最佳答案
评论() 相关
后面还有条评论,
评论支持使用[code][/code]标签添加代码
您需要登录后才可以评论 登录 | 立即注册
收藏
50030
积分:1129 等级:LV3
热点推荐
(追記) (追記ここまで)
最新更新

我们

合作

网站

信息

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

AltStyle によって変換されたページ (->オリジナル) /