我最近开始使用Smarty,这可以大大减少网页中的样板代码。
如何通过使用Smarty制作.php
及相关.tpl
文件的模板来扩展减少样板代码的想法?或者,是否有一个更简单,更少“元”的方法?
例如,考虑一个所有网页都具有相同菜单和侧边栏的网站。可以使用Smarty为给定页面的每个菜单项生成HTML代码。有没有办法生成.tpl
文件,因为它们有很多共同之处? (也许我的设计中有很多可以在两个层面上自动化,这表明设计很差?)
这是否像使用一个PHP文件生成另一个一样简单?
为了提供更具体的例子,我使用Smarty生成了this web site的索引页面。正如您所看到的,some other的pages足够接近我认为可以更加简洁地生成HTML。我认为为每个页面生成Smarty模板的机制是一种合理的方法,尽管我不确定如何继续。
相关SO问题
这个问题,Calling Smarties display() method multiple times vs using includes,指的是模板继承,它可能是我试图获得的OOP模拟。
答案 0 :(得分:1)
我通常做的,可能不是最好的方法,但可能会帮助你,是拥有一个全局模板,其中包含header
,menu
,footer
的模板,等...并包含数据驱动的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:
部分。
如果您希望某些网页覆盖head
或menu
,则执行以下操作非常容易:
{if isset($headerOverride) }
{include file=$headerOverride}
{else}
{include file=$lang|cat:"/head.tpl"}
{/if}
通过将模板分解为可覆盖的较小块,我认为您可以为模板保留一个非常可靠的结构,并且仍允许异常加载自定义代码。