前回までで,基本的なアプリケーションの土台はほぼ完成しました。今回は,rhacoを用いたアプリケーション開発の基本となる Flow という機構をつかって,ToDoデータの一覧画面を実際に構築してみます。
Flow とは
ウェブアプリケーションでは,ユーザーからのリクエストを受けてリクエストに見合った出力(HTML)を返すまでが一連の動作となりますが,rhacoでは基本的にそれぞれをリクエストクラス(network.http.Request),テンプレートクラス(tag.HtmlParser)として扱います。
しかし,これらは一般的にはいつもセットで使われるので,それらを統合したクラスが提供されています。それが,今回のメインとなる Flow(generic.Flow)です。
簡単な使用方法
まずは簡単な例をお見せします。
アプリケーションのディレクトリに hello.php として,次のようなファイルを作成してみましょう。
<?php
require_once '__init__.php';
Rhaco::import('generic.Flow');
$flow = new Flow();
// greeting に "Hello!" をセット
$flow->setVariable('greeting', 'Hello!');
if(!$flow->isVariable('name')){
// name が与えられなかったら Guest をセット
$flow->setVariable('name', 'Guest');
}
$flow->write('hello.html');
ここでは,Flowのみを使って,テンプレートの出力まで行っています。
最初の行の __init__.php で,アプリケーションの初期化を行います。__init__.php 内部で __settings__.php を読み込んでいるので,セットアップアプリケーションで設定した値などの読み込みや,rhaco本体の読み込みなどを行います。Rhaco::import については第1回でも利用しましたね。
このコードでは, http://localhost/kaeru/hello.php に,「?name=なまえ」とクエリパラメータを与えると,出力も変わるようにしています。
テンプレートファイルは,アプリケーションのディレクトリ内 resources/templates に設置します。セットアップアプリケーションから,テンプレートのディレクトリを変更することもできます。
ここでは,resources/templates/hello.html として,次のようなファイルを作成しました。
<html><body>
<h1>Greeting Sample</h1>
{$greeting} {$name}
</body></html>
これは,RequestとHtmlParserを使った次のようなコードとほぼ同じ意味を持ちます。
<?php
require_once '__init__.php';
Rhaco::import('network.http.Request');
Rhaco::import('tag.HtmlParser');
$request = new Request();
$parser = new HtmlParser();
// テンプレート変数 greeting に "Hello!" をセット
$parser->setVariable('greeting', 'Hello!');
$parser->setVariable('name', $request->getVariable('name', 'Guest'));
$parser->write('hello.html');
前述したコードと少し違う点にお気づきでしょうか?
getVariableメソッドに第二引数を渡すと,その値をデフォルトの値として扱うことができます。これを利用すると最初のコードももっと簡潔に書けそうですね。
それでは,実際にDBからToDo一覧を取得して表示するFlowを作成してみましょう。
DBに接続をする
第3回の「データベースの設定と作成」で既にDBの準備はOKですね。
アプリケーション内でDBに接続するには DbUtil(database.DbUtil)というクラスを利用します。
DB設定は projext.xml の各databaseによって接続先が変わることも考えられるので,テーブルモデルクラスを利用してDbUtilへ接続情報を与えます。
テーブルモデルは,library/model に生成されています。Rhaco::import は,rhaco内部のライブラリだけではなく,アプリケーションのlibrary以下のファイルを読み込むときにも使用します。
<?php
require_once '__init__.php';
Rhaco::import('database.DbUtil');
Rhaco::import('model.Todo');
// DbUtil に,Todoモデルクラスの connection メソッドの返り値を渡す
$db = new DbUtil(Todo::connection());
これで,DBへの接続は完了です。

