如果你打算那样做,你想把你的逻辑和设计分开,真的。
但您不需要使用 Smarty 来执行此操作。
优先级是关于心态。我看到有人在 Smarty 中做了令人震惊的事情,最终变成了在 Smarty 中开发网站的人,然后一些明亮的火花会决定他们需要在 Smarty 中编写模板引擎(永远不要低估一个愚蠢的想法)。
如果您将代码分成两部分并强迫自己遵守标准,那么您将获得更好的性能。
PageLogic.php
<?php
$pageData = (object)(array()); // Handy trick I learnt.
/* Logic Goes here */
$pageData->foo = SomeValue;
ob_start();
require("layout.php");
ob_end_flush();
布局.php
<html>
<!-- etc -->
<?php for ( $i = 1; $i < 10; $i++ ){ ?>
<?php echo $pageData->foo[$i]; ?>
<?php } ?>
<!-- etc -->
</html>
PHP 是作为模板引擎编写的,因此在评估是否需要深入研究 Smarty 之前,您至少应该尝试将其用于其设计任务。
此外,如果您决定使用模板引擎,请尝试使用 默认 转义 HTML 的引擎,然后您“选择退出”而不是“选择加入”。你会为自己省去很多 XSS 的麻烦。 Smarty 在这方面比较薄弱,正因为如此,里面写了很多 content-naïve 的模板。
{if $cond}
{$dangerous_value}
{else}
{$equally_dangerous_value}
{/if}
通常是 Smarty 模板的运行方式。问题是 $dangerous_value 可以是任意 HTML,这只会导致甚至更多糟糕的编码实践,到处都是无法追踪的意大利面条代码。
您认为应该的任何模板语言都可以解决这个问题。例如:
{$code_gets_escaped}
{{$code_gets_escaped_as_a_uri}}
{{{$dangerous_bare_code}}}
通过这种方式,您的潜在利用途径在模板中很容易识别,而利用途径是 DEFAULT 行为。