PEAR::HTML_Quickformはフォームを生成するクラス。オブジェクトとして扱えるので慣れるととても便利。
PEAR::DB_DataObjectはデータベースのテーブルにアクセス周りのラップクラス。複雑な事は苦手だけど定型的なデータアクセスなんかだとSQLレスにすっきりとしたコーディングができますよ!的なクラス。
データベースアクセスにスクリプトから毎回やれサニタイズだなんだって気にしてSQLを生成するのはナンセンスだけど、自分でデータベースアクセス周りをラップするクラスを作るのも面倒だよなー。って時にはいいかもしれないですね。PEARのクラスライブラリ同士を連携させた例をあまり見かけなかったので確認がてらメモ。
ソース見づらくなっても後でコピーして使えなくなっていやなので、入力値の評価やデータベースアクセスに対してのレスポンスなんかの処理はなんもしてません。
HTML_Quickformを継承して例えば
- cnvFormToDb(リクエストをテーブルの型に変換するメソッド)
- update(リクエストをテーブルにUPDATEするメソッド)
- insert(リクエストをテーブルにINSERTするメソッド)
なんてメソッドを追加してみます。ソースは以下の様な塩梅。
ちろっとした解説はソースの下に。
class Form extends HTML_Quickform{ var $DBO; var $_tableName; /* UPDATEする場合まずUPDATEする レコードを取得必要があるので、 WHEREに指定するカラム名 */ var $_primary_keyName = 'id'; function Form($name,$method,$action,$tablename){ $this->_form->HTML_Quickform($name,$method,$action); $this->_tableName = $tablename; $this->DBO = DB_DataObject::factory($this->_tableName); } function cnvFormToDb($values){ $result = array(); foreach($values as $column=>$value){ switch($column){ case 'username': //処理 break; } $result = array_merge($result,array($column=>$value)); } return $result; } function update(){ $values = $this->cnvFormToDb($this->_form->submitValues); if($this->DBO->get($this->_primary_keyName,$this->$this->_primary_keyName)==0)return false; $this->DBO->setFrom($values); $this->DBO->update(); } function insert(){ $values = $this->cnvFormToDb($this->_form->submitValues); /* テーブルスキーマを取得 */ $this->DBO->table(); /* 引数をテーブルのカラム名=>保存する値 としておく事で取得したテーブルスキーマに 存在するカラムのデータがセットされる */ $this->DBO->setFrom($values); /* テーブルのキーに当たるカラムは setFromメソッドではセットできないので キーとなるカラムがあった場合には keysメソッドでテーブルのキーを取得して キーのカラム名と同じインデックスの値をセット */ if(count($this->DBO->keys())!=0){ foreach ($this->DBO->keys() as $column){ $this->DBO->$column = $values[$column]; } } $this->DBO-update(); } } $Form = new Form($name,$method,$action,$tablename); //HTML_Quickformの処理 if(isset($_POST['SUBMIT'])){ if($Form->update())$Form->insert(); }
後はフォームのHTMLをSmartyかなんかで成型したり。
テーブルのカラム名をインデックスに、保存したい値で連想配列を作成して、テーブルスキーマを取得しておいてsetFromメソッドの引数に先ほどの配列をセットすれば、テーブルスキーマにある値だけがINSERTされるので、submitやhiddenなんかも気にせずPEAR::HTML_QuickformのsubmitValuesなんかをそのまま突っ込んで使えますよというもの。
cnvFormToDbメソッドの役割としては、PEAR::DB_DataObjectでDATE型のデータをテーブルに保存するときはdate(‘U’,$date)なんかでUNIXタイムスタンプに変更する必要があったり、電話番号で三つのinput要素をハイフンでimplodeしたりっつうことに使います。まあケースバイケースで。
例えば上記クラスのようにHTML_Quickformを継承せずに、共通モジュールとしてスタティックに呼び出せるデータベースアクセスクラスなんかを作ってもデータベース周りの定型な処理の見通しがよくなって便利ですね。
こういう共通モジュールを作っておくとPEAR::HTML_AJAXなんかと連携して、フォームに入力した郵便番号でページ簡易無しに住所を表示、とか会員制サイトの登録時のアカウントが重複しているかのチェックなどの複数の機能に対しても単一のメソッドで済んでしまうので開発が結構楽になると思います。
如何に楽をするか、それこそが最大の課題だ。 ~僕~
- 新しい: 年明けのご挨拶
- 古い: Frutigerを無料でかつ合法的に手に入れる方法
コメント:0
トラックバック:0
- この記事のトラックバック URL
- http://spais.jp/php/pearhtml_quickform%e3%81%a8peardb_dataobject%e3%81%ae%e9%80%a3%e6%90%ba/2006-12-25/trackback
- トラックバックの送信元リスト
- PEAR::HTML_QuickformとPEAR::DB_DataObjectの連携 - SPaiS より