繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM