首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Smarty函数返回未解释的smarty标记

Smarty函数返回未解释的smarty标记
EN

Stack Overflow用户
提问于 2013-04-15 20:55:29
回答 2查看 374关注 0票数 0

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

代码语言:javascript
复制
{$page->title|inter}

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

在这个html中,我可以有其他的智能标签。但是,我明白了,如果一个函数smarty返回了smarty代码,那么这个smarty代码就不会被解释...

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

你有什么想法吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2013-04-16 13:09:15

我猜你的意思是smarty_modifier_inter()返回聪明的代码,而你希望这个聪明的代码能被自己解析?Smarty只会为每个修饰符解析一次模板,所以它不会解析返回的smarty标签(实际上我假设它会在原始模板主体上运行所有函数,所以它不会解析任何返回的smarty标签)。

实现你想要的东西的一种方法是在你的修饰符中实现递归。例如,假设您的修饰符如下所示:

代码语言:javascript
复制
function smarty_modifier_inter($string)
{
    $html = some_function($string);  //This may contain a smarty tag, such as {$page->title|inter}
    return $html;
}

您可以将其更改为如下所示:

代码语言:javascript
复制
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变量。显然,这很容易出现无穷无尽的循环,所以请谨慎使用!

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

票数 1
EN

Stack Overflow用户

发布于 2013-04-17 02:14:36

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

您也许能够使用pre-filter做您想做的事情,它在Smarty本身处理之前在Smarty模板源代码上运行,但这并不像编写自定义函数那么容易。

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

因此,在您的自定义函数中,可能会有如下内容:

代码语言:javascript
复制
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以另一个对同一自定义函数的调用而结束,那么您将以相同的函数结束,因此请确保以某种方式防止无限递归!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16015699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档