tomimemo
Smarty
最終更新:
匿名ユーザー
-
view
インストール
(ApacheとPHPが既にインストールされているという前提)
Smarty本体を http://smarty.php.net/ からダウンロード。ダウンロードしたファイル(Smarty-x.x.x.tar.gz)を解凍すると以下のファイルができあがる。
Smarty本体を http://smarty.php.net/ からダウンロード。ダウンロードしたファイル(Smarty-x.x.x.tar.gz)を解凍すると以下のファイルができあがる。
[ディレクトリ] demo libs←これのみ必要 misc unit_test [ファイル] COPYING.lib BUGS ChangeLog FAQ INSTALL NEWS QUICK_START README RELEASE_NOTES TODO
PHPインストールフォルダ以下にSmartyを置くフォルダを作成。(ここでは c:\php\lib\Smarty とする)
解凍したlibs以下のファイル・フォルダ全てをc:\php\lib\Smarty以下にコピーする。この時点でのフォルダ構成は以下。
解凍したlibs以下のファイル・フォルダ全てをc:\php\lib\Smarty以下にコピーする。この時点でのフォルダ構成は以下。
c:\php\lib\Smarty ∟ internals(ディレクトリ) plugins(ディレクトリ) Config_File.class.php Smarty.class.php Smarty_Compiler.class.php debug.tpl
php.iniファイルに以下のパスを記述して上書き保存。
include_path = ".;c:\php\lib\Smarty"
Apacheを再起動して完了。
Smarty 動くかテスト
Apacheのドキュメントルート以下にSmartyテスト用フォルダを作成(ここでは SmartyTest とする)。SmartyTestフォルダに以下のフォルダとファイルを作成。
注)本来はセキュリティを考慮して下記4つのディレクトリはApacheのドキュメントルート以外に置いたほうがよい。もし置くなら、.htaccessファイルなどでwebから直接参照できないようにしておいたほうが吉。
注)本来はセキュリティを考慮して下記4つのディレクトリはApacheのドキュメントルート以外に置いたほうがよい。もし置くなら、.htaccessファイルなどでwebから直接参照できないようにしておいたほうが吉。
[フォルダ構成] htdocs\SmartyTest ∟index.php cache(ディレクトリ) config(ディレクトリ) templates_c(ディレクトリ) templates(ディレクトリ) ∟sample.tpl
[index.phpの内容] <?php //Smartyライブラリ読み込み require_once("Smarty.class.php"); $smarty = new Smarty; $smarty->assign('title','タイトル'); $smarty->assign('name', 'お名前'); $smarty->display('sample.tpl'); ?>
[sample.tplの内容] <html> <head> <title>{$title}</title> </head> <body> 名前:{$name} </body> </html>
http://localhost/SmartyTest/index.php にアクセス。エラー出なければOK。
Smarty セットアップ用のクラスを作成
Smartyを使うときに毎回「require_once("Smarty.class.php");」やら「$smarty->template_dir = "xxxx";」やら書くのは効率が悪いので、専用のSmarty設定クラスを作成する。
[SmartySetup.php] <?php require_once("Smarty.class.php"); class SmartySetup extends Smarty { public function __construct() { $this->Smarty(); //Smartyで用いるディレクトリの設定 $this->template_dir = "c:/xxxx/templates/"; $this->compile_dir = "c:/xxxx/templates_c/"; $this->config_dir = "c:/xxxx/config/"; $this->cache_dir = "c:/xxxx/cache/"; } } ?>
使うときは以下のようにする。ちょっとだけ書くのが楽。
[index.php] <?php require_once("SmartySetup.php"); $smarty = new SmartySetup; $smarty->display("index.tpl"); ?>
Smarty セットアップ用のクラスを作成その2
[SmartySetup.php] <?php require_once("Smarty.class.php"); class SmartySetup extends Smarty { public function __construct($smarty_data = array(), $tpl_name) { $this->Smarty(); // 設定 $this->template_dir = "smarty/template"; $this->compile_dir = "smarty/template_c"; $this->config_dir = "smarty/config"; $this->cache_dir = "smarty/cache"; $this->caching = 0; // キャッシュ無効 1で有効 // テンプレート文字化け対策用プリフィルタとポストフィルタ $this->register_prefilter(array($this,'pre1')); $this->register_postfilter(array($this,'post1')); // データをアサインしてテンプレートを表示 $this->assign($smarty_data); $this->display($tpl_name); // アサインしたデータを破棄 $this->clear_all_assign(); } // プリフィルタ public function pre1($tpl_source, &$smarty) { return mb_convert_encoding($tpl_source,"EUC-JP","SJIS"); } // ポストフィルタ public function post1($tpl_source, &$smarty) { return mb_convert_encoding($tpl_source,"SJIS","EUC-JP"); } } ?>
使うときは以下のようなかんじ
[index.php] <?php require_once("SmartySetup.php"); $data = array( "data1"=>"ほげー" ,"data2"=>"ほげほげー" ); $tpl = "index.tpl"; $smarty = new SmartySetup($data, $tpl); ?>
[index.tpl] <html> <head><title>index</title></head> <body> データその1:{$data1}<br> データその2:{$data2}<br> </body> </html>
index.phpにアクセスして以下のように表示されるはず(未検証)
データその1:ほげー データその2:ほげほげー
Shift_JISでテンプレート作成時に文字化け
sjisでテンプレートファイルを作成したら、「施設」という文字でエラーになった。回避策は{literal}で囲う。(sjisで作らないことが一番の回避策?)
{literal}施設{/literal}
Smartyのプリフィルタとポストフィルタを使えばいちいち{literal}で囲わなくてもOKだけど、やや強引な感は否めない...
function pre01($buff, &$smarty) { return mb_convert_encoding($buff,"EUC-JP","SJIS"); } function post01($buff, &$smarty) { return mb_convert_encoding($buff,"SJIS","EUC-JP"); } $smarty = new Smarty; $smarty->register_prefilter('pre01'); $smarty->register_postfilter('post01'); $smarty->display('index.tpl');
{html_options}でlabel属性がついてしまう
label属性を削除するには、smartyフォルダ/plugins/function.html_options.phpの99行目を以下のように修正。
$_html_result = '<option value="' .
smartyの関数メモ
URLエンコード
{$text|escape:'url'}
スペースやタブを削除
{strip}{/strip}で囲う
デバッグ
{debug} (別ウインドウでデバッグウインドウが立ち上がる)
中括弧を表示させる
右側中括弧 {rdelim} 左側中括弧 {ldelim}
サーバにアップしたら画面が表示されないエラー
PHP+smartyを用いてローカル環境で開発していたものをサーバにそのままアップするとエラーが出て画面が表示されない場合がある。サーバにアップした際に以下の操作をしておけば大体大丈夫?
- smartyコンパイルディレクトリ内ファイル(template_c以下)を全部削除
- smartyキャッシュディレクトリ内ファイル(cache以下)を全部削除
- smartyのtemplate_c、cache、configディレクトリの権限を777