Smarty 图标

您可以根据商标声明使用 Smarty 徽标。

Smarty Template Engine Smarty Template Engine

如需赞助、广告、新闻或其他询问,请联系我们:

使用 Smarty 的网站

广告

模板语法:Smarty 与 PHP

PHP 编程语言很适合进行代码开发,但许多人会争论,将简洁的语句语法嵌入 HTML 中可能难以管理。Smarty 能够解决此问题,方法是通过基于标记的更简单语法将 PHP 与展示区分开来。这些标记以简洁直观的方式在展示中显示应用程序的内容。无需掌握 PHP 知识即可管理 Smarty 模板。

为了展示这一点,我们来比较 PHP 和 Smarty 语法。我们从一个简单的变量开始,使用 PHP 的短标签语法。

PHP

<?=$foo?>

Smarty

{$foo}

请注意,PHP 语法使用 5 个标点符号来显示一个简单的变量:<?=?>,而 Smarty 仅使用 2 个:{}。(我们忽略了 $,因为它始终在两种语法中出现。)现在,我们来比较数组访问

PHP

<?=$foo['bar']?>

Smarty

{$foo.bar}

PHP 使用 9 个标点符号,而 Smarty 仅使用 3 个。即使使用此简单示例,我们也可以看出 Smarty 在多大程度上减少了语法噪音。接下来,我们尝试一个 foreach 循环

PHP

<?php foreach($foo as $bar): ?>
...
<?php endforeach; ?>

Smarty

{foreach $foo as $bar}
...
{/foreach}

PHP 使用 18 个标点符号,而 Smarty 仅使用 5 个。现在,我们尝试一些实际用途,将其与 HTML 标记混合使用

PHP

<?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; ?>

Smarty

{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 短标签

请注意,我们一直在使用 PHP 短标签语法 <?=$foo?> 来输出变量。它在 PHP 中用作 <?php echo $foo; ?> 的更长语法的快捷方式。这有助于缩短长度,但在可读性方面却收效甚微。许多 PHP 开发人员会建议您尽量避免使用短标签,因为短标签是可选的,因此这样做会损害跨系统的兼容代码。我们来将长语法与 Smarty 变量进行比较

PHP

<?php echo $foo; ?>

Smarty

{$foo}

即便使用此简短示例,您也可以看到节省了 13 个字符(缩短了 69%),而显示的内容相同。现在,我们来看看它与 HTML 混合使用的情况

PHP

<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>

Smarty

<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

<?php for($x=0; $x<20; $x+=2): ?>
  <php echo $x+1; ?>
<?php endfor; ?>

Smarty

{for $x = 1 to 20 step 2}
  {$x}
{/for}

哪一种更容易理解?对于非开发人员来说呢?

下面的示例循环遍历$foo数组,在表格单元格中打印值。每隔4行,它都会打印</tr><tr>,以开始新的一行

PHP

<?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; ?>

Smarty

{foreach $foo as $bar}
  {if $bar@iteration is div by 4}
    </tr><tr>
  {/if}
  <td>{$bar}</td>
{/foreach}

下一个示例将变量转换成小写并对其进行HTML转义

PHP

<?php echo htmlspecialchars(strtolower($foo),ENT_QUOTES,'UTF-8'); ?>

Smarty(注意自然从左到右的语句流程)

Smarty

{$foo|lower|escape}

lowerescape是Smarty附带的众多内置插件中的两个。它们包含专门针对表现层输出的强大功能。您想以JavaScript转义变量吗?一个简单的参数就够了

Smarty

{$foo|lower|escape:javascript}

您认为上述哪种方法更受设计师欢迎?简洁明快的语法是快速部署和轻松维护的关键。

这些只是Smarty帮助您管理模板、将模板与PHP代码隔离开来,让模板维护变得容易的几个示例,即使对完全没有经验的用户来说也是如此。另请参阅Smarty简介用例和工作流程模板继承以及使用Smarty的原因