Smarty函数返回一个不被解释的smarty标签

时间:2013-04-15 12:55:29

标签: php smarty

我为CMS创建了一个自定义功能:

{$page->title|inter}

所以,这个标签,当它被解释时,调用我的自定义函数smarty_modifier_inter,检索一个HTML代码,做一些动作,然后返回它。

在这个html中,我可以有其他聪明的标签。但是,我只是看,如果一个函数smarty返回smarty代码,这个聪明的代码不会被解释......

所以,我的页面上有{$page->title|inter}这样的标签没有被解释。

你有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

我想你的意思是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到你的字符串,直到它不再包含更聪明的变量。显然这很容易受到无限循环的影响,所以请谨慎使用!

如果你确定会有一个级别的递归,那么你最多可以再运行一次你的数据函数

答案 1 :(得分:0)

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最终再次调用相同的自定义函数,则最终会返回相同的函数,因此请确保保护以某种方式反对无限递归!