跳至内容

自定义块标签

区块标记是格式为 {func} .. {/func} 的标记。换句话说,它们包含一个模版区块,并操作该区块的内容。

如果名称相同的正常标记和区块功能同时存在,则区块功能优先,也就是说,你不能同时拥有自定义标记 {func} 和区块标记 {func}..{/func}

  • 默认情况下,你的功能实现由 Smarty 调用两次:一次是针对起始标记,一次是针对结束标记。(请参阅下文 $repeat 了解如何更改此设置。)

  • 只有区块的起始标记有属性。所有属性都包含在关联数组 $params 变量中。当处理结束标记时,也可以使用你的功能读到起始标记的属性。

  • $content 变量的值取决于你的功能是针对起始标记还是结束标记被调用的。如果是针对起始标记调用,则值为 NULL;如果是针对结束标记调用,则为模版区块的内容。请注意,模版区块将已被 Smarty 处理,因此你只收到模版的输出,而不是模版的源代码。

  • 参数 $repeat 按引用传递给函数实现,并为其提供控制块显示次数的一种可能性。默认情况下,在块函数(起始标签)的第一次调用中,$repeat 为 TRUE,在块函数(块的结束标签)的所有后续调用中为 FALSE。每当函数实现返回时,$repeat 为 TRUE,则会评估 {func}...{/func} 之间的内容,并使用参数 $content 中的新块内容再次调用函数实现。

示例

<?php

function smarty_block_translate($params, $content, \Smarty\Template $template, &$repeat) {
    // only output on the closing tag
    if (!$repeat){
        if (isset($content)) {
            $lang = $params['lang'];
            // do some intelligent translation thing here with $content
            return $translation;
        }
    }
}

$smarty->registerPlugin(Smarty\Smarty::PLUGIN_BLOCK, 'translate', 'smarty_block_translate');

现在可以在模板中使用如下所示

{translate lang='nl'}
    Quia omnis nulla omnis iusto est id et.
{/translate}