2012-06-16 222 views
1

我遇到了一个有趣的问题。我需要使用Smarty模板内的一个Smarty模板。如何使用Smarty模板中的Smarty模板?

这是为什么。我为各种wiki网站使用相同的模板,每个网站都有自己的配置。该配置包含主模板的部分(如更改的标题和标题等)。

这里是一个简化的例子。我已经导致用户在所有网站共享的文件topic-list.template.html

<div id="topics"> 
    <h1>{$h1}</h1> 
    ... 
</div> 

正如你可以看到,这个模板文件包含<h1>标记,可自定义每个网站。

然后对每个网站的我有,看起来像这样(简体)一个配置文件:

$config = [ 
    "h1-titles" => [ 
     "topics" => "Showing Topics in {\$category}" 
    ] 
]; 

正如你所看到的配置文件中包含一个Smarty的模板。

所以,当我渲染topic-list.template.html文件,我已经通过$smarty->fetch("string":$config['h1-titles']['topics'])呈现$config['h1-titles']['topics']第一,然后将其分配给h1 Smarty的变量。我的简化代码如下所示:

$h1_tag = $smarty->fetch("string":$config['h1-titles']['topics']); 
$smarty->assign('h1', $h1_tag); 
$smarty->display('topic-list.template.html'); 

我不知道如果我能以某种方式自动插入在topic-list.template.html文件$config['h1-titles']['topics'],然后在一个全力以赴渲染?

回答

2

请看看上String Template Resources的文档。您会立即注意到您的$smarty->fetch('string:…')方法也可以在一个模板中完成:{include file="string:…"}

+0

这也很酷。尤金还在他的评论中提出了“{eval}”。我会尝试你的方法,也是尤金的。我不确定哪一个是最好的,但如果他们都工作,我将不得不选择一个或另一个。 :) – bodacydo

+0

好吧,'{eval}'工作。现在我要尝试'{include}'方法。我在想'{include}'可能会更好,因为它实际上是将字符串模板编译到一个文件中,所以Smarty每次看到它时都不会评估字符串! – bodacydo

+0

该页面有一个注释:“使用字符串:资源类型时,每个唯一字符串会生成一个编译文件,Smarty无法检测到已更改的字符串,因此会为每个唯一字符串生成一个新的编译文件。选择正确的资源,这样就不会用浪费的编译字符串填充磁盘空间。“既然你在谈论可能会改变很多(标题)的字符串,eval看起来对我更有用。 – Eugene

1

我相信{}的eval标签可以帮助你:

{}的eval是用来评估一个变量作为模板。这可以用于将模板标记/变量嵌入到变量中,或将标记/变量嵌入到配置文件变量中。

http://www.smarty.net/docs/en/language.function.eval.tpl

+0

找到Eugene。我会尝试一下! – bodacydo

+0

Eugene,请看@ rodneyrehm的评论中的讨论。它是'{eval}'与'{include}'。 – bodacydo