INTER-MediatorというPHPアプリケーションフレームワークがあります。
かなり前から存在は知っていたものの、今回はじめて使ってみました。
普通に使うには、私個人としてメリットがなかったので使って来なかったのですが、
他のフレームワークと一緒に使うと便利なんじゃね?
ってことで、Codeigniterで使ってみることに。
 
え?なんでかって?seezoo cmsのコミッターだからさ!
 


そもそも、INTER-Mediatorってなによ?

 
そもそも、INTER-Mediatorってなによ?ってことなんですが、
従来のPHPやPHPフレームワークでは、
SQLやORMをつかってデータベースのレコードを呼んできて、
 

<table>
<?php foreach( $rows as $row ): ?>
<tr> <td><?php $row['field']; ?></td> </tr> <?php endforeach; ?>
</table>

 
のようなコードを書かなくてはなりませんでした。
(PHPTALをつかうともっとスッキリHTMLのポリシーに近くなりますが)
 
Inter-Mediatorの場合、PHPファイルに規定の書き方で、
呼び出すテーブル・1ページあたりのレコード数などを書き入れ、
そのファイルをjavascriptファイルとして、HTMLから呼び出すだけで、
 

<table>
<tr>
<td class="IM[テーブル名@フィールド名"></td>
</tr>
</table>

 
こんなHTMLを書けば、Javascript制御でclassで指定された
テーブル名/フィールド名のデータを表示してくれます。
また、複数レコードを呼ぶ設定にしている場合は、
テーブルの行数もレコード数分追加してくれます。


定義ファイルの中身

INTER-Mediatorの定義ファイルは
 

<?php
require_once ('INTER-Mediator/INTER-Mediator.php');
IM_Entry(
	//呼び出すレコードの定義
	array(
		array(
			'records' => 1,
			'name' => 'person',
			'key' => 'id',
		),
	),
	//オプション設定
	null,
	//DBへの接続設定
	array('db-class' => 'PDO'),
	//デバッグレベルの設定
	false
);

こんな感じです。詳しくは公式サイトのドキュメントをご覧下さい。
IM_Entry();が、HTMLのクラスセレクタを解析して、
DBのレコード/フィールドを差し込むJavascriptコードを出力してくれる
そんな仕組みになっているようです。
 


Codeignireから使うには?

 
上記の様に、INTER-Mediatorの定義ファイルは実に単純なしくみです。
この定義ファイルを出力するコントローラーをつくれば、
ページの出力がかなり簡単になるのでは?
と思ったわけです。
 
気をつけるポイントとして、
INTER-Mediatorでは、PDOでMySQLなどへの接続を行なっているので、
CodeigniterのDBドライバインスタンスをINTER-Mediatorで使うことはできません。
ただ、CodeigniterでつかっているDBの設定はそのまま引き継ぎたい。
そんなわけで、以下のようなコントローラーを作ってみました。
 

<?php
class im_require extends CI_Controller
{
	public function index()
	{
		//IMをrequire
		require FCPATH.'INTER-Mediator/INTER-Mediator.php';
		
		//データベース設定を呼び出す
		require APPPATH . 'config/database.php';
		$dsn = $db[$active_group];
		
		//第三引数
		$dbset = array();
		$dbset['db-class'] = 'PDO';
		$dbset['dsn'] = 'mysql:dbname=' . $dsn['database'] . ';host=' . $dsn['hostname'];
		$dbset['user'] = $dsn['username'];
		$dbset['password'] = $dsn['password'];
		
		
		IM_Entry(
			array(
					array(
						'records' => 1,
						'paging' => true,
						'name' => 'person'
					)
			),
			null,
			$dbset,
			0
		);
	}
}

 
DB設定ファイルを呼び出して、今アクティブなDB設定を
INTER-MediatorのPDO設定に入れているという簡単なしくみです。
 
あとは、どのテーブルを呼び出すかなどを、
GET/POSTのパラメータなどから呼び出せるようにしたり、
YAMLなどで定義できるようにしておけば、
1つのコントローラーで、複数のINTER-Mediatorの定義を作ることができるようになります。
 


INTER-Mediatorの改造

 
さて、定義ファイルを作成するコントローラーができたわけですが、
これだけでは、ちょっとまずいところがありますので、
INTER-Mediator自体の改造が少し必要です。
GenerateJSCode.phpを改造します。
68行目付近に
 

$pathToMySelf = (isset($scriptPathPrefix) ? $scriptPathPrefix : '')
. $_SERVER['SCRIPT_NAME'] . (isset($scriptPathSufix) ? $scriptPathSufix : '');

 
があります。
この状態ですと、定義ファイルの物理的なパスをJavascript中でXHRのURLとして利用してしまうので、
URIルーティングがあるCodeigniterでは、index.phpが呼ばれてしまい、
正しく動作してくれません。
 

$pathToMySelf = (isset($scriptPathPrefix) ? $scriptPathPrefix : '')

			. $_SERVER['SCRIPT_NAME'] . (isset($scriptPathSufix) ? $scriptPathSufix : '');

if(function_exists('get_instance'))
{
	$ci = get_instance();
	$pathToMySelf = (isset($scriptPathPrefix) ? $scriptPathPrefix : '')
		. '/index.php/' . $ci->uri->uri_string()
		. (isset($scriptPathSufix) ? $scriptPathSufix : '');
}

このように書き換えています。
Codeigniterからの呼び出しでない場合も踏まえて、
コントローラーインスタンスが呼べるかどうかで、振り分けをしています。
 
上記のコードでは、GETパラメーターへの考慮がされていないので、
実務レベルで使うには、そのあたりも考慮した改造が更に必要でしょう。
 


viewファイルの記述は?

viewファイルのへの記述は特に気にするような点はなく、
ここまでで作った定義作成コントローラーをjavascriptとして呼び出して、
bodyにonload="INTERMediator.construct(true);"をつければOKです。
 

<script type="text/javascript" src="http://localhost/index.php/im_require"></script>

  

<body onload="INTERMediator.construct(true);">

 
こんな感じですね。
 


seezoo cmsに入れる?

 
seezoo cmsはCodeigniterベースにできているので、
ここまでで書いたコントローラーを突っ込めばうごいてくれますし、
seezoo cmsには管理者/会員承認機能がそろっているので、
このへんもからめると面白いものができそうです。
 
また、Codeigniter自身のModel(DB)機能を使えば、
Inter-Mediartorではカバーできない複雑な処理も行うこともできますから、
「とても便利系」なライブラリやフレームワークにありがちな、
「あーここまではできないかーorz」という手詰まり感も回避することができます。
 


将来展望

実は、私今年のはじめからseezoo cmsベースで似たようなものを作ろうとしていたのですが、
仕様の練り直しなどで進んでいなかったところがあり、
一気に解決した感じです。
 
CodeigniterにはDB構造を操作するメソッドも揃っているので、
テーブル作成やインデックスの付与などを管理画面からできるようにすれば、
オンライン版FileMakerのようなものができるのでは!?
と思っています。
 
もう少しいじってみよう!
 


P.S.

INTER-Mediatorのコードを覗くと、
プロパティが

var $var = '';

のような、ちょっと古い書き方がされているところがあるようです。
この辺りは改善してもらえるとうれしいなー。