模板语言与直接PHP

时间:2009-09-14 22:45:29

标签: php templates

我打算写一个CMS,但是现在我正在写下我的所有想法,并试图在我开始之前完成所有的概念。我被撕毁的一件事是,是否使用模板语言并解析网站的页面,用内容项替换模板标签,或者只是用直接的PHP开发网站,并让CMS生成有用的数据结构。例如:

{navigation: products}

VS

foreach($cms_label['products'] as $product) {

    echo '<li class="product_nav">'.
         '<a href="products/{$product.id}">{$product.name}</a>'.
         "</li>\n";

}

前者更清晰,但它涉及发明一种语言,并在显示之前解析每一页。后者不太干净,但我认为如果CMS只提供所有代码的数据,它可以工作得非常好。但是,这会被视为混合逻辑与演示吗?我考虑的另一个选择是使用类似于模板标签的PHP函数:

<?php navigation('products'); ?>

你有什么想法?

请记住,我不需要做任何比在某个地方包含页面或写出无序列表更复杂的事情;其余的应由CSS处理。

6 个答案:

答案 0 :(得分:13)

PHP的模板语言是一个名为“Inner-Platform Effect”的反模式示例。 Smarty是PHP模板框架的一个例子,但即使是一本关于Smarty的书的作者Hasin Hayder也说Smarty is dead并且不再需要使用它了。

开发模板语言有充分的理由,例如,如果你有非编码器设计师或使用你的CMS的内容编辑器,你不想用PHP的复杂性压倒他们(或允许他们写代码可能会破坏您的网站。)

但是你还没有把它描述为一个目标,所以我假设使用PHP作为你的页面模板语言是最好的。这样做的工作量会减少,因为您不必开发自己的新语言,并且可以为需要特定类型的动态内容的不常见情况提供更大的灵活性。

不要编写PHP函数来封装HTML输出块。相反,使用include()来拉入HTML片段。这种技术有时被称为“部分”。

您还可以使用Symfony,Kohana,Solar,CodeIgniter或Zend Framework等MVC框架来帮助您保持将PHP模板代码与其他应用程序代码分离的纪律。

答案 1 :(得分:7)

很长一段时间我是一个非常高兴的Smarty用户,我不再相信专门的模板语言了。

模板语言不会阻止您在演示文稿代码中添加不适当的逻辑,它只会强迫您使用模板语言编写错误的代码。

在模板中使用php创建自己的小模板系统是相当简单的。然后创建各种帮助程序以保持模板代码清洁(如“navigation()”函数)。

我认为Zend_View采用的方法非常好。 Symfony的视图层也相当整洁,但可能有点令人生畏。您不必使用框架从中获取内容。只需看看示例中的一些模板代码,看看是什么激发了你的灵感。

底线:忘记模板的特殊语言 - 只需对视图代码应用良好的设计感,将视图脚本中的复杂性分解为可重用的助手。

答案 2 :(得分:7)

重新发明轮子大部分时间都是一个坏主意。

PHP已经是一种模板语言。您不需要实现自己的。

至于Smarty,它是php最完整的模板系统,它仍然是一个坏主意。

关于这个问题的几篇文章:

如果您想查看模板做得更好请查看:

  • phpSavant它使用php代码,仍然促进了关注点的分离。

最终目标当然是通过促进业务逻辑与演示文稿的分离

来更轻松地维护代码

答案 3 :(得分:2)

您可能想要了解Smarty- http://smarty.php.net Smarty是一个非常强大的模板引擎,可以为您提供两全其美的效果。它对自定义模块和插件提供了广泛的支持。

我使用Smarty和PHP构建了一个自定义CMS,除了它之外别无他法。

使用Smarty的php代码看起来像这样

<?php
// my cms

$smarty = new Smarty();
.
.
$smarty->display('home.tpl');

?>

模板代码是这样的

<h1>{$pagetitle}</h1>

{insert tag="navigation"}

答案 4 :(得分:1)

我想知道为什么没有人提到模板语言最重要的用途之一:自动输出转义。

在这里或那里很容易忘记htmlspecialchars(),所以提供像{$ name}这样的指令的模板语言必须确保$ name 自动通过htmlspecialchars传递,并带有相应的charset和一切。

当然,这也意味着您可以为变量输出指定不同的“上下文”,例如alert('嗨{$ name | context = singlequotes}!');模板解释器将转义$ name的内容,以便不可能打破单引号,而不是转义它的XML(应该是默认值)。

此类上下文还可以包含int(强制数字)等内容,也可以扩展为接受其他参数来格式化输出等等。

我的2美分。不确定是否有一个允许这样的开源解决方案(有兴趣听听它!),我在工作中为这些东西推出了自己的解释器。由于生成的“中间代码”是纯PHP,它也可以很容易地“缓存”(如Smarty和其他tpl系统一样)。

答案 5 :(得分:1)

我非常喜欢Smarty,我也认为控制器应该纯粹用XML编写,YAML中的模型。这是强制执行MVC的唯一方法。

如果出现性能问题,那么编译到php可能会被认为是一种可能性(尽管是远程的),它具有以混淆方式完成的必要条件,以阻止渴望开发人员阅读它。