0

我为我的 CMS 创建了一个自定义函数 smarty:

{$page->title|inter}

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

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

所以,我的页面上有一个{$page->title|inter}未解释的标签。

你有什么想法?谢谢!

4

2 回答 2

1

我想你的意思是 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 变量。显然,这很容易受到无限循环的影响,因此请谨慎使用!

如果您确定将有单级递归,那么您最多可以简单地在数据上运行您的函数一次

于 2013-04-16T05:09:15.400 回答
0

Smarty 函数是一种从输入(Smarty 模板)到输出(通常是 HTML)的方法;它们不是生成将递归呈现的更多 Smarty 代码的方法。

您可以使用pre-filter做您想做的事,它在 Smarty 自己处理之前在 Smarty 模板源上运行,但这并不像编写自定义函数那么容易。

更有希望的是,Smarty3 包含一个string:资源,它允许您呈现一个字符串,就好像它是模板的内容一样。

所以在你的自定义函数中,你可以有这样的东西:

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最终再次调用同一个自定义函数,您最终将回到同一个函数,因此请确保以某种方式防止无限递归!

于 2013-04-16T18:14:36.073 回答