1

在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){ 提取($params); // $html= ' {include file="tke-pre_bid_scopeworkModules/Section1_Factory_to_Price_Optional_Configurat‌​ion.tpl"} ' ; 返回 $html; }

{RenderHtml 数=12}

4

2 回答 2

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');
}
于 2012-07-03T13:28:10.340 回答
1

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

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

(以上为Smarty 3)

于 2012-07-03T12:21:41.643 回答