0

我正在尝试使用 Smarty for php 创建一个模板。我希望模板可重用,因此我继承它并使用块替换值。这很好用,除非我需要在子模板中访问这些块值。我使用 smarty 的 {include} 函数调用这些子模板。

例子:

模板父(template.tpl):

<html>
     <head>
         {include file=sub_template.tpl}
     </head>

     <body>
         {block name=title}No Title Provided{/block}
     </body>
</html>

子模板 (sub_template.tpl)

     <title>{block name=title}No Title Provided{/block}</title>

模板-子 (template_child.tpl)

     {extends file="template.tpl"}
     {block name=title}My Website!{/block}

当我查看该站点时,输出是:

<html>
     <head>
         <title>No Title Provided</title>
     </head>

     <body>
         My Website!
     </body>
</html>

在做了一些研究之后,我确实在 smarty 的网站上看到了关于将 {include} 函数包含在虚拟 {block} 标记中的注释,但在使其工作方面取得了不同程度的成功。

注意:如果你有一个包含在 {include} 中的子模板并且它包含 {block} 区域,那么它只有在从周围的 {block} 中调用 {include} 本身时才有效。在最终的父模板中,您可能需要一个虚拟 {block}。(http://www.smarty.net/docs/en/advanced.features.template.inheritance.tpl)

因此,我尝试过:

<html>
     <head>
         {block name=dummy}{include file=sub_template.tpl}{/block}
     </head>

     <body>
         {block name=title}No Title Provided{/block}
     </body>
</html>

在我对子模板进行任何更改之前,这似乎有效。一旦对子模板进行更改,它就会再次停止响应子模板中设置的块值。

我是否误解了通知所指的关于将 {include} 放置在虚拟块标签中的内容,或者这是 smarty 的错误?我目前没有使用缓存,但我的另一个想法是这可能是一个子模板缓存问题。

任何见解将不胜感激,谢谢!

4

1 回答 1

0

确实,这些模板被编译并缓存到模板目录中。这就是为什么清除模板目录暂时解决了这个问题。模板缓存不同于 smarty 也支持的显式缓存。我发现模板缓存可以被覆盖:

$smarty->compile_check = true;
$smarty->force_compile = true;

这允许对模板进行更改,而无需在开发过程中更改后删除缓存。

于 2012-09-10T15:27:53.303 回答