Zend_Db_Tableの使い勝手の向上
Zend_Db_Tableの使い勝手が良くないんで、独自にjoin対応してみたりもしたんだけど、やっぱりああやって元クラス自体に手を入れなきゃならないアプローチは実用レベルにはなり得ないよなーということで、別アプローチでZend_Db_Table周りを使いやすくしてみた。
ソースを見れば分かるけど、要はZend_Db_Table、Zend_Db_Table_Row、Zend_Db_Table_Rowsetのインスタンスをコンポジットに持つ集約クラスを作って、状況に応じて妥当な内部クラスのメソッドを呼ぶ、というのが基本的な構造。
で、それに加えて、Zend_Db_Tableでは扱えない複数テーブルにまたがったデータのハンドリングを行いやすくするための、拡張カラムの呼び出し機能を追加してある。
Zend_Db_Tableで処理を書こうとすると、
class Foo extends Zend_Db_Table{}
$table = new Foo();
$rowset = $table->fetchAll();
foreach ($rowset as $row) {
echo $row->id;
}
$row = $table->find(1);
echo $row->id;
みたいな感じで、Table、Row、Rowsetオブジェクトがいちいち発生してうざかった。それを、
class Foo extends Zend_Db_Table{}
$table = new WEBXP_Db_Object(new Foo());
$table->fetchAll();
foreach ($table as $row) {
echo $row->id;
}
$table->find(1);
echo $table->id;
みたいな感じで、一つのオブジェクトで完結して処理が書けるようになる。
あと、fooテーブルがbar_idカラムでbarテーブルとリンクするような構造だった場合、
$table->fetchAll();
foreach ($table as $row) {
$bar = $row->bar; // $row->barIdから自動的にbarテーブルオブジェクトを取得
}
といった感じで、規約通りのテーブル構成だった場合は、プロパティ名から自動的にリンクするテーブルのオブジェクトを取得してくれる。
あと、拡張カラム名とその内容を取得するためのselect文を定義しておけば、規約外の構造でリンクされる他テーブルの情報を、プロパティとして取得できるような機能を追加してある。
といったあたりまで拡張したら、Zend_Db_Tableもずいぶん使い物になるんじゃなかろうか。今後互換性のない機能拡張がないことを祈りつつ、このアプローチをしばらく試してみよう。
CSSのレイアウト
今後標準的に使っていくものを決める際に、独自のレイアウトCSSを作るか、それともどこか有名どころの(ライセンス的に自由な)CSSを採用するか、検討中。
試しにYUIのgridを使ってみたんだけど、これってYUIライブラリの中でも整合性取れてなくね? っつーか、最初に試したのがgridでレイアウトした中に、カレンダーを表示するという組み合わせで、早速破綻が生じた(カレンダーのタイトル部分がずれる)んで、それ以上試す気力を失ってしまった。
reset.cssでcaption,th {text-align:left;}しているのが原因だということは分かったから、場当たり的に直す(calendar.cssでcaption,th{text-align: center;}するとか)のは簡単なんだけど、そういうことをやらなきゃいけないんだったら、初めから全部自分で把握できるCSSレイアウトを採用した方がましな気もしちゃうんだよなー。