在Smarty3中,从插件函数中调用由{function}标记定义的模板函数

时间:2012-02-05 19:00:17

标签: php symfony smarty smarty3

Smarty {call}内置函数能够调用{function}标记定义的模板函数。现在,我需要在插件函数中调用模板函数但,因为我只知道插件中的函数名称。

插件功能:

<?php

$smarty->registerPlugin('function', 'form_label', 'renderFormLabel');

function renderFormLabel($form, \Smarty_Internal_Template $template) {

    // find out which function to call based on the available ones
    $function = lookupTemplateFunction($template);

    $args = $form->getVariables();

    // How to call the Smarty template function with the given $args?
    // $html = $template->smarty->???($args); 

    //return $html;
}

模板:

<form action="submit.php" method="post">
    {form_label}
    ....
</form>

这是在Symfony2 Forms中支持SmartyBundle的努力。每个表单片段由Smarty函数表示。要自定义表单呈现方式的任何部分,用户只需覆盖相应的函数。

3 个答案:

答案 0 :(得分:3)

可以从插件内部调用模板函数。但我们最初确实计划了这个选项,所以如果启用或不启用缓存,目前API是不同的。这可能在将来的版本中也会发生变化。

假设您想要做类似的事情   {call name = test world ='hallo'} 来自插件:

if ($template->caching) {
   Smarty_Internal_Function_Call_Handler::call ('test',$template,array('world'=>'hallo'),$template->properties['nocache_hash'],false);
} else {
   smarty_template_function_test($template,array('world'=>'hallo'));
}

请注意,模板函数在调用插件的模板上下文中调用。调用模板中已知的所有模板变量都会在模板函数内自动识别。

模板函数不返回HTML输出,而是直接将其放入输出缓冲区。

答案 1 :(得分:2)

我应该在第一个答案中更加具体。 renderFormLabel的代码应如下所示:

function renderFormLabel($form, \Smarty_Internal_Template $template) {

    // find out which function to call based on the available ones
    $function = lookupTemplateFunction($template);

    if ($template->caching) {
        Smarty_Internal_Function_Call_Handler::call ('test',$template,$form,$template->properties['nocache_hash'],false);
    } else {
        smarty_template_function_test($template,$form);
    }
}

在这种情况下,$ form数组传递给renderFormLabel插件的属性(参数)将被视为模板函数中的本地模板变量。

答案 2 :(得分:1)

据我了解你的需要,你希望用给定的args调用一个命名方法。

为什么不使用call_user_func_array调用,如:

call_user_func_array(array($template->smarty, $function), $args);