区块函数 {/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;
}
}
}
?>