8月5日,こうしろうが帰省した。朝6時過ぎに大学の寮を出て,青春18きっぷでひこにゃんを経由して,夕食前に高岡の駅に着いた。彦根城では「レゴ」で作った世界遺産展が開催されているらしい。

 帰省しても自宅にいる時間は少ない。といっても,大学1年生はまだかわいいもので,夜の街に繰り出したりするわけではない。ポツポツと帰省する小学校からの友人たちに「飯食いに行こう」と誘われ,連日のように近所の「ぼてじゃこ」に出かけている。大学生のふところ具合は粉もんと釣り合いが良いようだ。

 サークル活動でプログラミングをしようということになり,PHPとMySQLで何かを作るのだとこうしろうは言う。おせっかいな父としては「じゃあ,Smartyも使った方がいいな」と,Smartyの導入部分だけでも帰省しているうちにやってみようと久しぶりのMindStormsタイム復活である。SmartyとはPHP用のテンプレートシステムである。

 ところがどっこい。筆者が春から使っているWindows VistaのPCにApache2.2.4+PHP 5.2.3+Smarty 2.6.18,そしてMySQL5.0.45という環境を構築するのは容易なことではなかったのだ。

 MySQL5.0.45 Community EditionをVistaにインストールするときに発生する問題は,比較的,解決が容易だ。

 インストール後,Configure the MySQL Server nowにチェックが入っている状態でFinishボタンをクリックしても,Configuration Wizardが始まらない。アンインストール後,再度インストールを始め,Configure the MySQL Server nowのチェックをはずしてFinishボタンをクリックした後,メニューに登録されたMySQL Server Instance Configuration Wizardを実行することでConfigurationが実行できた。
 
 Apache HTTP Server 2.2.4をVistaにインストールするにはWindows Vistaのユーザーアカウント制御(UAC)を一時的に無効にしなければいけない。

 UACを無効にするには,コントロールパネルでユーザーアカウントからユーザーアカウント制御の有効化または無効化をたどり,「ユーザーアカウント制御(UAC)を使ってコンピュータの保護に役立たせる」のチェックをはずす。

 ブラウザでlocalhostにアクセスしてIt works!と表示されていれば,Apache2.2.4のインストールは成功している。安全のためにUACは有効に戻す。だが,これが次の問題の原因だった。

 Apache2.2.4のインストールはうまくいったものと思い,PHPのインストールに進む。PHP 5.2.3 zip packageを展開してC:\にコピーし,php5にリネームする。php5ts.dllをWindowsシステムディレクトリ(Windows\System32)にコピーしてApache の設定ファイルhttpd.confやphp.iniを編集する。

 php.iniのdoc_rootは以下のようになっている。

 doc_root = "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"

 このディレクトリがまずかったのだ。

 <?php phpinfo(); ?> 

 PHPの情報を出力するphpinfo関数を記したinfophp.phpというファイル名をhtdocsフォルダに置こうとするのだが,互換性ファイルとなってしまい,勝手に別フォルダに保存されるのである。

 ApacheをデフォルトのままProgram Files以下にインストールしたのが問題だった。Program Files以下にファイルを保存しようとすると,Vistaのセキュリティ機能が別の場所に移動させてしまう。

 そこで,いったんアンインストールして,C:\Apache Software Foundation\Apache2.2\フォルダに再インストールすることにした。

 まだ問題は続く。PCを起動するたびに,ERRORというダイアログが表示されるようになった。この問題は,Monitor Apache Serversをスタートアップから削除することで解決した。

 しかし,httpd.confやphp.iniを編集して,メニューをたぐりApacheをRestartさせるが変更が反映されない。

 PCを再起動させると反映されたので,サービスを再起動すればよいことがわかった。

 最後にSmarty 2.6.18をダウンロードして解凍する。解凍してできたディレクトリの中のSmartyの下のlibsフォルダをSmartyという名前に変更し,ディレクトリC:\php5の下に移動する。結局,Smartyを利用するにはlibsフォルダの中身があればいいのだ。

 php.iniを編集してinclude_pathにc:\php5\Smartyを追加すれば,Smartyは利用可能になる。

 結局,Apacheの設定ファイルhttpd.confには,以下の変更を加えた。

---------------------------------------------------------------------
 LoadModule php5_module "c:/php5/php5apache2_2.dll"
 PHPIniDir "c:/php5"
 AddType application/x-httpd-php .php
---------------------------------------------------------------------

 LoadModule,AddTypeは目新しいものではない。PHPIniDirはApache2.0以降で指定可能になったディレクティブで,php.iniファイルのありかを指定する。php.iniをWindowsディレクトリに移動させる必要がなくなったのである。

 php.iniの設定は次の通り。

---------------------------------------------------------------------
 include_path = ".;c:\php5\PEAR;c:\php5\Smarty"
 doc_root = "C:/Apache Software Foundation/Apache2.2/htdocs"
 extension_dir = "c:/php5/ext"
 extension=php_mbstring.dll
 extension=php_mysql.dll
 extension=php_mysqli.dll
---------------------------------------------------------------------

 8月11日,やっと,こうしろうにSmartyの説明が始められるようになった。

・ SmartyはPHP用のテンプレート・システムである。テンプレートを使うとデザインとロジックを分離することができるので,デザイナとプログラマの分業が可能になる。Smartyではデザインは拡張子tplのファイルに保存する。ロジック(phpファイル)はそのままで,tplファイルだけを指し替えて見た目を変更できるというメリットがある。

・ テンプレート・ファイルは更新後,読み込んだときにコンパイルされるので,速度低下を招きにくい。

 こうしろうはtplファイルとそれを使うphpファイルの編集を始める。Smartyテンプレートを使うには,templatesフォルダとtemplates_cフォルダをあらかじめ作っておく必要がある。

 たとえば,test_smartyフォルダにphpファイルを作るとしたら,templatesフォルダのデフォルト位置は上図のようになる。もちろん,templatesフォルダの位置をphp側で指定することもできる。templatesフォルダに作ったtplファイルはtemplates_cフォルダに自動的にコンパイルされる。

 Smartyのマニュアルページを真似て,こうしろうがテンプレートとphpファイルを作成する。

(test1.tpl)
---------------------------------------------------------------------
 {*コメント-Smarty*}
 こんにちは、{$name}。ようこそSmartyへ!
---------------------------------------------------------------------

 {*と*}のようにアスタリスクとデリミタ({,})で囲むと,テンプレートのコメントになる。テンプレート変数は先頭にドル記号($)を付ける。

(test1.php)
---------------------------------------------------------------------
 <?php
 require_once('Smarty.class.php');
 $smarty = new Smarty();
 $smarty->assign('name','Ned');
 $smarty->display('test1.tpl');
 ?>
---------------------------------------------------------------------

assignはテンプレートに値を割り当て,displayはテンプレートを表示する。

 まだ,おもしろくもおかしくもないサンプルだが,穴を開けたテンプレートを用意しておいて,そこにphpで値を割り当てる,そんなイメージで理解してもらうと良いだろうか。