Smarty:评估存储在PHP变量中的模板

时间:2010-11-30 14:55:17

标签: php smarty

我有一个php变量,里面有html / smarty代码

$x='<a href="{$link}" >{$title}</a>';

这个数据是从数据库中获取的,我想用smarty对它进行评估,然后将输出放到php变量中(将其打印出来或再次保存到数据库中)。

由于

编辑:

我希望使用smarty评估X的内容,就好像x的内容存储在file.tpl中然后$ y = $ smarty-&gt; fetch('file.tpl'); ...想要这样做而不需要将x的内容保存到文件中

5 个答案:

答案 0 :(得分:13)

如果你正在使用Smarty 3,你可以通过

轻松完成
$smarty->fetch('string:'.$template_string);

'eval:'.$template_string。 更多关于manual

的内容

答案 1 :(得分:5)

如果您没有使用Smarty 3并且没有字符串/ eval资源,则可以使用Smarty eval plugin。我发现这比创建自定义资源简单得多,问题也少得多。

$template = "put some {$variables} in here"
require_once( $smarty->_get_plugin_filepath( 'function', 'eval' ));
$compiled = smarty_function_eval(array('var'=>$template), $smarty);

答案 2 :(得分:4)

上面的例子都没有对我有用,可能是因为我们现在正在使用旧版本的smarty。对我们有用的解决方案是创建一个模板,我们称之为eval.tpl,其中仅包含以下行:

{eval var=$string}

然后,当我们想要评估字符串时,我们可以简单地使用以下内容:

$smarty->assign('string', $string);
$result = $smarty->fetch('eval.tpl');

答案 3 :(得分:2)

请参见“示例15.9。使用自定义资源”: http://www.smarty.net/docsv2/en/template.resources

答案 4 :(得分:2)

如果我关注你,你的意思是整个字符串都在数据库中,也就是说,{$ link}作为字符串的一部分。我不确定它是多么巧妙,但在我看来,如果它甚至可以做到这一点,那个字符串将必须运行eval()。 (除非smarty正在做一些我缺少的时髦,但是,我再也没有聪明的工作)

这意味着你在这里设置了一个非常不安全的设置。如果您的数据库遭受SQL注入,您的整个服务器可能会受到损害。

将这些硬编码到应用程序中的文件运行起来不是一个巨大的安全问题,因为您可以控制调用.tpl的代码,并且您可以控制.tpl本身。这是对eval的“安全”使用,因为您必须对服务器进行一些严格的访问才能够利用它,这种访问才是利用它的原因。

但是一旦你从数据库访问这些数据,可能是某些管理系统允许你添加新的动态模板,你就已经在你的系统中创建了一个攻击者可能潜入的窗口。