Smartyでホームページを作る – 実践編
index.phpのみでホームページを制御する
Smartyについて連々と書いてきましたが、デザイナー側はこのカテゴリーの記事を読んで使えるようになれば、十分だと思います。テンプレートはあくまでページデザインを担うものとして扱い、処理はPHP側で行うのが理想です。
さて、今度はプログラマー側のお話しです。テンプレートが変わる度にPHPを書いていてはたまったもんじゃ有りません。それならHTMLで作ってしまった方が早いです。ですので、index.phpのみでページ切り替え(テンプレート変更)を行うよう考えてみます。
サンプルは、ヘッダー、フッターの他に、以下の3枚のテンプレートを作りました。
Index01.tpl
Index02.tpl
Index03.tpl
URLによって、テンプレートを切り替えます。
mod_rewriteとフレンドリーURL
PHP側の解説を始める前に、サンプルの各ページのURLが以下のようになっているのが判ると思います。
./Sample/Smarty/Index02.html
これ実は以下のURLでもアクセス出来ます。
./Sample/Smarty/?mode=Index02
ただ、これじゃURLとして味気ないですし、SEO的にも宜しくないです。真偽は置いておき、Googleなんかはページの拡張子が.htmlの方が良いとかどうとか。
この、?mode=Index02をIndex02.htmlにするには、mod_rewriteというものを使います。.htaccessに以下のように書きます。
DirectoryIndex index.php RewriteEngine on #RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)$ index.php?mode=$1 [L]
mod_rewriteは色々な書き方が有りますし、サーバーによっても書き方が変わりますので、あくまで一例です。詳しい説明は省きますが、URLの末尾に付いた文字を $_GET[‘mode ‘]という変数に格納してindex.phpに渡すように書かれています。
これでも表示出来ます。
index.phpの処理
<?php mb_language("Japanese"); mb_internal_encoding("UTF-8"); require_once('Smarty/Smarty.class.php'); /* * テンプレート表示クラス */ class SmartyControll{ var $Smarty; var $Template; function setTemplates(){ $smarty = $this -> Smarty; $smarty->display('smarty_Header.tpl'); //ヘッダーのテンプレート if($this -> Template) $smarty->display($this -> Template); //コンテンツのテンプレート $smarty->display('smarty_Footer.tpl'); //フッターのテンプレート } } /* * コントローラー */ class controller{ var $post; var $get; function mode(){ $templates = null; if($_GET['mode']): $mode = htmlspecialchars($_GET['mode'] , ENT_QUOTES , "UTF-8"); //URLの意図しない文字を変換 $mode = explode(".",$mode); // Index**.html を . で区切って配列化 $templates = $mode[0].'.tpl'; //テンプレート名を定義 endif; //Smartyを定義 $smarty = new Smarty; $smarty-> template_dir = 'tpl/'; //テンプレートフォルダー $smarty-> compile_dir = 'cache/'; //キャッシュフォルダー if($templates): if( file_exists("tpl/".$templates) == false): //****.tplが存在してるか確認 $templates = 'Index01.tpl'; //無ければIndex01.tplを表示 endif; else: $templates = 'Index01.tpl'; endif; $obj = new SmartyControll; $obj -> Smarty = $smarty; $obj -> Template = $templates; $obj -> setTemplates(); exit; } } $obj = new controller; $obj -> mode(); ?>
やっていることは単純で、$_GET[‘mode’]をドットで配列化し、Index02などの文字を得ます。それと同じ名前のテンプレート(Index02.tpl)があれば、そのテンプレートを表示、無ければIndex01.tplを表示といった処理です。プログラマーはこれをたたき台にし、例えば class Index01 というクラスを作り、ページ内の処理を書いていくなど。こんな感じで、プログラマはデザインが上がってくる前に、URLに応じた処理を書く事が出来ますので、工数削減になります。