<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>Suinasia(smarty)</title>
<link>http://suin.asia/tag/smarty</link>
<description>「smarty」なエントリー</description>
<language>ja</language>
<lastBuildDate>Thu, 09 Feb 2012 08:37:09 +0900</lastBuildDate>
<docs>http://backend.userland.com/rss/</docs>
<category>smarty</category>
<item>
<title>Smartyの{if}の中では、定数を使ってはいけない</title>
<link>http://suin.asia/2011/02/21/dont_use_constants_in_smarty_if_statement</link>
<description><![CDATA[<p>次のSmartyはyesが出力されるでしょうか？それともnoが出力されるでしょうか？
定数 MY_CONSTANT は未定義だとします。</p>

<pre name="code" class="smarty">
{if $smarty.const.MY_CONSTANT == true} yes {else} no {/if}
</pre>

<p>正解は、yesが出力されます。
もし定数 MY_CONSTANT が未定義だと、Smarty側で 'MY_CONSTANT' という文字列に解釈されます。
したがって、{if "MY_CONSTANT" == true} となってしまい、真と評価されます。
そうして結果的に、yes が出力されることになります。</p>

<p>防衛プログラミングとして、Smartyの{if}の中では定数を使わないほうがいいかもしれません。どうしても定数をSmartyで使いたい場合は、get_defined_constants(true)で定義済の定数を取得してきて、動的にassignするなどの代替処置をとったほうがいいでしょう。</p>]]></description>
<pubDate>Mon, 21 Feb 2011 22:06:51 +0900</pubDate>
<guid>http://suin.asia/2011/02/21/dont_use_constants_in_smarty_if_statement</guid>
<category domain="http://suin.asia/tag/Smarty">Smarty</category>
</item>
<item>
<title>Smarty2.0からSmarty3.0への変更点</title>
<link>http://suin.asia/2010/03/06/smarty_3.0</link>
<description><![CDATA[<p>Smarty3.0のパッケージに入っている、SMARTY2_BC_NOTESを和訳してみた。</p>

<h3>分かっているSmarty2との非互換性</h3>

<h4>シンタクス</h4>

<p>Smarty 3 APIはシンタクスが新しくなりました。Smarty2のシンタクスはサポートしますが、将来サポートが保証されない可能性があります。</p>

<h4>PHPのバージョン</h4>

<p>Smarty3はPHP5のみ対応します。PHP4では動きません。</p>

<h4>{php}タグ</h4>

<p><code>{php}</code>タグはデフォルトでは無効になりました。<code>{php}</code>タグを使うことは非推奨です。<code>$smarty->allow_php_tag=true;</code>で<code>{php}</code>タグを有効にすることができます。</p>
<p>しかし、複数の<code>{php}</code>タグにまたがるPHPコードは、これ以上は動かないでしょう。</p>

<h4>デリミタとホワイトスペース</h4>

<p>ホワイトスペースに囲まれたデリミタは今後、Smartyのタグとして扱われません。したがって、<code>{ foo }</code>はタグとしてコンパイルされません。この場合、コンパイルするには<code>{foo}</code>とする必要があります。この変更により、<code>{literal}</code>が必要とならないので、Javascript/CSSが扱いやすくなります。なお、<code>$smarty->auto_literal = false;</code>でこの設定を無効化できます。</p>

<h4>クォートされなかった文字列</h4>

<p>Smarty2は、パラメータにクォートしていない文字列が現れたとき、大雑把で曖昧な面がありました。一方、Smarty3はより厳密です。といっても、特別な文字(A-Za-z0-9_以外)を含まない限り、今でもクォーテーションなしの文字列を使うことはできます。</p>

<p>例えば、ファイル名の文字列はクォートしなければなりません。</p>

<pre class="smarty" name="code">
{include file='path/foo.tpl'}
</pre>

<h4>Smartyクラスの拡張</h4>

<p>Smarty3は初期化するのに、<code>__construct</code>メソッドを使います。Smartyクラスを拡張するとき、もし、小クラスが独自のコンストラクタを定義すると、Smartyのコンストラクタは実行されません。Smartyのコンストラクタを実行する必要があれば、小クラスのコンストラクタで<code>parent::__construct()</code>を実行してください。</p>

<pre class="php" name="code">
class MySmarty extends Smarty {
   function __construct() {
       parent::__construct();
    
       // your initialization code goes here

   }
}
</pre>

<h4>オートローダー</h4>

<p>Smarty3は<code>spl_autoload_register</code>で独自のオートローダーを登録します。もしあなたのコード中に<code>__autoload</code>関数が存在するのなら、 それを明示的に<code>__autoload</code>スタックに登録しなければなりません。 詳しくは、http://us3.php.net/manual/en/function.spl-autoload-register.php を御覧下さい。</p>

<h4>プラグインファイル名</h4>

<p>Smarty3ではPHP <code>spl_autoloader</code>をサポートしています。このオートローダーは、ファイル名を小文字にすることを要求しています。したがって、Smartyプラグインのファイル名は小文字である必要があります。Smarty2では、大文字小文字が混在したファイル名でも動作しました。</p>

<h4>特別なSmarty変数のスコープ</h4>

<p>Smarty2では特別なSmarty変数(例えば、<code>$smarty.section...</code>や<code>$smarty.foreach</code>)がグローバルスコープでした。もし、同じ名前のループがサブテンプレートにあると、親テンプレートの変数を上書きしていまします。<p>

<p>Smarty3では特別なSmarty変数は、ループがあるテンプレートのローカルスコープになります。もし、親テンプレートの変数をサブテンプレートに渡す場合は、パラメータにする必要があります。</p>

<pre class="smarty" name="code">
{include file='path/foo.tpl' index=$smarty.section.foo.index}
</pre>

<h4>SMARTY_RESOURCE_CHAR_SET</h4>

<p>Smarty3はutf-8をデフォルトcharsetとして、定数<code>SMARTY_RESOURCE_CHAR_SET</code>に定義します。これは、escapeのような修飾子のデフォルトcharsetとして使われるようになります。もし、utf-8以外のcharsetをテンプレートで使う場合、適宜に<code>SMARTY_RESOURCE_CHAR_SET</code>を定義することに注意してください。そうしなければ、なにも出力されない可能性があります。</p>

<h4>改行での{if}タグ</h4>

<p>テンプレートのソースに予期される改行の出力を得るために、<code>{if}</code>,<code>{else}</code>,<code>{elseif}</code>,<code>{/if}</code>タグのコンパイル後コードに¥nが追加されました。もし、<code>{if}</code>タグなどが行末にある場合、HTMLの出力結果が改行されます。</p>]]></description>
<pubDate>Sat, 06 Mar 2010 22:20:42 +0900</pubDate>
<guid>http://suin.asia/2010/03/06/smarty_3.0</guid>
<category domain="http://suin.asia/tag/smarty">smarty</category>
<category domain="http://suin.asia/tag/php">php</category>
</item>
</channel>
</rss>
