忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/03/29 11:21 |
PHP5.3.5 Smarty3を試すその2
前回Smarty3のSmartyBCクラスを利用して、Smarty2形式の書き方をしました。
今回は同じものをSmarty3形式で書いてみます。
<?php

	//Smartyパス
		$smartyDir         = dirname(__FILE__) . '/../../fw/smarty/';
		$smartyFile        = $smartyDir . 'Smarty.class.php';
		$smartyTemplateDir = $smartyDir . 'templates/';
		$smartyCompileDir  = $smartyDir . 'templates_c/';
	
	//Smarty
		require_once($smartyFile);
		$smarty = new Smarty();
		$smarty->template_dir = $smartyTemplateDir;
		$smarty->compile_dir  = $smartyCompileDir;
		
	//フィルタ
		$smarty->registerFilter('pre', 'smartyPreFilter');
		$smarty->registerFilter('post', 'smartyPostFilter');
		$smarty->registerFilter('output', 'smartyOutputFilter');
		function smartyPreFilter($tpl_source, $smarty){
			//テンプレートをコンパイルする前に行う処理
			//{}等のテンプレートがそのまま渡される
			return $tpl_source;
		}
		function smartyPostFilter($tpl_source, $smarty){
			//テンプレートをコンパイルした後に行う処理
			//{}等のSmarty関数、修正子等はパースされPHPに置換されている
			return $tpl_source;
		}
		function smartyOutputFilter($tpl_source, $smarty){
			//HTMLの出力直前に行う処理
			//Smarty関数、PHP共に処理された後で、ただのHTMLの状態
			return $tpl_source;
		}
	
	//修正子登録
		$smarty->registerPlugin('modifier', 'testModifier', 'smartyTestModifier');
		function smartyTestModifier($name, $param1, $param2, $param3 = NULL){
			//修正子testModifierが使用されたときに呼び出される
			return $param1 . strip_tags($name) . $param2;
		}
	
	//変数セット
		$smarty->assign('title' , 'タイトル');
		$smarty->assign('meta' , array('description'=>'description'));
		$smarty->assign('hoge' , array('foo', 'bar', 'baz'));
	
	//表示
		$smarty->display('index.html');
メソッド名が変わっただけじゃないか。
はい、そのとおりです。

テンプレート側については何一つ変更の必要はありません。
これは、Smarty3のテンプレートは、ロジック側と違って後方互換性を残しているからです。
実際は{foreach}の推奨される使い方も変わっているのですが、Smarty2形式でも全く問題無く動作します。
ですが、せっかくなのでSmarty3形式にしてみましょう。

index.html
{include file='header.html'}
<body>
	$hogeを表示<br />
	{foreach $hoge as $item}
		KEY:{$item@key} - ITEM:{$item}<br />
		{if $item@last}最後のループ<br />{/if}
	{/foreach}
	<br />
	{'XSS!!<script>alert("xss");</script>XSS!!'|testModifier:"aaa":"bbb"}
	
</body>
</html>
foreachはPHPと同くasを使うようになっています。
配列の要素に.でアクセスできるのはこれまでどおりですが、それとは別に@を繋ぐことで特殊な用途に使用できます。
@keyで配列のキーに、@firstで初回のループだけtrueにといった、これまで$smarty.foreachという遠回りな使い道だった要素も直接使用できるようになります。
.keyではきちんと$hoge['key']にアクセスしてくれるので、うっかりキーが被ったなどという事故もありません。

Smarty2と同じ使い方をするかぎり、使い勝手が微妙によくなったマイナーバージョンアップと考えても問題なさそうです。
PR


2012/05/18 23:50 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<Minecraft1.2.5 Transport Thingys v2.0 移動に便利なブロックを幾つか追加 | HOME | Minecraft1.2.5 PowerStaff v1.2.5 ブロックをちょっとだけ押す>>
忍者ブログ[PR]