Smarty の構文解析を回避する

時々、Smarty の構文解析の対象にしたくないと望む、 もしくはそうする必要がある部分があります。 典型的な例としては、 テンプレートに Javascript や CSS コードが含まれるときです。 それらの言語が Smarty のデフォルトの デリミタ である { と } を使用するときに問題が発生します。

注意

もっとも単純な解決方法は、Javascript と CSS コードをそれぞれファイルに切り分け、 それらにアクセスするために標準的な HTML の機能を使用する事で状況を回避する事です。 これは、ブラウザのスクリプトキャッシュも利用します。 Smarty の変数や関数を Javascript/CSS で使いたい場合は、次のようにします。

Smarty のテンプレート内では、{ や } の両側に空白文字があればそれをデリミタとはみなしません。 この挙動を無効にするには、Smarty のクラス変数 $auto_literal を false にします。

例 3.8. 自動リテラル機能の使用


<script>
   // 次の波括弧は Smarty に無視されます
   // その両側に空白文字があるからです
   function foobar {
	alert('foobar!');
   }
   // こちらの場合はリテラルとして扱うエスケープが必要です
   {literal}
	function bazzy {alert('foobar!');}
   {/literal}
</script>
  
 

テンプレートロジックのブロックをエスケープするには {literal}..{/literal} ブロックを使用します。 HTML エンティティの使用法と同様に、 {ldelim}{rdelim} あるいは {$smarty.ldelim}{$smarty.rdelim} を使用してデリミタを個別にエスケープすることもできます。

単純に Smarty の $left_delimiter および $right_delimiter を変更するだけでも便利になることが多々あります。

注意

デリミタの変更は、すべてのテンプレートの構文およびエスケープに影響を及ぼします。 変更した後は、キャッシュやコンパイル済みファイルを一度削除するようにしましょう。

例 3.9. デリミタを変更する例


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