[英]Smarty function return a smarty tag which is not interpreted
我为CMS创建了一个自定义函数smarty:
{$page->title|inter}
因此,在解释此标记后,请调用我的自定义函数smarty_modifier_inter
,检索html代码,执行一些操作,然后将其返回。
在此html中,我可以使用其他smarty标签。 但是,我只是看到,如果一个聪明的函数返回聪明的代码,则不会解释这个聪明的代码...
因此,我在页面上有一个{$page->title|inter}
类的标签未解释。
你有什么想法? 谢谢!
我想您的意思是smarty_modifier_inter()返回smarty代码,并且您希望此smarty代码本身能够被解析? 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变量为止。 显然,这很容易造成无限循环,因此请谨慎使用!
如果您确定将进行单一级别的递归,则可以在数据上最多再运行一次函数
Smarty函数是从输入(Smarty模板)到输出(通常是HTML)的一种方法。 它们不是生成将以递归方式呈现的其他Smarty代码的方法。
您可以使用pre-filter来做您想做的事, 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
最终以相同的自定义函数的另一个调用结束,您将以相同的函数结束,因此请确保以某种方式防止无限递归!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.