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函数表示。要自定义表单呈现方式的任何部分,用户只需覆盖相应的函数。
答案 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);