新規ドキュメントはこちら(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>