如何在smarty引擎中重用代码?

时间:2012-07-03 12:19:31

标签: php function smarty

在smarty中,我遇到了这样的HTML代码。**

{section name=listAll loop=$scope} 
 (input id="a1" name="from" / >
 (input id="b1" name="from" / >
 (input id="c1" name="from" / >
{/section}

{section name=listAll loop=$scope} 
 (input id="a2" name="from" / >
 (input id="b2" name="from" / >
 (input id="c2" name="from" / >
{/section}

{section name=listAll loop=$scope} 
 (input id="a3" name="from" / >
 (input id="b3" name="from" / >
 (input id="c3" name="from" / >
{/section}

我可以将它转移到如下功能:

        function RenderControl($i)
        {
        return '
        {section name=listAll loop=$scope} 
         (input id="a$i" name="from" / >
         (input id="b$i" name="from" / >
         (input id="c$i" name="from" / >
        {/section}
        } ';

然后在tpl文件中调用它,如:

    {RenderControl i=1}
    {RenderControl i=2}
    {RenderControl i=3}

为什么以下内容无法用于smarty tpl?$ smarty-> register_function('RenderHtml','RenderHtml');函数RenderHtml($ params){extract($ params); // $ html ='{include file =“tke-pre_bid_scopeworkModules / Section1_Factory_to_Price_Optional_Configurat ion.tpl”}'; return $ html; }

{RenderHtml num = 12}

2 个答案:

答案 0 :(得分:2)

您可能正在寻找{function},您可以在模板中定义简单的可重复使用的文本生成器:

{function name=controls i=0}
  (input id="a{$i}" name="from" / >
  (input id="b{$i}" name="from" / >
  (input id="c{$i}" name="from" / >
{/function}

{controls i=1}
{controls i=2}
{controls i=3}

取决于您输入的结构,您甚至可能希望按照

的方式进行细化
{function name=controls i=0}
  {$fields = ["a", "b", "c"]}
  {foreach $fields as $field}
    (input id="{$field}{$i}" name="from" / >
  {/foreach}
{/function}

这是一个Smarty3功能。 Smarty2没有模板功能。您可以将上述{function}的内容提取到单独的文件中,并{include file="controls.tpl" i=1}。或者,正如@Brett所说,为它编写一个插件函数。


您的问题的第二部分是关于以下代码

$smarty->register_function('RenderHtml','RenderHtml');

function RenderHtml($params){ 
  extract($params); 
  $html= '{include file="tke-pre_bid_scopeworkModules/Section1_Factory_to_Price_Optional_Configurat‌​ion.tpl"}'; 
  return $html;
}

这将不包括您似乎期待的文件。无论这些插件函数返回什么,都会直接写入模板输出。没有什么可以阻止你按照

的方式做事了
function RenderHtml($params, &$smarty){ 
  // create new smarty instance
  $t = new Smarty();
  // copy all values to new instance
  $t->assign($smarty->get_template_vars());
  // overwrite whatever was given in params
  $t->assign($params);
  // execute the template, returning the generated html
  return $t->fetch('tke-pre_bid_scopeworkModules/Section1_Factory_to_Price_Optional_Configurat‌​ion.tpl');
}

答案 1 :(得分:1)

您可能需要http://www.smarty.net/docs/en/advanced.features.prefilters.tpl以确保在处理之前对代码进行评估,因此您可以像在示例中那样进行。

您也可以查看http://www.smarty.net/docs/en/plugins.tpl

(以上是Smarty 3)