什么是 Smarty?
为何使用 Smarty?
用例和工作流程
语法比较
模板继承
最佳实践
速成课程
PHP 编程语言很适合进行代码开发,但许多人会争论,将简洁的语句语法嵌入 HTML 中可能难以管理。Smarty 能够解决此问题,方法是通过基于标记的更简单语法将 PHP 与展示区分开来。这些标记以简洁直观的方式在展示中显示应用程序的内容。无需掌握 PHP 知识即可管理 Smarty 模板。
为了展示这一点,我们来比较 PHP 和 Smarty 语法。我们从一个简单的变量开始,使用 PHP 的短标签语法。
<?=$foo?>
{$foo}
请注意,PHP 语法使用 5 个标点符号来显示一个简单的变量:<?=?>,而 Smarty 仅使用 2 个:{}。(我们忽略了 $,因为它始终在两种语法中出现。)现在,我们来比较数组访问
<?=$foo['bar']?>
{$foo.bar}
PHP 使用 9 个标点符号,而 Smarty 仅使用 3 个。即使使用此简单示例,我们也可以看出 Smarty 在多大程度上减少了语法噪音。接下来,我们尝试一个 foreach 循环
<?php foreach($foo as $bar): ?> ... <?php endforeach; ?>
{foreach $foo as $bar} ... {/foreach}
PHP 使用 18 个标点符号,而 Smarty 仅使用 5 个。现在,我们尝试一些实际用途,将其与 HTML 标记混合使用
<?php if(!empty($foo)): ?> <?php foreach($foo as $bar): ?> <a href="<?=$bar['zig']?>"><?=$bar['zag']?></a> <a href="<?=$bar['zig2']?>"><?=$bar['zag2']?></a> <a href="<?=$bar['zig3']?>"><?=$bar['zag3']?></a> <?php endforeach; ?> <?php else: ?> There were no rows found. <?php endif; ?>
{foreach $foo as $bar} <a href="{$bar.zig}">{$bar.zag}</a> <a href="{$bar.zig2}">{$bar.zag2}</a> <a href="{$bar.zig3}">{$bar.zag3}</a> {foreachelse} There were no rows found. {/foreach}
在上述简短示例中,Smarty 节省了 110 个字符,即 36% 的语法缩减。另请注意,Smarty 会在任何可能的地方处理样板功能,例如上述示例中的 empty() 测试。Smarty 清理了模板的语法,使其更少出错。
请注意,我们一直在使用 PHP 短标签语法 <?=$foo?> 来输出变量。它在 PHP 中用作 <?php echo $foo; ?> 的更长语法的快捷方式。这有助于缩短长度,但在可读性方面却收效甚微。许多 PHP 开发人员会建议您尽量避免使用短标签,因为短标签是可选的,因此这样做会损害跨系统的兼容代码。我们来将长语法与 Smarty 变量进行比较
<?php echo $foo; ?>
{$foo}
即便使用此简短示例,您也可以看到节省了 13 个字符(缩短了 69%),而显示的内容相同。现在,我们来看看它与 HTML 混合使用的情况
<a href="<?php echo $bar['zig']; ?>"><?php echo $bar['zag']; ?></a> <a href="<?php echo $bar['zig2']; ?>"><?php echo $bar['zag2']; ?></a> <a href="<?php echo $bar['zig3']; ?>"><?php echo $bar['zag3']; ?></a>
<a href="{$bar.zig}">{$bar.zag}</a> <a href="{$bar.zig2}">{$bar.zag2}</a> <a href="{$bar.zig3}">{$bar.zag3}</a>
PHP标记的另一个问题是,它们与HTML标记的<>字符相同。在应用程序代码中,这并不成问题,但与HTML结合使用后,<?php ?>标记便形成了难以与HTML标记区分开来的令人抓狂的过程。这也是模糊了应用程序与表现层分离的界限,因为任何PHP逻辑都可以注入到模板中。这就是简单{tag}语法非常受欢迎的地方。Smarty简化并压缩了表现层,使之架构清晰、错误更少,而且易于维护。
Smarty配备简化的英语式逻辑语句。下面的示例展示了1-20的奇数(1、3、5、7,...)
<?php for($x=0; $x<20; $x+=2): ?> <php echo $x+1; ?> <?php endfor; ?>
{for $x = 1 to 20 step 2} {$x} {/for}
哪一种更容易理解?对于非开发人员来说呢?
下面的示例循环遍历$foo数组,在表格单元格中打印值。每隔4行,它都会打印</tr><tr>,以开始新的一行
<?php $counter=0; ?> <?php foreach($foo as $bar): ?> <?php if(($counter+1) % 4 == 0): ?> </tr><tr> <?php endif; ?> <td><?php echo $bar; ?></td> <?php $counter++; ?> <?php endforeach; ?>
{foreach $foo as $bar} {if $bar@iteration is div by 4} </tr><tr> {/if} <td>{$bar}</td> {/foreach}
下一个示例将变量转换成小写并对其进行HTML转义
<?php echo htmlspecialchars(strtolower($foo),ENT_QUOTES,'UTF-8'); ?>
Smarty(注意自然从左到右的语句流程)
{$foo|lower|escape}
lower和escape是Smarty附带的众多内置插件中的两个。它们包含专门针对表现层输出的强大功能。您想以JavaScript转义变量吗?一个简单的参数就够了
{$foo|lower|escape:javascript}
您认为上述哪种方法更受设计师欢迎?简洁明快的语法是快速部署和轻松维护的关键。
这些只是Smarty帮助您管理模板、将模板与PHP代码隔离开来,让模板维护变得容易的几个示例,即使对完全没有经验的用户来说也是如此。另请参阅Smarty简介、用例和工作流程、模板继承以及使用Smarty的原因。