1

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>

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

4

3 回答 3

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 输出,而是直接将其放入输出缓冲区。

于 2012-02-05T19:47:15.177 回答
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 插件的属性(参数)将被视为模板函数内的本地模板变量。

于 2012-02-05T21:48:39.693 回答
1

据我了解您的需求,您希望使用给定的已知参数调用命名方法。

为什么不使用这样的call_user_func_array电话:

call_user_func_array(array($template->smarty, $function), $args);
于 2012-02-05T20:01:43.653 回答