Skip to content

区块函数 {/programmers/plugins/plugins-block-functions/}

void

smarty_block_

name

array

\$params

mixed

\$content

object

\$template

boolean

&\$repeat

区块函数的形式为:{func} .. {/func}。换句话说,它们包围了一个模板区块并对这个区块的内容进行操作。区块函数优先于同名的自定义函数,也就是说,你不能同时拥有自定义函数 {func} 和区块函数 {func}..{/func}

  • 默认情况下,你的函数实现会被 Smarty 调用两次:一次是在开放标签,一次是在关闭标签。(参见下面的 $repeat 如何改变这个。)

  • 从 Smarty 3.1 开始,开放标签调用的返回值也会被显示出来。

  • 只有区块函数的开放标签可能有属性。所有从模板传递给模板函数的属性都包含在 $params 变量中,作为一个关联数组。开放标签的属性在处理关闭标签时也可以访问到你的函数。

  • $content 变量的值取决于你的函数是在开放标签还是关闭标签时被调用。在开放标签的情况下,它将是 NULL,在关闭标签的情况下,它将是模板区块的内容。注意,模板区块已经被 Smarty 处理过了,所以你收到的只是模板输出,而不是模板源代码。

  • 参数 $repeat 是通过引用传递给函数实现的,并为其提供了一个控制区块显示次数的可能性。默认情况下,$repeat 在区块函数的第一次调用(开放标签)时为 TRUE,在所有后续的区块函数调用(区块的关闭标签)时为 FALSE。每次函数实现返回并带有 $repeat 为 TRUE 时,{func}...{/func} 之间的内容就会被评估,并且函数实现会再次被调用,新的区块内容会在参数 $content 中。

如果你有嵌套的区块函数,可以通过访问 $smarty->_tag_stack 变量来找出父区块函数是什么。只需对其进行 var_dump() ,结构应该就很明显了。

<?php
/*
 * Smarty 插件
 * -------------------------------------------------------------
 * 文件:     block.translate.php
 * 类型:     block
 * 名称:     translate
 * 目的:  翻译一段文字
 * -------------------------------------------------------------
 */
function smarty_block_translate($params, $content, Smarty_Internal_Template $template, &$repeat)
{
    // 只在关闭标签时输出
    if(!$repeat){
        if (isset($content)) {
            $lang = $params['lang'];
            // 在这里使用 $content 做一些智能翻译的事情
            return $translation;
        }
    }
}
?>

参见:registerPlugin(), unregisterPlugin().