使用Smarty的模板模板

时间:2012-12-13 14:07:19

标签: php html smarty

我最近开始使用Smarty,这可以大大减少网页中的样板代码。

如何通过使用Smarty制作.php及相关.tpl文件的模板来扩展减少样板代码的想法?或者,是否有一个更简单,更少“元”的方法?

例如,考虑一个所有网页都具有相同菜单和侧边栏的网站。可以使用Smarty为给定页面的每个菜单项生成HTML代码。有没有办法生成.tpl文件,因为它们有很多共同之处? (也许我的设计中有很多可以在两个层面上自动化,这表明设计很差?)

这是否像使用一个PHP文件生成另一个一样简单?

为了提供更具体的例子,我使用Smarty生成了this web site的索引页面。正如您所看到的,some otherpages足够接近我认为可以更加简洁地生成HTML。我认为为每个页面生成Smarty模板的机制是一种合理的方法,尽管我不确定如何继续。

相关SO问题

这个问题,Calling Smarties display() method multiple times vs using includes,指的是模板继承,它可能是我试图获得的OOP模拟。

1 个答案:

答案 0 :(得分:1)

我通常做的,可能不是最好的方法,但可能会帮助你,是拥有一个全局模板,其中包含headermenufooter的模板,等...并包含数据驱动的content模板。

{* Smarty Template *}
{* Core Template *}
{* Multi-lang - Loads all inner components of the page *}
<!DOCTYPE HTML>
<html>
    <head>
        {include file=$lang|cat:"/head.tpl"}
    </head>
    <body>
        {include file=$lang|cat:"/menu.tpl"}
        {include file=$lang|cat:"/body.tpl"}
        {include file=$lang|cat:"/footer.tpl"}
    </body>
</html>

我将拥有一个简单的body.tpl,可以做到:

{* Smarty Template *}
{* Base Template for BODY *}
<div>
    {include file=$lang|cat:"/"|cat:$view|cat:".tpl"}
</div>

$view表示我想要显示的content(另一个模板)。正如您所看到的,我的设置是多语言的,如果您不想处理多种语言,可以删除$lang|cat:部分。

如果您希望某些网页覆盖headmenu,则执行以下操作非常容易:

{if isset($headerOverride) }
    {include file=$headerOverride}
{else}
    {include file=$lang|cat:"/head.tpl"}
{/if}

通过将模板分解为可覆盖的较小块,我认为您可以为模板保留一个非常可靠的结构,并且仍允许异常加载自定义代码。