忍者ブログ
[PR]
×

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



2024/11/22 21:49 |
PHP5.3.5 Smarty3を試す
これまでずっとSmarty2を使っていたんですが、いいかげんそろそろSmarty3に乗り換えてみます。
執筆時点での最新版は3.1.5でした。

ダウンロード・解凍後、libsフォルダを適当なところに突っ込みます。
中にはSmarty.phpおよびSmartyBC.phpがありますが、どうも中身を見るかぎりSmartyBC.phpは後方互換のために用意されたクラスみたいです。

Smarty2ではメソッド名などがスネークケースでしたが、Smarty3ではキャメルケースに改められています。
その橋渡しをするためのラッパクラスのようで、中身は大体こんなかんじです。
    public function assign_by_ref($tpl_var, &$value){
        $this->assignByRef($tpl_var, $value);
    }

なのでSmarty2から3にバージョンアップする際はとりあえずSmartyBCにしておいて、徐々にメソッドなどをSmarty3仕様に差し替えていくといいんじゃないかな。
ということでひとまずSmartyBCを使ってみます。
しかしびっくりするほど検索にひっかからんね、SmartyBC。

テンプレート側には大きな変更が加えられています。
変数のネストや複雑な構文などが色々できるようになっているみたいですが、とりあえずSmarty2のテンプレートを移植するにあたって気をつけるところはスペースです。
Smarty2では{ $hoge }とか書いても有効だったんですが、3では{$hoge }と前を詰めないといけなくなっているようです。
後ろはいくら開いていても大丈夫みたいです。
どこか設定があるのかもしれませんがよくわかりませんでした。

とりあえずSmarty2形式でサンプルを作成。
index.php
<?php

	//Smartyパス
		$smartyDir         = dirname(__FILE__) . '/../../fw/smarty/';
		$smartyFile        = $smartyDir . 'SmartyBC.class.php';
		$smartyTemplateDir = $smartyDir . 'templates/';
		$smartyCompileDir  = $smartyDir . 'templates_c/';
	
	//Smarty
		require_once($smartyFile);
		$smarty = new SmartyBC();
		$smarty->template_dir = $smartyTemplateDir;
		$smarty->compile_dir  = $smartyCompileDir;
		
	//フィルタ
		$smarty->register_prefilter('smartyPreFilter');
		$smarty->register_postfilter('smartyPostFilter');
		$smarty->register_outputfilter('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->register_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');
index.html
{include file='header.html'}
	<body>
		$hogeを表示<br />
		{foreach from=$hoge key=key item=item name=loop}
			KEY:{$key} - ITEM:{$item}<br />
			{if $smarty.foreach.loop.last}最後のループ<br />{/if}
		{/foreach}
		<br />
		修正子を実行<br />
		{'XSS!!<script>alert("xss");</script>XSS!!'|testModifier:"aaa":"bbb"}
		XSSの部分は$name、"aaa"が$param1、"bbb"が$param2というふうに割り当てられる
		
	</body>
	</html>
header.html
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE html>
	<html lang="ja">
	<head>
		<meta http-equiv=" Content-Type" content="text/html; charset=UTF-8">
		<title>{$title|escape|default:''}</title>
		<meta name="description" content="{$meta.description|escape|default:''}">
		<meta name="keywords" content="{$meta.keywords|escape|default:''}">
	</head>
register_prefilterとか普段は使わないんですが、今回はサンプルなのでとりあえず置いてます。
試してないんですがSmarty2の機能しか使ってないのでSmarty2でも動くと思います。
普通にSmarty2の使い方でほぼ問題無く使えてしまった。
PR


2012/05/11 23:37 | Comments(0) | PHP

コメント

コメントを投稿する






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



<<Minecraft1.2.5 Xie's MODs その7 Default Farming Content 追加食料その2 | HOME | Minecraft1.2.5 Extended Workbench v0.4 作業台の拡張>>
忍者ブログ[PR]