我已经为我的CMS创建了一个自定义函数smarty:
{$page->title|inter}所以,这个标签,当它被解释时,调用我的自定义函数smarty_modifier_inter,检索html代码,执行一些操作,然后返回它。
在这个html中,我可以有其他的智能标签。但是,我明白了,如果一个函数smarty返回了smarty代码,那么这个smarty代码就不会被解释...
所以,在我的页面上有一个像{$page->title|inter}这样的标签没有被解释。
你有什么想法吗?谢谢!
发布于 2013-04-16 13:09:15
我猜你的意思是smarty_modifier_inter()返回聪明的代码,而你希望这个聪明的代码能被自己解析?Smarty只会为每个修饰符解析一次模板,所以它不会解析返回的smarty标签(实际上我假设它会在原始模板主体上运行所有函数,所以它不会解析任何返回的smarty标签)。
实现你想要的东西的一种方法是在你的修饰符中实现递归。例如,假设您的修饰符如下所示:
function smarty_modifier_inter($string)
{
$html = some_function($string); //This may contain a smarty tag, such as {$page->title|inter}
return $html;
}您可以将其更改为如下所示:
function smarty_modifier_inter($string)
{
$html = some_function($string); //This may contain a smarty tag, such as {$page->title|inter}
if (preg_match("/".preg_quote("{$")."/", $html)) { //A very quick and dirty way to see if there are any smarty variables within your template
$html = smarty_modifier_inter($html); //This may contain a smarty tag, such as {$page->title|inter}
}
return $html;
}这将对您的字符串重复运行smarty_modifier_inter,直到它不再包含smarty变量。显然,这很容易出现无穷无尽的循环,所以请谨慎使用!
如果您确定将会有一个级别的递归,那么您最多可以在数据上再次运行一次函数
发布于 2013-04-17 02:14:36
Smarty函数是一种从输入( Smarty模板)转到输出(通常是HTML)的方法;它们不是生成递归呈现的更多Smarty代码的方法。
您也许能够使用pre-filter做您想做的事情,它在Smarty本身处理之前在Smarty模板源代码上运行,但这并不像编写自定义函数那么容易。
更有希望的是,Smarty3包含一个string: resource,它允许您呈现一个字符串,就像它是模板的内容一样。
因此,在您的自定义函数中,可能会有如下内容:
function smarty_function_get_more_smarty($params, $smarty_instance)
{
$code = get_code_from_somewhere($params['foo'], $params['bar']);
// $code might be something like '<h1>My Awesome Site - {$title}</h1>'
return $smarty_instance->fetch('string:' . $code);
}请注意,我没有测试过这段代码,也没有使用过这一特性,所以请阅读手册中的转义选项,以及string:和eval:之间的区别。
此外,尽管从表面上看这并不是显式的递归,但如果$code以另一个对同一自定义函数的调用而结束,那么您将以相同的函数结束,因此请确保以某种方式防止无限递归!
https://stackoverflow.com/questions/16015699
复制相似问题