Smarty3でdefault_modifiersを使用する際の注意点

Smarty3が昨年の11月に正式リリースされて12月にはSmarty 3.0.6がリリースされ
公式発表では表示速度がバージョン2に比べると2倍~5倍との事なので早速
使用してみました。

ほとんど修正する事もなくバージョン2で使用していたコードも問題なく動くのですが
数点注意点が有ったので紹介しておきます。

今回の注意点は下記のようにdefault_modifiersを使用してエスケープ処理をしている場合の
問題点です。

$this -> default_modifiers = array('escape:"html"');

このようにデフォルトでエスケープ処理を施している場合、
バージョン2ではエスケープ処理を施さない場所が有った場合
{$var|smarty:nodefaults}

のようにしてクリアしていたのですがバージョン3ではエラーになります。
バージョン3では下記のように書きます。
{$vars nofilter}

又default_modifiersを使用してエスケープ処理を行っているとそのままでは
デバッギングコンソールが利用できません。
デバッギングコンソールを利用するにはdebug.tpl内の下記の3ヶ所に上記と同じように
「nofilter」を記入してデフォルトのエスケープ処理を回避すると利用できます。

<table id="table_assigned_vars">
    {foreach $assigned_vars as $vars}
       <tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
       <th>${$vars@key|escape:'html'}</th>
       <td>{$vars|debug_print_var:0:1000 nofilter}</td></tr>
    {/foreach}
</table>

<h2>assigned config file variables (outer template scope)</h2>

<table id="table_config_vars">
    {foreach $config_vars as $vars}
       <tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
       <th>{$vars@key|escape:'html'}</th>
       <td>{$vars|debug_print_var nofilter}</td></tr>
    {/foreach}

</table>
</body>
</html>
{/capture}
<script type="text/javascript">
{$id = $template_name|default:''|md5}
    _smarty_console = window.open("","console{$id}","width=680,height=600,resizable,scrollbars=yes");
    _smarty_console.document.write("{$debug_output|escape:'javascript' nofilter}");
    _smarty_console.document.close();
</script>

ちなみに5行目の「debug_print_var:0:1000」はデバッギングコンソール内で変数の出力はデフォルトで
40文字で省略されるのですがもっと長く表示したい場合などに修正してください。
上記の例では1000文字まで表示されます。

Windows環境phpでSmartyを使うとWarning Error

ウィンドウズにxamppをインストールしSmartyテンプレートエンジンを利用した開発をする時の注意点

WindowsでSmartyを使うと以下のようなErrorが出る時が有る
だいたいテンプレートを新規作成した後に発生する。
unlink(./view/templates_c/pc\%%48^484^484984CD%%index.tpl.php) [function.unlink]: No such file or directory

その場合Smartyの下記のファイルを編集して対処
smarty/internals/core.write_file.php

44行目の@unlink($params['filename']);を

下記のように修正
if (is_file($params['filename'])){
@unlink($params['filename']);
}