suin.io

Smarty2.0からSmarty3.0への変更点

suin2010年3月6日

Smarty3.0のパッケージに入っている、SMARTY2_BC_NOTESを和訳してみた。

分かっているSmarty2との非互換性

シンタクス

Smarty 3 APIはシンタクスが新しくなりました。Smarty2のシンタクスはサポートしますが、将来サポートが保証されない可能性があります。

PHPのバージョン

Smarty3はPHP5のみ対応します。PHP4では動きません。

{php}タグ

{php}タグはデフォルトでは無効になりました。{php}タグを使うことは非推奨です。$smarty->allow_php_tag=true;{php}タグを有効にすることができます。

しかし、複数の{php}タグにまたがるPHPコードは、これ以上は動かないでしょう。

デリミタとホワイトスペース

ホワイトスペースに囲まれたデリミタは今後、Smartyのタグとして扱われません。したがって、{ foo }はタグとしてコンパイルされません。この場合、コンパイルするには{foo}とする必要があります。この変更により、{literal}が必要とならないので、Javascript/CSSが扱いやすくなります。なお、$smarty->auto_literal = false;でこの設定を無効化できます。

クォートされなかった文字列

Smarty2は、パラメータにクォートしていない文字列が現れたとき、大雑把で曖昧な面がありました。一方、Smarty3はより厳密です。といっても、特別な文字(A-Za-z0-9_以外)を含まない限り、今でもクォーテーションなしの文字列を使うことはできます。

例えば、ファイル名の文字列はクォートしなければなりません。

{include file='path/foo.tpl'}

Smartyクラスの拡張

Smarty3は初期化するのに、__constructメソッドを使います。Smartyクラスを拡張するとき、もし、小クラスが独自のコンストラクタを定義すると、Smartyのコンストラクタは実行されません。Smartyのコンストラクタを実行する必要があれば、小クラスのコンストラクタでparent::__construct()を実行してください。

class MySmarty extends Smarty {
   function __construct() {
       parent::__construct();

       // your initialization code goes here

   }
}

オートローダー

Smarty3はspl_autoload_registerで独自のオートローダーを登録します。もしあなたのコード中に__autoload関数が存在するのなら、 それを明示的に__autoloadスタックに登録しなければなりません。 詳しくは、http://us3.php.net/manual/en/function.spl-autoload-register.php を御覧下さい。

プラグインファイル名

Smarty3ではPHP spl_autoloaderをサポートしています。このオートローダーは、ファイル名を小文字にすることを要求しています。したがって、Smartyプラグインのファイル名は小文字である必要があります。Smarty2では、大文字小文字が混在したファイル名でも動作しました。

特別なSmarty変数のスコープ

Smarty2では特別なSmarty変数(例えば、$smarty.section...$smarty.foreach)がグローバルスコープでした。もし、同じ名前のループがサブテンプレートにあると、親テンプレートの変数を上書きしていまします。

Smarty3では特別なSmarty変数は、ループがあるテンプレートのローカルスコープになります。もし、親テンプレートの変数をサブテンプレートに渡す場合は、パラメータにする必要があります。

{include file='path/foo.tpl' index=$smarty.section.foo.index}

SMARTY_RESOURCE_CHAR_SET

Smarty3はutf-8をデフォルトcharsetとして、定数SMARTY_RESOURCE_CHAR_SETに定義します。これは、escapeのような修飾子のデフォルトcharsetとして使われるようになります。もし、utf-8以外のcharsetをテンプレートで使う場合、適宜にSMARTY_RESOURCE_CHAR_SETを定義することに注意してください。そうしなければ、なにも出力されない可能性があります。

改行での{if}タグ

テンプレートのソースに予期される改行の出力を得るために、{if},{else},{elseif},{/if}タグのコンパイル後コードに¥nが追加されました。もし、{if}タグなどが行末にある場合、HTMLの出力結果が改行されます。

RELATED POSTS