Ext JS に関しては,新しい記事は Sunvisor Lab. ExtJS 別館 にあります。そちらもよろしくお願いいたします。
xFrameworkPXを使って見る(2) データベース操作
引き続き 「データベースの基本的な操作」のチュートリアルを順番にやってみます。
テーブルとリンクしたモジュールの作成
その通りやってもエラーが出るわけではないが,メッセージがちゃんと表示されないので,.index.php の9行目を
$this->set('module_data', $this->sample->testMethod());
のように()をつけたら動作した。
pxでは,モジュール名にtbl_ というプレフィックスをつけたテーブル名がデフォルトになるようです。モジュール名とは別に設定する場合は,usetable にテーブル名を代入すればいい。このプレフィックス自体もdatabase.pxmlの設定で変更できるような気配がします。既出ですがfalseを代入しておけば,テーブルは使わないモジュールになる。ここのサンプルでは単にテーブルがあるかどうか見ているだけ。
基本的なデータベース操作(1)
ここらへんから具体的な例が出てくる。複数行のデータ取得もある。
モジュールでは,$this->row メソッドの戻り値は1行のみで,$this-rowAll メソッドの戻り値は全行ということでしょうか。
コントローラーでは,モデルからの戻り値をそのまま,$this->set してます。たぶんどちらも連想配列なんじゃないかと思います。
単行データの方では,コントローラーでは $rowdata に値をセットしています。それをビューの方では,
<!--{$rowdata.id}-->
という書式で,フィールドを取り出しています。なるほど。
複数行の場合は,コントローラーでは, $alldata に値をセットしています。それをビューでは,
<!--{foreach from=$alldata item=item key=key}--> <tr> <td><!--{$item.id}--></td> <td><!--{$item.title}--></td> <td><!--{$item.note}--></td> <td><!--{$item.modified}--></td> </tr> <!--{/foreach}-->
ほぉ。こうしてループが書けるのか。これはSmartyの機能なんだろうか。なるほど。
「基本的なデータベース操作(2)」は,モジュールの $this->count でレコード数が取り出せるということですので飛ばします。
基本的なデータベース操作(3)
データの挿入。データの挿入は, モジュールの$this->insert()メソッドをつかうのですね。
フォームが出てきて,Webアプリらしくなってきます。
- ビューのフォームは,自分自身に対してpostメソッドでデータを投函します。
- コントローラーでは,$this->post プロパティを使ってデータを取り出して,それらがちゃんとセットされていたらモデルのindertData()メソッドでデータを挿入する。
サンプルをコピペしても動作はするのですが,.index.php のモジュールの参照が間違っていて,自分で作ったモジュールを読んでいません。
5行目の
public $modules = array('Docs_Tutorial_Database_Db3_sample');
は
public $modules = array('sample');
です。19行目と27行目
$this->Docs_Tutorial_Database_Db3_sample->insertData(
$alldata = $this->Docs_Tutorial_Database_Db3_sample->getDataAll();
それぞれ
$this->sample->insertData(
$alldata = $this->sample->getDataAll();
という風にするのが正しいです。
面白いのは,モジュールのinsertDataメソッド。
public function insertData($id, $title, $note) { $this->insert( array( 'field' => array( 'id', 'title', 'note', ), 'value' => array( ':id', ':title', ':note', ), 'bind' => array( 'id' => $id, 'title' => $title, 'note' => $note, ) ) ); }
$this->insert に渡している field と value は,
INSERT INTO () VALUES ()
のINSERT INTO 句のパラメータとVALUES句のパラメータですよね。そしてVALUES句にはコロンで始まるパラメータが設定されているので,bind のところで,それぞれのパラメータと値をひもつけている。という感じかな。
試しに,value のところを次のようにして bind の部分をなくしてしまっても動作しました。
'value' => array( $id, "'".$title."'", "'".$note."'", )
このやり方では,上のようにちゃんと引用符でくくってやる必要があるようです。
このフォームでは,ID欄に次の値がセットされていますが,コントローラーで全行取得後,最終行のIDプラス1をビューに渡しています。