Skip to content

转义 Smarty 解析

有时候,我们希望或者需要让 Smarty 忽略它通常会解析的部分。一个经典的例子是在模板中嵌入 Javascript 或 CSS 代码。问题在于这些语言使用的 {} 字符也是 Smarty 的默认定界符

注意

避免转义的一个好的实践是将你的 Javascript/CSS 分离到它们自己的文件中,并使用标准的 HTML 方法来访问它们。这也会利用浏览器脚本缓存。当你需要将 Smarty 变量/函数嵌入到你的 Javascript/CSS 中时,下面的内容就适用了。

在 Smarty 模板中,只要 {} 两侧有空白,Smarty 就会忽略它们。这种行为可以通过将 Smarty 类变量 $auto_literal 设置为 false 来禁用。

示例

<script>
   // 以下的大括号被Smarty忽略
   // 因为它们被空白包围
   function foobar {
    alert('foobar!');
   }
   // 这个需要字面转义
   {literal}
    function bazzy {alert('foobar!');}
   {/literal}
</script>

{literal}..{/literal} 块用于转义模板逻辑的块。你也可以用 {ldelim}, {rdelim} 标签或 {$smarty.ldelim},{$smarty.rdelim} 变量单独转义大括号。

Smarty 的默认定界符 {} 干净地表示了呈现内容。然而,如果其他的定界符更符合你的需求,你可以用 Smarty 的 $left_delimiter$right_delimiter 值来改变它们。

注意

改变定界符会影响所有的模板语法和转义。如果你决定改变它们,一定要清除缓存和编译文件。

<?php

$smarty->left_delimiter = '<!--{';
$smarty->right_delimiter = '}-->';

$smarty->assign('foo', 'bar');
$smarty->assign('name', 'Albert');
$smarty->display('example.tpl');

其中模板是:

Welcome <!--{$name}--> to Smarty
<script language="javascript">
  var foo = <!--{$foo}-->;
  function dosomething() {
    alert("foo is " + foo);
  }
  dosomething();
</script>