新規ドキュメントはこちら(http://ozaki.kyoichi.jp/content/blogsection/4/26/)に掲載しております。
smartyのインストール
アクションが作れるようになったら、次に用意したいのはテンプレートシステムです。mojaviの長所は、純粋なMVC2フレームワーク以外の部分については、他のライブラリを柔軟に組み込める点です。そこで、PHPではわりと有名なsmartyをmojavi 3に組み込む方法を紹介します。まずはsmartyのソースコードを入手します。現時点(2005/01/21)では Smarty 2.6.6 リリースとなっています(こちらから入手できます)。 ファイルを入手したら、プロジェクト(MyProject)のルートディレクトリに展開します。プロジェクトは、ホットデプロイ(どこでも簡単に設置。配置するだけで稼動するシステム)できることが望ましいので、プロジェクトディレクトリ内に展開します。
[k-ozaki@free15 ~]$ cd tmp [k-ozaki@free15 tmp]$ wget 'http://smarty.php.net/do_download.php?download_file=Smarty-2.6.6.tar.gz' [k-ozaki@free15 tmp]$ tar xvzf Smarty-2.6.6.tar.gz -C /home/k-ozaki/workspace/MyProject/
mojavi 3と連携するべき、設定を行います。まず、config.phpを利用して、グローバルな定数を追加します。Smartyがどこにインストールされたか定義します。以下の行をMyProject/webapp/config.phpに追加してください
// Smarty Installation Directory
define('MO_SMARTY_DIR', '/home/k-ozaki/workspace/MyProject/Smarty-2.6.6');
実際にsmarty用の変数をmojaviで扱えるようにラッピングするクラスを作成します。実際に、mojavi 3のパッケージの中には、SmartyView.class.phpというクラスが存在します。ただ、まだ中身は空です。正式リリース版には、これが実装された形で含まれるのではないかと思います。それまで待てないし、mojavi 3ってPHP5に準拠してて、素敵すぎるから今すぐどうにかして使いたい!って人には、以下が参考になるのではないかと思います。Smartyへのレンダリングクラスを作ります。まず、AbstractSmartyView.class.phpというファイルをMyProject/webapp/lib/の中に作ります。SmartyView.class.phpと称したいところなのですが、既にmojavi 3パッケージの中に同じクラスがあるので、少々長ったらしい名前になってしまいます。内容は以下のようになります
<?php
ini_set("display_errors", 0);
ini_set("error_reporting", false);
require_once(MO_SMARTY_DIR.'/libs/Smarty.class.php');
ini_restore("error_reporting");
ini_restore("display_errors");
abstract class AbstractSmartyView extends View
{
private $smarty;
public function __construct()
{
$this->smarty = new Smarty();
$this->smarty->config_dir = MO_CONFIG_DIR;
$this->smarty->cache_dir = MO_CACHE_DIR;
}
public function clearAttributes ()
{
$this->smarty->clear_all_assign();
}
public function getAttributeNames ()
{
return array_keys($this->smarty->get_template_vars());
}
public function & getAttribute ($name)
{
return $this->smarty->get_template_vars($name);
}
public function & removeAttribute ($name)
{
$retval = $this->smarty->get_template_vars($name);
$this->smarty->clear_assign($name);
return $retval;
}
public function setAttribute ($name, $value)
{
$this->smarty->assign($name, $value);
}
public function setAttributeByRef ($name, &$value)
{
$this->smarty->assign_by_ref($name, $value);
}
public function setAttributes ($attributes)
{
$this->smarty->assign($attributes);
}
public function setAttributesByRef (&$attributes)
{
$this->smarty->assign_by_ref($attributes);
}
public function & getEngine ()
{
return $this->smarty;
}
}
?>
先頭のinit_setとrequireについてですが、PHP5では、Smartyを利用する際にいくつかエラーが発生しますので、それらを表示しないようにして、Smartyを取り込み後、元に戻します。これをまた更に必要に応じてsmartyテンプレートを利用できるようにしたクラスを作ります。同じくMyProject/webapp/libの中にMySmartyView.class.phpというファイル名で、下記のようなクラスを作ります。
<?php
abstract class MySmartyView extends AbstractSmartyView
{
public function & render ()
{
$retval = null;
// execute pre-render check
$this->preRenderCheck();
// get the render mode
$mode = $this->getContext()->getController()->getRenderMode();
$this->getEngine()->template_dir = $this->getDirectory();
$this->getEngine()->compile_dir = $this->getDirectory();
if ($mode == View::RENDER_CLIENT)
{
$this->getEngine()->display($this->getTemplate());
}
else if ($mode == View::RENDER_VAR)
{
$retval = $this->getEngine()->fetch($this->getTemplate());
}
return $retval;
}
}
?>
上記クラスにより、Smartyのcompileディレクトリがtemplatesディレクトリに設定されるので、MyProject/webapp/HelloWorld/templatesをapache(ウェブサーバ)権限に変更します。もしくは、ウェブサーバにより書き込み可能な権限(たとえば1777)に変更しても問題ありません。このような設定がセキュリティ上好ましくない場合は、上記クラスを修正して、compileディレクトリをtemplatesディレクトリから分離します。
[k-ozaki@free15 ~]$ cd /home/k-ozaki/workspace/MyProject/webapp/modules/HelloWorld/
[k-ozaki@free15 HelloWorld]$ su
Password:
[root@free15 HelloWorld]# chown apache:apache templates
これらの作成したクラスをrequire(あるいはinclude)しなくても使えるようにするべく、autoloaderの設定を行います。MyProject/webapp/config/autoload.iniに次の2行を付け足します
AbstractSmartyView = "%MO_WEBAPP_DIR%/lib/AbstractSmartyView.class.php" MySmartyView = "%MO_WEBAPP_DIR%/lib/MySmartyView.class.php"
最後に、MySmartyViewを使ったビューを作成します。ここではアクションの作成の手順は省き、以前に作成したHelloWorldモジュールのHelloWorldアクションのビューを修正します。MyProject/webapp/module/HelloWorld/views/HelloWorldSuccessView.class.phpを修正します。継承するViewをPHPViewからMySmartyViewに変更します。内容は以下のようになります
<?php
class HelloWorldSuccessView extends MySmartyView
{
public function execute ()
{
$this->setTemplate('HelloWorldSuccess.tpl');
}
}
?>
ここで、新規にSmartyTemplateのHelloWorldSuccess.tplを作成します。内容は以下のようになります
<html>
<body>
Hello World!<br>
This is a Smarty Template.
</body>
</html>