smarty模板引擎,支持动态标签吗?

subendong 2010-08-04 02:27:49
现在我有一种需求:
<body>{{{EliteNews}}}</body>
这个“{{{}}}”里面的标签名(EliteNews)我是存入数据库的,与EliteNews对应的有SQL语句,模板内容。

LabelName:EliteNews
Sql:select top 5 title from news where IsElite=1
Template:{loop}{{title}}<br />{/loop}

我相信做过动态标签的,看到这里肯定明白我什么意思了。我要问的是smarty有处理动态标签的功能吗?
...全文
103 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dleno 2010-08-06
[Quote=引用 3 楼 subendong 的回复:]

谢谢2楼,还有没有更好的办法。
[/Quote]
不知道了,针对smarty暂时只想到这个办法。
想要提高效率的话,你就只有改smarty核心的东西了,不过改了过后估计就不是smarty了(改动很大,没弄它,太麻烦了,还不如象老大说的,另外找个适合的模板引擎来改)
回复
subendong 2010-08-04
4楼,你好,能推荐下解释性的模板引擎吗?
回复
xuzuning 2010-08-04
基本如是,或许可能可以在简单一点。
但是 Smarty 是编译型的模板引擎,实现你的需求开销太大
你的需求在解释型模板引擎较易实现
回复
subendong 2010-08-04
谢谢2楼,还有没有更好的办法。
回复
Dleno 2010-08-04
相当于要smarty解析两次。
但smarty只会解析一次。

折中的办法,给smarty加一个db属性,并设置该属性为你的db类的对象。
再加一个自定义的smarty\plugins函数。
如:

<?php
function smarty_function_execsql($params, &$smarty) {
$sql = rawurldecode($params["sql"]);//有需要的话,还可以有其他参数
$name = 'dbdata';

$query=$smarty->db->query($sql);
$dbdata = array();
while($rt = $smarty->db->fetch_array($query)){
$dbdata[]=$rt;
}
$smarty->assign(array($name => $dbdata));
}


?>

再在Smarty.class.php里增加一个方法,例如:parseMyPlugins(&$_source_content,$myPlugins)
更改Smarty.class.php里_compile_resource方法,读取到模板内容$_source_content后,
使用正则匹配"\{\{\{([^\}]*)\}\}\}"的内容。如结果为$myPlugins
$myPlugins中有结果才调用parseMyPlugins($_source_content,$myPlugins)
继续执行

parseMyPlugins大概如下:

function parseMyPlugins(&$_source_content,$myPlugins) {
//根据$myPlugins查出数据库里的对应的标签。得到结果数组$dbPlugins
foreach($dbPlugins as $plugins){
$parseString = "";
//为了不让语句里的引号与模板的引号起冲突,用rawurlencode编码
$parseString .= $this->left_delimiter.'execsql sql=\''.rawurlencode($plugins['Sql']).'\''.$this->right_delimiter;
//这里你的内容没有遵循smarty的规范,那你就只有再把它格式化为规范的写法,用到的数据变量名为dbdata
$plugins['Template'] = ********;
$parseString .= $plugins['Template'];
$_source_content = str_replace('{{{'.$plugins['LabelName'].'}}}',$parseString,$_source_content);//替换
}
}


正好也有这类似的需求,稍微研究了下,没有测试的哈。
回复
xuzuning 2010-08-04
你自己加呀
回复
发动态
发帖子
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
社区公告
暂无公告